๐Ÿš€ Terraform ์‹ค๋ฌด ์‹œ๋‚˜๋ฆฌ์˜ค 15์„ : DevOps ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ์‹ค๋ฌด ์œ„์ฃผ์˜ ํ•ต์‹ฌ ์งˆ๋ฌธ/์ƒ์„ธ ๋‹ต๋ณ€

# ํ˜„์žฅ์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Terraform ์˜ ์ƒ์„ธํ•œ 15๊ฐ€์ง€ ์‹ค๋ฌด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

1. ์‹œ๋‚˜๋ฆฌ์˜ค: EC2 ์ธ์Šคํ„ด์Šค์˜ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ

  • :red_question_mark: ์งˆ๋ฌธ : EC2 ์ธ์Šคํ„ด์Šค์˜ AMI ID๋ฅผ ๋‹ค์šดํƒ€์ž„ ์—†์ด ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Terraform์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ญ์ œ ํ›„ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šดํƒ€์ž„์„ ํ”ผํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?**

  • :cloud: ๋‹ต๋ณ€: 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. ์‹œ๋‚˜๋ฆฌ์˜ค: ํฌ๋กœ์Šค ๋ฆฌ์ „ ์ธํ”„๋ผ ๊ด€๋ฆฌ

  • :red_question_mark: ์งˆ๋ฌธ : ๋™์ผํ•œ Terraform ์„ค์ •์—์„œ us-east-1 ๋ฆฌ์ „์— S3 ๋ฒ„ํ‚ท์„, ap-south-1 ๋ฆฌ์ „์— EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: ์—ฌ๋Ÿฌ 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 ์ฒ˜๋ฆฌ

  • :red_question_mark: ์งˆ๋ฌธ : Terraform์œผ๋กœ ๊ด€๋ฆฌ ์ค‘์ธ AWS ์ธํ”„๋ผ๊ฐ€ ๋‹ค๋ฅธ ํŒ€์— ์˜ํ•ด ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Terraform์—์„œ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ณด์ด์ง€ ์•Š์ง€๋งŒ AWS ์ฝ˜์†”์—์„œ๋Š” ์ฐจ์ด๊ฐ€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํƒ์ง€ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: terraform plan -refresh-only ๋ช…๋ น์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜์ง€ ์•Š๊ณ  drift๋ฅผ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    terraform state list๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์  ์ค‘์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ importํ•ฉ๋‹ˆ๋‹ค:

terraform import aws_instance.example i-1234567890abcdef0

ํ•„์š”ํ•˜๋‹ค๋ฉด terraform apply๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์˜ˆ์ƒ๋˜๋Š” ๊ตฌ์„ฑ์œผ๋กœ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.


4. ์‹œ๋‚˜๋ฆฌ์˜ค: Terraform ๋ณด์•ˆ ์ •์ฑ… ๊ฐ•์ œ ์ ์šฉ

  • :red_question_mark: ์งˆ๋ฌธ : ํšŒ์‚ฌ๋Š” AWS ๋น„์šฉ์„ ํ†ต์ œํ•˜๊ธฐ ์œ„ํ•ด t2.micro ์ธ์Šคํ„ด์Šค๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์ œํ•œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Terraform์—์„œ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: 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

  • :red_question_mark: ์งˆ๋ฌธ :Terraform์„ ์‚ฌ์šฉํ•ด Auto Scaling Group(ASG)์— Blue-Green ๋ฐฐํฌ ์ „๋žต์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: ๋‘ ๊ฐœ์˜ 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 ์‹คํŒจ

  • :red_question_mark: ์งˆ๋ฌธ : ๋‹จ์ผ terraform apply์—์„œ 100๊ฐœ ์ด์ƒ์˜ AWS ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ, AWS API rate limit ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: 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. ์‹œ๋‚˜๋ฆฌ์˜ค: ์ค‘์š” ๋ฆฌ์†Œ์Šค์˜ ์‹ค์ˆ˜๋กœ ์ธํ•œ ์‚ญ์ œ ๋ฐฉ์ง€

  • :red_question_mark: ์งˆ๋ฌธ : Terraform์œผ๋กœ ๊ด€๋ฆฌ ์ค‘์ธ ํ”„๋กœ๋•์…˜ RDS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์‹ค์ˆ˜๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: prevent_destroy lifecycle ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

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 ๊ด€๋ฆฌ

  • :red_question_mark: ์งˆ๋ฌธ : ์กฐ์ง์— AWS ๊ณ„์ •์ด ์—ฌ๋Ÿฌ ๊ฐœ(Dev, QA, Prod) ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: 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) ์ด์Šˆ ์ฒ˜๋ฆฌ

  • :red_question_mark: ์งˆ๋ฌธ : ํŒ€์—์„œ S3์— ์›๊ฒฉ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ํŒ€์›์˜ Terraform ์‹คํ–‰์ด ์‹คํŒจํ•˜๋ฉด์„œ ์ƒํƒœ๊ฐ€ ์ž ๊ธด ์ฑ„๋กœ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋‚˜์š”?

  • :cloud: ๋‹ต๋ณ€: terraform { backend "s3" { } }๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Terraform์€ DynamoDB์—์„œ ์ƒํƒœ๋ฅผ ์ž๋™์œผ๋กœ ์ž ๊ธ‰๋‹ˆ๋‹ค.

