Terraform 관리 · 4 min read · Dec 10, 2025

AWS S3 버킷에서 Terraform 상태 관리하는 방법

이 기사에서는 Terraform 상태가 무엇인지, S3 버킷에서 이를 관리하는 방법을 살펴보겠습니다. 또한 Terraform에서 “lock”이 무엇인지, 이를 구현하는 방법도 살펴보겠습니다. 이를 구현하기 위해 AWS에서 S3 버킷과 DynamoDB 테이블을 생성해야 합니다.

진행하기 전에 Terraform 상태와 Lock의 기본 개념을 이해해 봅시다.

  • Terraform 상태 (terraform.tstate 파일):
    상태 파일은 terraform 구성 파일에 정의된 리소스에 대한 정보를 포함합니다. 예를 들어, terraform 구성을 사용하여 EC2 인스턴스를 생성한 경우, 상태 파일에는 AWS에서 생성된 실제 리소스에 대한 정보가 포함됩니다.
  • 상태 파일을 저장하기 위한 S3 백엔드:
    팀에서 작업하는 경우, 팀원들이 접근할 수 있도록 terraform 상태 파일을 원격으로 저장하는 것이 좋습니다. 상태를 원격으로 저장하기 위해서는 두 가지가 필요합니다: 상태 파일을 저장할 S3 버킷과 terraform S3 백엔드 리소스입니다.
  • Lock:
    상태 파일을 원격으로 저장하여 여러 사람이 접근할 수 있도록 하면, 여러 사람이 동시에 동일한 파일을 변경하려고 시도할 위험이 있습니다. 따라서 현재 다른 사용자가 사용 중인 경우 상태를 “lock”할 수 있는 메커니즘이 필요합니다. 이를 위해 terraform이 사용할 DynamoDB 테이블을 생성할 수 있습니다.

여기에서는 S3 버킷을 수동으로 생성하고, 필요한 정책을 추가하고, Terraform을 사용하여 DynamoDB 테이블을 생성하고, Terraform을 S3를 백엔드로 사용하고 DynamoDB를 lock 저장소로 구성하는 모든 단계를 살펴보겠습니다.

전제 조건

  1. Terraform에 대한 기본 이해.
  2. S3 버킷에 대한 기본 이해.
  3. 시스템에 설치된 Terraform.
  4. AWS 계정 (없다면 생성하십시오).
  5. AWS IAM 사용자에 대한 ‘access_key’ 및 ‘secret_key’. (AWS에서 ‘access_key’ 및 ‘secret_key’로 IAM 사용자 생성하는 방법을 배우려면 여기를 클릭하십시오.)

우리가 할 일

  1. S3 버킷을 생성하고 정책을 첨부합니다.
  2. Terraform을 사용하여 DynamoDB 테이블을 생성합니다.
  3. Terraform 구성 파일을 사용하여 EC2를 생성합니다.
  4. Terraform을 사용하여 생성된 EC2 인스턴스를 삭제합니다.

S3 버킷을 생성하고 정책을 첨부합니다.

AWS 계정에서 S3 버킷을 생성하는 방법을 배우려면 여기를 클릭하십시오. 버킷을 생성한 후, 다음 정책을 첨부합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1560164441598",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:PutObject*",
                "s3:List*",
                "s3:Get*",
                "s3:Delete*"
            ],
            "Resource": [
                "arn:aws:s3:::state-lock-rahul",
                "arn:aws:s3:::state-lock-rahul/*"
            ]
        }
    ]
}

“AWS_ACCESS_KEY_ID” 및 “AWS_SECRET_ACCESS_KEY”를 구성하여 CLI에서 계정에 접근할 수 있도록 합니다.

다음 명령어를 사용하여 “AWS_ACCESS_KEY_ID” 및 “AWS_SECRET_ACCESS_KEY”의 값을 내보냅니다.

export AWS_ACCESS_KEY_ID=AKIAQ6GAIA5XC2XMMM7W
export AWS_SECRET_ACCESS_KEY=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
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEY

자격 증명을 구성한 후, 다음 명령어를 사용하여 버킷 목록을 나열하여 테스트할 수 있습니다.

aws s3 ls

Terraform을 사용하여 DynamoDB 테이블 생성

필요한 변수를 선언하는 ‘variables.tf’를 생성합니다.

vim variables.tf

variable "region" {
     description = "AWS VPC의 지역"
}

DynamoDB 테이블을 생성하는 책임이 있는 ‘main.tf’를 생성합니다. 이 main.tf는 variables.tf에서 변수의 값을 읽습니다. 이 테이블은 lock을 저장하는 데 사용됩니다.

provider "aws" {
      region     = "${var.region}"
}  
resource "aws_dynamodb_table" "terraform_locks" {  
  name         = "rahul-test-dynamodb-table"  
  billing_mode = "PAY_PER_REQUEST"  
  hash_key     = "LockID"  
  attribute {  
    name = "LockID"  
    type = "S"  
  }  
}

