Terraform ํ•จ์ •

Terraform ํ•จ์ •
๋ฃจํ”„, if ๋ฌธ, ๋ฐฐํฌ ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ํ•จ์ •์„ ๋น„๋กฏํ•˜์—ฌ Terraform ์ „์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ํ•จ์ •์„ ๊ฐ•์กฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • count ๋ฐ for_each ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์šดํƒ€์ž„ ์—†๋Š” ๋ฐฐํฌ ์ œํ•œ
  • ์ข‹์€ ๊ณ„ํš์ด๋ผ๋„ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฆฌํŒฉํ† ๋ง์—๋Š” ํ•จ์ •์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€์—ฐ๋œ ์ผ๊ด€์„ฑ์€ ์ง€์—ฐ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

count ๋ฐ for_each ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์žฅ์˜ ์˜ˆ์ œ์—์„œ๋Š” ๋ฃจํ”„์™€ ์กฐ๊ฑด ๋…ผ๋ฆฌ์—์„œ count ๋งค๊ฐœ๋ณ€์ˆ˜์™€ for_each ํ‘œํ˜„์‹์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์€ ์ข‹์€ ์„ฑ๊ณผ๋ฅผ ๋ณด์ด์ง€๋งŒ, ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • count๋‚˜ for_each์—์„œ๋Š” ๋ฆฌ์†Œ์Šค ์ถœ๋ ฅ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ ๊ตฌ์„ฑ์—์„œ๋Š” count์™€ for_each๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

count ๋˜๋Š” for_each์—์„œ๋Š” ๋ฆฌ์†Œ์Šค ์ถœ๋ ฅ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋Œ€์˜ EC2 ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•˜์ง€๋งŒ ์–ด๋–ค ์ด์œ ์—์„œ์ธ์ง€ ASG๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

resource "aws_instance" "example_1" {
   count             = 3
   ami                = "ami-0c55b159cbfafe1f0"
   instance_type = "t2.micro"
}

ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

count ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ •์  ๊ฐ’์œผ๋กœ ์„ค์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด ์ฝ”๋“œ๋Š” ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, apply ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์„ธ ๊ฐœ์˜ EC2 ์„œ๋ฒ„๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ AWS ์ง€์—ญ ๋‚ด์˜ ๊ฐ ๊ฐ€์šฉ ์˜์—ญ(AZ)์— ํ•˜๋‚˜์˜ ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? aws_availability_zones ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ์˜์—ญ ๋ชฉ๋ก์„ ๋กœ๋“œํ•œ ๋‹ค์Œ ๊ฐ ์˜์—ญ์„ "๋ฃจํ”„"๋กœ ์‹คํ–‰ํ•˜๊ณ  count ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ EC2 ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธ๋ฑ์Šค๋กœ ๋ฐฐ์—ด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

resource "aws_instance" "example_2" {
   count                   = length(data.aws_availability_zones.all.names)
   availability_zone   = data.aws_availability_zones.all.names[count.index]
   ami                     = "ami-0c55b159cbfafe1f0"
   instance_type       = "t2.micro"
}

data "aws_availability_zones" "all" {}

์ด ์ฝ”๋“œ๋„ count ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ฌธ์ œ์—†์ด ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์„œ๋ฒ„ ์ˆ˜๊ฐ€ ์ผ๋ถ€ ๋ฆฌ์†Œ์Šค์˜ ์ถœ๋ ฅ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ random_integer ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์—์„œ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ์ด ๋ฆฌ์†Œ์Šค๋Š” ์ž„์˜์˜ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

resource "random_integer" "num_instances" {
  min = 1
  max = 3
}

์ด ์ฝ”๋“œ๋Š” 1๊ณผ 3 ์‚ฌ์ด์˜ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. aws_instance ๋ฆฌ์†Œ์Šค์˜ count ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์ด ๋ฆฌ์†Œ์Šค์˜ ๊ฒฐ๊ณผ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

resource "aws_instance" "example_3" {
   count             = random_integer.num_instances.result
   ami                = "ami-0c55b159cbfafe1f0"
   instance_type = "t2.micro"
}

์ด ์ฝ”๋“œ์—์„œ terraform plan์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Error: Invalid count argument

   on main.tf line 30, in resource "aws_instance" "example_3":
   30: count = random_integer.num_instances.result

