terraform main backend에서
bootstrap s3와 ddb를 참조 해야하잖아?
둘 다 aws에 생성된 hex 값이 아닌
내 리소스 이름을 넣어주면 되지?
--------------------------------------
resource "aws_s3_bucket" "tf_state" {
bucket = "my-tf-state-bucket-${random_id.suffix.hex}"
force_destroy = false
tags = { Name = "tf-state" }
}
# [2] DynamoDB
resource "aws_dynamodb_table" "tf_lock" {
name = "my_tf_lock"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
tags = { Name = "tf_lock" }
}
---------------------------------
bootstrap s3와 ddb를 참조 해야하잖아?
둘 다 aws에 생성된 hex 값이 아닌
내 리소스 이름을 넣어주면 되지?
--------------------------------------
resource "aws_s3_bucket" "tf_state" {
bucket = "my-tf-state-bucket-${random_id.suffix.hex}"
force_destroy = false
tags = { Name = "tf-state" }
}
# [2] DynamoDB
resource "aws_dynamodb_table" "tf_lock" {
name = "my_tf_lock"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
tags = { Name = "tf_lock" }
}
---------------------------------
맞아요. main 쪽 terraform { backend "s3" { ... } }에서는 “AWS에 생성된 리소스 ID(hex) 같은 값”을 넣는 게 아니라,
- S3는 “버킷 이름(bucket name)”
- DynamoDB는 “테이블 이름(table name)”
을 문자열로 넣으면 됩니다.
다만 중요한 포인트가 2개 있어요.
1) backend 블록은 변수/리소스 참조가 안 됩니다
backend "s3" 안에서는 이런 걸 못 써요:
- aws_s3_bucket.tf_state.id
- var.bucket_name
- ${random_id.suffix.hex} 같은 interpolation
즉, bootstrap에서 랜덤 suffix로 만든 “최종 버킷 이름”을 그대로(완성된 문자열로) 넣어야 합니다.
예)
- bootstrap 실제 생성 결과 버킷: my-tf-state-bucket-a1b2c3d4
- 그럼 main backend에는 bucket = "my-tf-state-bucket-a1b2c3d4" 로 “완성값”을 넣어야 함
DDB도 동일하게 실제 테이블 이름인 my_tf_lock을 그대로 넣으면 됩니다.
2) 권장 흐름: bootstrap output → main init 때 backend-config로 주입
bootstrap에서 output으로 뽑아두고, main에서는 terraform init -backend-config=... 로 넣는 방식이 가장 깔끔합니다.
bootstrap에 output 추가
output "tf_state_bucket_name" { value = aws_s3_bucket.tf_state.bucket } output "tf_lock_table_name" { value = aws_dynamodb_table.tf_lock.name }
bootstrap apply 후 출력에서 실제 값을 확인한 다음,
main에서 init 시 주입
terraform init \ -backend-config="bucket=my-tf-state-bucket-a1b2c3d4" \ -backend-config="key=envs/prod/terraform.tfstate" \ -backend-config="region=ap-northeast-2" \ -backend-config="dynamodb_table=my_tf_lock" \ -backend-config="encrypt=true"
(원하면 backend.hcl 파일로 저장해서 -backend-config=backend.hcl로도 가능)
결론
- S3: bucket에는 “버킷 이름” (랜덤 suffix까지 포함된 최종 이름)
- DDB: dynamodb_table에는 “테이블 이름” (여기선 my_tf_lock)
- 리소스의 hex ID 같은 건 넣는 게 아님
- backend 블록에서 참조 못 하니까 완성된 이름을 직접/ init 옵션으로 주입이 정석
원하면, 지금 bootstrap apply 결과로 실제 생성된 버킷 이름이 뭐로 나왔는지(콘솔/출력)만 알려줘요. 그 값 기준으로 main의 backend 설정을 딱 맞게 적어줄게요.
'[2] 250909~ 클라우드 > [b] 12월 : Terraform + Ansible' 카테고리의 다른 글
| [30] Github -> Ansible (0) | 2026.01.12 |
|---|---|
| [29] Ansible (0) | 2026.01.12 |
| [27] backend 실제 구현 (0) | 2026.01.09 |
| [26] tfstate 개념 (0) | 2026.01.07 |
| [25] variables 분리 (0) | 2026.01.07 |