# ํ์ฅ์์ ์ ์ฉํ ์ ์๋ Terraform ์ ์์ธํ 15๊ฐ์ง ์ค๋ฌด ์๋๋ฆฌ์ค๋ฅผ ๊ณต์ ํฉ๋๋ค.
1. ์๋๋ฆฌ์ค: EC2 ์ธ์คํด์ค์ ๋ฌด์ค๋จ ๋ฐฐํฌ
-
์ง๋ฌธ : EC2 ์ธ์คํด์ค์ AMI ID๋ฅผ ๋ค์ดํ์ ์์ด ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค. Terraform์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์ญ์ ํ ๋ค์ ์์ฑํ๋ ค๊ณ ํฉ๋๋ค. ๋ค์ดํ์์ ํผํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?** -
๋ต๋ณ: lifecycle ๊ท์น์์ Create Before Destroy๋ฅผ ์ฌ์ฉํฉ๋๋ค.
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = "t3.micro"
lifecycle {
create_before_destroy = true
}
}
์ด ์ค์ ์ ๊ธฐ์กด ์ธ์คํด์ค๊ฐ ์ญ์ ๋๊ธฐ ์ ์ ์๋ก์ด ์ธ์คํด์ค๊ฐ ๋จผ์ ์์ฑ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋ํ Auto Scaling Group(ASG)์ ์ฌ์ฉํ์ฌ ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉํ ์๋ ์์ต๋๋ค.
2. ์๋๋ฆฌ์ค: ํฌ๋ก์ค ๋ฆฌ์ ์ธํ๋ผ ๊ด๋ฆฌ
-
์ง๋ฌธ : ๋์ผํ Terraform ์ค์ ์์ us-east-1 ๋ฆฌ์ ์ S3 ๋ฒํท์, ap-south-1 ๋ฆฌ์ ์ EC2 ์ธ์คํด์ค๋ฅผ ๋ฐฐํฌํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น์? -
๋ต๋ณ: ์ฌ๋ฌ provider ๊ตฌ์ฑ์ ์ฌ์ฉํฉ๋๋ค
provider "aws" {
alias = "us-east"
region = "us-east-1"
}
provider "aws" {
alias = "us-south"
region = "ap-south-1"
}
resource "aws_s3_bucket" "example" {
provider = aws.us-east
bucket = "my-bucket-us-east"
}
resource "aws_instance" "example" {
provider = aws.us-south
ami = "ami-123456"
instance_type = "t2.micro"
}
๊ฐ ๋ฆฌ์์ค๋ ๋ช ์์ ์ผ๋ก provider alias์ ํ ๋น๋ฉ๋๋ค.
3. ์๋๋ฆฌ์ค: ํ๋ก๋์ ํ๊ฒฝ์์์ Terraform Drift ์ฒ๋ฆฌ
-
์ง๋ฌธ : Terraform์ผ๋ก ๊ด๋ฆฌ ์ค์ธ AWS ์ธํ๋ผ๊ฐ ๋ค๋ฅธ ํ์ ์ํด ์๋์ผ๋ก ์์ ๋์์ต๋๋ค. Terraform์์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ณด์ด์ง ์์ง๋ง AWS ์ฝ์์์๋ ์ฐจ์ด๊ฐ ํ์ธ๋ฉ๋๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ํ์งํ๊ณ ์์ ํ ์ ์์๊น์? -
๋ต๋ณ: terraform plan -refresh-only๋ช ๋ น์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ง ์๊ณ drift๋ฅผ ํ์งํฉ๋๋ค.
terraform state list๋ฅผ ์ฌ์ฉํ์ฌ ์ถ์ ์ค์ธ ๋ฆฌ์์ค๋ฅผ ํ์ธํฉ๋๋ค. ๋ฆฌ์์ค๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ importํฉ๋๋ค:
terraform import aws_instance.example i-1234567890abcdef0
ํ์ํ๋ค๋ฉด terraform apply๋ฅผ ์คํํ์ฌ ์์๋๋ ๊ตฌ์ฑ์ผ๋ก ๋ณต์ํฉ๋๋ค.
4. ์๋๋ฆฌ์ค: Terraform ๋ณด์ ์ ์ฑ ๊ฐ์ ์ ์ฉ
-
์ง๋ฌธ : ํ์ฌ๋ AWS ๋น์ฉ์ ํต์ ํ๊ธฐ ์ํด t2.micro ์ธ์คํด์ค๋ง ์ฌ์ฉํ๋๋ก ์ ํํ๋ ค๊ณ ํฉ๋๋ค. Terraform์์ ์ด๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์์๊น์? -
๋ต๋ณ: variables.tfํ์ผ์ Terraform validation rule์ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค ํ์ ์ ์ ํํฉ๋๋ค:
variable "instance_type" {
description = "AWS EC2 instance type"
type = string
validation {
condition = contains(["t2.micro"], var.instance_type)
error_message = "Only t2.micro instance type is allowed."
}
}
์ด๋ ๊ฒ ํ๋ฉด ์น์ธ๋์ง ์์ ์ธ์คํด์ค ํ์ ์ผ๋ก Terraform์ ์ ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
5. ์๋๋ฆฌ์ค: Terraform์ ํ์ฉํ Blue-Green Deployment
-
์ง๋ฌธ :Terraform์ ์ฌ์ฉํด Auto Scaling Group(ASG)์ Blue-Green ๋ฐฐํฌ ์ ๋ต์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ๋ฌ์ฑํ ์ ์์๊น์? -
๋ต๋ณ: ๋ ๊ฐ์ ASG(blue์ green)๋ฅผ Elastic Load Balancer(ELB) ๋ค์ ๋ฐฐ์นํฉ๋๋ค:
resource "aws_launch_template" "blue" {
name = "blue-template"
image_id = var.ami_blue
}
resource "aws_launch_template" "green" {
name = "green-template"
image_id = var.ami_green
}
resource "aws_autoscaling_group" "blue" {
launch_template {
id = aws_launch_template.blue.id
}
}
resource "aws_autoscaling_group" "green" {
launch_template {
id = aws_launch_template.green.id
}
}
resource "aws_lb_listener_rule" "switch" {
listener_arn = aws_lb_listener.http.arn
priority = 100
conditions {
field = "path-pattern"
values = ["*"]
}
actions {
type = "forward"
target_group_arn = aws_lb_target_group.green.arn
}
}
์ ๋ฒ์ ์ ๋ฐฐํฌํ ๋๋ ALB์ target group์ ๋ณ๊ฒฝํ์ฌ ํธ๋ํฝ์ ์ ํํฉ๋๋ค.
6. ์๋๋ฆฌ์ค: API Rate Limit์ผ๋ก ์ธํ terraform apply ์คํจ
-
์ง๋ฌธ : ๋จ์ผ terraform apply์์ 100๊ฐ ์ด์์ AWS ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋๋ฐ, AWS API rate limit ๋๋ฌธ์ ํ๋ก์ธ์ค๊ฐ ์คํจํฉ๋๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น์? -
๋ต๋ณ: AWS provider์์ retry ์ค์ ์ ์ฌ์ฉํฉ๋๋ค:
provider "aws" {
region = "us-east-1"
max_retries = 5
}
depends_on์ ์ฌ์ฉํด ๋ฆฌ์์ค ์์ฑ์ ๋จ๊ณ์ ์ผ๋ก ์งํํฉ๋๋ค:
resource "aws_instance" "one" {
ami = "ami-123456"
}
resource "aws_instance" "two" {
ami = "ami-123456"
depends_on = [aws_instance.one]
}
Terraform Workspaces๋ฅผ ํ์ฉํ์ฌ ์ํฌ๋ก๋๋ฅผ ๋ถํ ํฉ๋๋ค.
7. ์๋๋ฆฌ์ค: ์ค์ ๋ฆฌ์์ค์ ์ค์๋ก ์ธํ ์ญ์ ๋ฐฉ์ง
-
์ง๋ฌธ : Terraform์ผ๋ก ๊ด๋ฆฌ ์ค์ธ ํ๋ก๋์
RDS ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ค์๋ก ์ญ์ ๋์ง ์๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? -
๋ต๋ณ: prevent_destroylifecycle ๊ท์น์ ์ฌ์ฉํฉ๋๋ค:
resource "aws_db_instance" "production_db" {
identifier = "prod-db"
engine = "mysql"
instance_class = "db.t3.large"
lifecycle {
prevent_destroy = true
}
}
terraform destroy๊ฐ ์คํ๋๋ฉด ์ด ๋ฆฌ์์ค์ ๋ํด์๋ ์คํจํ๊ฒ ๋ฉ๋๋ค.
8. ์๋๋ฆฌ์ค: ๋ฉํฐ ํ ๋ํธ AWS ๊ณ์ ์ Terraform ๊ด๋ฆฌ
-
์ง๋ฌธ : ์กฐ์ง์ AWS ๊ณ์ ์ด ์ฌ๋ฌ ๊ฐ(Dev, QA, Prod) ์์ต๋๋ค. ๋ฐฐํฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? -
๋ต๋ณ: Terraform Workspaces๋ฅผ ์ฌ์ฉํด ๋ฉํฐ ํ๊ฒฝ์ ๊ด๋ฆฌํฉ๋๋ค:
terraform workspace new dev
terraform workspace new prod
terraform workspace select prod
Terraform ์ค์ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํฉ๋๋ค:
provider "aws" {
region = "us-east-1"
alias = terraform.workspace
}
resource "aws_s3_bucket" "example" {
bucket = "my-bucket-${terraform.workspace}"
}
9. ์๋๋ฆฌ์ค: Terraform ์ํ ์ ๊ธ(State Lock) ์ด์ ์ฒ๋ฆฌ
-
์ง๋ฌธ : ํ์์ S3์ ์๊ฒฉ ์ํ๋ฅผ ์ฌ์ฉ ์ค์
๋๋ค. ํ์์ Terraform ์คํ์ด ์คํจํ๋ฉด์ ์ํ๊ฐ ์ ๊ธด ์ฑ๋ก ๋จ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์? -
๋ต๋ณ: terraform { backend "s3" { } }๋ฅผ ์ฌ์ฉํ ๋ Terraform์ DynamoDB์์ ์ํ๋ฅผ ์๋์ผ๋ก ์ ๊ธ๋๋ค.
์ ๊ธ์ด ์ง์๋๋ฉด ๋ค์์ ์คํํฉ๋๋ค:
terraform force-unlock <LOCK_ID>
์ ๊ธ์ ํด์ ํ๊ธฐ ์ ์ terraform state list์ terraform state show๋ก ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
10. ์๋๋ฆฌ์ค: ์คํจํ Terraform ๋ฐฐํฌ ๋กค๋ฐฑ
-
์ง๋ฌธ : terraform apply๊ฐ ๋ฆฌ์์ค๋ฅผ ์๋ชป ์์ ํด ์ฅ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด์ ์ํ๋ก ๋น ๋ฅด๊ฒ ๋กค๋ฐฑํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? -
๋ต๋ณ: ์ด์ ์ํ ํ์ผ์ด ์๊ฒฉ(S3, Terraform Cloud)์ ์ ์ฅ๋์ด ์๋ค๋ฉด ๋ณต์ํฉ๋๋ค:
terraform state pull > backup.tfstate
terraform state push backup.tfstate
์๋ชป๋ ์ฝ๋๋ฅผ ๋๋๋ฆฐ ๋ค Terraform์ ๋ค์ ์ ์ฉํฉ๋๋ค. ํ์ํ๋ค๋ฉด terraform apply๋ฅผ ์คํํ๊ธฐ ์ ์ ์ค์ ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ๋ณต๊ตฌํฉ๋๋ค.
11. ์๋๋ฆฌ์ค: Terraform ๋ชจ๋๋ก ๋์ ๋ฆฌ์์ค ์ค์ผ์ผ๋ง
-
์ง๋ฌธ : ์ธํ๋ผ๊ฐ ํ๊ฒฝ(dev, prod)์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ EC2 ์ธ์คํด์ค ํ์
์ ์๊ตฌํฉ๋๋ค. Terraform ๋ชจ๋์์ ์ธ์คํด์ค ํ์
์ ๋์ ์ผ๋ก ์ง์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? -
๋ต๋ณ: terraform.tfvars๋๋variables.tf๋ด๋ถ์ map์ ์ฌ์ฉํฉ๋๋ค:
variable "instance_type_map" {
type = map(string)
default = {
dev = "t2.micro"
prod = "t3.large"
}
}
resource "aws_instance" "example" {
ami = "ami-123456"
instance_type = var.instance_type_map[var.environment]
}
Terraform ๋ณ์์ environment = "prod"๋ฅผ ์ ๋ฌํ์ฌ ์ฌ๋ฐ๋ฅธ ์ธ์คํด์ค ํ์
์ ์ ํํฉ๋๋ค.
12. ์๋๋ฆฌ์ค: Terraform์์ ์ํฌ๋ฆฟ์ ์์ ํ๊ฒ ๊ด๋ฆฌ
-
์ง๋ฌธ : Terraform ์ฝ๋์์ AWS ์๊ฒฉ ์ฆ๋ช
์ด ํ์ํฉ๋๋ค. ํ๋์ฝ๋ฉ ์์ด ์ด ์ํฌ๋ฆฟ์ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? -
๋ต๋ณ: AWS Secrets Manager๋ฅผ ์ฌ์ฉํด ๋์ ์ผ๋ก ์ํฌ๋ฆฟ์ ์กฐํํฉ๋๋ค:
data "aws_secretsmanager_secret_version" "db_creds" {
secret_id = "my-db-creds"
}
resource "aws_db_instance" "db" {
username = jsondecode(data.aws_secretsmanager_secret_version.db_creds.secret_string)["username"]
password = jsondecode(data.aws_secretsmanager_secret_version.db_creds.secret_string)["password"]
}
๋๋ ํ๊ฒฝ ๋ณ์(TF_VAR_secret)์ ํจ๊ป Terraform ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
13. ์๋๋ฆฌ์ค: ๋ํ Terraform ์ํ(State) ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ
-
์ง๋ฌธ : Terraform ์ํ ํ์ผ์ด ๋๋ฌด ์ปค์ ธ ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค. ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? -
๋ต๋ณ: Terraform State Splitting์ ์ฌ์ฉํฉ๋๋ค: ์๋ก ๋ค๋ฅธ workspace๋ backend๋ก ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฆฌํด ์ฌ๋ฌ ์ํ ํ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
Terraform State Locking์ ํ์ฑํํฉ๋๋ค: ๋์์ฑ ์ด์ ๋ฐฉ์ง๋ฅผ ์ํด S3์ DynamoDB๋ฅผ ์ฌ์ฉํฉ๋๋ค:
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-lock"
}
}
๋ํ terraform workspace new dev ๋ฑ Terraform Workspaces๋ก ํ๊ฒฝ์ ๊ฒฉ๋ฆฌํฉ๋๋ค.
14. ์๋๋ฆฌ์ค: EKS์์ ์์ปค ๋ ธ๋ ์คํ ์ค์ผ์ผ๋ง
-
์ง๋ฌธ : Kubernetes ํด๋ฌ์คํฐ๊ฐ AWS EKS์์ ๋์ํฉ๋๋ค. Terraform์ผ๋ก ์์ปค ๋
ธ๋๋ฅผ ๋์ ์ผ๋ก ์คํ ์ค์ผ์ผ๋งํ๋ ค๋ฉด ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋์? -
๋ต๋ณ: AWS Auto Scaling Group์ Terraform์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค:
resource "aws_autoscaling_group" "eks_nodes" {
min_size = 2
max_size = 10
desired_capacity = 3
tag {
key = "kubernetes.io/cluster/my-cluster"
value = "owned"
propagate_at_launch = true
}
}
Cluster Autoscaler์ ๊ฒฐํฉํ์ฌ ๋ ธ๋ ์๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํฉ๋๋ค.
15. ์๋๋ฆฌ์ค: Terraform์์ ๋ฆฌ์์ค ์ฌ์์ฑ ํํผ
-
์ง๋ฌธ : EC2 ์ธ์คํด์ค ํ์
์ ์
๋ฐ์ดํธํ๋๋ฐ, Terraform์ด in-place ์์ ๋์ ์ญ์ ํ ์ฌ์์ฑ์ ์๋ํฉ๋๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ๋ฐฉ์งํ๋์? -
๋ต๋ณ: ignore_changeslifecycle ๊ท์น์ ์ฌ์ฉํด ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ ์งํฉ๋๋ค:
resource "aws_instance" "example" {
ami = "ami-123456"
instance_type = "t2.micro"
lifecycle {
ignore_changes = [instance_type]
}
}
์์ ์ด ๊ผญ ํ์ํ๋ค๋ฉด Terraform ์ธ๋ถ์์ ์๋์ผ๋ก ๋ณ๊ฒฝํ ๋ค ๋ค์์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ importํฉ๋๋ค:
terraform import aws_instance.example i-1234567890abcdef
