ΠŸΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ 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. Но Ссли Π²Π°ΠΌ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ сСрвСру Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·ΠΎΠ½Π΅ доступности (Availability Zone ΠΈΠ»ΠΈ AZ) Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½Π° AWS? Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш ΠΊΠΎΠ΄ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ» список Π·ΠΎΠ½ ΠΈΠ· источника Π΄Π°Π½Π½Ρ‹Ρ… aws_availability_zones ΠΈ Π·Π°Ρ‚Π΅ΠΌ «цикличСски» ΠΏΡ€ΠΎΡˆΠ΅Π»ΡΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈ создал Π² Π½Π΅ΠΉ сСрвСр EC2, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ count ΠΈ доступ ΠΊ массиву ΠΏΠΎ индСксу:

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. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ случится, Ссли ΠΌΡ‹ попытаСмся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ result этого рСсурса Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ count рСсурса aws_instance:

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 Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΊΠΎΠΏΠΈΠΈ рСсурса webserver-cluster. Или, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ захочСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ модуля ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ Π² зависимости ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π±ΡƒΠ»Π΅Π²Π° условия, присвоив Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ 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 Π² рСсурсС module Π½Π΅ поддСрТиваСтся. Богласно Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌ ΠΎ выпускС Terraform 0.12 (http://bit.ly/3257bv4) компания HashiCorp ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, поэтому, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ эту ΠΊΠ½ΠΈΠ³Ρƒ, ΠΎΠ½Π° ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доступна. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ навСрняка, ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΆΡƒΡ€Π½Π°Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Terraform здСсь.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΉ с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ простоя

ИспользованиС Π±Π»ΠΎΠΊΠ° create_before_destroy Π² сочСтании с ASG являСтся ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΉ с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ простоя, Ссли Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ нюанс: ΠΏΡ€Π°Π²ΠΈΠ»Π° Π°Π²Ρ‚ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡ€ΠΈ этом Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ. Или, Ссли Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ, это сбрасываСт Ρ€Π°Π·ΠΌΠ΅Ρ€ ASG ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊ min_size ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Ссли Π²Ρ‹ использовали ΠΏΡ€Π°Π²ΠΈΠ»Π° Π°Π²Ρ‚ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ для увСличСния количСства Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… сСрвСров.

НапримСр, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ webserver-cluster содСрТит ΠΏΠ°Ρ€Ρƒ рСсурсов aws_autoscaling_schedule, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² 9 ΡƒΡ‚Ρ€Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ количСство сСрвСров Π² кластСрС с Π΄Π²ΡƒΡ… Π΄ΠΎ дСсяти. Если Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅, скаТСм, Π² 11 ΡƒΡ‚Ρ€Π°, новая Π³Ρ€ΡƒΠΏΠΏΠ° ASG загрузится Π½Π΅ с Π΄Π΅ΡΡΡ‚ΡŒΡŽ, Π° всСго с двумя сСрвСрами ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² Ρ‚Π°ΠΊΠΎΠΌ состоянии Π΄ΠΎ 9 ΡƒΡ‚Ρ€Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ дня.

Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ нСсколькими путями.

  • ΠŸΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ recurrence Π² aws_autoscaling_schedule с 0 9 * * * (Β«Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π² 9 ΡƒΡ‚Ρ€Π°Β») Π½Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ 0-59 9-17 * * * (Β«Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΌΠΈΠ½ΡƒΡ‚Ρƒ с 9 ΡƒΡ‚Ρ€Π° Π΄ΠΎ 5 Π²Π΅Ρ‡Π΅Ρ€Π°Β»). Если Π² ASG ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π΄Π΅ΡΡΡ‚ΡŒ сСрвСров, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΠΏΡ€Π°Π²ΠΈΠ»Π° Π°Π²Ρ‚ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΈ Π½ΡƒΠΆΠ½ΠΎ. Но Ссли Π³Ρ€ΡƒΠΏΠΏΠ° ASG Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Π° совсСм Π½Π΅Π΄Π°Π²Π½ΠΎ, это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ максимум Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΈΠ½ΡƒΡ‚Ρƒ количСство Π΅Π΅ сСрвСров достигнСт дСсяти. Π­Ρ‚ΠΎ Π½Π΅ совсСм элСгантный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΈ большиС скачки с дСсяти Π΄ΠΎ Π΄Π²ΡƒΡ… сСрвСров ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.
  • Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСняСт API AWS для опрСдСлСния количСства Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… сСрвСров Π² ASG, Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ внСшнСго источника Π΄Π°Π½Π½Ρ‹Ρ… (см. ΠΏΡƒΠ½ΠΊΡ‚ Β«Π’Π½Π΅ΡˆΠ½ΠΈΠΉ источник Π΄Π°Π½Π½Ρ‹Ρ…Β» Π½Π° с. 249) ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ desired_capacity Π³Ρ€ΡƒΠΏΠΏΡ‹ ASG Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ этим скриптом. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр ASG всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ с Ρ‚ΠΎΠΉ ΠΆΠ΅ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎ ΠΈ ΡΡ‚Π°Π°ΡˆΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° Terraform ΠΈ услоТняСт Π΅Π³ΠΎ обслуТиваниС.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² ΠΈΠ΄Π΅Π°Π»Π΅ Π² Terraform Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ встроСнная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΉ с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ простоя, Π½ΠΎ ΠΏΠΎ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π½Π° ΠΌΠ°ΠΉ 2019 Π³ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° HashiCorp Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»Π° Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (подробности β€” здСсь).

ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½

Иногда ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ plan получаСтся Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½ развСртывания, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° apply Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ рСсурс aws_iam_user с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ использовали для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ IAM, созданного Π²Π°ΠΌΠΈ Ρ€Π°Π½Π΅Π΅ Π² Π³Π»Π°Π²Π΅ 2:

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, Π½ΠΎ ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ с Π»ΡŽΠ±Ρ‹ΠΌ рСсурсом. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΡ‚ΠΎ-Ρ‚ΠΎ создал этот рСсурс Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π½ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ, совпадСниС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌ. Π£ этой ошибки сущСствуСт мноТСство разновидностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто Π·Π°ΡΡ‚Π°ΡŽΡ‚ врасплох Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² Π² 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 выступаСт имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, yevgeniy.brikman), Π° ID рСсурса aws_instance Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сСрвСра EC2 (Π²Ρ€ΠΎΠ΄Π΅ i-190e22e5). Π’ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рСсурс, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ указываСтся Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π²Π½ΠΈΠ·Ρƒ Π΅Π³ΠΎ страницы.

    НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° import, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рСсурс aws_iam_user, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² свою ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Terraform вмСстС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ IAM Π² Π³Π»Π°Π²Π΅ 2 (СстСствСнно, вмСсто yevgeniy.brikman Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ вашС имя):

    $ terraform import aws_iam_user.existing_user yevgeniy.brikman

    Terraform обратится ΠΊ API AWS, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ вашСго ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ IAM ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π΅ состояния связь ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌ ΠΈ рСсурсом aws_iam_user.existing_user Π² вашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Terraform. Π‘ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ plan Terraform Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ IAM ΡƒΠΆΠ΅ сущСствуСт, ΠΈ Π½Π΅ станСт ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΅Ρ‰Π΅ Ρ€Π°Π·.

    Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ, Ссли Ρƒ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ рСсурсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Terraform, Ρ€ΡƒΡ‡Π½ΠΎΠ΅ написаниС ΠΊΠΎΠ΄Π° ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ…Π»ΠΎΠΏΠΎΡ‚Π½Ρ‹ΠΌ занятиСм. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚Π°ΠΊΠΎΠΉ инструмСнт, ΠΊΠ°ΠΊ Terraforming (http://terraforming.dtan4.net/), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· ΡƒΡ‡Π΅Ρ‚Π½ΠΎΠΉ записи AWS ΠΊΠΎΠ΄ ΠΈ состояниС.

    Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ свои ΠΏΠΎΠ΄Π²ΠΎΡ…ΠΈ

    Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ β€” распространСнная ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ мСняСтС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ структуру ΠΊΠΎΠ΄Π°, оставляя внСшнСС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±Π΅Π· измСнСния. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ понятным, опрятным ΠΈ простым Π² обслуТивании. Π Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ β€” это нСзамСнимая ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ слСдуСт рСгулярно ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ. Но, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ 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. Π­Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ·-Π·Π° Π½Π΅Π³ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π±ΠΎΠΈ Π² Ρ€Π°Π±ΠΎΡ‚Π΅.

    Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ webserver-cluster ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ cluster_name Π² Ρ†Π΅Π»ΠΎΠΌ рядС рСсурсов, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ name Π΄Π²ΡƒΡ… Π³Ρ€ΡƒΠΏΠΏ бСзопасности ΠΈ ALB:

    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]
    }

    Если ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ name Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ рСсурсС, Terraform ΡƒΠ΄Π°Π»ΠΈΡ‚ ΡΡ‚Π°Ρ€ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ этого рСсурса ΠΈ создаст вмСсто Π½Π΅Π³ΠΎ Π½ΠΎΠ²ΡƒΡŽ. Но Ссли Ρ‚Π°ΠΊΠΈΠΌ рСсурсом являСтся ALB, Π² ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΅Π³ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ вСрсии Ρƒ вас Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° для пСрСнаправлСния Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ Π²Π΅Π±-сСрвСру. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, Ссли удаляСтся Π³Ρ€ΡƒΠΏΠΏΠ° бСзопасности, ваши сСрвСры Π½Π°Ρ‡Π½ΡƒΡ‚ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡ‚ΡŒ любой сСтСвой Ρ‚Ρ€Π°Ρ„ΠΈΠΊ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создана новая Π³Ρ€ΡƒΠΏΠΏΠ°.

    Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ Π²ΠΈΠ΄ΠΎΠΌ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ, являСтся ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Terraform. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рСсурс aws_security_group Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ webserver-cluster:

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

    Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ этого рСсурса называСтся instance. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²ΠΎ врСмя Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π±ΠΎΠ»Π΅Π΅ понятноС (ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ мнСнию) имя cluster_instance:

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

    Π§Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ случится? ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ: ΠΏΠ΅Ρ€Π΅Π±ΠΎΠΉ Π² Ρ€Π°Π±ΠΎΡ‚Π΅.

    Terraform связываСт ID ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ рСсурса с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°. НапримСр, iam_user привязываСтся ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ IAM Π² AWS, Π° aws_instance β€” ΠΊ ID сСрвСра AWS EC2. Если ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ рСсурса (скаТСм, с instance Π½Π° cluster_instance, ΠΊΠ°ΠΊ Π² случаС с aws_security_group), для Terraform это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ, Π±ΡƒΠ΄Ρ‚ΠΎ Π²Ρ‹ ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ старый рСсурс ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ. Если ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ эти измСнСния, Terraform ΡƒΠ΄Π°Π»ΠΈΡ‚ ΡΡ‚Π°Ρ€ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ бСзопасности ΠΈ создаст Π΄Ρ€ΡƒΠ³ΡƒΡŽ, Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΌ ваши сСрвСры Π½Π°Ρ‡Π½ΡƒΡ‚ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡ‚ΡŒ любой сСтСвой Ρ‚Ρ€Π°Ρ„ΠΈΠΊ.

    Π’ΠΎΡ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ основных ΡƒΡ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· этого обсуТдСния.

    • ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ plan. Π•ΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ всС эти Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠΈ. Π’Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ просматривайтС Π΅Π΅ Π²Ρ‹Π²ΠΎΠ΄ ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ситуации, ΠΊΠΎΠ³Π΄Π° Terraform ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ рСсурсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, скорСС всСго, ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π½Π΅ стоит.
    • Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉΡ‚Π΅, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ рСсурс, Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π½ΡŒΠΊΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Ρƒ Π΄ΠΎ удалСния ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°. Если ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Π² этом ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ create_before_destroy. Π’ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π΄Π²Π° шага: сначала Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π½ΠΎΠ²Ρ‹ΠΉ рСсурс ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ apply, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ старый рСсурс ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ apply Π΅Ρ‰Π΅ Ρ€Π°Π·.
    • ИзмСнСниС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ измСнСния состояния. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, связанный с рСсурсом (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ 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

      Π’Π°ΠΊ Π²Ρ‹ сообщитС Terraform, Ρ‡Ρ‚ΠΎ состояниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π°Π½Π΅Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΠ»ΠΎΡΡŒ ΠΊ aws_security_group.instance, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ связано с aws_security_group.cluster_instance. Если послС пСрСимСнования ΠΈ запуска этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ terraform plan Π½Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π·Π½Π°Ρ‡ΠΈΡ‚, Π²Ρ‹ всС сдСлали ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

    • НСкоторыС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ нСльзя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ½ΠΎΠ³ΠΈΡ… рСсурсов нСизмСняСмыС. Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Terraform ΡƒΠ΄Π°Π»ΠΈΡ‚ старый рСсурс ΠΈ создаст вмСсто Π½Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ. На страницС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ рСсурса ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ указываСтся, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, поэтому Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΡΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ. ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ plan ΠΈ рассматривайтС Ρ†Π΅Π»Π΅ΡΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ примСнСния стратСгии create_before_destroy.

    ΠžΡ‚Π»ΠΎΠΆΠ΅Π½Π½Π°Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ согласуСтся… с ΠΎΡ‚Π»Π°Π³Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠΌ

    API Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ AWS, асинхронныС ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ. ΠΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ интСрфСйс ΠΌΠΎΠΆΠ΅Ρ‚ сразу ΠΆΠ΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚, Π½Π΅ доТидаясь Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ дСйствия. ΠžΡ‚Π»ΠΎΠΆΠ΅Π½Π½Π°Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ для распространСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠΎ всСй систСмС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ врСмя; ΠΏΠΎΠΊΠ° это происходит, ваши ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСсогласованными ΠΈ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, какая Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° источника Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° ваши API-Π²Ρ‹Π·ΠΎΠ²Ρ‹.

    ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ API-Π²Ρ‹Π·ΠΎΠ² ΠΊ AWS с ΠΏΡ€ΠΎΡΡŒΠ±ΠΎΠΉ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ сСрвСр EC2. API Π²Π΅Ρ€Π½Π΅Ρ‚ Β«ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉΒ» ΠΎΡ‚Π²Π΅Ρ‚ (201 Created) практичСски ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ, Π½Π΅ доТидаясь создания самого сСрвСра. Если Π²Ρ‹ сразу ΠΆΠ΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ, ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ получится, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ AWS всС Π΅Ρ‰Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ рСсурсы ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, сСрвСр Π΅Ρ‰Π΅ Π½Π΅ загрузился. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π²Ρ‹ сдСлаСтС Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± этом сСрвСрС, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ошибка (404 Not Found). Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ свСдСния ΠΎΠ± этом сСрвСрС 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 всС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊ этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ информация ΡƒΠΆΠ΅ распространится ΠΏΠΎ систСмС.

    Π”Π°Π½Π½Ρ‹ΠΉ ΠΎΡ‚Ρ€Ρ‹Π²ΠΎΠΊ прСдставлСн ΠΈΠ· ΠΊΠ½ΠΈΠ³ΠΈ ЕвгСния Π‘Ρ€ΠΈΠΊΠΌΠ°Π½Π° Β«Terraform: инфраструктура Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ΄Π°Β».

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com