본문 바로가기

개발하자

테라폼: 변수를 user_data init 스크립트로 전달하려면 어떻게 해야 합니까

반응형

테라폼: 변수를 user_data init 스크립트로 전달하려면 어떻게 해야 합니까

나는 지금 이 문제를 가지고 한참을 어슬렁거리고 있는데 해결할 수가 없어.

bash 스크립트를 실행하고 몇 가지를 설치하는 EC2 인스턴스를 시작합니다. 동시에 RDS 인스턴스도 시작하지만 연결을 구성하려면 RDS 끝점에서 EC2 인스턴스로 값을 전달할 수 있어야 합니다.

템플릿 파일을 사용하여 이 작업을 수행하려고 합니다

resource "aws_rds_cluster_instance" "cluster_instances" {
  count               = 1
  identifier          = "rds-prod-ddbb-${count.index}"
  cluster_identifier  = aws_rds_cluster.default.id
  instance_class      = "db.r5.large"
  engine              = "aurora"
  engine_version      = "5.6.mysql_aurora.1.22.5"
  publicly_accessible = "true"
}

resource "aws_rds_cluster" "default" {
  cluster_identifier      = "aws-rds-ddbb-cluster"
  availability_zones      = ["us-west-2b"]
  db_subnet_group_name    = "default-vpc-003d3ab296c"
  skip_final_snapshot     = "true"
  backup_retention_period = 30
  vpc_security_group_ids  = [aws_security_group.ddbb.id]
}

data "template_file" "RDSs" {
  template = file("init.sh")
  vars = {
    rds = aws_rds_cluster.default.endpoint
  }
  depends_on = [
    aws_rds_cluster.default,
    aws_rds_cluster_instance.cluster_instances,
  ]
}

resource "aws_instance" "web_01" {
  ami                    = "ami-0477c9562acb09"
  instance_type          = "t2.micro"
  subnet_id              = "subnet-0d0558d99ec3cd3"
  key_name               = "web-01"
  user_data_base64       = base64encode(data.template_file.RDSs.rendered)
  vpc_security_group_ids = [aws_security_group.ddbb.id]
  ebs_block_device {
    device_name = "/dev/sda1"
    volume_type = "gp2"
    volume_size = 20
  }
  tags = {
    Name = "Web01"
  }
  depends_on = [
    aws_rds_cluster.default,
    aws_rds_cluster_instance.cluster_instances,
  ]
}

그 다음에, 제 말은 이렇습니다:

#!/bin/bash
echo "rds = $rds" > /var/tmp/rds

하지만 저는 아무것도 얻지 못해서 변수가 비어 있는 것처럼 보입니다.

도움을 주시면 대단히 감사하겠습니다.

Ps: 출력은 다음과 같이 구성되어 있습니다:

outputs.tf

output "rds_endpoint" {
  value = aws_rds_cluster.default.endpoint
}

그리고 적용이 완료되면 RDS 끝점의 값을 보여줍니다.




: 이 답변은 원래 질문의 구문을 다루지만, 기본 사용 사례를 처리하는 훨씬 더 나은 방법이 있습니다. 자세한 내용은 을 참조하십시오.


변수는 셸 변수가 아니라 템플릿 변수이므로 terraform은 파일 형식에 관계없이 파일을 구문 분석하고 해당 파일의 terraform 변수를 대체합니다.

이것을 아는 것은 지형 변수 보간이 아니다.

따라서 bash 스크립트는 다음과 같아야 합니다:

#!/bin/bash
echo "rds = ${rds}" > /var/tmp/rds



변수를 전달하는 더 우아한 방법이 있기 때문입니다

테라폼의 새 기능을 사용하는 대신 선호


locals {
  WEB_SERVER_UNAME   = "your_username"
  WEB_SERVER_PASS    = "your_password"
}

resource "aws_instance" "web_01" {
  ....
  user_data_base64 = base64encode("${templatefile("${path.module}/user_data_script.sh", {
    WEB_SERVER_UNAME   = local.WEB_SERVER_UNAME
    WEB_SERVER_PASS    = local.WEB_SERVER_PASS
  })}")
  ....
}

를 사용하면 셸 스크립트 또는 환경 변수 내부의 변수를 참조하므로 아무것도 표시되지 않습니다.

템플릿 변수를 사용하려면 다음 방법으로 보간해야 합니다

자세한 내용은 다음을 참조하십시오


반응형