웹사이트 검색

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


이 기사에서는 Terraform 상태가 무엇이며 S3 버킷에서 이를 관리하는 방법을 살펴봅니다. 또한 Terraform에서 \잠금\이 무엇이고 어떻게 구현하는지 알아봅니다. 이를 구현하려면 AWS에서 S3 버킷과 DynamoDB 테이블을 생성해야 합니다.

계속 진행하기 전에 Terraform 상태 및 잠금의 기본 사항을 이해합시다.

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

여기서는 수동으로 S3 버킷 생성, 필요한 정책 추가, Terraform을 사용하여 DynamoDB 테이블 생성, S3를 백엔드로 사용하고 DynamoDB를 잠금 저장에 사용하도록 Terraform을 구성하는 모든 단계를 볼 수 있습니다.

전제 조건

  1. Terraform에 대한 기본적인 이해.
  2. S3 Bucket에 대한 기본적인 이해.
  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/*"
            ]
        }
    ]
}

CLI에서 계정에 액세스할 수 있도록 \AWS_ACCESS_KEY_ID\ 및 \AWS_SECRET_ACCESS_KEY\를 구성합니다.

다음 명령을 사용하여 \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 = "Region of AWS VPC"
}

DynamoDB 테이블 생성을 담당하는 main.tf를 생성합니다. 이 main.tf는 variables.tf에서 변수 값을 읽습니다. 이 테이블은 잠금을 저장하는 데 사용됩니다.

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 대시보드로 이동하여 테이블이 생성되었는지 여부를 확인할 수 있습니다.

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

목표를 달성하려면 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 테이블을 사용하여 잠금을 획득하도록 활성화되었습니다. 잠금이 활성화되면 동일한 리소스에서 두 개의 동일한 작업을 병렬로 수행할 수 없습니다.

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

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

vim main.tf

variable "region" {
     description = "Region of AWS VPC"
}

Rahuls-MacBook-Pro:terraform rahul$ cat 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"
  }
}


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

위의 스크린샷에서 잠금이 활성화되고 .tfstate 파일이 S3에 복사되는 것을 볼 수 있습니다.

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

이제 Terraform을 사용하여 만든 리소스가 더 이상 필요하지 않으면 다음 명령어를 사용하여 리소스를 삭제하세요.

terraform destroy

리소스를 삭제하자마자 잠금에 사용하던 테이블도 삭제된 것을 확인할 수 있습니다. S3 버킷도 필요하지 않은 경우 콘솔에서 삭제할 수 있습니다.

결론

이 기사에서는 Terraform에서 원격 상태 사용 및 잠금의 필요성에 대해 배웠습니다. S3 버킷을 백엔드로 사용하여 Terraform 상태 및 DynamoDb 테이블을 저장하여 잠금을 활성화하는 단계를 보았습니다.