ํ ๋ผํผ์ ๋ํ์ ์ธ IaC ๋๊ตฌ๋ก AWS ์ ๊ฐ์ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ์ฝ๋๋ก ๊ตฌ์ฑํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ณดํต ํด๋ผ์ฐ๋ ํ๊ฒฝ์ Dev ๊ณผ Prod ์ผ๋ก ๋๋๊ฒ ๋ฉ๋๋ค.
ํํธ, ํ ๋ผํผ์ ์ด์ฉํด์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด backend ๋ผ๋ ๊ณณ์ tfstate ๋ฅผ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
tfstate ๋ ๋ฆฌ์์ค์ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ์ผ์ด๊ณ , backend ๋ ์ด๋ฌํ tfstate ๋ฅผ ์ ์ฅํ๋ ๋ณด๊ด์ ์ ๋๋ค.
backend ๋ ๋ก์ปฌ์ด ๋ ์๋ ์๊ณ , AWS S3 ์ ๊ฐ์ ์ค๋ธ์ ํธ ์คํ ๋ฆฌ์ง๋ ๋ ์ ์์ต๋๋ค.
ํ๋ฒ, AWS S3 ์ Demo ๋ฒํท์ Dev ํ๊ฒฝ๊ณผ Prod ํ๊ฒฝ์ ๊ฐ์ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ๋์ผํ๊ฒ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
์์ ์ฝ๋๋ ์ฌ๊ธฐ์ ๊ฐ์ ธ์์ต๋๋ค!
์ฌ์ฉํ main.tf ๋ ์๋์ ๊ฐ๊ณ ,
resource "random_pet" "this" {
length = 2
}
module "simple_bucket" {
source = "terraform-aws-modules/s3-bucket/aws"
version = "4.1.2"
bucket = "kingbj0429-${random_pet.this.id}"
force_destroy = true
}
providers.tf ๋ ์๋์ ๊ฐ์ต๋๋ค.
terraform {
required_version = ">=1.5.0"
backend "s3" {
bucket = "backend-dev"
key = "tfstates/s3/demo-bucket.tfstate"
region = "ap-northeast-2"
profile = "iam-dev"
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.33.0"
}
}
}
provider "aws" {
shared_config_files = ["~/.aws/config"]
shared_credentials_files = ["~/.aws/credentials"]
profile = terraform.workspace == "dev" ? "s3-manager-dev-role" : "s3-manager-prod-role"
region = "ap-northeast-2"
default_tags {
tags = {
terraform = "true"
environment = terraform.workspace
}
}
}
๊ฐ๋จํ๊ฒ backend ๊ตฌ์ฑ์ ํ๋ฒ ์ดํด๋ณด๋ฉด,
backend ๋ "AWS S3" ๋ฅผ ์ฌ์ฉํ๊ณ , "backend-dev" ๋ฒํท์ tfstate ํ์ผ(์ค๋ธ์ ํธ)์ ์ ์ฅํฉ๋๋ค. ์ด๋ ์ ์ฅ๋๋ ์ค๋ธ์ ํธ์ ํค๋ "tfstates/s3/demo-bucket.tfstate" ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ "backend-dev" ๋ฒํท ์ ๋ํ ์ก์ธ์ค ๊ณ์ ์ผ๋ก๋ "iam-dev" ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ดํ ์ด์ ํ ๋ผํผ์ workspace ๊ธฐ๋ฅ์ ์ด์ฉํด์ dev ์ prod ๋๋ ํ ๋์ผํ .tf ๋ฅผ ์ด์ฉํด์ AWS Dev ์ Prod ํ๊ฒฝ์ ๊ฐ๊ฐ ์์ฑํด์ค ๊ฒ์ ๋๋ค.
init ์ workspace ๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ,
Dev ํ๊ฒฝ์ S3 ๋ฒํท์ ์์ฑํ๊ณ ,
$ terraform workspace select dev
$ terraform apply -auto-approve
workspace ๋๋ถ์ env:/ ๋ก tfstate ๊ฐ ๋ฐ๋ก ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Prod ํ๊ฒฝ์ S3 ๋ฒํท์ ์์ฑํฉ๋๋ค.
$ terraform workspace select prod
$ terraform apply -auto-approve
์ด๋ฒ์ env:/ ์ ํ์ ํค๊ฐ dev ๊ฐ ์๋ prod ์ธ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ฌ๊ธฐ์ ๊ฐ๊ณผํ ๊ฒ์ด ํ๋ ์์ต๋๋ค. S3 ๊ฐ ๋ฐฐํฌ๋๋ ํ๊ฒฝ์ Dev ์ Prod ๊ฐ ๋๋์ด์ก์ง๋ง, tfstate ๊ฐ ์ ์ฅ๋๋ backend ๋ ํ์ฌ Dev ํ๊ฒฝ์ ์๋ "backend-dev" ๋ฒํท์ ๋๋ค.
Prod ํ๊ฒฝ์ ์๋ S3 ๋ฒํท์ ๋ํ tfstate ๊ฐ Dev ํ๊ฒฝ์ ์๋ ๊ฒ์ด ๋ญ๊ฐ ์ฐ์ฐํฉ๋๋ค...
์ฌ์ค ์์ ๊ฐ์ด ํด๋ ๋ฌธ์ ๋ ๊ฒ์ ํ๋๋ ์์ต๋๋ค. ์ฃผ์ด์ง ์กฐ๊ฑด๊ณผ ํ๊ฒฝ์ ์ ๋ถ ๋ค๋ฅด๊ธฐ์ ์ ๋ต์ ์์ต๋๋ค.
๊ทธ๋๋ ์ ๋ Dev ํ๊ฒฝ์ ๋ํ tfstate ๋ฉด Dev ๋ฒํท์, Prod ํ๊ฒฝ์ ๋ํ tfstate ๋ฉด Prod ๋ฒํท์ ์๋ ๊ฒ์ด ๋ ๊น๋?ํ๋ค ์๊ฐ ํ๊ณ , ๋ฌด์๋ณด๋ค Prod ํ๊ฒฝ๊ณผ Dev ํ๊ฒฝ์ด ์์ ํ ๊ฒฉ๋ฆฌ๋์ด์ผ ํ๋ ์กฐ๊ฑด์ด ์์๊ธฐ ๋๋ฌธ์ ๋๋์ฑ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ง์์ฃ .
์์ ํ ๊ฒฉ๋ฆฌ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ AWS ๊ต์ฐจ ๊ณ์ ์ก์ธ์ค ๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๊ทธ๋์ ์ด๋ฒ ๊ธ์์๋ Multi-Cross-Backend ์ Multi-Cross-Account ๋ฅผ ์ฌ์ฉํด์ ์๋ก ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ์๋ก ๋ค๋ฅธ backend ์ tfstate ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ณ ์ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๋งํ๋ Multi-Cross-Account ๋ ๋จ์ํ ์๋ก ๋ค๋ฅธ ๊ณ์ ์ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ด์ง, AWS ๊ต์ฐจ ๊ณ์ ์ก์ธ์ค ๋ฅผ ๋งํ๋ ๊ฒ์ ์๋๋๋ค!
๋ ์ธ ๋๋์ฝ๋~
Multi-Cross-Backend X Multi-Cross-Account
providers.tf ์ ๋ค์ ํ๋ฒ ๋ณด์ฃ .
terraform {
required_version = ">=1.5.0"
backend "s3" {
bucket = "backend-dev"
key = "tfstates/s3/demo-bucket.tfstate"
region = "ap-northeast-2"
profile = "iam-dev"
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.33.0"
}
}
}
provider "aws" {
shared_config_files = ["~/.aws/config"]
shared_credentials_files = ["~/.aws/credentials"]
profile = terraform.workspace == "dev" ? "s3-manager-dev-role" : "s3-manager-prod-role"
region = "ap-northeast-2"
default_tags {
tags = {
terraform = "true"
environment = terraform.workspace
}
}
}
provider "aws" {} ์ค์ฝํ ์์๋ terraform.workspace ์ ๊ฐ์ variable ์ด๋ ์ผํญ์ฐ์ฐ์ ๋ฑ ์ ์ฌ์ฉํ ์ ์์ง๋ง, terraform {} ์ค์ฝํ ์์๋ ๊ทธ ์ด๋ ํ ๊ฒ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ์ ํ๋ ์ฝ๋ฉ๋ง ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ terraform.workspace ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๊ณ ๋ฐฉ๋ฒ์ด ์๋ ๊ฑด ์๋๋๋ค. backend "s3" {} ๋ด์ฉ์ ๋ฐ๋ก ํ์ผ๋ก ๋บ ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์์ฃ .
#-- dev.hcl
bucket = "backend-dev"
profile = "iam-dev"
region = "ap-northeast-2"
#-- prod.hcl
bucket = "backend-prod"
profile = "iam-prod"
region = "ap-northeast-2"
์ฐธ๊ณ ๋ก ํ์ผ์ ํ์ฅ์๋ .hcl ๋ , .txt ๋ , ์๋ ์๊ด ์์ต๋๋ค. ๊ฒฝ๋ก ๋ํ ์๊ด ์์ต๋๋ค.
์ดํ providers.tf ๋ ์๋์ ์์ ํ ์ ์์ต๋๋ค.
terraform {
required_version = ">=1.5.0"
backend "s3" {
key = "tfstates/s3/demo-bucket.tfstate"
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.33.0"
}
}
}
provider "aws" {
shared_config_files = ["~/.aws/config"]
shared_credentials_files = ["~/.aws/credentials"]
profile = terraform.workspace == "dev" ? "s3-manager-dev-role" : "s3-manager-prod-role"
region = "ap-northeast-2"
default_tags {
tags = {
terraform = "true"
environment = terraform.workspace
}
}
}
dev.hcl ์ prod.hcl ์ ์๋ ๊ฐ๋ค์ ๋ชจ๋ ์ ๊ฑฐ ํด์ค๊ฑฐ์ฃ .
๊ทธ๋ผ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด์ backend ์ configuration ์ ๋์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
-backend-config=backend-configs/dev.hcl ์ต์ ์ ํตํด backend ๋ฅผ backend-dev ๋ฒํท์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด์ง์.
$ terraform init -backend-config=backend-configs/dev.hcl -reconfigure
-reconfigure ์ต์ ์ ๋ํด ์๊ณ ์ถ๋ค๋ฉด ์ฌ๊ธฐ!
๊ผญ terraform workspace show ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ฌ workspace ๋ฅผ ํ์ธํ์๊ธธ ๋ฐ๋๋๋ค!
terraform apply ๋ ๋ง์ ์คํ ํ ํ ํ๋ฒ backend-dev ๋ฒํท์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
์ํ๋ ๋ฐ๋๋ก ์ ์์ฑ๋์์ต๋๋ค!
๊ทธ๋ผ ์ด๋ฒ์ prod.hcl ๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
workspace ๋ฅผ ์ฎ๊ธด ํ์ init ๋ช ๋ น์ด๋ฅผ ํด์ค๋๋ค.
$ terraform init -backend-config=backend-configs/prod.hcl -reconfigure
$ terraform workspace new prod
-reconfigure ์ต์ ์ ๋ก์ปฌ backend ๊ตฌ์ฑ์ ์ด๊ธฐํ ํ๊ธฐ ๋๋ฌธ์ ์๋กญ๊ฒ workspace ๋ฅผ ๋ง๋ค์ด์ค์ผ ํฉ๋๋ค!
backend-prod ๋ฒ์ปท์ ์๊ธด ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ก์จ backend ๋ฅผ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
workspace ๋ ์ด์ฉํด๋ ์ถฉ๋ถํ Dev ์ Prod ํ๊ฒฝ์ ๋ถ๋ฆฌํ ์ ์์ง๋ง, ์์์ ๋ณด์ธ ์์ ์ฒ๋ผ Dev ํ๊ฒฝ์ ์๋ backend-dev ๋ฒํท์ tfstate ๊ฐ ์ ์ฅ๋ ๊ฒฝ์ฐ, backend-dev ๋ฒํท์ ๋ํ ์ก์ธ์ค๋ง ์์ผ๋ฉด ์ถฉ๋ถํ Prod ํ๊ฒฝ์๋ ์ํฅ์ ๋ผ์น ์ ์๋ค๋ ์ํ์ฑ์ด ์กด์ฌํฉ๋๋ค.
์๋ฅผ ๋ค์ด, A ๋ Prod ๋ฆฌ์์ค์ ๋ํ tfstate ๋ฅผ backend-dev ๋ฒํท์ ์ ์ฅํ๊ฒ ๋๋๋ฐ, backend-dev ๋ฒํท์ ๋ํด์๋ B ๋ ์ก์ธ์ค ๊ถํ์ด ์์ต๋๋ค. ์ด๋ B ๋ Prod ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ์์ง๋ง, backend-dev ๋ฒํท์ ์๋ Prod ๋ฆฌ์์ค์ ๋ํ tfstate ์ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋น์ฐํ ๋ณด์์ ์ผ๋ก ๋งค์ฐ ์ข์ง ์์ต๋๋ค.
๊ทธ๋ ๋ค๊ณ ์์ ํ ๋ถ๋ฆฌํ๋ ๊ฒ๋ ์ข์ ์ ๋ง ์๋ ๊ฒ์ ์๋๋๋ค. ๊ด๋ฆฌํ ๊ฒ์ด ๋ง์์ง๊ธฐ ๋๋ฌธ์ ๋ณต์ก์ฑ์ด ์ฌ๋ผ ๊ฐ ์ ๋ฐ์ ์์ฃ .
๋ค์ ํ๋ฒ ๊ฐ์ํ์ง๋ง backend ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์๋ ์ ๋ต์ด ์์ผ๋ฉด ์ฃผ์ด์ง ํ๊ฒฝ์ ๋ง๊ฒ ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!
'DevOps > Terraform' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Terraform] -migrate-state vs. -reconfigure (29) | 2024.02.19 |
---|