์ž ๊ธˆ์ด ์ง€์†๋˜๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

terraform force-unlock <LOCK_ID>

์ž ๊ธˆ์„ ํ•ด์ œํ•˜๊ธฐ ์ „์— terraform state list์™€ terraform state show๋กœ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.


10. ์‹œ๋‚˜๋ฆฌ์˜ค: ์‹คํŒจํ•œ Terraform ๋ฐฐํฌ ๋กค๋ฐฑ

  • :red_question_mark: ์งˆ๋ฌธ : terraform apply๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž˜๋ชป ์ˆ˜์ •ํ•ด ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ƒํƒœ๋กœ ๋น ๋ฅด๊ฒŒ ๋กค๋ฐฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: ์ด์ „ ์ƒํƒœ ํŒŒ์ผ์ด ์›๊ฒฉ(S3, Terraform Cloud)์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค:

terraform state pull > backup.tfstate
terraform state push backup.tfstate

์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ๋˜๋Œ๋ฆฐ ๋’ค Terraform์„ ๋‹ค์‹œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด terraform apply๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ค‘์š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค.


11. ์‹œ๋‚˜๋ฆฌ์˜ค: Terraform ๋ชจ๋“ˆ๋กœ ๋™์  ๋ฆฌ์†Œ์Šค ์Šค์ผ€์ผ๋ง

  • :red_question_mark: ์งˆ๋ฌธ : ์ธํ”„๋ผ๊ฐ€ ํ™˜๊ฒฝ(dev, prod)์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ EC2 ์ธ์Šคํ„ด์Šค ํƒ€์ž…์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. Terraform ๋ชจ๋“ˆ์—์„œ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์„ ๋™์ ์œผ๋กœ ์ง€์ •ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: 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์—์„œ ์‹œํฌ๋ฆฟ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ

  • :red_question_mark: ์งˆ๋ฌธ : Terraform ์ฝ”๋“œ์—์„œ AWS ์ž๊ฒฉ ์ฆ๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋“œ์ฝ”๋”ฉ ์—†์ด ์ด ์‹œํฌ๋ฆฟ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: 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) ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ

  • :red_question_mark: ์งˆ๋ฌธ : Terraform ์ƒํƒœ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ์ปค์ ธ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

  • :cloud: ๋‹ต๋ณ€: 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์—์„œ ์›Œ์ปค ๋…ธ๋“œ ์˜คํ† ์Šค์ผ€์ผ๋ง

  • :red_question_mark: ์งˆ๋ฌธ : Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ AWS EKS์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. Terraform์œผ๋กœ ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์˜คํ† ์Šค์ผ€์ผ๋งํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋‚˜์š”?

  • :cloud: ๋‹ต๋ณ€: 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์—์„œ ๋ฆฌ์†Œ์Šค ์žฌ์ƒ์„ฑ ํšŒํ”ผ

  • :red_question_mark: ์งˆ๋ฌธ : EC2 ์ธ์Šคํ„ด์Šค ํƒ€์ž…์„ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๋ฐ, Terraform์ด in-place ์ˆ˜์ • ๋Œ€์‹  ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•˜๋‚˜์š”?

  • :cloud: ๋‹ต๋ณ€: ignore_changes lifecycle ๊ทœ์น™์„ ์‚ฌ์šฉํ•ด ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค:

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

[์ถœ์ฒ˜] https://medium.com/devops-dev/15-terraform-scenarios-every-devops-engineer-should-know-part-3-e1e2307333ab

2 Likes