The "count" value depends on resource attributes that cannot be determined until apply, so Terraform cannot predict how many instances will be created. To work around this, use the -target argument to first apply only the resources that the count depends on.

Terraform์—์„œ๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์ˆ˜์ •๋˜๊ธฐ ์ „, ๊ณ„ํš ์‹œ์ ์— count์™€ for_each๋ฅผ ํ‰๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, count์™€ for_each๋Š” ๋ฆฌํ„ฐ๋Ÿด, ๋ณ€์ˆ˜, ๋ฐ์ดํ„ฐ ์†Œ์Šค, ์‹ฌ์ง€์–ด ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก(๊ธธ์ด๋ฅผ ์Šค์ผ€์ค„๋ง ์‹œ์ ์— ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ)์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณ„์‚ฐ๋œ ๋ฆฌ์†Œ์Šค ์ถœ๋ ฅ ๋ณ€์ˆ˜๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ๊ตฌ์„ฑ์—์„œ๋Š” count์™€ for_each๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์‹œ์ ์—์„œ๋Š” ๋ชจ๋“ˆ ๊ตฌ์„ฑ์— count ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

module "count_example" {
     source = "../../../../modules/services/webserver-cluster"

     count = 3

     cluster_name = "terraform-up-and-running-example"
     server_port = 8080
     instance_type = "t2.micro"
}

์ด ์ฝ”๋“œ๋Š” ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ count๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค์˜ ์‚ฌ๋ณธ์„ ์„ธ ๊ฐœ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๋ชจ๋“ˆ์˜ count ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ถ€์šธ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ชจ๋“ˆ์„ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ terraform plan์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Error: Reserved argument name in module block

   on main.tf line 13, in module "count_example":
   13: count = 3

The name "count" is reserved for use in a future version of Terraform.

