๐ Notice
๋ณธ ๋ธ๋ก๊น ์ ์๋์
24๋จ๊ณ ์ค์ต์ผ๋ก ์ ๋ณตํ๋ ์ฟ ๋ฒ๋คํฐ์ค
์ฑ ์ ๊ธฐ์คํ์ฌ ์ ๋ฆฌํ์์ต๋๋ค.์ถ์ฒ - ํ๋น์ถํ๋คํธ์ํฌ
CloudNetaStudy
๊ทธ๋ฃน์์ ์คํฐ๋ํ ๋ด์ฉ์ ๋๋ค.
Hashicorp korea์ ํ์ฑ
๋๊ณผ ํจ๊ป ์คํฐ๋ ํ๊ณ ์์ต๋๋ค. ๐
์ ํ์ฑ
๋๊ณผ์ค์์จ
๋๊ป ๋ค์ํ๋ฒ ๐ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๐ ๋ฌ์ฑํ๊ณ ์ ํ๋ ๋ชฉ์ ์ ๋ฌด์์ธ๊ฐ์?
DevOps ์์ง๋์ด๋ก์ ์ ๋ฌด์์ ํ๋ฐํ๊ฒ ์ฌ์ฉํ๊ณ ์๋ ํ ๋ผํผ์ ๋ํด์ ๋์ณค๋ ๋ถ๋ถ์ด๋ ๊ธฐ์ด๋ฅผ ๋ค์ํ๋ฒ ๋ค๋ฌ์ผ๋ฉฐ, ์ ๋ฌด ์ญ๋์ ๋๋ฆฌ๊ณ ์ ํฉ๋๋ค.
IaC์ ํ ๋ผํผ์ ์ดํดํ๊ณ ์คํฐ๋์ ํ์ํ ์ค์ต ํ๊ฒฝ์ ๊ตฌ์ฑํฉ๋๋ค.
ํ ๋ผํผ ๊ธฐ๋ณธ ๋ช ๋ น ์ฌ์ฉ๋ฒ์ ์์๋ด ๋๋ค.
HCL์ ์ดํดํ๊ณ ๊ธฐ๋ณธ ํ์ฉ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
์ํ์ฝ๋ ์์ฑ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ค์ตํฉ๋๋ค.
ํ ๋ผํผ์ด๋?
ํ์์ฝํ์ฌ์์ ๊ณต๊ฐํ IaC ๋๊ตฌ
โํ์์ฝํ์ ์ฒ ํ - ๋งํฌโ ์ค 3๊ฐ์ง๋ฅผ ๋ด์์ ํ ๋ผํผ์ ์ค๊ณ : ์ํฌํ๋ก์ฐ์ ์ง์ค, ์ฝ๋ํ ์ธํ๋ผ, ์ค์ฉ์ฃผ์
ํ ๋ผํผ ์ ๊ณต ์ ํ
- On-premise : Terraform์ด๋ผ ๋ถ๋ฆฌ๋ ํํ๋ก, ์ฌ์ฉ์์ ์ปดํจํ ํ๊ฒฝ์ ์คํ์์ค ๋ฐ์ด๋๋ฆฌํด์ธ ํ ๋ผํผ์ ํตํด ์ฌ์ฉ
- Hosted SaaS : Terraform Cloud๋ก ๋ถ๋ฆฌ๋ SaaS๋ก ์ ๊ณต๋๋ ๊ตฌ์ฑ ํ๊ฒฝ์ผ๋ก ํ์์ฝํ๊ฐ ๊ด๋ฆฌํ๋ ์๋ฒ ํ๊ฒฝ์ด ์ ๊ณต
- Private Install : Terraform Enterprise๋ก ๋ถ๋ฆฌ๋ ์๋ฒ ์ค์นํ ๊ตฌ์ฑ ํ๊ฒฝ์ผ๋ก, ๊ธฐ์ ์ ์ฌ๋ด ์ ์ฑ ์ ๋ฐ๋ผ ํ๋ก๋น์ ๋ ๊ด๋ฆฌ๊ฐ ์ธ๋ถ ๋คํธ์ํฌ์ ๊ฒฉ๋ฆฌ - ๋งํฌ
์คํ ํ๊ฒฝ ๊ตฌ์ฑ(3๊ฐ์ง) :
๋ฒ์ ์ ํ : ๊ฐ์ฅ ์ต์ ๋ฒ์ ๊ถ์ฅ - ํ์ ๋ฒ์ ํธํ, ๊ธฐ๋ฅ ๊ฐ์ , ๋ฒ๊ทธ ์์
terraform_<๋ฒ์ >_<OS>_<CPU>
.zipPATH ์ค์ : ๋ฆฌ๋ ์ค/macOS , ์๋์ฐ
/usr/bin
C:\\windows\\system32
์ฐธ๊ณ : BSL ๋ผ์ด์ผ์ค ์ ์ฉ์ Terraform 1.5.x ์ดํ๋ถํฐ ์ ์ฉ๋ฉ๋๋ค. (์ผ๋ฐ ์ฌ์ฉ์๋ ์ ํ๋์ง ์์ผ๋ ์ผ๋ คํ์ง ์๊ณ ์ฌ์ฉํ์ ๋ ๋ฉ๋๋คโ๏ธ)
ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ IDE๋ ๋น์ฃผ์ผ ์คํ๋์ค ์ฝ๋ Visual Studio Code (VS Code)๋ฅผ ์ค์น ํ ์ค์ต์ ์ฌ์ฉ - ๋งํฌ
โhelpโ ์ต์ (์ฐธ๊ณ )
# ์๋ธ์ปค๋งจ๋ help ์ง์ terraform console -help terraform init -help
init ์ด๊ธฐํ
# ํ ๋ผํผ ์คํ์ ์ํด ์ฝ๋ ํ์ผ์ด ์๋ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ # (์ฐธ๊ณ ) ํ ๋ผํผ์ด ์คํ๋๋ ๋๋ ํฐ๋ฆฌ = ๋ชจ๋(ํ ๋ผํผ ์ฝ๋ ํ์ผ๊ณผ ๋ณ์ ํ์ผ), ๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ๋ '๋ฃจํธ ๋ชจ๋', ํธ์ถ ๋ชจ๋์ '์์ ๋ชจ๋' cd 03.start/ # plan ์คํ ์ ์๋ฌ ์ถ๋ ฅ > ์๋ฌ ๋ฉ์์ง์ ์๋ฏธ๋? terraform plan โ Error: Inconsistent dependency lock file โ โ The following dependency selections recorded in the lock file are inconsistent with the current configuration: โ - provider registry.terraform.io/hashicorp/local: required by this configuration but no version is selected โ โ To make the initial dependency selections that will initialize the dependency lock file, run: โ terraform init # ์ด๊ธฐํ : ์ฝ๋ ์ฌ์ฉ ๊ตฌ๋ฌธ ๊ธฐ๋ฐ์ผ๋ก ํ์ํ ํ๋ก๋ฐ์ด๋ ํ๋ฌ๊ทธ์ธ์ ์ฐพ๊ณ ์ค์น, ์ถ๊ฐ๋ก 'ํ๋ก๋ฐ์ด๋/๋ชจ๋/๋ฐฑ์๋' ๊ตฌ์ฑ ์ค์ /๋ณ๊ฒฝ ์ ์ํ ํ์ terraform init ls -al tree .terraform # VS Code์์ ํ์๊ธฐ ํ์ธ
plan ๊ณํ & apply ์คํ
terraform plan
๋ช ๋ น์ ํ ๋ผํผ์ผ๋ก ์ ์ฉํ ์ธํ๋ผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ดํ ์คํ ๊ณํ์ ์์ฑํ๋ ๋์. ๋ํ ์ถ๋ ฅ๋๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ฌ ์ด๋ค ๋ณ๊ฒฝ์ด ์ ์ฉ๋ ์ง ์ฌ์ฉ์๊ฐ ๋ฏธ๋ฆฌ ๊ฒํ ํ๊ณ ์ดํดํ๋๋ฐ ๋์์ ์ค.๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก ์ ์ฉํ์ง๋ ์์ผ๋ฏ๋ก, ์ ์ฉ ์ ์ ์์ํ ๊ตฌ์ฑ์ด ๋ง๋์ง ๊ฒํ
terraform apply
๋ plan ๊ณํ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ ์คํ.# plan ์คํ : ๊ตฌ์ฑ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ด๋ค ๋ฆฌ์์ค๊ฐ ์์ฑ๋๋์ง ์์ธ ๋ด์ญ ์ถ๋ ฅ, ๊ธฐ๋ณธ๊ฐ ์๋ ์ ๋ ฅ ์ ์ฉ 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: # local_file.abc will be created + resource "local_file" "abc" { + content = "abc!" + content_base64sha256 = (known after apply) + content_base64sha512 = (known after apply) + content_md5 = (known after apply) + content_sha1 = (known after apply) + content_sha256 = (known after apply) + content_sha512 = (known after apply) + directory_permission = "0777" + file_permission = "0777" + filename = "./abc.txt" + id = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. # ํ๋์ ๋ฆฌ์์ค๊ฐ ์ถ๊ฐ๋๊ณ , ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ญ์ ๋๋ ๊ฒ์ ์์ ์์
-detailed-exitcode
: plan ์ถ๊ฐ ์ต์ ์ผ๋ก, ํ์ดํ๋ผ์ธ ์ค๊ณ์์ ํ์ฉ ๊ฐ๋ฅ, exitcode๊ฐ ํ๊ฒฝ ๋ณ์๋ก ๊ตฌ์ฑ๋จ
-auto-approve
์๋ ์น์ธ ๊ธฐ๋ฅ ๋ถ์ฌ ์ต์ # plan ๊ฒฐ๊ณผ๋ฅผ ์์คํ ์ฝ๋๋ก ์ถ๋ ฅ terraform plan -detailed-exitcode ... # ์ฝ๋ ํ์ธ : 0(๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ์ฑ๊ณต), 1(์ค๋ฅ๊ฐ ์์), 2(๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ์ฑ๊ณต) echo $? 2 # (์ฐธ๊ณ ) apply ๊ฒฐ๊ณผ์ ์ ์ฉ ์๋ terraform apply -auto-approve -detailed-exitcode
apply
# apply ์คํ : no ์ ๋ ฅ terraform apply ... Enter a value: no ... # plan ๊ฒฐ๊ณผ๋ฅผ ์ง์ ๋ ํ์ผ(๋ฐ์ด๋๋ฆฌ ํํ) ์ด๋ฆ์ผ๋ก ์์ฑ terraform plan -out=tfplan cat tfplan file tfplan # apply ์คํ : ์คํ๊ณํ์ด ์์ผ๋ฏ๋ก ์ฆ์ ์ ์ฉ๋จ terraform apply tfplan ls -al abc.txt # apply ์คํ : ์ด๋ป๊ฒ ๋๋์? # ํ ๋ผํผ์ ์ ์ธ์ ๊ตฌ์ฑ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ์ธ์ด๋ก ๋ฉฑ๋ฑ์ฑ idempotence์ ๊ฐ๊ณ , ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋์ผํ ๊ตฌ์ฑ์ ๋ํด์๋ ๋ค์ ์คํํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ์์ ์ ์ํํ์ง ์์ terraform apply ... terraform state list
์ฝ๋ ํ์ผ ์์
resource "local_file" "abc" { content = "abc!" filename = "${path.module}/abc.txt" } resource "local_file" "dev" { content = "def!" filename = "${path.module}/def.txt" }
์คํ
# apply ์คํ : ๋ณ๊ฒฝ(์ ๊ท ์ถ๊ฐ) ๋ถ๋ถ๋ง ๋ฐ์ ํ์ธ terraform apply ... # local_file.dev will be created + resource "local_file" "dev" { ... Enter a value: yes # ํ์ธ terraform state list tree ls *.txt # ๋ณ๊ฒฝ ์ด์ ์ ์คํ ๊ณํ ์ ์ฉ ์๋ > ์ด๋ป๊ฒ ๋ ๊น์? terraform apply tfplan ...
๋ค์ ์ถ๊ฐ ์ฝ๋ ๋ด์ฉ์ ์ญ์
resource "local_file" "abc" { content = "abc!" filename = "${path.module}/abc.txt" }
์คํ
ํ ๋ผํผ์ ์ ์ธ์ ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ํ์ฌ์ ์ฝ๋ ์ํ์ ์ ์ฉํ ์ํ๋ฅผ ๋น๊ตํด ์ผ์น์ํค๋ ๋์์ ์ํ# ์คํ > ์ด๋ป๊ฒ ๋๋์? terraform apply ... Enter a value: yes ... # ํ์ธ terraform state list tree ls *.txt
-replace
: ํ๋ก๋น์ ๋์ด ์๋ฃ ํ ์ฌ์ฉ์์ ํ์์ ์ํด ํน์ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ ๋ค์ ์์ฑ. plan, apply ๋ชจ๋ ์ ์ฉ ๊ฐ๋ฅdestroy ์ ๊ฑฐ & fmt
ํ ๋ผํผ ๊ตฌ์ฑ์์ ๊ด๋ฆฌํ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ ๋ช ๋ น์ด โ ์ผ๋ถ ๋ฆฌ์์ค๋ง ์ ๊ฑฐํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ๋ ๊น์?# terraform destroy ... Enter a value: yes ... # ํ์ธ terraform state list ls *.txt
fmt
format ๋๋ reformat ์ค์ ํ์๋ก terraform tmt ๋ช ๋ น์ด๋ก ์ํ, ํ ๋ผํผ ๊ตฌ์ฑ ํ์ผ์ ํ์ค ํ์๊ณผ ํ์ค ์คํ์ผ๋ก ์ ์ฉ. ์ฝ๋ ๊ฐ๋ ์ฑ ๋์# ์ ์ฉ ํ ์ฝ๋ ํ์ผ ๋ด์ฉ ํ์ธ -> ๋ค์ฌ์ฐ๊ธฐ ํ์ธ terraform fmt
HCL HashiCorp Configuration Language์ ํ์์ฝํ์ฌ์์ IaC์ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ๋ช ์ํ๊ธฐ ์ํด ๊ฐ๋ฐ๋ ์คํ ์์ค ๋๊ตฌ
HCL ํน์ง
HCL์ ์ฌ์ฉํ๋ ์ด์
ํ ๋ผํผ ๋ธ๋ก : ํ ๋ผํผ ๊ตฌ์ฑ์ ๋ช ์ํ๋ ๋ฐ ์ฌ์ฉ
- ํ ๋ผํผ ๋ฒ์ ์ด๋ ํ๋ก๋ฐ์ด๋ ๋ฒ์ ๊ณผ ๊ฐ์ ๊ฐ๋ค์ ์๋์ผ๋ก ์ค์ ๋์ง๋ง, ํจ๊ป ์์ ํ ๋๋ ๋ฒ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ธํ๊ณ ํ์ํ ์กฐ๊ฑด์ ์ ๋ ฅํ์ฌ ์คํ ์ค๋ฅ๋ฅผ ์ต์ํ ํ ๊ฒ์ ๊ถ์ฅํ๋ค. [Docs] [Docs ์์ ]
- ์ค๋ ์คํํ๋, 3๋ ํ์ ์คํํ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ด์ผ ํ๋ค! (Desired State + Immutable)
terraform {
required_version = "~> 1.3.0" # ํ
๋ผํผ ๋ฒ์
required_providers { # ํ๋ก๋ฐ์ด๋ ๋ฒ์ ์ ๋์ด
random = {
version = ">= 3.0.0, < 3.1.0"
}
aws = {
version = "4.2.0"
}
}
cloud { # Cloud/Enterprise ๊ฐ์ ์๊ฒฉ ์คํ์ ์ํ ์ ๋ณด [์ฐธ๊ณ : Docs]
organization = "<MY_ORG_NAME>"
workspaces {
name = "my-first-workspace"
}
}
backend "local" { # state๋ฅผ ๋ณด๊ดํ๋ ์์น๋ฅผ ์ง์ [์ฐธ๊ณ : Docs, local, remote, s3]
path = "relative/path/to/terraform.tfstate"
}
}
- ํ ๋ผํผ ๋ด์์ ๋ฒ์ ์ด ๋ช ์๋๋ terraform, module์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ๋ฒ์ ์ ๋ํ ์ ์ฝ์ ๋ ์ผ๋ก์จ ํ ๋ผํผ, ํ๋ก๋ฐ์ด๋, ๋ชจ๋์ด ํญ์ ์๋ํ ์ ์๋๋ก ์คํ๋๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค.
- ๋ฒ์ ์ฒด๊ณ๋ ์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ Semantic Versioning(SemVer) ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค [์ฐธ๊ณ ], [Kubernetes Release Versioning]
์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ ๋ฐฉ์
Major ๋ฒ์ : ๋ด๋ถ ๋์์ API๊ฐ ๋ณ๊ฒฝ ๋๋ ์ญ์ ๋๊ฑฐ๋ ํ์ ํธํ์ด ๋์ง ์๋ ๋ฒ์
Minor ๋ฒ์ : ์ ๊ท ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ฑฐ๋ ๊ฐ์ ๋๊ณ ํ์ ํธํ์ด ๊ฐ๋ฅํ ๋ฒ์
Patch ๋ฒ์ : ๋ฒ๊ทธ ๋ฐ ์ผ๋ถ ๊ธฐ๋ฅ์ด ๊ฐ์ ๋ ํ์ ํธํ์ด ๊ฐ๋ฅํ ๋ฒ์
- ๋ฒ์ ์ ์ฝ ๊ตฌ๋ฌธ์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ ์ธ์ด์์์ ์ข ์์ฑ ๊ด๋ฆฌ ์์คํ ๊ณผ ํก์ฌํ๋ค.
=
๋๋ ์ฐ์ฐ์ ์์ : ์ง์ ๋ ๋ฒ์ ๋ง์ ํ์ฉํ๊ณ ๋ค๋ฅธ ์กฐ๊ฑด๊ณผ ๋ณ๊ธฐํ ์ ์๋ค.!=
: ์ง์ ๋ ๋ฒ์ ์ ์ ์ธํ๋ค.>, >=, <, <=
: ์ง์ ๋ ๋ฒ์ ๊ณผ ๋น๊ตํด ์กฐ๊ฑด(๋ถ๋ฑํธ)์ ๋ง๋ ๊ฒฝ์ฐ ํ์ฉํ๋ค.
~>
: ์ง์ ๋ ๋ฒ์ ์์ ๊ฐ์ฅ ์๋ฆฌ์๊ฐ ๋ฎ์ ๊ตฌ์ฑ์์๋ง ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ฉํ๋ค.
~> x.y
์ธ ๊ฒฝ์ฐ y ๋ฒ์ ์ ๋ํด์๋ง,~> x.y.z
์ธ ๊ฒฝ์ฐ z ๋ฒ์ ์ ๋ํด์๋ง ๋ณด๋ค ํฐ ๋ฒ์ ์ ํ์ฉํ๋ค.
๋ฐฑ์๋ ๋ธ๋ก
- ๋ฐฑ์๋ ๋ธ๋ก์ ๊ตฌ์ฑ์ ํ ๋ผํผ ์คํ ์ ์ ์ฅ๋๋ State(์ํ ํ์ผ)์ ์ ์ฅ ์์น๋ฅผ ์ ์ธํ๋ค. (๊ธฐ๋ณธ: local)
- ์ฃผ์ํ ์ ์ ํ๋์ ๋ฐฑ์๋๋ง ํ์ฉํ๋ค๋ ์ ์ด๋ค.
- ํ ๋ผํผ์ State์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ์ฝ๋๋ก ๊ด๋ฆฌ๋ ๋ฆฌ์์ค๋ฅผ ํ์ํ๊ณ ์ถ์ ํ๋ค.
- ์์ ์ ๊ฐ์ ํ์ ์ ๊ณ ๋ คํ๋ค๋ฉด ํ ๋ผํผ์ผ๋ก ์์ฑํ ๋ฆฌ์์ค์ ์ํ ์ ์ฅ ํ์ผ์ ๊ณต์ ํ ์ ์๋ ์ธ๋ถ ๋ฐฑ์๋ ์ ์ฅ์๊ฐ ํ์ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ State์๋ ์ธ๋ถ๋ก ๋ ธ์ถ๋๋ฉด ์ ๋๋ ํจ์ค์๋ ๋๋ ์ธ์ฆ์ ์ ๋ณด ๊ฐ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ค์ด ํฌํจ๋ ์ ์์ผ๋ฏ๋ก State์ ์ ๊ทผ ์ ์ด ๋ฐ ์์ ํ ๊ด๋ฆฌ๋ฐฉ์ ๋์ฑ ์๋ฆฝ์ด ํ์ํ๋ค.
State ์ ๊ธ ๋์
- ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋๋ ๋ฐฑ์๋๋ local์ด๋ค.
- ์ํ๋ฅผ ์์ ์์ ๋ก์ปฌ ํ๊ฒฝ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
- ์ด ๋ฐ์ ๋ค๋ฅธ ๋ฐฑ์๋ ๊ตฌ์ฑ์ ๋์์ ์ฌ๋ฌ ์์ ์๊ฐ ์ ๊ทผํด ์ฌ์ฉํ ์ ์๋๋ก ๊ณต์ ์คํ ๋ฆฌ์ง ๊ฐ์ ๊ฐ๋ ์ ๊ฐ๋๋ค.
- ๊ณต์ ๋๋ ๋ฐฑ์๋์ State๊ฐ ๊ด๋ฆฌ๋๋ฉด ํ ๋ผํผ์ด ์คํ๋๋ ๋์
.terraform.tfstate.lock.info
ํ์ผ์ด ์์ฑ๋๋ฉด์ ํด๋น State๋ฅผ ๋์์ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ์ ๊ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.- ํ์ผ ์์ฑ์ ํ์ธํ๊ณ ์ถ๋ค๋ฉด
terraform apply
๋ฅผ ์คํํ๊ณ ์์ฑ๋๋ ์ ๊ธ ํ์ผ์ ํ์ธํด๋ณด์. ์ ๊ธ ํ์ผ ๋ด์ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ๋ค.
Backend ๊ตฌ์ฑ์ ํตํด Terraform์ดย stateย ๋ฐ์ดํฐ ํ์ผ์ ์ ์ฅํ๋ ์์น๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค.
ํ ๋ผํผ์ tfstate๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ ์ ์ธํ ๋ฆฌ์์ค๋ฅผ ์ถ์ ํฉ๋๋ค.
tfstate์๋ ์ค์ํ ์ ๋ณด๋ ํฌํจ๋๊ธฐ ๋๋ฌธ์, Github ๋๋ ์ธ๋ถ๋ก ๋ ธ์ถ๋์ด์๋ ์ฝ๋ ์ ์ฅ์์ ์ฌ๋ผ๊ฐ์ง ์๋๋ก ์ฃผ์ํ์ฌ์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด aws ์๋น์ค์ธ S3์ DynamoDB๋ฅผ ์ด์ฉํด์ ๋ฐฑ์๋๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋ณ๋์ ์ํฌ์คํ์ด์ค๋ฅผ ์์ฑํ์ฌ ๋ฐฑ์๋๋ฅผ ์ํ ๋ฆฌ์์ค๋ฅผ ๋ณ๋ก๋ ์์ฑํฉ๋๋ค.
# backend.tf
provider "aws" {
region = "ap-northeast-2" # Please use the default region ID
}
# S3 ๋ฒํท์ ์์ฑํฉ๋๋ค.
resource "aws_s3_bucket" "for_tfstate" {
bucket = "xgro-tfstate"
}
# S3 ๋ฒํท์ ๋ฒ์ ๋ ๊ธฐ๋ฅ ํ์ฑํ ์ ์ธํ๋ค.
resource "aws_s3_bucket_versioning" "tfstate" {
bucket = aws_s3_bucket.for_tfstate.bucket
versioning_configuration {
status = "Enabled"
}
}
# DynamoDB for terraform state lock
resource "aws_dynamodb_table" "terraform_state_lock" {
name = "terraform-lock"
hash_key = "LockID"
billing_mode = "PAY_PER_REQUEST"
attribute {
name = "LockID"
type = "S"
}
}
์์์ ๋ฐฑ์๋๋ฅผ ์ํ S3, DynamoDB๊ฐ ์ ์์ ์ผ๋ก ์์ฑ๋์๋ค๋ฉด, ํ ์คํธ๋ฅผ ์ํ ํ ๋ผํผ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
# main.tf
# Required providers configuration
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.6.0"
}
}
backend "s3" {
bucket = "xgro-tfstate"
key = "terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "terraform-lock"
encrypt = true
}
required_version = ">= 1.0.11"
}
data "aws_region" "current" {}
data "aws_caller_identity" "current" {}
ํ ์คํธ๋ vpc ๋ชจ๋์ ์ด์ฉํด์ ๋ฆฌ์์ค์ ์ด๋ฆ ๋ฐ ์ค์ ์ ๋ณ๊ฒฝํ๋ฉฐ ์งํํ์์ต๋๋ค.
# vpc.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "final_mon1-vpc"
cidr = "10.0.0.0/16"
azs = ["ap-northeast-2a", "ap-northeast-2b"]
private_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
public_subnets = ["10.0.1.0/24"]
enable_nat_gateway = false
enable_vpn_gateway = false
tags = {
Terraform = "true"
Environment = "dev"
}
}
terraform.tfstate ํ์ผ์ด s3์ ์ ์ฅ๋๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ํ ๋ผํผ์ผ๋ก ์์ฑ๋ vpc๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.