- CloudNeta์ ๊ฐ์๋ค๋์ด ์งํํ์๋ Terraform 101 Study์ ์ฐธ๊ฐํ๋ฉฐ ์์ฑํ ๋ด์ฉ์ ๋๋ค.
- ์คํฐ๋ ๊ต์ฌ โ ํ ๋ผํผ์ผ๋ก ์์ํ๋ IaC
CH3. ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ - 3
3-10. ์กฐ๊ฑด์
ํ ๋ผํผ์ ์กฐ๊ฑด์์ 3ํญ ์ฐ์ฐ์ ํํ โ <์กฐ๊ฑด ์ ์> ? <true์ธ ๊ฒฝ์ฐ> : <false์ธ ๊ฒฝ์ฐ>
์กฐ๊ฑด์์์ ํ์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ํ ๋ผํผ์ ์กฐ๊ฑด ๋น๊ต๋ฅผ ์ํด ํํ๋ฅผ ์ถ๋ก ํ์ฌ ์๋์ผ๋ก ๋ณํ โ ์กฐ๊ฑด์์ ๋ช ์์ ์ธ ํํ๋ก ์์ฑ
์ ๋ ฅ ๋ณ์๋ก ๋ฐฐํฌ ํ๊ฒฝ(dev, prod)๋ฅผ ๊ตฌ๋ถํ์ฌ EC2 ์ธ์คํด์ค์ ์ฌ์ด์ฆ ์กฐ์ ํ๊ธฐ
3-11. ํจ์
ํ ๋ผํผ์ ๊ฐ์ ์ ํ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํจํ ์ ์๋ ๋ด์ฅ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ด์ฅํจ์ ์ธ์ ์ฌ์ฉ์ ์ ์ ํจ์๋ ์ง์ํ์ง ์์ต๋๋ค.
terraform console ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํด ํ ๋ผํผ์์ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
cidrhost(๋ด์ฅ ํจ์)์ count๋ฅผ ์ด์ฉํ์ฌ 2๊ฐ์ ENI๋ฅผ ์์ฑํ๊ณ EC2์ attach ์ํค๊ธฐ
3-12. ํ๋ก๋น์ ๋
- ํ๋ก๋น์ ๋ โ ํ๋ก๋ฐ์ด๋๋ก ์คํ๋์ง ์๋ ์ปค๋งจ๋์ ํ์ผ ๋ณต์ฌ ๊ฐ์ ์ญํ ์ ์ํ
- ํ๋ก๋น์ ๋๋ก ์คํ๋ ๊ฒฐ๊ณผ๋ ํ
๋ผํผ์ ์ํ ํ์ผ๊ณผ ๋๊ธฐํ๋์ง ์์ผ๋ฏ๋ก ํ๋ก๋น์ ๋์ ๋ํ ๊ฒฐ๊ณผ๊ฐ ํญ์ ๊ฐ๋ค๊ณ ๋ณด์ฅํ ์ ์๋ค.
โ ๋ฐ๋ผ์ ํ๋ก๋น์ ๋ ์ฌ์ฉ์ ์ต์ํํ๋ ๊ฒ์ด ์ข๋ค.
ํ๋ก๋น์ ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ
- ํ๋ก๋น์ ๋์ ๊ฒฝ์ฐ ๋ฆฌ์์ค ํ๋ก๋น์ ๋ ์ดํ ๋์ํ๋๋ก ๊ตฌ์ฑํ ์ ์๋ค.
- ํ๋ก๋น์ ๋๋ ์ ์ธ๋ ๋ฆฌ์์ค ๋ธ๋ก์ ์์ ์ด ์ข ๋ฃ๋๊ณ ๋์ ์ง์ ํ ๋์์ ์ํํ๋ค.
- ๋ค์์ ํ๋ก๋น์ ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ์ธ๋ ๊ฐ๋ฅํ๋ฉฐ ์ด๋ฐ ๊ฒฝ์ฐ ์์๋๋ก ์ฒ๋ฆฌ๋๋ค.
- ํ๋ก๋น์ ๋๋ self๋ฅผ ํตํด ํ๋ก๋น์ ๋ ๋ฆฌ์์ค๋ฅผ ํด๋น ์์ฑ์ ์ฐธ์กฐํ ์ ์๋ค.
local-exec ํ๋ก๋น์ ๋
- local-exec โ ํ ๋ผํผ์ด ์คํ๋๋ ํ๊ฒฝ์์ ์ํํ ์ปค๋งจ๋๋ฅผ ์ ์
resource "local_file" "provisioner_test" {
content = "for provisioner test"
filename = "provisioner_test.txt"
# local-exec ํ๋ก๋น์ ๋ -> ํ
๋ผํผ์ด ์คํ๋๋ ํ๊ฒฝ์์ ์ํ
provisioner "local-exec" {
command = "echo The content is ${self.content}"
}
}
# ์คํ ๊ฒฐ๊ณผ
# 1. terraform apply ๋จ๊ณ์์ ๋ก์ปฌ ๋จธ์ ์ "echo The content is ${self.content}" ๋ผ๋ ์ปค๋งจ๋๊ฐ ์ ๋ฌ๋๋ค.
# 2. provisioner_test.txt๋ผ๋ ํ์ผ์ด ํ๋ก๋น์ ๋ ๋๋ค.
์๊ฒฉ์ง ์ฐ๊ฒฐ
- file ํ๋ก๋น์ ๋์ remote-exec ํ๋ก๋น์ ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์๊ฒฉ์ง์ ์ฐ๊ฒฐํ SSH, WinRM ์ฐ๊ฒฐ ์ ์๊ฐ ํ์
file ํ๋ก๋น์ ๋
- file โ ํ ๋ผํผ์ ์คํํ๋ ์์คํ ์์ ์ฐ๊ฒฐ ๋์์ผ๋ก ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ณต์ฌํ๋๋ฐ ์ฌ์ฉ
- ๋ก์ปฌ์์ ํ ๋ผํผ์ ์คํํ์ฌ EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ์๊ฒฉ์ง ์ฐ๊ฒฐ์ ํตํด ๋ก์ปฌ์ ํ์ผ์ EC2๋ก ์ ๋ก๋ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
remote-exec ํ๋ก๋น์ ๋
- remote-exec โ ์๊ฒฉ์ง ํ๊ฒฝ์์ ์คํํ ์ปค๋งจ๋์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์
- EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ VM์์ ์คํํ ๋ช ๋ น ๋ฑ์ ์ ์
resource "aws_instance" "file_ec2" {
ami = "ami-0c9c942bd7bf113a2"
instance_type = "t3.micro"
# ์๊ฒฉ์ง ์ฐ๊ฒฐ
# 1.2.3.4์ IP๋ฅผ ๊ฐ์ง๋ EC2 ์ธ์คํด์ค์ ssh๋ก ์ฐ๊ฒฐ
connection {
type = "ssh"
user = "root"
password = "Password"
host = "1.2.3.4"
}
# file ํ๋ก๋น์ ๋
# ํ
๋ผํผ ์คํ ํ๊ฒฝ์ ์๋ 'install_script.sh'๋ฅผ EC2 ์ธ์คํด์ค์ ์
๋ก๋
provisioner "file" {
source = "install_script.sh"
destination = "/etc/install_script.sh"
}
# remote-exec ํ๋ก๋น์ ๋
# EC2์์ inline์ ์๋ ์ปค๋งจ๋๋ฅผ ์ํํ๋๋ก ์ง์
provisioner "remote-exec" {
inline = [
"chmod +x /ect/install_script.sh",
"/bin/bash /etc/install_script.sh"
]
}
}
3-13. null_resources์ terraform_data
- ํ ๋ผํผ 1.4 ๋ฒ์ ์ด ๋ฆด๋ฆฌ์ค ๋๋ฉด์ ๊ธฐ์กด null_resource ๋ฆฌ์์ค๋ฅผ ๋์ฒดํ๋ terraform_data ๋ฆฌ์์ค๊ฐ ์ถ๊ฐ
null_resource
- ์๋ฌด ์์ ๋ ์ํํ์ง ์๋ ๋ฆฌ์์ค๋ฅผ ๊ตฌํ
- ์ฌ์ฉ์๊ฐ ์๋์ ์ผ๋ก ํ๋ก๋น์ ๋ํ๋ ๋์์ ์กฐ์จํด์ผ ํ๋ ์ํฉ์์
โ ํ๋ก๋ฐ์ด๋๊ฐ ์ ๊ณตํ๋ ๋ฆฌ์์ค ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ๋ก๋ง์ ํด๊ฒฐํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ
terraform_data
- ๊ธฐ์กด null_resource์ ๊ธฐ๋ฅ์ ์ธ ์์๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ์ถ๊ฐ โ null_resource๋ ๋ณ๋์ ํ๋ก๋ฐ์ด๋๊ตฌ์ฑ์ด ํ์
- terraform_data์ null_resource์ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ ๊ฐ๋ค.
- ๊ฐ์ ์ฌ์คํ โ triggers_replace
- ์ํ ์ ์ฅ โ input ์ธ์
- input์ ์ ์ฅ๋ ๊ฐ์ ์ถ๋ ฅ โ output ์์ฑ
3-14. moved ๋ธ๋ก
ํ ๋ผํผ State์ ๊ธฐ๋ก๋๋ ๋ฆฌ์์ค ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๋ฉด ๊ธฐ์กด ๋ฆฌ์์ค๋ ์ญ์ ๋๊ณ ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋๋ค.
โ ๋ฆฌ์์ค ์ด๋ฆ์ ๋ณ๊ฒฝ๋์ง๋ง ํ ๋ผํผ์ผ๋ก ํ๋ก๋น์ ๋ํ ํ๊ฒฝ์ ๊ทธ๋๋ก ์ ์งํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ moved๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํ ๋ผํผ 1.1 ๋ฒ์ ๋ถํฐ moved๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด์ ์๋ terraform state mv ๋ช ๋ น์ผ๋ก State๋ฅผ ์กฐ์ํด์ผํ๋ ๋ถ๋ด์ด ์์๋ค.
A๋ผ๋ ๋ฆฌ์์ค์ ์ด๋ฆ์ B๋ก ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ moved ๋ธ๋ก์ ์์ฑํ๊ณ apply ํ๊ณ moved ๋ธ๋ก์ ์ญ์ ํ๋ฉด ๋๋ค.
# A๋ผ๋ ์ด๋ฆ์ local_file ๋ฆฌ์์ค๋ฅผ B๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝ
moved {
from = local_file.A
to = local_file.B
}
3-15. CLI๋ฅผ ์ํ ์์คํ ํ๊ฒฝ ๋ณ์
- ํ ๋ผํผ์ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์คํ ๋ฐฉ์๊ณผ ์ถ๋ ฅ ๋ด์ฉ์ ๋ํ ์ต์ ์ ์กฐ์ `ํ ์ ์๋ค.
- ์์คํ
ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๋ฉด, ์๊ตฌ์ ์ผ๋ก ๋ก์ปฌ ํ๊ฒฝ์ ์ ์ฉ๋๋ ์ต์
์ด๋ ๋ณ๋ ์๋ฒ ํ๊ฒฝ์์ ์คํํ๊ธฐ ์ํ ์ต์
์ ๋ถ์ฌํ ์ ์๋ค.
โ ์ด๋ฅผ ํตํด ๋ก์ปฌ ์์ ํ๊ฒฝ๊ณผ ๋ค๋ฅธ
TF_LOG
- stderr ๋ก๊ทธ ๋ ๋ฒจ ์ ์ โ trace, debug, info, warn, error, off
- TF_LOG : ๋ก๊น ๋ ๋ฒจ ์ง์
- TF_LOG_PATH : ๋ก๊ทธ ํ์ผ ์์น ์ง์
- TF_LOG_CORE : ํ ๋ผํผ ์ฝ์ด์ ๋ก๊น ๋ ๋ฒจ ์ง์
- TF_LOG_PROVIDER : ํ๋ก๋ฐ์ด๋์ ๋ก๊น ๋ ๋ฒจ ์ง์
TF_INPUT
- TF_INPUT์ผ๋ก 0 ๋๋ false๋ฅผ ์ค์ ํ๋ ๊ฒฝ์ฐ โ ์ ๋ ฅ๋ฐ๋ ๋์์ ์ํํ์ง ์์
TF_VAR_name
- default๋ก ์ ์ธ๋ ๋ณ์๋ฅผ ๋์ฒดํ๋ ํ๊ฒฝ ๋ณ์
TF_CLI_ARGS / TF_CLI_ARGS_subcommand
- ํ ๋ผํผ ์คํ ์ ์ถ๊ฐํ ์ธ์๋ฅผ ์ ์
TF_DATA_DIR
- ์์
๋๋ ํฐ๋ฆฌ๋ณ ๋ฐ์ดํฐ(state ์ ์ฅ ๋ฐฑ์๋, ๋ชจ๋, ์ํฐํฉํธ ๋ฑ)๋ฅผ ๋ณด๊ดํ๋ ์์น๋ฅผ ์ง์
โ init ์ดํ์ TF_DATA_DIR ๊ฒฝ๋ก๋ฅผ ์ฌ์ง์ ํ๋ ๊ฒฝ์ฐ ํ๋ฌ๊ทธ์ธ ์ค์น๊ฐ ํ์ํ๋ค๋ ๋ฉ์ธ์ง๊ฐ ์ถ๋ ฅ
CH4. ํ๋ก๋ฐ์ด๋
- ํ ๋ผํผ์ ์ฝ๋๋ก ๊ด๋ฆฌํ๊ณ ์ ํ๋ ๋์์ ํธ์ถ ํ๋ ๋ฐฉ์์ผ๋ก ์คํ
- ๊ด๋ฆฌํ๊ณ ์ ํ๋ ๋์๋ค์ ํธ์ถํ๋ ๋ฐฉ์์ ๋ชจ๋ ๋ค๋ฅด์ง๋ง ์ผ๊ด๋๊ฒ ํธ์ถ ํ ์ ์๋ ์ด์ โ ํ๋ก๋ฐ์ด๋
- ํ๋ก๋ฐ์ด๋๋ ํ ๋ผํผ์ด ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ์ ํ๊ณผ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ฐ๊ฒฐ
- ํ ๋ผํผ์ ํ๋ก๋ฐ์ด๋ ์์ด๋ ์ด๋ค ์ข ๋ฅ์ ์ธํ๋ผ์ ์๋น์ค๋ ๊ด๋ฆฌํ ์ ์๋ค
4-1. ํ๋ก๋ฐ์ด๋ ๊ตฌ์ฑ
- ํ๋ก๋ฐ์ด๋์๋ Tier๊ฐ ์กด์ฌ
โ Official (hashicorp๊ฐ ๊ด๋ฆฌ) / Partner (ํํธ๋๊ฐ ๊ด๋ฆฌ) / Community (๊ฐ์ธ) / Archived (๊ด๋ฆฌ๋์ง ์์)
๋จ์ผ ํ๋ก๋ฐ์ด๋์ ๋ค์ค ์ ์
- ๋จ์ผ ํ๋ก๋ฐ์ด๋๋ฅผ ๋ค์ค ์ ์ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ โ ํ๋ก๋ฐ์ด๋์ alias๋ฅผ ์ ์ธ`
provider "aws" {
region = "us-west-1"
}
provider "aws" {
alias = "seoul"
region = "ap-northeast-2"
}
resource "aws_instance" "app_server" {
provider = aws.seoul
ami = "ami-0c9c942bd7bf113a2"
instance_type = "t3.micro"
}
ํ๋ก๋ฐ์ด๋ ์ค์น ๋ฐ ์๊ตฌ์ฌํญ ์ ์
- terraform init ๋ช ๋ น์ ํตํด ์ ์๋ ํ๋ก๋ฐ์ด๋๋ฅผ ์ค์นํ๊ฒ ๋๋ค.
- ์ฝ๋๋ก ์์ฑํ ์ธํ๋ผ๋ฅผ ํญ์ ๋์ผํ ํ๋ก๋ฐ์ด๋๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ
โ terraform ๋ธ๋ญ์ ํ๋ก๋ฐ์ด๋ ๋ฒ์ ์ ๋ช ์
โ .terraform.lock.hcl์ ์ฝ๋์ ํจ๊ป ๊ณต์ - terraform ๋ธ๋ญ์ required_providers ๋ธ๋ญ์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก๋ฐ์ด๋๋ฅผ ์ ์ํ ์ ์๋ค.
- required_providers ๋ธ๋ญ์ source์๋ ํ๋ก๋ฐ์ด๋ ๋ค์ด๋ก๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ณ , version์๋ ๋ฒ์ ์ ์ฝ์ ๋ช ์ํ๋ค.
4-2. ํ๋ก๋ฐ์ด๋ ์์ฝ์์คํ
- ์์ฝ์์คํ ์ ์ํ ํ ๋ผํผ ํตํฉ โ ์ํฌํ๋ก ํํธ๋์ ์ธํ๋ผ ํํธ๋
- ์ํฌํ๋ก ํํธ๋ โ ํ ๋ผํผ ์คํ๊ณผ ์ฐ๊ณํ์ฌ ๋์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณต
- ์ธํ๋ผ ํํธ๋ โ ์ฌ์ฉ์๊ฐ ๋์ ํ๋ซํผ์ API๋ก ๋ฆฌ์์ค ๊ด๋ฆฌ
4-3. ํ๋ก๋ฐ์ด๋ ๊ฒฝํํด๋ณด๊ธฐ
AWS
- ํ์ ๊ฐ์ โ IAM ์ฝ์ โ ์ก์ธ์ค ํค ๋ฐ๊ธ โ ํ ๋ผํผ ์ฝ๋ ์์ฑ
Azure
- UI(์ฝ์)๋ก ID์ ์ํฌ๋ฆฟ ์ทจ๋ํ๋ ๋ฐฉ๋ฒ
- ํ์ ๊ฐ์
โ Azure Active Directory โ ์ ํ๋ฆฌ์ผ์ด์
๋ฑ๋ก โ client_id์ tenant_id ํ์ธ
โ ํด๋ผ์ด์ธํธ ์ํธ ์ค์ โ client_secret ํ์ธ โ subscription_id ํ์ธ โ ์ก์ธ์ค ์ ์ด(IAM)์์ ์ญํ ํ ๋น โ ๊ตฌ์ฑ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋ก
โ ํ ๋ผํผ ์ฝ๋ ์์ฑ
GCP
- UI(์ฝ์)๋ก ID์ ์ํฌ๋ฆฟ ์ทจ๋ํ๋ ๋ฐฉ๋ฒ
- ํ์๊ฐ์ โ IAM ๋ฐ ๊ด๋ฆฌ์์์ ํ๋ก์ ํธ ์ ํ ๋๋ ์์ฑ โ JSON ์ ํ์ ํค๋ฅผ ๋ค์ด๋ก๋ โ ํ ๋ผํผ ์ฝ๋ ์์ฑ
Alibaba Cloud
- UI(์ฝ์)๋ก ID์ ์ํฌ๋ฆฟ ์ทจ๋ํ๋ ๋ฐฉ๋ฒ
- ํ์๊ฐ์
โ RAM(Resource Access Management)์์ ์๋ธ User ์์ฑ โ ์๋ธ User์ ๋ฆฌ์์ค ๊ด๋ จ ๊ถํ ๋ถ์ฌ
โ RAM์์ AccessKey ID์ AccessKey Secret ํ์ธ โ ํ ๋ผํผ ์ฝ๋ ์์ฑ