[0]
infra/
├── .gitignore
├── README.md
├── bootstrap/
│ ├── main.tf
│ ├── .terraform/
│ └── .terraform.lock.hcl
├── main/
│ ├── backend.tf
│ ├── main.tf
│ ├── variables.tf
│ ├── terraform.tfvars
│ ├── outputs.tf
│ ├── .terraform/
│ └── .terraform.lock.hcl
개요
boostrap에서는 BE를 s3로 걸어버리면 terraform init 단계에서 Bucket이 없어서 막힘
1. bootstrap (로컬 state) 로 실행
-> S3 + DDB 생성
-> tfstate가 로컬에 한번 생김
2. main (S3 be) 실행
-> 실제 인프라 생성 + 상태 S3저장 + DDB락
* main은 Bootstrap 리소스를 인프라 리소스로 관리x
-> 단순히 저장소 / 락 서비스로만 사용
실무
: Terraform이 자기 상태를 관리하는 저장소는 그 Terraform이 관리하지 않는다
[1]
bootstrap
# backend없이 local로 한번 apply
# [0] provider
terraform {
required_version = ">= 1.5.6"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.0"
}
}
}
provider "aws" {
region = "ap-northeast-2"
}
# [1] s3 bucket
resource "random_id" "suffix" {
byte_length = 4
}
resource "aws_s3_bucket" "tf-state" {
bucket = "my-tf-state-bucket-${random_id.suffix.hex}"
force_destroy = false
tags = { Name = "tf-state" }
}
resource "aws_s3_bucket_versioning" "versioning" {
bucket = aws_s3_bucket.tf-state.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "enc" {
bucket = aws_s3_bucket.tf-state.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
resource "aws_s3_bucket_public_access_block" "block" {
bucket = aws_s3_bucket.tf-state.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
# [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" }
}
-
[2]
main + backend
terraform {
backend "s3" {
bucket = "my-tf-state-bucket"
key = "envs/prod/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "my-tf-lock"
encrypt = true
}
}
[3]
생성 확인
버킷

버저닝

enc

block (ACL)


-
Amazon S3 버킷에 대한 기본 암호화를 구성하려는 경우 다음 암호화 유형 중 하나를 사용할 수 있습니다.
- Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)(기본값)
- AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS)
- AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)
기본 옵션(SSE-S3)의 경우 Amazon S3는 가장 강력한 블록 암호 중 하나인 256비트 Advanced Encryption Standard(AES-256)를 사용하여 버킷에 업로드되는 각 객체를 암호화합니다. SSE-KMS를 사용하면 키를 더 효과적으로 제어할 수 있습니다. SSE-KMS를 사용하는 경우 AWS KMS 고객 관리형 키를 선택하거나 기본 AWS 관리형 키(aws/s3)를 사용할 수 있습니다. SSE-KMS도 KMS 키가 사용된 때와 사용 주체를 표시하는 감사 추적 기능을 제공합니다. DSSE-KMS를 통해 Amazon S3는 두 개의 개별 객체 수준 암호화 계층을 적용하여 규제가 엄격한 고객의 규정 준수 요구 사항을 충족합니다.


'[2] 250909~ 클라우드 > [b] 12월 : Terraform + Ansible' 카테고리의 다른 글
| [29] Ansible (0) | 2026.01.12 |
|---|---|
| [28] 리소스 참조 (0) | 2026.01.09 |
| [26] tfstate 개념 (0) | 2026.01.07 |
| [25] variables 분리 (0) | 2026.01.07 |
| [24] IAMROLE 추가 (0) | 2025.12.29 |
