ํ ๋ผํผ์ ์ฒ์ ์์ํ๋ฉด ํท๊ฐ๋ฆฌ๋ ๋ช ๋ น์ด ์ต์ ์ด ์์ต๋๋ค.
๋ฐ๋ก terraform init ๋ช ๋ น์ด์ -migrate-state ์ -reconfigure ์ฃ .
๋ณดํต backend ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๋ฉด ํด๋น ์ต์ ์ ์ฌ์ฉํ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๋ก๊ทธ์์ -migrate-state ์ -reconfigure ์ ๋ํ ์ค๋ช ์ด ๋์์์ง๋ง ๋ฑํ ์๋ฟ์ง๋ ์์ต๋๋ค.
tfstate ์ ๋ฐฉํฅ์ฑ์ ์ข์ง์ฐ์ง ํ๋ ์ต์ ์ด๊ธฐ ๋๋ฌธ์ ์๋ชป ์ผ๋ค๊ฐ ์ธํ๋ผ๊ฐ ๊ผฌ์ผ ์๋ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ถ๋ช ๋ณ๊ฒฝ(0 to change)ํ๋ ๊ฑด๋ฐ ์๋กญ๊ฒ(1 to add) ์์ฑํ๋ค๋ ๋ฌธ๊ตฌ๋ฅผ ๋ณผ ์ ์์ฃ .
์ด๋ฐ ๊ฒฝ์ฐ๋ ๋ณดํต backend ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๊ณ , -reconfigure ๋ฅผ ์ฌ์ฉํ์ ๋ ๋ฐ์ํฉ๋๋ค.
์์ ์ฌ์ ๋ฑ ํ๋์ state ๋ง ์กด์ฌํ์ง๋ง ์ค์ ์ธํ๋ผ ํ๊ฒฝ์ด๋ผ๋ฉด ์๋นํ ๊ท์ฐฎ์์ง๋ ์ผ์ด ๋ฐ์ํ ์ ์์ฃ . (import block ๊ฐ์..)
๊ทธ๋ผ ์ด์ ๊ฐ ์ต์ ์ ๋ํด ์์๋ณด๊ณ , ์ธ์ ์ด๋ค ์ต์ ์ ์ฌ์ฉํ๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
๋ ์ธ ๋๋์ฝ๋~
-reconfigure
๋ค์ ํ๋ฒ ๋ง์๋๋ฆฌ๋ฉด ์๋์ ๊ฐ์ด backend ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๋ฉด -migrate-state ์ -reconfigure ๊ด๋ จ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
terraform {
required_version = ">= 1.5.0"
backend "local" {
path = "./tfstates/random-pet.tfstate" #-- ์ด ๊ฐ์ ๋ณ๊ฒฝํ์ ๊ฒฝ์ฐ ๋ฐ์
}
required_providers {
random = {
source = "hashicorp/random"
version = "3.6.0"
}
}
}
terraform block ์ backend ๊ตฌ์ฑ์ ๋ฐ๊พธ๋ฉด ์๋์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๋ฒ์ญํด๋ณด์๋ฉด "state(tfstate ํ์ผ) ์ ๋ํ ๋ณ๊ฒฝ ์์ด ํ์ฌ์ ์ค์ ๊ฐ์ ์ ์ฅํ๊ณ ์ถ์ผ๋ฉด -reconfigure ๋ฅผ ์ฌ์ฉํด๋ผ" ์ ๋๋ค.
๋ฌด์จ ๋ง์ธ์ง ๋๋์ ์ค๋ ํ์คํ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.. (์ ๋ง ๊ทธ๋ฐ ๊ฑฐ์ผ ์๋ ใ ใ )
ํ๋ฒ ์ค์ต์ผ๋ก ์์ธํ ์ดํดํด๋ณด์ฃ !
์ฝ๋๋ ๊ฐ๋จํ terraform block ๊ณผ random ๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค.
terraform {
required_version = ">= 1.5.0"
backend "local" {
path = "./tfstates/random-pet.tfstate"
}
required_providers {
random = {
source = "hashicorp/random"
version = "3.6.0"
}
}
}
resource "random_pet" "server" {}
terraform init ์ ํตํด ๋ฐฑ์๋ ๊ตฌ์ฑ๊ณผ ๋ชจ๋ ๋ฑ์ ์ธํ ํด์ค๋๋ค.
terraform init ์ ์งํํ๊ฒ ๋๋ฉด .terraform/terraform.tfstate ์ ๋ฐฑ์๋์ ๋ชจ๋ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
ํ์ผ ๋ด์ฉ์ ๋ณด๋ฉด backend ๊ตฌ์ฑ์ด ๋์ด ์๋๋ฐ, ํ์ฌ ./tfstates/random-pet.tfstate ๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์์ต๋๋ค.
{
"version": 3,
"serial": 1,
"lineage": "ab7ad77f-6b5b-a79a-496e-7d244bc1085a",
"backend": {
"type": "local",
"config": {
"path": "./tfstates/random-pet.tfstate", #-- ์ฌ๊ธฐ
"workspace_dir": null
},
"hash": 3115818295
},
"modules": [
{
"path": [
"root"
],
"outputs": {},
"resources": {},
"depends_on": []
}
]
}
์ดํ ๋ฐฑ์๋ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํด๋ณด๊ฒ ์ต๋๋ค.
terraform {
required_version = ">= 1.5.0"
backend "local" {
path = "./tfstates/change-pet.tfstate" #-- ๋ณ๊ฒฝ
}
required_providers {
random = {
source = "hashicorp/random"
version = "3.6.0"
}
}
}
resource "random_pet" "server" {}
๊ธฐ์กด ๋ฐฑ์๋ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฌธ๊ตฌ๊ฐ ๋์ฌ ๊ฒ์ด๊ณ , ํด๊ฒฐํ๊ธฐ ์ํด -reconfigure ๋ฅผ ์ฌ์ฉํด์ค๋๋ค.
ํ๊ฒ ๋๋ฉด ๋ฐฑ์๋ ๊ตฌ์ฑ์ด ./tfstates/change-pet.tfstate ๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
{
"version": 3,
"serial": 2,
"lineage": "ab7ad77f-6b5b-a79a-496e-7d244bc1085a",
"backend": {
"type": "local",
"config": {
"path": "./tfstates/change-pet.tfstate", #-- ๋ณ๊ฒฝ๋จ
"workspace_dir": null
},
"hash": 1312397314
},
"modules": [
{
"path": [
"root"
],
"outputs": {},
"resources": {},
"depends_on": []
}
]
}
๊ทธ๋ผ ์ด๋ฒ์ terraform apply ๊น์ง ์งํํด๋ณด๊ฒ ์ต๋๋ค.
terraform {
required_version = ">= 1.5.0"
backend "local" {
path = "./tfstates/random-pet.tfstate" #-- ์๋ ๋ฐฑ์๋ ๊ตฌ์ฑ
}
required_providers {
random = {
source = "hashicorp/random"
version = "3.6.0"
}
}
}
resource "random_pet" "server" {}
๋ฐฑ์๋ ๊ตฌ์ฑ์ ๋ช ์ํ ๊ฒฝ๋ก์ state ๋ฅผ ๋ด๊ณ ์๋ tfstate ๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ดํ ๋ค์ ๋ณ๊ฒฝํด๋ณด๊ณ terraform apply ๋ฅผ ์งํํ๊ฒ ์ต๋๋ค.
terraform {
required_version = ">= 1.5.0"
backend "local" {
path = "./tfstates/change-pet.tfstate"
}
required_providers {
random = {
source = "hashicorp/random"
version = "3.6.0"
}
}
}
resource "random_pet" "server" {}
terraform init, apply ๋ ๋ค ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ, ๋ฐ๋ผ๋ณด๊ณ ์๋ tfstate ๊ฐ ๋ณ๊ฒฝ๋์ ๊ทธ๋ ์ต๋๋ค.
.terraform/terraform.tfstate ์ ๋ช ์๋์ด ์๋ ๋ฐฑ์๋ ๊ตฌ์ฑ ๊ฒฝ๋ก์ ๋ณ๊ฒฝ๋ change-pet.tfstate ๊ฐ ์์ด์ ๊ทธ๋ ์ฃ .
์ด๋ -reconfigure ์ต์ ์ ํตํด .terraform/terraform.tfstate ์ ๋ช ์๋์ด ์๋ ๋ฐฑ์๋ ๊ตฌ์ฑ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํด์ ๋ณ๊ฒฝ๋ tfstate ๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ํฉ๋๋ค.
-reconfigure ๋ฅผ ์ฌ์ฉํด๋ณด๋ฉด ๋ฌธ์ ์์ด ์ ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
ํ์ง๋ง ์ฃผ์ํ ์ ์ด ์์ต๋๋ค. terraform apply ๋ฅผ ์งํํ๊ฒ ๋๋ฉด, ์๋กญ๊ฒ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ค๋ ๋ฌธ๊ตฌ๊ฐ ๋์ต๋๋ค.
์๊น ๋ถ๋ช ์์ฑํ๋๋ฐ... ์ ๊ทธ๋ด๊น์?
์ด์ ๋ ๊ฐ๋จํฉ๋๋ค. ๋ฐฑ์๋ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ฐ๋ผ๋ณด๊ณ ์๋ tfstate ํ์ผ์ด ๋ณ๊ฒฝ๋์ ๊ทธ๋ ์ต๋๋ค.
๊ธฐ์กด ๋ฆฌ์์ค ์ํ(state) ๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ์ผ์ random-pet.tfstate ์๋๋ฐ, ๋ฐฑ์๋ ๊ตฌ์ฑ์ด ๋ฐ๋๋ฉด์ ๋ ์ด์ random-pet.tfstate ๊ฐ ์๋ chagne-pet.tfstate ๋ฅผ ๊ฐ๋ฅดํค๊ฒ ๋ ๊ฒ์ด๊ณ , ๋น์ฐํ change-pet.tfstate ์๋ ์๋ฌด๋ฐ ์ ๋ณด๊ฐ ์์ต๋๋ค.
terraform apply ๋ฅผ ํตํด ๋ฆฌ์์ค๋ฅผ ์์ฑํ ์ ์ด ์๊ธฐ ๋๋ฌธ์ด์ฃ .
๋ฐฑ์๋ ๊ตฌ์ฑ์ ๋ค์ "./tfstates/random-pet.tfstate" ๋ก ๋ณ๊ฒฝํ ํ terraform init -reconfigure ๋ฅผ ์งํํ๋ฉด ์ด์ ๋ฆฌ์์ค ์ํ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
์ ๋ฆฌํด๋ณด๋ฉด, -reconfigure ์ ํ์ฌ ๋ฐฑ์๋ ๊ตฌ์ฑ์ ์๋กญ๊ฒ ์ฌ์ค์ ํฉ๋๋ค.
์ ๋ ๋ณดํต -reconfigure ์ต์ ๊ฐ์ ๊ฒฝ์ฐ๋ workspace ๋ฅผ ํตํด dev ์ prod ๋ฅผ ๊ตฌ๋ถํ๊ณ , dev ๋ AWS Dev Account S3 ๋ฐฑ์๋, prod ๋ AWS Prod Account S3 ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ์ ๋ ๋ฐ๋ผ๋ณด๋ ๋ฐฑ์๋ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ ๋ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
workspace ์ Multi S3 Backend with AWS Cross-Account ์ ๋ํด์ ๋ค์ ๊ธ์์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค!
terraform ์ ์ฒ์ ์ฌ์ฉํ์ ๋ -reconfigure ์ต์ ์ ์ ์์ง ๋ชปํ๋ ์ํ์์ ์ฌ์ฉํ๋ค๊ฐ ๋ฆฌ์์ค๋ฅผ ์๋กญ๊ฒ ์์ฑํ๋ค๋ ๋ฌธ๊ตฌ๊ฐ ๋ ์ ๋ง์ด ๋นํฉํ๋ ์ ์ด ์์๋๋ฐ, ์ฌ๋ฌ๋ถ์ ๊ทธ๋ฐ ์ผ์ด ์์ผ์๊ธธ ๋ฐ๋๋๋ค!
-migrate-state
์ด๋ฒ์ -migrate-state ์ ๋๋ค.
๋ฒ์ญํด๋ณด์๋ฉด "state(tfstate ํ์ผ) ๋ฅผ ์๋์ผ๋ก ์ด์ ํ๊ณ ์ถ์ผ๋ฉด -migrate-state ๋ฅผ ์ฌ์ฉํด๋ผ" ์ ๋๋ค.
-reconfigure ์ ๋ค๋ฅด๊ฒ ์ง๊ด์ ์ด๋ผ๊ณ ๋ด ๋๋ค. ์ด๋ฆ ๊ทธ๋๋ก tfstate ๋ฅผ ์ด์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ค์ต ์ฝ๋๋ ์๊น์ ๋์ผํฉ๋๋ค.
terraform {
required_version = ">= 1.5.0"
backend "local" {
path = "./tfstates/random-pet.tfstate"
}
required_providers {
random = {
source = "hashicorp/random"
version = "3.6.0"
}
}
}
resource "random_pet" "server" {}
ํ์ฌ ํ ๋ผํผ ๋ฆฌ์์ค๋ฅผ tfstates/random-pet.tfstate ์ state(์ํ) ๋ฅผ ์ ์ฅํ๊ณ ์์ฃ .
๊ทธ์น๋ง tfstates ๋๋ ํฐ๋ฆฌ๊ฐ ์๋, rocket ๋๋ ํฐ๋ฆฌ๋ก ๋ณ๊ฒฝํ๊ณ ์ถ๊ณ ์ด์ฐธ์ random-pet.tfstate ๊ฐ ์๋ rocket.tfstate ๋ก ํ์ผ ์ด๋ฆ๋ ๋ณ๊ฒฝํ๊ณ ์ถ์ต๋๋ค.
terraform {
required_version = ">= 1.5.0"
backend "local" {
path = "./rocket/rocket.tfstate" #-- ๋ณ๊ฒฝ
}
required_providers {
random = {
source = "hashicorp/random"
version = "3.6.0"
}
}
}
resource "random_pet" "server" {}
๋ณ๊ฒฝํ ํ, terraform init -migrate-state ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์๋์ ๊ฐ์ ๋ฌธ๊ตฌ๊ฐ ๋์ต๋๋ค.
ํต์ฌ์ "์๋ก์ด ๋ฐฑ์๋๋ก ํ์ฌ state ๋ฅผ ๋ณต์ฌํ๊ณ ์ถ๋?" ์ ๋๋ค.
yes ๋ฅผ ํด์ค๋๋ค.
๊ทธ๋ผ rocket/rocket.tfstate ์ ๊ธฐ์กด tfstates/random-pet.tfstate ๊ฐ ๋ณต์ฌ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
-reconfigure ๋์ ๋ค๋ฅด๊ฒ ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋์ง ์์ต๋๋ค.
-migrate-state ๊ฐ์ ๊ฒฝ์ฐ ๋น๋ก ๋ฐฑ์๋ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋๊ธด ํ์ง๋ง ๋ณ๊ฒฝ๊ณผ ๋์์ ๊ธฐ์กด ์ํ๋ ๊ฐ์ด ๋ณต์ฌ(์ด์ ) ๋์๊ธฐ ๋๋ฌธ์ด์ฃ !
์ ๋ ๋ณดํต state(์ํ)๋ฅผ ๋ด๊ณ ์๋ tfstate ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ฑฐ๋, workspace ๋ฅผ ์ฌ์ฉํ์ง ์์๋ ํ ๋ผํผ ๋ฆฌ์์ค๋ฅผ workspace ๋ก ์ด์ ํ ๋ -migrate-state ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก workspace ์ Multi S3 Backend with AWS Cross-Account ๊ธ์์ ๋ค๋ฃจ๊ธด ํ ๊ฑฐ์ง๋ง, ๋ง๋ณด๊ธฐ ํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์งํ๋ฉ๋๋ค.
# (backend ๊ตฌ์ฑ ๋ณ๊ฒฝํ์ง ์๊ณ , ๊ธฐ์กด ๊ทธ๋๋ก) ๊ธฐ์กด ๋๋ ํฐ๋ฆฌ์์
$ terraform state pull > dev.tfstate
# ์ค์!!!!!! -> ์งํํ๊ธฐ ์ ์ ๋ฐฑ์๋ ๊ตฌ์ฑ ๋ฐ๊ฟ์ฃผ๊ธฐ
# init ์ ํตํด ๋ฐฑ์๋ ๋ฐ๊ฟ์ฃผ๊ธฐ
$ terraform init -backend-config=backend-configs/dev.hcl -migrate-state
# pull ํ tfstate ์ด๋ฆ ๋ณ๊ฒฝ ํ ์ํฌ์คํ์ด์ค ์์ฑ
$ terraform workspace new -state="dev.tfstate" dev
# push ํ๊ธฐ
$ terraform state push dev.tfstate
# ํ์ธํ๊ธฐ
$ terraform state list
์ค๋์ terraform ์ ์ฒ์ ๊ณต๋ถํ์ ๋ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ ์ค ํ๋์๋ -reconfigure ์ -migrate-state ์ ๋ํด ์์๋ดค์ต๋๋ค!
์๋ชป๋ ์ฌ์ฉ์ผ๋ก ์ธํด ๊ณ ์ํ๋ ๊ธฐ์ต์ด ์๋ค์..
ํ์ง๋ง ์๋ง ์ฌ์ฉํ๋ค๋ฉด ์ ๋ง ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์ต์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. (Muli S3 Backend with AWS Cross-Account)
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!
'DevOps > Terraform' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Terraform] Multi-Cross-Backend X Multi-Cross-Account = ์ธ๋ถํ๋ ์ก์ธ์ค ์ ์ด (55) | 2024.04.24 |
---|