ν λΌνΌ(Terraform) κΈ°μ΄μ λͺ¨λ κ²!
π ν λΌνΌ(Terraform) μ΄λ?
ν λΌνΌ(Terraform)μ μΈνλΌμ€νΈλμ²λ₯Ό μ½λλ‘ κ΄λ¦¬νκΈ° μν μ€νμμ€ λꡬμ λλ€. AWS, Google Cloud Platform, Microsoft Azure λ± λ€μν ν΄λΌμ°λ μλΉμ€ λ° μ¨νλ λ―Έμ€ μΈνλΌλ₯Ό μ§μνλ©°, μ½λλ‘ μΈνλΌλ₯Ό ꡬμ±νκ³ λ³κ²½μ¬νμ μΆμ , κ΄λ¦¬ν μ μμ΅λλ€.
ν λΌνΌμ μ¬μ©νλ μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
μ₯μ :
-
μ½λλ‘ μΈνλΌλ₯Ό κ΄λ¦¬νκΈ° λλ¬Έμ, λ°λ³΅μ μ΄κ³ μΌκ΄μ± μλ μΈνλΌ κ΅¬μ±μ΄ κ°λ₯ν©λλ€.
-
μ½λ κ΄λ¦¬ λꡬ(Git λ±)λ₯Ό μ¬μ©νμ¬ λ³κ²½ μ΄λ ₯μ μΆμ νκ³ , μ΄λ ₯μ λ°λΌ μΈνλΌλ₯Ό 볡μν μ μμ΅λλ€.
-
λ€μν ν΄λΌμ°λ μλΉμ€ λ° μ¨νλ λ―Έμ€ μΈνλΌλ₯Ό μ§μνλ©°, μΈνλΌ λ³΅μ‘λκ° λμμ§λλΌλ μ½λλ‘ κ΄λ¦¬ν μ μμ΅λλ€.
-
ν λΌνΌμ μΈνλΌλ₯Ό λ³κ²½ν λ μλ‘μ΄ μΈνλΌλ₯Ό λ§λ€κ³ μ΄μ μΈνλΌλ₯Ό μ κ±°νλ λ°©μμΌλ‘ λ³κ²½μ¬νμ μ μ©ν©λλ€. μ΄λ₯Ό ν΅ν΄ λ³κ²½μ¬ν μ μ© μ€μλ μΈνλΌμ μμ μ±μ μ μ§ν μ μμ΅λλ€.
λ¨μ :
- νμ΅ κ³‘μ μ΄ λμ΅λλ€. ν λΌνΌμ λ€μν κΈ°λ₯κ³Ό κ΅¬μ± μμλ₯Ό μ 곡νκΈ° λλ¬Έμ μ²μ μ κ·Όνλ μ¬μ©μμκ²λ μ΄ν΄νκΈ° μ΄λ €μΈ μ μμ΅λλ€.
- ν λΌνΌ μ½λ μμ± μ λͺ¨λνκ° νμν κ²½μ°κ° λ§μ΅λλ€.
- λͺ¨λνλ μ½λλ₯Ό μμ±νλ €λ©΄, μΆκ°μ μΈ νμ΅κ³Ό κ²½νμ΄ νμν©λλ€.
βοΈ ν λΌνΌμ κΈ°λ³Έ νμΌ κ΅¬μ± λ° μ ν μ 리
-
main.tf νμΌμλ μΈνλΌλ₯Ό ꡬμ±νλ 리μμ€μ λ°μ΄ν° μμ€λ₯Ό μ μν©λλ€.
provider "aws" { region = var.region } resource "aws_instance" "example" { ami = var.ami_id instance_type = var.instance_type tags = { Name = "ExampleInstance" } }
-
variables.tf νμΌμλ μ λ ₯ λ³μλ₯Ό μ μν©λλ€.
variable "region" { type = string description = "AWS region to create resources in" default = "us-west-2" } variable "ami_id" { type = string description = "AMI ID for EC2 instance" } variable "instance_type" { type = string description = "EC2 instance type" default = "t2.micro" }
-
outputs.tf νμΌμλ μΆλ ₯ λ³μλ₯Ό μ μν©λλ€.
output "public_ip" { value = aws_instance.example.public_ip }
-
backend.tf ν λΌνΌ μν νμΌμ μ μ₯νλ μμΉμ νμμ μ§μ ν μ μμ΅λλ€.
# S3 λ²ν·μ μνλ₯Ό μ μ₯νλλ° μ¬μ©ν©λλ€. # λμμ± μ²΄ν¬ λ° μ΄λ―Έ λ§λ€μ΄μ Έ μ°κ΄ μλ ꡬ쑰λ₯Ό κ°κ³ μ¬ λ μ¬μ©ν©λλ€. terraform { backend "s3" { bucket = "my-terraform-state" key = "terraform.tfstate" region = "us-west-2" } }
-
env.tfvars νμΌμμλ νκ²½ λ³μλ₯Ό μ μν©λλ€. νκ²½ λ³μλ ν λΌνΌ μ€ν μ -var-file μ΅μ μ μ¬μ©νμ¬ μ§μ ν μ μμ΅λλ€.
region = "us-west-2" ami_id = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro"
βοΈ κ΅¬μ± λ¬Έλ²μ μλμ κ°μ΅λλ€.
-
data : 리μμ€κ° μλ λ°μ΄ν° μμ€(Data Source)λ₯Ό μ μνλ λͺ λ Ήμ΄μ λλ€.
-
module : λͺ¨λ(Module)μ μ μνλ λͺ λ Ήμ΄μ λλ€. λͺ¨λμ μ¬μ¬μ© κ°λ₯ν μ½λ λΈλ‘μΌλ‘, ν λΌνΌ μ½λλ₯Ό λμ± λͺ¨λννμ¬ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ λμΌ μ μμ΅λλ€.
module "vpc" { # source μ μΈλ λλ ν 리 λ©μΈ μ½λμ νΈμΆνλλ° μ¬μ©λ©λλ€. source = "terraform-aws-modules/vpc/aws" name = "example-vpc" cidr = "10.0.0.0/16" azs = ["us-west-2a", "us-west-2b"] public_subnets = ["10.0.1.0/24", "10.0.2.0/24"] private_subnets = ["10.0.10.0/24", "10.0.20.0/24"] enable_nat_gateway = true single_nat_gateway = true enable_dns_hostnames = true }
-
provider : μ¬μ©ν ν΄λΌμ°λ μλΉμ€ 곡κΈμ(Provider)λ₯Ό μ μνλ λͺ λ Ήμ΄μ λλ€. μλ₯Ό λ€μ΄, AWSλ₯Ό μ¬μ©νλ κ²½μ° provider βawsβ {}μ κ°μ΄ μμ±ν©λλ€.
provider "aws" { region = "us-west-2" } resource "aws_instance" "example" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" }
-
variable : μ λ ₯ λ³μ(Variable)λ₯Ό μ μνλ λͺ λ Ήμ΄μ λλ€. μλ₯Ό λ€μ΄, νΉμ AMI IDλ₯Ό λ³μλ‘ μ§μ νμ¬ EC2 μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²½μ° variable βami_idβ {}μ κ°μ΄ μμ±ν©λλ€.
variable "ami_id" { type = string description = "AMI ID for EC2 instance" } resource "aws_instance" "example" { ami = var.ami_id instance_type = "t2.micro" }
-
output : μΆλ ₯ λ³μ(Output)λ₯Ό μ μνλ λͺ λ Ήμ΄μ λλ€. μλ₯Ό λ€μ΄, EC2 μΈμ€ν΄μ€μ IP μ£Όμλ₯Ό μΆλ ₯νλ κ²½μ° output βinstance_ipβ {}μ κ°μ΄ μμ±ν©λλ€.
resource "aws_instance" "example" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" provisioner "local-exec" { command = "echo ${self.public_ip} > ip_address.txt" } } output "instance_ip" { value = aws_instance.example.public_ip }
π μ¬λ¬κ°μ§μ μν€ν μ² μ 리
μ΄μ 1
βββ main.tf
βββ variables.tf
βββ outputs.tf
βββ backend.tf
βββ env.tfvars
βββ modules
β βββ vpc
β β βββ main.tf
β β βββ variables.tf
β β βββ outputs.tf
β β βββ README.md
β βββ ec2
β β βββ main.tf
β β βββ variables.tf
β β βββ outputs.tf
β β βββ README.md
β βββ ...
βββ data
β βββ example.tf
β βββ ...
βββ README.md
μ΄μ 2
βββ infra
β βββ rds
β β βββ mariana_db
β β β βββ README.md
β β β βββ backend.tf
β β β βββ env-dev.tfvars
β β β βββ env-staging.tfvars
β β β βββ main.tf
β β β βββ terraform.tf
β β β βββ variables.tf
β βββ vpc
β βββ README.md
β βββ backend.tf
β βββ env-dev.tfvars
β βββ env-staging.tfvars
β βββ main.tf
β βββ terraform.tf
β βββ variables.tf
βββ modules
β βββ ec2
β β βββ ec2.tf
β β βββ main.tf
β β βββ output.tf
β β βββ variables.tf
β βββ loadbalancer
β β βββ main.tf
β β βββ variables.tf
β βββ ...
βββ service
βββ backend_example
β βββ README.md
β βββ alb.tf
β βββ ec2.tf
β βββ provider.tf
β βββ script.sh
β βββ terraform.tfvars
β βββ variables.tf
βββ frontend_example
β βββ README.md
β βββ backend.tf
β βββ env-dev.tfvars
β βββ env-prod.tfvars
β βββ env-stage.tfvars
β βββ main.tf
β βββ terraform.tf
β βββ variables.tf
β
βββ ...
βοΈ ν λΌνΌ μ€ν λͺ λ Ήμ΄λ λ€μκ³Ό κ°μ΅λλ€.
terraform init # λͺ
λ Ήμ΄λ₯Ό μ¬μ©νμ¬ ν
λΌνΌ μ€μ μ μ΄κΈ°νν©λλ€.
terraform plan # λͺ
λ Ήμ΄λ₯Ό μ¬μ©νμ¬ μΈνλΌ λ³κ²½μ¬νμ κ²ν ν©λλ€.
terraform apply # λͺ
λ Ήμ΄λ₯Ό μ¬μ©νμ¬ μΈνλΌ λ³κ²½μ¬νμ μ μ©ν©λλ€.
terraform destroy # λͺ
λ Ήμ΄λ₯Ό μ¬μ©νμ¬ μΈνλΌλ₯Ό μ κ±°ν©λλ€.
π μκ°
-
μ΄μμΌλ‘ ν λΌνΌ(Terraform)μ λν κΈ°λ³Έμ μΈ λ΄μ©κ³Ό ν λΌνΌ μ½λμ ꡬ쑰, λͺ λ Ήμ΄ λ±μ λν΄ μμ보μμ΅λλ€.
-
ν λΌνΌμ ν΄λΌμ°λ μΈνλΌλ₯Ό μ½λλ‘ κ΄λ¦¬νκ³ , μλνλ μΈνλΌ λ°°ν¬λ₯Ό κ°λ₯μΌ ν΄μ£Όλ κ°λ ₯ν λꡬμ λλ€.
λ§μ§λ§μΌλ‘ ν λΌνΌκ³Ό κ°μ΄ μ°λ©΄ μ’μκ²λ€ !
-
Packer: μΈνλΌλ₯Ό μν 컀μ€ν μ΄λ―Έμ§λ₯Ό λ§λ€κΈ° μν λꡬμ λλ€. Packerλ₯Ό μ¬μ©νλ©΄ μΈνλΌ λ¦¬μμ€λ₯Ό 미리 μ€μΉνκ³ κ΅¬μ±νμ¬ μ»€μ€ν μ΄λ―Έμ§λ₯Ό μμ±ν μ μμ΅λλ€.
-
Vault: 보μ κ΄λ¦¬ λꡬλ‘, ν λΌνΌμμ μ¬μ©λλ λΉλ° μ 보λ₯Ό μμ νκ² κ΄λ¦¬ν μ μλλ‘ λμμ€λλ€.
-
Atlantis: ν λΌνΌ μ½λμ λ³κ²½ μ¬νμ λ²μ κ΄λ¦¬ μμ€ν κ³Ό μ°λνμ¬ μλνλ μ½λ κ²ν λ₯Ό μ 곡νλ λꡬμ λλ€.
-
Terratest: ν λΌνΌ μ½λμ λ¨μ ν μ€νΈλ₯Ό μν λꡬλ‘, ν μ€νΈ μ½λλ₯Ό μμ±νμ¬ ν λΌνΌ μ½λ λ³κ²½ μ¬νμ΄ νλ‘λμ μ μν₯μ λ―ΈμΉμ§ μλλ‘ λ³΄μ₯ν©λλ€.
μ΄ μΈμλ λ€μν ν λΌνΌκ³Ό κ΄λ ¨λ λꡬλ€μ΄ μμ΅λλ€. μ΄λ€ λꡬλ€μ νμ©νλ©΄ ν λΌνΌμ λμ± ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μμΌλ©°, μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ λμΌ μ μμ΅λλ€.
κ°μ¬ν©λλ€!