사용할 첫 번째 명령어는 ‘terraform init’입니다. 이 명령어는 구성 내에서 사용되는 공급자에 대한 플러그인을 다운로드하고 설치합니다. 우리의 경우 이는 AWS입니다.

* terraform init*

두 번째 명령어는 ‘terraform plan’입니다. 이 명령어는 인프라에서 어떤 변경이 발생할지를 확인하는 데 사용됩니다.

terraform plan

‘terraform apply’ 명령어는 main.tf 파일에 언급된 AWS에서 리소스를 생성합니다. 리소스를 생성하기 위해 입력을 제공하라는 메시지가 표시됩니다.

terraform apply

이제 콘솔의 DynamoDB 대시보드로 이동하여 테이블이 생성되었는지 확인할 수 있습니다.

지금까지 S3 콘솔에서 수동으로 S3 버킷을 생성하고 Terraform을 사용하여 DynamoDB 테이블을 생성했습니다. 우리는 S3 버킷을 상태를 저장하는 백엔드로 구성하고 DynamoDB 테이블을 lock 저장소로 구성하지 않았습니다.

목표를 달성하기 위해 Terraform main.tf 파일을 수정해야 합니다. 코드를 수정하고 실행하면 기존 로컬 상태가 S3 백엔드로 복사됩니다.

기존 main.tf를 다음 코드로 업데이트합니다.

vim main.tf

provider "aws" {
      region     = "${var.region}"
}
 
terraform {
  backend "s3" {
    bucket         = "state-lock-rahul"
    key            = "test/terraform.tfstate"
    region         = "eu-west-3"
    dynamodb_table = "rahul-test-dynamodb-table"
  }
}
 
resource "aws_dynamodb_table" "terraform_locks" {
  name         = "rahul-test-dynamodb-table"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}

이제 “terraform plan” 명령어를 사용하여 어떤 새로운 리소스가 생성될지를 확인하려고 하면, 명령어가 다음 오류로 실패합니다.

백엔드를 재초기화하라는 메시지가 표시됩니다.

백엔드를 재초기화하려면 “terraform init” 명령어를 사용합니다. 이 단계에서 로컬 상태 파일이 S3 버킷으로 복사됩니다.

terraform init

“terraform init” 명령어를 실행한 후 출력 결과를 확인할 수 있으며, Terraform이 DynamoDB 테이블을 사용하여 lock을 획득하도록 활성화되었습니다. Locking이 활성화되면 동일한 리소스에 대해 두 개의 동일한 작업을 병렬로 수행할 수 없습니다.

AWS 콘솔의 S3 대시보드로 이동하여 terraform.tfstate가 복사되었는지 확인할 수 있습니다.

이제 새로운 리소스를 생성하고 상태가 S3 버킷에 저장되는 것을 확인할 수 있습니다. 새로운 DynamoDB 테스트 테이블을 생성하려면 main.tf 파일을 다음 코드로 업데이트합니다.

vim main.tf

variable "region" {
     description = "AWS VPC의 지역"
}

Rahuls-MacBook-Pro:terraform rahul$ cat main.tf 
provider "aws" {
      region     = "${var.region}"
}


tf {
  backend "s3" {
    bucket         = "state-lock-rahul"
    key            = "test/terraform.tfstate"
    region         = "eu-west-3"
    dynamodb_table = "rahul-test-dynamodb-table"
  }
}

resource "aws_dynamodb_table" "terraform_locks" {
  name         = "rahul-test-dynamodb-table"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}


resource "aws_dynamodb_table" "test-table" {
  name         = "rahul-test-table"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
  }
}

이번에는 공급자에 대한 백엔드 변경이 없으므로 “terraform init”을 실행할 필요가 없습니다.

새로운 리소스가 생성될지를 확인하기 위해 “terraform plan” 명령어를 사용할 수 있습니다.

terraform plan

이제 다음 명령어를 실행하여 새로운 DynamoDb 테스트 테이블을 생성합니다.

terraform apply

위 스크린샷에서 Locking이 활성화되었으며, .tfstate 파일이 S3로 복사되고 있음을 볼 수 있습니다.

이제 콘솔에서 새로운 테이블이 생성되었음을 확인할 수 있습니다.

이제 Terraform을 사용하여 생성한 리소스가 더 이상 필요하지 않다면, 다음 명령어를 사용하여 리소스를 삭제합니다.

terraform destroy

리소스를 삭제하자마자 lock에 사용되었던 테이블도 삭제된 것을 볼 수 있습니다. S3 버킷도 필요하지 않다면 콘솔에서 삭제할 수 있습니다.

결론

이 기사에서는 Terraform에서 원격 상태 및 locking을 사용하는 필요성에 대해 배웠습니다. S3 버킷을 Terraform 상태를 저장하는 백엔드로 사용하고 DynamoDb 테이블을 locking을 활성화하는 방법을 살펴보았습니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.