์•ˆํƒ€๊น๊ฒŒ๋„ Terraform 0.12.6๋ถ€ํ„ฐ ๋ชจ๋“ˆ ๋ฆฌ์†Œ์Šค์—์„œ count๋‚˜ for_each๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Terraform 0.12 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ(http://bit.ly/3257bv4)์— ๋”ฐ๋ฅด๋ฉด, HashiCorp์—์„œ๋Š” ํ–ฅํ›„ ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด๋ฏ€๋กœ, ์ด ๊ธ€์„ ์ฝ๋Š” ์‹œ์ ์— ๋”ฐ๋ผ ์ด๋ฏธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด, ์—ฌ๊ธฐ์—์„œ Terraform ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.

์ œ๋กœ ๋‹ค์šดํƒ€์ž„ ๋ฐฐํฌ์˜ ํ•œ๊ณ„

ASG์™€ ํ•จ๊ป˜ create_before_destroy ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์šดํƒ€์ž„ ์—†๋Š” ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ด ๋˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ํ™•์žฅ ๊ทœ์น™์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋” ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด, ๋ชจ๋“  ๋ฐฐํฌ์—์„œ ASG ํฌ๊ธฐ๋ฅผ min_size๋กœ ์žฌ์„ค์ •ํ•˜๋Š”๋ฐ, ์ด๋Š” ์ž๋™ ํฌ๊ธฐ ์กฐ์ • ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, webserver-cluster ๋ชจ๋“ˆ์—๋Š” ์˜ค์ „ 9์‹œ์— ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„œ๋ฒ„ ์ˆ˜๋ฅผ 11๊ฐœ์—์„œ 9๊ฐœ๋กœ ๋Š˜๋ฆฌ๋Š” aws_autoscaling_schedule ๋ฆฌ์†Œ์Šค ์Œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค์ „ XNUMX์‹œ์— ๋ฐฐํฌํ•˜๋ฉด ์ƒˆ๋กœ์šด ASG๋Š” XNUMX๊ฐœ ๋Œ€์‹  XNUMX๊ฐœ์˜ ์„œ๋ฒ„๋งŒ์œผ๋กœ ๋ถ€ํŒ…๋˜๊ณ  ๋‹ค์Œ ๋‚  ์˜ค์ „ XNUMX์‹œ๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ œํ•œ์„ ๊ทน๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • aws_autoscaling_schedule์˜ ๋ฐ˜๋ณต ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 0 9 * * * ("์˜ค์ „ 9์‹œ์— ์‹คํ–‰")์—์„œ 0-59 9-17 * * * ("์˜ค์ „ 9์‹œ๋ถ€ํ„ฐ ์˜คํ›„ 5์‹œ๊นŒ์ง€ XNUMX๋ถ„๋งˆ๋‹ค ์‹คํ–‰")๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ASG์— ์ด๋ฏธ XNUMX๊ฐœ์˜ ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ์ž๋™ ํ™•์žฅ ๊ทœ์น™์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋„ ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ASG๊ฐ€ ์ƒˆ๋กœ ๋ฐฐํฌ๋˜๋ฉด ์ด ๊ทœ์น™์€ ์ตœ๋Œ€ XNUMX๋ถ„ ์•ˆ์— ํ•ด๋‹น ์„œ๋ฒ„์˜ ์ˆ˜๊ฐ€ XNUMX๊ฐœ์— ๋„๋‹ฌํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ทธ๋‹ค์ง€ ์šฐ์•„ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ฉฐ, ์„œ๋ฒ„ ์ˆ˜๋ฅผ XNUMX๊ฐœ์—์„œ XNUMX๊ฐœ๋กœ ํฌ๊ฒŒ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ด๋Š” ๊ฒƒ๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ASG์— ์žˆ๋Š” ํ™œ์„ฑ ์„œ๋ฒ„ ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด AWS API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํ˜ธ์ถœํ•˜๊ณ (249ํŽ˜์ด์ง€์˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ฐธ์กฐ), ASG์˜ desired_capacity ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ๊ฐ์˜ ์ƒˆ๋กœ์šด ASG ์ธ์Šคํ„ด์Šค๋Š” ํ•ญ์ƒ ๊ธฐ์กด Terraform ์ฝ”๋“œ์™€ ๋™์ผํ•œ ์šฉ๋Ÿ‰์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด์ƒ์ ์œผ๋กœ Terraform์—๋Š” ๊ฐ€๋™ ์ค‘์ง€ ์—†๋Š” ๋ฐฐํฌ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ์ง€์›์ด ์žˆ์—ˆ๊ฒ ์ง€๋งŒ 2019๋…„ XNUMX์›” ํ˜„์žฌ HashiCorp ํŒ€์€ ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”).

์˜ฌ๋ฐ”๋ฅธ ๊ณ„ํš์ด๋ผ๋„ ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค

๋•Œ๋กœ๋Š” plan ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ ๋ฐฐํฌ ๊ณ„ํš์ด ์ƒ์„ฑ๋˜์ง€๋งŒ apply ๋ช…๋ น์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2์žฅ์—์„œ ๋งŒ๋“  IAM ์‚ฌ์šฉ์ž์— ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ aws_iam_user ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์„ธ์š”.

resource "aws_iam_user" "existing_user" {
   # ะŸะพะดัั‚ะฐะฒัŒั‚ะต ััŽะดะฐ ะธะผั ัƒะถะต ััƒั‰ะตัั‚ะฒัƒัŽั‰ะตะณะพ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั IAM,
   # ั‡ั‚ะพะฑั‹ ะฟะพะฟั€ะฐะบั‚ะธะบะพะฒะฐั‚ัŒัั ะฒ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะธ ะบะพะผะฐะฝะดั‹ terraform import
   name = "yevgeniy.brikman"
}

์ด์ œ plan ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด Terraform์€ ๊ฒ‰๋ณด๊ธฐ์— ํƒ€๋‹นํ•œ ๋ฐฐํฌ ๊ณ„ํš์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Terraform will perform the following actions:

   # aws_iam_user.existing_user will be created
   + resource "aws_iam_user" "existing_user" {
         + arn                  = (known after apply)
         + force_destroy   = false
         + id                    = (known after apply)
         + name               = "yevgeniy.brikman"
         + path                 = "/"
         + unique_id         = (known after apply)
      }

Plan: 1 to add, 0 to change, 0 to destroy.

