DevOps/Terraform

[Terraform] 독립적인 배포 환경 만들기

TTOII 2022. 5. 3. 22:07
728x90

해당 이미지는 마켓컬리 DevOps 팀의 Terraform 배포 환경이다.

dev, qa, stg 환경으로 분리하여 코드를 관리하고 있다.

보통 개발을 할 때 하나의 환경에서 진행하지 않고 여러 환경을 세팅한 뒤 test를 거친 후 실제 서비스로 배포한다.

Terraform에서도 같은 모듈을 참조하면서 목적에 따라 다른 환경을 세팅할 수 있다.

 

module-test/module/vpc/main.tf

variable "cidr" {
    type = string
}

resource "asw_vpc" "my_vpc" {
    cidr_bloc = var.cidr

    tags = {
        Name = "My_VPC"
    } 
}

모든 환경에서 사용할 공통 vpc 모듈이다.

[vagrant@controller module-test]$ tree
.
├── main.tf
└── module
    └── vpc
        └── main.tf

 

module-test/main.tf

module "test-vpc" {
    source = "./module/vpc" # 현재 디렉토리의 module의 vpc에서 참조한다.

    cidr = "172.18.0.0/16"
}

모듈을 이렇게 참조하여 사용할 수 있다.

 

독립적인 배포 환경을 세팅해보자

[vagrant@controller module-test]$ mkdir -p env/dev
[vagrant@controller module-test]$ mv main.tf env/dev
[vagrant@controller module-test]$ mkdir -p env/stage
[vagrant@controller module-test]$ mkdir -p env/prod
[vagrant@controller module-test]$ tree
cd env/dev
terraform init

dev, stage, prod 환경을 만든다.

[vagrant@controller module-test]$ tree
.
├── env
│   ├── dev
│   │   └── main.tf
│   ├── prod
│   └── stage
├── module
│   └── vpc
│       └── main.tf
└── terraform.tfstate

6 directories, 3 files

트리 구조는 다음과 같다.

약간의 수정을 거쳐 실제로 환경에 따라서 terraform 코드를 다르게 배포해보자

cp env/dev/main.tf env/prod/ 
cp env/dev/main.tf env/stage/
[vagrant@controller module-test]$ tree
.
├── env
│   ├── dev
│   │   └── main.tf # 실행할 곳, dev의 root 모듈
│   ├── prod
│   │   └── main.tf # 실행할 곳, prod의 root 모듈
│   └── stage
│       └── main.tf # 실행할 곳, stage의 root 모듈
├── module # 각 환경은 모두 하위 모듈을 참조하고 있다. 
│   └── vpc
│       └── main.tf
└── terraform.tfstate

6 directories, 5 files
[vagrant@controller module-test]$ code env/prod/main.tf
[vagrant@controller module-test]$ code env/dev/main.tf
[vagrant@controller module-test]$ code env/stage/main.tf

각 파일의 cidr 블록을 prod 172.18.0.0/16 dev 172.19.0.0/16 stage 172.20.0.0/16 로 지정한다.

dev

[vagrant@controller module-test]$ cd env/dev
[vagrant@controller dev]$ ls
main.tf
[vagrant@controller dev]$ terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.test-vpc.aws_vpc.my_vpc will be created
  + resource "aws_vpc" "my_vpc" {
      + arn                                  = (known after apply)
      + cidr_block                           = "172.19.0.0/16"

stage

[vagrant@controller module-test]$ cd env/stage/
[vagrant@controller stage]$ terraform init
[vagrant@controller stage]$ terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.test-vpc.aws_vpc.my_vpc will be created
  + resource "aws_vpc" "my_vpc" {
      + arn                                  = (known after apply)
      + cidr_block                           = "172.20.0.0/16"

prod

[vagrant@controller module-test]$ cd env/prod
[vagrant@controller prod]$ terraform init
[vagrant@controller prod]$ terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.test-vpc.aws_vpc.my_vpc will be created
  + resource "aws_vpc" "my_vpc" {
      + arn                                  = (known after apply)
      + cidr_block                           = "172.18.0.0/16"

실행할 파일은 각 디렉토리(dev, prod, stage)에 있는 루트 모듈이지만 모듈은 하위 모듈을 참조하고 있다.

즉, 변수를 어떻게 세팅하느냐에 따라 환경이 달라진다.

728x90