본문 바로가기

네트워크 & 클라우드/자동화

Terraform 기초 5 - Data Block

Data Block


-  내가 Terraform으로 생성하지 않은 인프라의 리소스를 가져올 수 있는 구문이다. 예시를 봐보자.

   직접 AWS console에서 유저를 생성해줬다.

- data block에서 정의한 유저의 데이터를 참조하여 path값을 가져와 testkimtest라는 유저를 생성했다.

data "aws_iam_user" "testkim1" {
  user_name = "kgw"
}

resource "aws_iam_user" "testkim2" {
  name = "testkimtest"
  path = data.aws_iam_user.testkim1.path
}

- data block은 타입에 따라 Attribute가 다르다. registry의 좌측 목록에서 Data_Source 부분을 선택해서 Attribute 확인해서 코드를 작성하면 되시겠다.

- Data block에서 일부 속성값만 가져오게 하는 설정이 있다. Filter block인데 용법은 아래와 같다.

  아래는 ami에  filter 내용에 부합하도록 data block을 정의하였다. data block에서 해당하는 ami id값을 불러와 instance를 구성하였다.

data "aws_ami" "amzn2_ami" {
  most_recent = true // 최신버전
  filter {
    name = "name" // required
    values = [ "amzn2-ami-hvm*" ]
  }
}

resource "aws_instance" "tf_test_ec2" {
  ami = data.aws_ami.amzn2_ami.id
  instance_type = "t2.micro"
}

data block 내에서 filter를 여러개 구성할 경우 AND 조건으로 동작하며, filter block 내에서 여러 values를 정의할 경우 OR 조건으로 동작한다.

 

- 추가로 외부 리소스를 가져오는 것이 아닌, local 내 데이터를 통해 Data block을 정의할 수 있다.

local_file  local_sensitive_file 가 있다.

  (https://registry.terraform.io/providers/hashicorp/local/latest/docs/data-sources/sensitive_file)

 

[locla_file]

- local에 있는 파일을 data instance로 생성하여, content 값을 참조하게 해준다.

 

- 로컬파일을 불러들어 bucket object로 지정하는 소스 코드이다.

data "local_file" "txt" {
    filename = "${path.module}/test.txt"
}

resource "aws_s3_bucket" "tf_s3" {
  bucket = "tf-s3-test-kgw"  
}

resource "aws_s3_bucket_object" "tf_s3_object" {
  bucket = aws_s3_bucket.tf_s3.bucket
  key = "test"
  content = data.local_file.txt.content
}

output "text_read" {
  value = aws_s3_bucket_object.tf_s3_object
}

 

 

[local_sensitive_file]

- local 파일을 data instance로 생성하는 것은 같으나, 이를 참조하는 결과는 민감 정보로 표시 된다.

  output으로 해당 데이터를 읽을 때 sensitive = true를 하지 않으면 에러가 발생하며, true를 입력해도 결과값은 <sensitive>로 출력된다.

 

data "local_sensitive_file" "txt" {
    filename = "${path.module}/test.txt"
}

resource "aws_s3_bucket" "tf_s3" {
  bucket = "tf-s3-test-kgw"  
}

resource "aws_s3_bucket_object" "tf_s3_object" {
  bucket = aws_s3_bucket.tf_s3.bucket
  key = "test"
  content = data.local_sensitive_file.txt.content
}

output "text_read" {
  value = aws_s3_bucket_object.tf_s3_object
  sensitive = true //local_sensitive_file이므로 이 값을 입력안하면 error 발생
}