Terraform data sources

서재민·2021년 3월 13일
1

Terraform

목록 보기
6/15

Data sources

Data source 는 Terraform 을 사용하지 않고 만든 infrastructure resource 또는 다른 곳에서 사용중인 Terraform code 를 통해 만들어진 resource 의 Data 를 가져오는데 사용된다.
각각의 provider 들은 resource 와 함께 data source 도 제공하고 있다.

Data source 문법

예제를 통해 어떻게 사용하는지 알아보자.

data "aws_iam_user" "foo" {
  user_name = "foo_name"
}

resource "aws_iam_user" "bar" {
  name = "bar_name"
  path = data.aws_iam_user.foo.path
}

코드의 첫번째 라인처럼 data block 을 통해 원하는 type 의 data 를 가져올 수 있다.
예제 코드에서는 user_namefoo_nameaws_iam_user 의 data 를 가져오도록 하였고 foo 라는 이름을 붙혀줬다.

이처럼 data 를 가져오기 위해서는 data block 안에 정보들(Arguments)을 명시해줘야 하는데, 이 Arguments 에 대한 내용은 각각의 Provider document 페이지에서 확인할 수 있다.
예제에서 사용한 aws_iam_user data 같은 경우도 document page 에서 확인할 수 있으며, 아래와 같다.

resource 사용법과 동일하게 (Required) Argument 에 대해선 반드시 명시를 해줘야하고, (Optional) 인 경우에는 필요한 경우만 명시하여 사용하면 된다.
또한 resource 사용법과 동일하게 data typedata name 을 합친건 unique id 로 사용되므로 다른 것과 중복되면 안된다.

Data instance 참조

data block 을 통해 data instance 가 생성되고 우리는 이걸 참조하여 원하는 data 를 가져올 수 있다.
resource 사용법과 동일하게 data.<TYPE>.<NAME>.<ATTRIBUTE> 문법을 사용하여 가져올 수 있으며, 위의 예제에서는 resource block 내에서 data.aws_iam_user.foo.path 를 사용하여 foo iam user 의 path 값을 가져왔다.

각각의 data instance 는 type 에 따라 참조할 수 있는 Attribute 가 있으며, 각각의 data source 문서를 참고하면 된다.
여기서 사용한 aws_iam_userdocument page{:target="_blank"} 를 참고해보면 아래와 같은 Attribute 가 제공됨을 알 수 있다.

filter block

filter 란 용어 그대로 가져온 Data instance 중 원하는 Data instance 를 얻고자 할때 사용된다.
예제를 통해 살펴보자.

data "aws_ami" "amazon_linux_2" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm*"]
  }
}

resource "aws_instance" "example" {
  ami           = data.aws_ami.amazon_linux_2.id
  instance_type = "t3.micro"
}

data block 을 통해 aws_ami 를 가져오고 있으며, "name" 이란 filter 를 통해 "amzn2-ami-hvm*" 에 해당하는 Data instance 를 가져온다. (이와 같이 정규식의 사용도 가능하다.)
most_recent 와 함께 사용하였으므로 이 data block 을 통해 가장 최신의 Amazon Linux 2 AMI 를 가져올 수 있다.
Filter 에서 사용할 수 있는 key 값은 aws_ami Attribute document page 에서 filter 부분을 보면 확인할 수 있다. (describe-images 를 위한 AWS CLI Reference의 --filter option 을 살펴보라고 나와있다.)
예제에서 이렇게 가져온 Data instance 를 통해 aws_instance resource 를 생성하는 부분까지 확인해 볼 수 있다.

filter 는 아래 예시와 같이 여러개의 block 을 명시한다면 AND type 으로 동작하고,

filter {
  name   = "name"
  values = ["amzn2-ami-hvm*"]
}

filter {
  name   = "virtualization-type"
  values = ["hvm"]
}

아래 예시와 같이 한개의 block 에서 여러개의 values 를 명시한다면 OR type 으로 동작한다.

filter {
  name   = "name"
  values = ["amzn2-ami-hvm*", "ubuntu-*"]
}

Local-only data sources

일부 Data source 중에는 remote infrastructure 에서 data 를 가져오는 것이 아니라, local 에서 처리한뒤 data instance 를 생성하는 것들이 있다.
template_file, local_file aws_iam_policy_document 이 3가지가 있는데, 간략한 설명과 공식 documentation page 를 적어놓을테니 사용법은 여기서 확인 바란다.

[template_file] - document page
.tpl 파일인 template file 을 가져와서 data instance 로 만들어 rendered template 을 참조하고자 할때 쓰는 data source 이다.
하지만 Terraform 0.12 이상 버전부터 deprecate 되었고 templatefile function 을 사용해서 동일한 동작을 수행할 수 있으므로 0.11 이하의 버전을 사용하지 않는다면 딱히 쓸일은 없다.

[local_file] - document page
Local 에 있는 file 을 data instance 로 생성하여 해당 파일의 content 또는 base64 로 encoding 된 content 를 참조할 수 있도록 해주는 Data source 이다.

[aws_iam_policy_document] - document page
aws_iam_policy resource 를 생성할때 사용할 policy 를 생성해주는 Data source 이다.
Arguments 들을 통해 data instance 를 생성하면 json 으로 변환된 값을 참조할 수 있다.

마무리

지금까지 Data sources에 대하여 살펴보았다.
resource 와 함께 Terraform 의 필수 요소 중 하나이며, 잘 사용한다면 더욱 안정적인 Infrastructure as Code 를 경험할 것이다.


[참고]

https://www.terraform.io/docs/configuration/data-sources.html

profile
Software engineer

0개의 댓글