본문 바로가기

개발하자

파일 변수가 있는 테라폼을 사용하여 user_data를 ec2 인스턴스에 추가합니다.

반응형

파일 변수가 있는 테라폼을 사용하여 user_data를 ec2 인스턴스에 추가합니다.

나는 테라폼 모듈을 사용하여 여러 개의 ec2 인스턴스를 만들려고 한다. 인스턴스마다 사용자 데이터가 다르기 때문에 이렇게 하고 싶은데 오류가 납니다.

data "local_file" "user_data" {
  for_each = { for ec2 in var.ec2_instances : ec2.name => ec2 }
  filename = "${path.cwd}/${each.value.user_data}"
}

resource "aws_instance" "instances" {
  for_each = { for instance in var.ec2_instances : instance.name => instance }

  ami                    = each.value.ami
  instance_type          = each.value.type
  cpu_core_count         = each.value.cpu_core
  user_data_base64  = base64encode(data.local_file.user_data[each.value.name].rendered)
}

module.tf

module "ec2_app_demo" {
  source = "./aws-ec2-application/"

  ec2_instances     = var.ec2_instances
}

tfvars 파일에서

ec2_instances= [
{
name = test1
user_data = ec2_1.sh
},
{
name = test2
user_data = ec2_2.sh
}
]

오류:

오류: 데이터 "local_file" "linux-vm-cloud-init":\n76:filename = filename${ach.value.user_data}")의 함수 인수\n이 잘못되었습니다.\n

파일 이름을 변수로 사용할 수 있는지 알려주세요.

폴더 구조는 다음과 같습니다.




그럴 필요 없어 그냥 충분해

filename = "${path.module}/${each.value.user_data}"



셸 파일이 동일한 디렉토리에 있으므로 원하는 것을 쉽게 달성할 수 있습니다. 또한 변수는 따옴표로 묶인 값을 사용해야 합니다.

ec2_instances= [
  {
    name = "test1"
    user_data = "ec2_1.sh"
  },
  {
    name = "test2"
    user_data = "ec2_2.sh"
  }
]

내장 함수는 [1] 파일에 대한 경로를 제공하기를 기대하며, 파일이 동일한 디렉토리에 있는지 여부를 알 수 없습니다.

지정된 경로에서 파일 내용을 읽고 문자열로 반환합니다.

코드가 작동하려면 주석(h/t: @Marcin)에 따라 데이터 소스를 다음과 같이 변경해야 합니다(는 필요하지 않습니다).

data "local_file" "user_data" {
  for_each = { for ec2 in var.ec2_instances : ec2.name => ec2 }
  filename = "${path.module}/../${each.value.user_data}"
}

: 댓글에 따라 쉘 스크립트는 변수 값에 대한 질문에서 원래 게시된 것과 비교된다. 이 작업을 위해 변수 값이 변경되어야 합니다.

ec2_instances= [
  {
    name = "test1"
    user_data = "tmosquid02.sh"
  }
]

[1]




나는 아래를 함으로써 이것을 할 수 있었다. 나는 데이터 소스가 필요하지 않았다. 아래에 방금 추가됨:

user_data = each.value.user_data != "" ? file("${path.module}/../${each.value.user_data}") : null

반응형