TF 101 Study 3μ£Όμ°¨ μ 리 - 쑰건μ, ν¨μ, νλ‘λΉμ λ, νκ²½ λ³μ, νλ‘λ°μ΄λ
- 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 νμΈ β ν λΌνΌ μ½λ μμ±