[2] 250909~ 클라우드/[b] 12월 : Terraform + Ansible

[28] 리소스 참조

서버관리자 페페 2026. 1. 9. 21:34
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" }
}

---------------------------------

 

맞아요. 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