본문 바로가기

DevOps/Terraform

[DevOps] AWS, Terraform - Terraform 고도화 작업

Terraform state를 관리하는 Terraform Backend

Terraform State란?

Terraform apply를 하는 경우, 리소스 생성된 후 terraform.tfstate라는 파일이 생성됨

내가 실행한 apply의 결과를 저장해놓은 "상태"라고 보면 됨

but 현재 인프라의 상태를 의미하는 것은 아님 - 내가 적용한 시점의 상태이지, 현재의 상태는 아닐 수 있음

state는 원격 저장소인 backend에도 저장할 수 있음

 

Terraform Backend란?

Terraform “Backend” 는 Terraform의 state file을 어디에 저장을 하고, 가져올지에 대한 설정. 기본적으로는 로컬 스토리지에 저장을 하지만, 설정에 따라서 s3, consul, etcd 등 다양한 “Backend type“을 사용할 수 있음

 

Terraform Backend를 사용하는 이유?

  • Locking
    • 보통 Terraform 코드를 혼자 작성하지 않는다. S3같은 원격 저장소를 사용함으로써 동시에 같은 state를 접근하는 것을 막아 의도치 않은 변경을 방지할 수 있다.
  • Backup
    • 로컬 스토리지에 저장한다는건 유실할 수 있다는 가능성을 내포하므로 S3와 같은 원격저장소를 사용함으로써 state 파일의 유실을 방지한다.

 

Terraform Backend 실습

S3 bucket as backend
테라폼의 상태를 저장하기 위해 S3 버킷을 생성한다. AWS S3는 쉽게 구축할 수 있으며 versioning 을 지원하는 안전한 저장소이다.

DynamoDB Table for Lock
동시에 같은 파일을 수정하지 못하도록 하기 위해 DynamoDB에 작업에 대한 Lock을 생성한다.

 

cf. Dynamo DB?

AWS에서 제공하는 NoSQL 기반 Key, Value Store

 

즉, state 파일이 S3에 저장되고, S3 파일의 경로와 "Lock"을 할 수 있는 파일들이 Dynamo DB에 저장되어서 Terraform은 그 두 가지를 확인한 이후에 현재 이 파일이 사용되고 있는지 판단하게 됨

 

DynamoDB 테이블을 생성하기 위한 권한 부족

 

Terraform이 DynamoDB 테이블을 자동으로 생성하려고 할 때, 해당 IAM 역할에는 dynamodb:CreateTable 작업을 수행할 수 있는 권한이 필요합니다. 그러나 현재 IAM 역할에는 이 작업을 수행할 수 있는 정책이 없어서 발생한 오류이다.

 

AWS Management Console 또는 AWS CLI를 사용하여 IAM 역할에 대한 정책을 수정하여
IAM 역할에 dynamodb:CreateTable 작업을 허용하는 정책을 추가하거나 수정하면 된다.

 

resource "aws_iam_role_policy" "dynamodb_policy" {
  name = "DynamoDBPolicy"

  role = aws_iam_role.your_role.name

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "dynamodb:CreateTable",
      "Resource": "arn:aws:dynamodb:ap-northeast-2:348978036311:table/terraform-lock"
    }
  ]
}
EOF
}


변경된 IAM 정책을 적용하고 업데이트된 권한을 가진 IAM 역할을 사용하여 Terraform을 다시 실행합니다.
이렇게 하면 DynamoDB 테이블을 생성하기 위해 필요한 권한이 부여되고 오류가 해결될 수 있다.