공부/IaC

[Terraform] 실행 환경 분리와 Backend 설정 (AWS/Terraform Cloud)

haejang 2021. 10. 10. 16:28
728x90
728x90

 

Terraform Backend에 대해 썼던 기존 글

 

위 글들은 잘 모르는 상태에서 책 내용을 정리만 해 놓은 것이었다

테라폼을 실무에서 쓰게 되면서 깨닫고 느낀 것들을 다시 정리해 보겠다

 

 

Terraform 실행 환경 분리 & Backend 설정의 필요성


참고한 글 : https://rampart81.github.io/post/terraform-directory-structure/

 

Terraform은 기본적으로 apply가 일어나는 폴더 내의 .tf 파일들을 모두 실행시킨다

VPC/EC2와 같은 기본적인 인프라만 프로비저닝할거라면 상관없지만, Database/Directory/Code Series/DNS 등 다양한 서비스들을 한꺼번에 프로비저닝시키는건 딱 봐도 바람직하지 못해 보인다

따라서 Terraform의 Best Practice는 경별로, 컴포넌트 혹은 카테고리별로 실행 환경을 분리하는 것이 된다

그리고 실행 환경을 분리한다는 것은 Directory를 분리한다는 것과 같은 말이다

 

대충 이런식으로....

 

그러나 테라폼에선 다른 폴더에 있는 .tf 파일을 모듈로 불러오지 않는 한 참조할 수 없다

infra와 database는 따로 프로비저닝 되더라도 서로의 리소스와 설정 사항을 읽어올 수 있어야 하는데, 폴더가 분리되어 있으면 어떻게 읽어온단 말인가?

-> Remote한 곳에 Backend를 설정한 후 .tfstate 파일을 공유하면 된다

 

즉, 백엔드는 Local이 아닌 Remote한 곳에 .tfstate 파일을 저장시키는 기능이며, Remote에 저장된 .tfstate 파일을 참조해서 다른 Directory에서도 해당 리소스를 참조할 수 있게 된다

 

AWS나 Terraform Cloud를 사용하는 경우 Backend

 

참고로 AWS S3에 Backend를 설정하는 경우, DynamoDB table을 같이 프로비저닝해 상태 잠금을 설정해줄 수 있다

Terraform Cloud를 쓰는 경우엔 상태 잠금이 자동으로 이루어진다

 

그럼 이제 실제로 Backend를 설정한 후, 다른 실행 환경의 리소스를 땡겨와보도록 하겠다

 

Backend 설정 (AWS S3)


백엔드 설정 후 리소스 땡겨오는 것 자체만을 최대한 간단하게 보여주기 위해, vpc와 subnet을 다른 실행 환경에서 프로비저닝해보도록 하겠다

(보통 vpc와 subnet은 같은 곳에서 실행시키는게 맞다...말 그대로 테스트용)

참고로 모듈 사용도 빼고 진행함

 

/aws/vpc/

# /aws/vpc/backend.tf
# honglab-tf-backend라는 s3 bucket에 vpc.tfstate라는 파일로 backend 설정
terraform {
  backend "s3" {
    bucket = "honglab-tf-backend"
    key    = "vpc.tfstate"
    region = "ap-northeast-2"
    encrypt = true
  }
}

# /aws/vpc/main.tf
# vpc 프로비저닝
resource "aws_vpc" "vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true
  tags = {
    Name = "AWS Backend Test VPC"
  }
}

# /aws/vpc/output.tf
# tfstate 파일에 vpc id를 올리기 위한 output 설정
output "vpc_id" {
  value = aws_vpc.vpc.id
}

 

VPC의 ID를 output으로 빼줘야지만 다른 곳에서도 쉽게(output명으로) 참조가 가능해진다

apply를 통해 VPC를 생성하면 아래와 같은 vpc.tfstate 파일이 S3에 업로드 되어있다

 

{
  "version": 4,
  "terraform_version": "0.14.8",
  "serial": 0,
  "lineage": "70da23f2-d354-b2cb-6067-c2a326c659cd",
  "outputs": {
    "vpc_id": {
      "value": "vpc-0ade55dd616a5fa9a",
      "type": "string"
    }
  },
  "resources": [
    {
      "mode": "managed",
      "type": "aws_vpc",
      "name": "vpc",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          ...
        }
      ]
    }
  ]
}

 

"outputs"으로 나와있는 "vpc_id"를 참조해서 Subnet도 만들어보겠다

 

/aws/subnet/

# /aws/subnet/data.tf
# honglab-tf-backend라는 s3 bucket에 vpc.tfstate라는 파일을 vpc로 참조
data "terraform_remote_state" "vpc" {
  backend = "s3"
  config = {
    bucket  = "honglab-tf-backend"
    key     = "vpc.tfstate"
    region  = "ap-northeast-2"
  }
}

# /aws/subnet/main.tf
# vpc_id를 참조해서 subnet 프로비저닝
resource "aws_subnet" "subnet" {
  cidr_block = "10.0.0.0/24"
  availability_zone = "ap-northeast-2a"
  vpc_id = data.terraform_remote_state.vpc.outputs.vpc_id
  tags = {
    Name = "AWS Backend Test Subnet"
  }
}

 

마찬가지로 Subnet 정보를 다른 곳에서 참조를 해야한다면 이 폴더 내에도 백엔드와 output 설정을 해주면 된다

 

 

Backend 설정 (Terraform Cloud)


귀찮으니까 백엔드 설정과 데이터로 땡겨오는 부분의 코드만 적어보겠다

Terraform Cloud를 사용하는 방법은 아래 글을 참조하자

[Terraform CI/CD] Terraform Cloud 사용법 (GitHub -> AWS)

 

/tf_cloud/vpc/backend.tf

terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "honglab-tf-backend"

    workspaces {
      name = "honglab-tf-backend-vpc"
    }
  }
}

 

/tf_cloud/subnet/data.tf

data "terraform_remote_state" "vpc" {
  backend = "remote"

  config = {
    organization = "honglab-tf-backend"
    workspaces = {
      name = "honglab-tf-backend-vpc"
    }
  }
}

 

나머지 코드들은 전부 동일하다

 

GitHub에서 Code 확인 : https://github.com/suminhong/honglab-tf-backend

 

 

 

 

728x90
728x90