apply ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Error: Error creating IAM User yevgeniy.brikman: EntityAlreadyExists:
User with name yevgeniy.brikman already exists.

   on main.tf line 10, in resource "aws_iam_user" "existing_user":
   10: resource "aws_iam_user" "existing_user" {

๋ฌผ๋ก  ๋ฌธ์ œ๋Š” ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ IAM ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ผ์€ IAM ์‚ฌ์šฉ์ž๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฑฐ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋˜๋Š” ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ ์–ด๋А ์ชฝ์ด๋“  ID ์ค‘๋ณต์œผ๋กœ ์ธํ•ด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ณ€ํ˜•์ด ์žˆ์–ด Terraform ์ดˆ๋ณด์ž๋“ค์ด ์ข…์ข… ๋‹นํ™ฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ์ ์€ terraform plan ๋ช…๋ น์€ Terraform ์ƒํƒœ ํŒŒ์ผ์— ์ง€์ •๋œ ๋ฆฌ์†Œ์Šค๋งŒ ๊ณ ๋ คํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ์‹(์˜ˆ: AWS ์ฝ˜์†”์—์„œ ์ˆ˜๋™์œผ๋กœ ํด๋ฆญ)์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋Š” ์ƒํƒœ ํŒŒ์ผ์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ Terraform์€ plan ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ์ฒซ๋ˆˆ์— ์˜ณ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ณ„ํš๋„ ์‹คํŒจ๋กœ ๋๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ตํ›ˆ์€ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • ์ด๋ฏธ Terraform์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ฒƒ์€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์ธํ”„๋ผ์˜ ์ผ๋ถ€๊ฐ€ Terraform์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ ๋” ์ด์ƒ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด์ƒํ•œ Terraform ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ฝ”๋“œ๊ฐ€ ๋” ์ด์ƒ ์ธํ”„๋ผ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ IaC์˜ ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฏธ ์ธํ”„๋ผ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ import ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ธฐ์กด ์ธํ”„๋ผ์™€ ํ•จ๊ป˜ Terraform์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด terraform import ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Terraform์—์„œ ์–ด๋–ค ์ธํ”„๋ผ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ• ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import ๋ช…๋ น์€ ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๋ฆฌ์†Œ์Šค ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์˜ ๊ตฌ๋ฌธ์€ ๋ฆฌ์†Œ์Šค ๋งํฌ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค: _. (aws_iam_user.existing_user์™€ ๊ฐ™์Œ). ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๊ฐ€์ ธ์˜ฌ ๋ฆฌ์†Œ์Šค ID์ž…๋‹ˆ๋‹ค. aws_iam_user ๋ฆฌ์†Œ์Šค ID๊ฐ€ ์‚ฌ์šฉ์ž ์ด๋ฆ„(์˜ˆ: yevgeniy.brikman)์ด๊ณ , aws_instance ๋ฆฌ์†Œ์Šค ID๊ฐ€ EC2 ์„œ๋ฒ„ ID(์˜ˆ: i-190e22e5)๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๋‹น ํŽ˜์ด์ง€ ํ•˜๋‹จ์˜ ์„ค๋ช…์„œ์— ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋‹ค์Œ์€ 2์žฅ์—์„œ Terraform ๊ตฌ์„ฑ์— ์ถ”๊ฐ€ํ•œ aws_iam_user ๋ฆฌ์†Œ์Šค์™€ IAM ์‚ฌ์šฉ์ž๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ๋ช…๋ น์ž…๋‹ˆ๋‹ค(๋ฌผ๋ก  yevgeniy.brikman ๋Œ€์‹  ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”).

    $ terraform import aws_iam_user.existing_user yevgeniy.brikman

    Terraform์€ AWS API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ IAM ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ๊ณ  Terraform ๊ตฌ์„ฑ์˜ aws_iam_user.existing_user ๋ฆฌ์†Œ์Šค์™€ ํ•ด๋‹น ์‚ฌ์šฉ์ž ๊ฐ„์— ์ƒํƒœ ํŒŒ์ผ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ plan ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด Terraform์€ IAM ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ๋‹ค์‹œ ์ƒ์„ฑ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์ด๋ฏธ Terraform์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ, ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  ๊ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ๋”ฐ๋ผ์„œ AWS ๊ณ„์ •์—์„œ ์ฝ”๋“œ์™€ ์ƒํƒœ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” Terraforming(http://terraforming.dtan4.net/)๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

    ๋ฆฌํŒฉํ† ๋ง์—๋Š” ํ•จ์ •์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

    ๋ฆฌํŒฉํ† ๋ง โ€” ์™ธ๋ถ€ ๋™์ž‘์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์ฝ”๋“œ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋งŒ ๋ฐ”๊พธ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ผ๋ฐ˜์ ์ธ ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ๊น”๋”ํ•˜๋ฉฐ, ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง์€ ์ •๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Terraform์ด๋‚˜ ๋‹ค๋ฅธ IaC ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฝ”๋“œ์˜ "์™ธ๋ถ€ ๋™์ž‘"์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜์ ์ธ ๋ฆฌํŒฉํ† ๋ง ์œ ํ˜• ์ค‘ ํ•˜๋‚˜๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ IDE์—๋Š” ๋ฆฌํŒฉํ† ๋ง ์ง€์› ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ์ƒ๊ฐ์ง€๋„ ๋ชปํ•  ์‚ฌ์†Œํ•œ ์ ˆ์ฐจ์ด์ง€๋งŒ Terraform์—์„œ๋Š” ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋งค์šฐ ์กฐ์‹ฌํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, webserver-cluster ๋ชจ๋“ˆ์—๋Š” cluster_name์ด๋ผ๋Š” ์ž…๋ ฅ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    variable "cluster_name" {
       description = "The name to use for all the cluster resources"
       type          = string
    }

    foo๋ผ๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์„ธ์š”. ๋‚˜์ค‘์— ์„œ๋น„์Šค ์ด๋ฆ„์„ bar๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด์กŒ์–ด์š”. ์ด๋Ÿฐ ๋ณ€ํ™”๋Š” ์‚ฌ์†Œํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์„œ๋น„์Šค ์ค‘๋‹จ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์š”์ ์€ ์›น ์„œ๋ฒ„-ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“ˆ์ด ๋‘ ๋ณด์•ˆ ๊ทธ๋ฃน์˜ ์ด๋ฆ„ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ALB๋ฅผ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์—์„œ cluster_name ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    resource "aws_lb" "example" {
       name                    = var.cluster_name
       load_balancer_type = "application"
       subnets = data.aws_subnet_ids.default.ids
       security_groups      = [aws_security_group.alb.id]
    }

    ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด Terraform์€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ ์ด์ „ ๋ฒ„์ „์„ ์‚ญ์ œํ•˜๊ณ  ๊ทธ ์ž๋ฆฌ์— ์ƒˆ ๋ฒ„์ „์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ALB์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ์ œ๊ฑฐ๋œ ์‹œ๊ฐ„๊ณผ ์ƒˆ ๋ฒ„์ „์ด ๋กœ๋“œ๋œ ์‹œ๊ฐ„ ์‚ฌ์ด์—๋Š” ์›น ์„œ๋ฒ„๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ฆฌ๋””๋ ‰์…˜ํ•  ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ณด์•ˆ ๊ทธ๋ฃน์ด ์‚ญ์ œ๋˜๋ฉด ์„œ๋ฒ„๋Š” ์ƒˆ ๊ทธ๋ฃน์ด ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ฑฐ๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    ์—ฌ๋Ÿฌ๋ถ„์ด ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๋งŒํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฆฌํŒฉํ† ๋ง์€ Terraform ์‹๋ณ„์ž๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด webserver-cluster ๋ชจ๋“ˆ์˜ aws_security_group ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    resource "aws_security_group" "instance" {
      # (...)
    }

    ์ด ๋ฆฌ์†Œ์Šค์˜ ์‹๋ณ„์ž๋Š” ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง ์ค‘์— ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด(๊ท€ํ•˜์˜ ์˜๊ฒฌ์œผ๋กœ๋Š”) ์ด๋ฆ„์ธ cluster_instance๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”.

    resource "aws_security_group" "cluster_instance" {
       # (...)
    }

    ๊ฒฐ๊ตญ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ? ์ •๋‹ต: ์—…๋ฌด ์ค‘๋‹จ.

    Terraform์€ ๊ฐ ๋ฆฌ์†Œ์Šค ID๋ฅผ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž ID์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, iam_user๋Š” AWS IAM ์‚ฌ์šฉ์ž ID์— ๋งคํ•‘๋˜๊ณ , aws_instance๋Š” AWS EC2 ์„œ๋ฒ„ ID์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ID๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: aws_security_group์˜ ๊ฒฝ์šฐ instance์—์„œ cluster_instance๋กœ ๋ณ€๊ฒฝ) Terraform์—์„œ๋Š” ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ฉด Terraform์€ ๊ธฐ์กด ๋ณด์•ˆ ๊ทธ๋ฃน์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ ๋ณด์•ˆ ๊ทธ๋ฃน์„ ๋งŒ๋“ค๋ฉฐ, ๊ทธ๋™์•ˆ ์„œ๋ฒ„๋Š” ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ฑฐ๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    ์ด ํ† ๋ก ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋„ค ๊ฐ€์ง€ ์ฃผ์š” ๊ตํ›ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • ํ•ญ์ƒ plan ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋Š” ๋ชจ๋“  ๋ฌธ์ œ์ ์„ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ๊ฒ€ํ† ํ•˜๊ณ  Terraform์ด ์‚ญ์ œํ•ด์„œ๋Š” ์•ˆ ๋  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•  ๊ณ„ํš์ธ ์ƒํ™ฉ์„ ํŒŒ์•…ํ•˜์„ธ์š”.
    • ์‚ญ์ œํ•˜๊ธฐ ์ „์— ๋งŒ๋“œ์„ธ์š”. ๋ฆฌ์†Œ์Šค๋ฅผ ๊ต์ฒดํ•˜๋ ค๋ฉด ์›๋ณธ์„ ์‚ญ์ œํ•˜๊ธฐ ์ „์— ๊ต์ฒด ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”์ง€ ์‹ ์ค‘ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ๋งŒ์•ฝ ๋Œ€๋‹ต์ด '์˜ˆ'๋ผ๋ฉด, create_before_destroy๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‘ ๋‹จ๊ณ„๋กœ ์ˆ˜๋™์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, ๊ตฌ์„ฑ์— ์ƒˆ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ ์šฉ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ๋‹ค์Œ, ๊ตฌ์„ฑ์—์„œ ์ด์ „ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ ์šฉ ๋ช…๋ น์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์‹๋ณ„์ž๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ƒํƒœ๋„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ ๋ฒ„์ „์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ฆฌ์†Œ์Šค์™€ ์—ฐ๊ฒฐ๋œ ์‹๋ณ„์ž๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(์˜ˆ: aws_security_group์˜ ์ด๋ฆ„์„ instance์—์„œ cluster_instance๋กœ ๋ณ€๊ฒฝ) Terraform ์ƒํƒœ ํŒŒ์ผ์„ ๊ทธ์— ๋งž๊ฒŒ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์ ˆ๋Œ€๋กœ ์ˆ˜๋™์œผ๋กœ ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋Œ€์‹  terraform state ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์‹๋ณ„์ž์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ๋•Œ๋Š” ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ๊ฐ–๋Š” terraform state mv ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>

      ORIGINAL_REFERENCE๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ํ˜„์žฌ ํ˜•ํƒœ๋กœ ์ฐธ์กฐํ•˜๋Š” ํ‘œํ˜„์‹์ด๊ณ , NEW_REFERENCE๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ด๋™ํ•˜๋ ค๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, aws_security_group์˜ ์ด๋ฆ„์„ instance์—์„œ cluster_instance๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      $ terraform state mv 
         aws_security_group.instance 
         aws_security_group.cluster_instance

      ์ด๋Š” ์ด์ „์— aws_security_group.instance์™€ ์—ฐ๊ด€๋˜์—ˆ๋˜ ์ƒํƒœ๊ฐ€ ์ด์ œ aws_security_group.cluster_instance์™€ ์—ฐ๊ด€๋˜์–ด์•ผ ํ•จ์„ Terraform์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ํ›„์—๋„ terraform plan์— ์•„๋ฌด๋Ÿฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ž‘์—…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ์ผ๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๋ฆฌ์†Œ์Šค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด Terraform์€ ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๊ทธ ์ž๋ฆฌ์— ์ƒˆ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ ๋ฆฌ์†Œ์Šค ํŽ˜์ด์ง€์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์„ค๋ช…์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ํ•ญ์ƒ plan ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๊ณ  create_before_destroy ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

    ์ง€์—ฐ๋œ ์ผ๊ด€์„ฑ์€ ๋‹ค์Œ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ

    AWS์™€ ๊ฐ™์€ ์ผ๋ถ€ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์—…์ฒด์˜ API๋Š” ๋น„๋™๊ธฐ์‹์ด๋ฉฐ ์ผ๊ด€์„ฑ์ด ์ง€์—ฐ๋ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ์„ฑ์ด๋ž€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์š”์ฒญ๋œ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ๋œ ์ผ๊ด€์„ฑ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹œ์Šคํ…œ ์ „์ฒด์— ์ „ํŒŒ๋˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ ์‘๋‹ต์ด ์ผ๊ด€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ API ํ˜ธ์ถœ์— ์‘๋‹ตํ•˜๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋ณต์ œ๋ณธ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด AWS์— EC2 ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” API ํ˜ธ์ถœ์„ ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์„ธ์š”. API๋Š” ์„œ๋ฒ„ ์ž์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ฑฐ์˜ ์ฆ‰์‹œ "์„ฑ๊ณต" ์‘๋‹ต(201 ์ƒ์„ฑ๋จ)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋ฉด ๊ฑฐ์˜ ํ™•์‹คํžˆ ์‹คํŒจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์— AWS๋Š” ์—ฌ์ „ํžˆ ๋ฆฌ์†Œ์Šค๋ฅผ ์ดˆ๊ธฐํ™” ์ค‘์ด๊ฑฐ๋‚˜, ํ˜น์€ ์„œ๋ฒ„๊ฐ€ ์•„์ง ๋ถ€ํŒ…๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํ˜ธ์ถœ์„ ํ•˜๋ฉด ์˜ค๋ฅ˜(404 ์ฐพ์„ ์ˆ˜ ์—†์Œ)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ํ•ด๋‹น EC2 ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—ฌ์ „ํžˆ AWS ์ „์ฒด์— ์ „ํŒŒ๋˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ ค๋ฉด ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ์ง€์—ฐ ์ผ๊ด€์„ฑ์„ ๊ฐ–์ถ˜ ๋น„๋™๊ธฐ API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ž‘์—…์ด ์™„๋ฃŒ๋˜์–ด ์‹œ์Šคํ…œ ์ „์ฒด์— ์ „ํŒŒ๋  ๋•Œ๊นŒ์ง€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์š”์ฒญ์„ ๋‹ค์‹œ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ AWS SDK๋Š” ์ด์— ๋Œ€ํ•œ ์ข‹์€ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ Terraform ํ”„๋กœ์ ํŠธ๋Š” ์ด์ „์— 6813(https://github.com/hashicorp/terraform/issues/6813)๊ณผ ๊ฐ™์€ ๋งŽ์€ ๋ฒ„๊ทธ๋กœ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

    $ terraform apply
    aws_subnet.private-persistence.2: InvalidSubnetID.NotFound:
    The subnet ID 'subnet-xxxxxxx' does not exist

    ์ฆ‰, ๋ฆฌ์†Œ์Šค(์„œ๋ธŒ๋„ท ๋“ฑ)๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ •๋ณด(์˜ˆ: ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ์„œ๋ธŒ๋„ท์˜ ID)๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ•˜๋ฉด Terraform์—์„œ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฒ„๊ทธ(6813 ํฌํ•จ)์˜ ๋Œ€๋ถ€๋ถ„์€ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ, ํŠนํžˆ Terraform์—์„œ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค ์œ ํ˜•์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์—ฌ์ „ํžˆ ๊ฐ€๋”์”ฉ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ท€์ฐฎ๊ธด ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์•„๋ฌด๋Ÿฐ ํ•ด๋ฅผ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ terraform apply๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—๋Š” ์ •๋ณด๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์— ํผ์กŒ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ์ด ๋ฐœ์ทŒ๋ฌธ์€ Evgeny Brickman์˜ ์ฑ…์—์„œ ๋ฐœ์ทŒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. "Terraform: ์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ์ธํ”„๋ผ".

์ถœ์ฒ˜ : habr.com

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster