반응형
테라폼: 변수를 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
})}")
....
}
를 사용하면 셸 스크립트 또는 환경 변수 내부의 변수를 참조하므로 아무것도 표시되지 않습니다.
템플릿 변수를 사용하려면 다음 방법으로 보간해야 합니다
자세한 내용은 다음을 참조하십시오
반응형
'개발하자' 카테고리의 다른 글
Typescript 클래스의 인스턴스에서 값을 변경하려면 어떻게 해야 합니까? (0) | 2023.05.19 |
---|---|
문장이 맞는지 확인하는 방법(파이썬에서 간단한 문법 검사)? (0) | 2023.05.18 |
terraformhcl 변수를 맵으로 생성합니다 (0) | 2023.05.17 |
Svelte 각 작업이 두 번 / 각 바인딩 오류(정의되지 않은 속성을 설정할 수 없음) (1) | 2023.05.17 |
Python: 이메일을 보낼 때 다른 우편함 사용 (0) | 2023.05.16 |