Terraform рдкрд┐рдЯрдлрд▓реНрд╕

Terraform рдкрд┐рдЯрдлрд▓реНрд╕
рд▓реВрдкрд╣рд░реВ, рдЗрдл рд╕реНрдЯреЗрдЯрдореЗрдиреНрдЯ рд░ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рдкреНрд░рд╡рд┐рдзрд┐рд╣рд░реВ, рд╕рд╛рдереИ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрдорд╛ рдЯреЗрд░рд╛рдлрд░реНрдорд▓рд╛рдИ рдЕрд╕рд░ рдЧрд░реНрдиреЗ рдердк рд╕рд╛рдорд╛рдиреНрдп рдореБрджреНрджрд╛рд╣рд░реВ рд╕рд╣рд┐рдд рдХреЗрд╣реА рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реМрдВ:

  • рдЧрдгрдирд╛ рд░ for_each рдорд╛рдкрджрдгреНрдбрд╣рд░реВрдХреЛ рд╕реАрдорд╛рд╣рд░реВ рдЫрдиреН;
  • рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрдирд╣рд░реВ рд╕реАрдорд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН;
  • рд░рд╛рдореНрд░реЛ рдпреЛрдЬрдирд╛ рдкрдирд┐ рдЕрд╕рдлрд▓ рд╣реБрди рд╕рдХреНрдЫ;
  • рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░рд┐рдЩрдорд╛ рдпрд╕рдХреЛ рдХрдордЬреЛрд░реА рд╣реБрди рд╕рдХреНрдЫ;
  • рд╕реНрдердЧрд┐рдд рд╕реБрд╕рдВрдЧрддрддрд╛ рд╕рдВрдЧрдд рдЫ ... рд╕реНрдердЧрд┐рдд рд╕рдВрдЧред

рдЧрдгрдирд╛ рд░ for_each рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдХреЛ рд╕реАрдорд╛рд╣рд░реВ рдЫрдиреН

рдпрд╕ рдЕрдзреНрдпрд╛рдпрдХрд╛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрд▓реЗ рдХрд╛рдЙрдиреНрдЯ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд░ рд▓реВрдкрд╣рд░реВ рд░ рд╕рд╢рд░реНрдд рддрд░реНрдХрд╣рд░реВрдорд╛ for_each рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдХреЛ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд░рд╛рдореНрд░реЛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдЫрдиреН, рддрд░ рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рджреБрдИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╕реАрдорд╛рд╣рд░реВ рдЫрдиреН рдЬреБрди рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╕рдЪреЗрдд рд╣реБрди рдЖрд╡рд╢реНрдпрдХ рдЫред

  • рдЧрдгрдирд╛ рд░ for_each рд▓реЗ рдХреБрдиреИ рдкрдирд┐ рд╕реНрд░реЛрдд рдЖрдЙрдЯрдкреБрдЯ рдЪрд░ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрди рд╕рдХреНрджреИрдиред
  • рдЧрдгрдирд╛ рд░ for_each рдореЛрдбреНрдпреБрд▓ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрдиред

рдЧрдгрдирд╛ рд░ for_each рд▓реЗ рдХреБрдиреИ рдкрдирд┐ рд╕реНрд░реЛрдд рдЖрдЙрдЯрдкреБрдЯ рдЪрд░ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрди рд╕рдХреНрджреИрди

рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдзреЗрд░реИ EC2 рд╕рд░реНрднрд░рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рд░ рдХреЗрд╣реА рдХрд╛рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдИрдВ ASG рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдиред рддрдкрд╛рдИрдВрдХреЛ рдХреЛрдб рдпрд╕реНрддреЛ рд╣реБрди рд╕рдХреНрдЫ:

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

рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдПрдХ рдПрдХ рдЧрд░реЗрд░ рд╣реЗрд░реМрдВред

рдХрд╛рдЙрдиреНрдЯ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд╕реНрдерд┐рд░ рдорд╛рдирдорд╛ рд╕реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рд╣реБрдирд╛рд▓реЗ, рдпреЛ рдХреЛрдбрд▓реЗ рд╕рдорд╕реНрдпрд╛ рдмрд┐рдирд╛ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫ: рдЬрдм рддрдкрд╛рдЗрдБ рд▓рд╛рдЧреВ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫ, рдпрд╕рд▓реЗ рддреАрди EC2 рд╕рд░реНрднрд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫред рддрд░ рдХреЗ рдпрджрд┐ рддрдкрд╛рдЗрдБ рддрдкрд╛рдЗрдБрдХреЛ рд╡рд░реНрддрдорд╛рди AWS рдХреНрд╖реЗрддреНрд░ рднрд┐рддреНрд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреНрд╖реЗрддреНрд░ (AZ) рдорд╛ рдПрдХ рд╕рд░реНрднрд░ рддреИрдирд╛рдд рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ? рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдХреЛрдбрд▓рд╛рдИ aws_availability_zones рдбрд╛рдЯрд╛ рд╕реНрд░реЛрддрдмрд╛рдЯ рдХреНрд╖реЗрддреНрд░рд╣рд░реВрдХреЛ рд╕реВрдЪреА рд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рддреНрдпрд╕рдкрдЫрд┐ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдорд╛рд░реНрдлрдд рд▓реБрдк рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдЧрдгрдирд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд░ рдПрд░реЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрд╣реБрдБрдЪ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпрд╕рдорд╛ 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" {}

рдпреЛ рдХреЛрдбрд▓реЗ рдкрдирд┐ рд░рд╛рдореНрд░реЛ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫ, рдХрд┐рдирдХрд┐ рдЧрдгрдирд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд▓реЗ рдХреБрдиреИ рдкрдирд┐ рд╕рдорд╕реНрдпрд╛ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрддрд╣рд░реВ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрди рд╕рдХреНрдЫред рддрд░ рдХреЗ рд╣реБрдиреНрдЫ рдпрджрд┐ рддрдкрд╛рдИрд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдХреЗрд╣рд┐ рд╕реНрд░реЛрддрдХреЛ рдЖрдЙрдЯрдкреБрдЯрдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫ? рдпреЛ рджреЗрдЦрд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐, рд╕рдмреИрднрдиреНрджрд╛ рд╕рдЬрд┐рд▓реЛ рддрд░рд┐рдХрд╛ random_integer рд╕реНрд░реЛрдд рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд╣реЛ, рдЬреБрди рдирд╛рдорд▓реЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдиреНрдЫ, рдЕрдирд┐рдпрдорд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдлрд░реНрдХрд╛рдЙрдБрдЫ:

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

рдпреЛ рдХреЛрдбрд▓реЗ 1 рд░ 3 рдХреЛ рдмреАрдЪрдорд╛ рдЕрдирд┐рдпрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫред рд╣реЗрд░реМрдВ рдХреЗ рд╣реБрдиреНрдЫ рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ aws_instance рд╕реНрд░реЛрддрдХреЛ рдЧрдгрдирд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рдорд╛ рдпреЛ рд╕реНрд░реЛрддрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдЫреМрдВ:

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

рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕ рдХреЛрдбрдорд╛ рдЯреЗрд░рд╛рдлрд░реНрдо рдпреЛрдЬрдирд╛ рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫ:

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 рд▓рд╛рдИ рдХреБрдиреИ рдкрдирд┐ рд╕реНрд░реЛрддрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рд╡рд╛ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдЧрд░реНрдиреБ рдЕрдШрд┐ рдпреЛрдЬрдирд╛ рдЪрд░рдгрдХреЛ рдЕрд╡рдзрд┐рдорд╛ рдЧрдгрдирд╛ рд░ for_each рдЧрдгрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рд╣реЛ рдХрд┐ рдЧрдгрдирд╛ рд░ for_each рд▓реЗ рд╢рд╛рдмреНрджрд┐рдХ, рдЪрд░, рдбреЗрдЯрд╛ рд╕реНрд░реЛрддрд╣рд░реВ, рд░ рд╕реНрд░реЛрдд рд╕реВрдЪреАрд╣рд░реВрд▓рд╛рдИ рдкрдирд┐ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрди рд╕рдХреНрдЫ (рдЬрдмрд╕рдореНрдо рддрд┐рдиреАрд╣рд░реВрдХреЛ рд▓рдореНрдмрд╛рдЗ рд╕рдордп рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ), рддрд░ рдЧрдгрдирд╛ рдЧрд░рд┐рдПрдХреЛ рд╕реНрд░реЛрдд рдЖрдЙрдЯрдкреБрдЯ рдЪрд░рд╣рд░реВрдорд╛ рд╣реЛрдЗрдиред

рдЧрдгрдирд╛ рд░ for_each рдореЛрдбреНрдпреБрд▓ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди

рдХреБрдиреИ рджрд┐рди рддрдкрд╛рдИрдВ рдЖрдлреНрдиреЛ рдореЛрдбреНрдпреБрд▓ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдЧрдгрдирд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдердкреНрди рдкреНрд░рд▓реЛрднрдирдорд╛ рдкрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

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

     count = 3

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

рдпреЛ рдХреЛрдбрд▓реЗ рд╡реЗрдмрд╕рд░реНрднрд░-рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрд░реЛрддрдХреЛ рддреАрди рдкреНрд░рддрд┐рд▓рд┐рдкрд┐рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдореЛрдбреНрдпреБрд▓ рднрд┐рддреНрд░ рдЧрдгрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджрдЫред рд╡рд╛ рддрдкрд╛рдЗрдБ рдХреЗрд╣рд┐ рдмреБрд▓рд┐рдпрди рдЕрд╡рд╕реНрдерд╛рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдореЛрдбреНрдпреБрд▓рд▓рд╛рдИ реж рдорд╛ рд╕реЗрдЯ рдЧрд░реЗрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдкрдорд╛ рдЬрдбрд╛рди рдЧрд░реНрди рдЪрд╛рд╣рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХреЛрдб рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рди рд╕рдХреНрдЫ, рддрд░ рдЯреЗрд░рд╛рдлрд░реНрдо рдпреЛрдЬрдирд╛ рдЪрд▓рд╛рдЙрдБрджрд╛ рддрдкрд╛рдЗрдБрд▓реЗ рдпреЛ рддреНрд░реБрдЯрд┐ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫ:

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 рдХреЛ рд░реВрдкрдорд╛, рдореЛрдбреНрдпреБрд▓ рд╕реНрд░реЛрддрдорд╛ рдЧрдгрдирд╛ рд╡рд╛ for_each рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдорд░реНрдерд┐рдд рдЫреИрдиред Terraform 0.12 рд░рд┐рд▓реАрдЬ рдиреЛрдЯрд╣рд░реВ (http://bit.ly/3257bv4) рдЕрдиреБрд╕рд╛рд░, HashiCorp рд▓реЗ рднрд╡рд┐рд╖реНрдпрдорд╛ рдпреЛ рдХреНрд╖рдорддрд╛ рдердкреНрдиреЗ рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдХреЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдкреБрд╕реНрддрдХ рдХрд╣рд┐рд▓реЗ рдкрдвреНрдиреБрд╣реБрдиреНрдЫ рднрдиреНрдиреЗ рдЖрдзрд╛рд░рдорд╛, рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рдЙрдкрд▓рдмреНрдз рд╣реБрди рд╕рдХреНрдЫред рдкрдХреНрдХрд╛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди, Terraform changelog рдпрд╣рд╛рдБ рдкрдвреНрдиреБрд╣реЛрд╕реН.

рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрд╣рд░реВрдХреЛ рд╕реАрдорд╛рд╣рд░реВ

ASG рд╕рдБрдЧ рд╕рдВрдпреЛрдЬрдирдорд╛ create_before_destroy рдмреНрд▓рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рднрдиреЗрдХреЛ рд╢реВрдиреНрдп-рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЙрддреНрдХреГрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд╣реЛ, рдПрдЙрдЯрд╛ рдЪреЗрддрд╛рд╡рдиреА рдмрд╛рд╣реЗрдХ: рд╕реНрд╡рдд: рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдирд┐рдпрдорд╣рд░реВ рд╕рдорд░реНрдерд┐рдд рдЫреИрдирдиреНред рд╡рд╛ рдердк рд╕рдЯреАрдХ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐, рдпрд╕рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрдорд╛ ASG рд╕рд╛рдЗрдЬрд▓рд╛рдИ min_size рдорд╛ рд░рд┐рд╕реЗрдЯ рдЧрд░реНрдЫ, рдЬреБрди рддрдкрд╛рдИрд▓реЗ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдмрдврд╛рдЙрди рд╕реНрд╡рдд: рд╕реНрдХреЗрд▓рд┐рдЩ рдирд┐рдпрдорд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рд░рд╣рдиреБрднрдПрдХреЛ рднрдП рд╕рдорд╕реНрдпрд╛ рд╣реБрди рд╕рдХреНрдЫред

рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╡реЗрдмрд╕рд░реНрднрд░-рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдбреНрдпреБрд▓рд▓реЗ aws_autoscaling_schedule рд╕реНрд░реЛрддрд╣рд░реВрдХреЛ рдЬреЛрдбреА рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рдЬрд╕рд▓реЗ рдмрд┐рд╣рд╛рди 9 рдмрдЬреЗ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рджреБрдИ рдмрд╛рдЯ резреж рд╕рдореНрдо рдмрдврд╛рдЙрдБрдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдмрд┐рд╣рд╛рди резрез рдмрдЬреЗ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рдирдпрд╛рдБ ASG рд▓реЗ рджрд╕ рднрдиреНрджрд╛ рджреБрдИрд╡рдЯрд╛ рд╕рд░реНрднрд░рдорд╛ рдмреБрдЯ рдЕрдк рдЧрд░реНрдиреЗрдЫ рд░ рдЕрд░реНрдХреЛ рджрд┐рди рдмрд┐рд╣рд╛рди реп рдмрдЬреЗрд╕рдореНрдо рддреНрдпрд╣реА рд░реВрдкрдорд╛ рд░рд╣рдиреЗрдЫред

рдпрд╕ рд╕реАрдорд╛рд▓рд╛рдИ рдзреЗрд░реИ рддрд░рд┐рдХрд╛рдорд╛ рд╣рдЯрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред

  • aws_autoscaling_schedule рдорд╛ 0 9 * * * ("рдмрд┐рд╣рд╛рди 9 рдмрдЬреЗ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН") рдмрд╛рдЯ 0-59 9-17 * * * ("рдкреНрд░рддреНрдпреЗрдХ рдорд┐рдиреЗрдЯ рдмрд┐рд╣рд╛рди 9 рдмрдЬреЗ рджреЗрдЦрд┐ 5 рдмрдЬреЗ рд╕рдореНрдо рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН") рдорд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ ASG рдкрд╣рд┐рд▓реЗ рдиреИ рджрд╕ рд╡рдЯрд╛ рд╕рд░реНрднрд░рд╣рд░реВ рдЫрдиреН рднрдиреЗ, рдпреЛ рд╕реНрд╡рдд: рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдирд┐рдпрдо рдлреЗрд░рд┐ рдЪрд▓рд╛рдЙрдБрджрд╛ рдХреЗрд╣реА рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреЗрдЫреИрди, рдЬреБрди рд╣рд╛рдореА рдЪрд╛рд╣рдиреНрдЫреМрдВред рддрд░ рдпрджрд┐ ASG рднрд░реНрдЦрд░реИ рдорд╛рддреНрд░ рддреИрдирд╛рдд рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ, рдпреЛ рдирд┐рдпрдорд▓реЗ рдпреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреЗрдЫ рдХрд┐ рдПрдХ рдорд┐рдиреЗрдЯрдХреЛ рдЕрдзрд┐рдХрддрдордорд╛ рдпрд╕рдХреЛ рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рджрд╕ рдкреБрдЧреНрдиреЗрдЫред рдпреЛ рдкреВрд░реНрдгрддрдпрд╛ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реЛрдЗрди, рд░ рджрд╕ рджреЗрдЦрд┐ рджреБрдИ рд╕рд░реНрднрд░ рд░ рдкрдЫрд╛рдбрд┐ рдареВрд▓рд╛ рдЬрдореНрдкрд╣рд░реВрд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрддреНрдпрд╛рдЙрди рд╕рдХреНрдЫред
  • ASG рдорд╛ рд╕рдХреНрд░рд┐рдп рд╕рд░реНрднрд░рд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди AWS API рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЕрдиреБрдХреВрд▓рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдпрд╕рд▓рд╛рдИ рдмрд╛рд╣реНрдп рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реН (рдкреГрд╖реНрда 249 рдорд╛ "рдмрд╛рд╣реНрдп рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд" рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН), рд░ ASG рдХреЛ рдЗрдЪреНрдЫрд┐рдд_capacity рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдЧрд░рд┐рдПрдХреЛ рдорд╛рдирдорд╛ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рд▓рд┐рдкрд┐ред рдпрд╕рд░реА, рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛рдБ ASG рдЙрджрд╛рд╣рд░рдг рд╕рдзреИрдВ рдЕрд╡рд╕реНрдерд┐рдд Terraform рдХреЛрдб рдЬрд╕реНрддреИ рдХреНрд╖рдорддрд╛рдорд╛ рдЪрд▓реНрдиреЗрдЫ рд░ рдпрд╕рд▓рд╛рдИ рдХрд╛рдпрдо рд░рд╛рдЦреНрди рдЕрдЭ рдЧрд╛рд╣реНрд░реЛ рдмрдирд╛рдЙрдБрдЫред

рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, Terraform рд▓рд╛рдИ рд╢реВрдиреНрдп-рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рдорд░реНрдерди рд╣реБрдиреЗрдЫ, рддрд░ рдореЗ 2019 рд╕рдореНрдо, HashiCorp рдЯреЛрд▓реАрд╕рдБрдЧ рдпреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдердкреНрдиреЗ рдХреБрдиреИ рдпреЛрдЬрдирд╛ рдерд┐рдПрди (рд╡рд┐рд╡рд░рдг - рдпрд╣рд╛рдБ).

рд╕рд╣реА рдпреЛрдЬрдирд╛ рдЕрд╕рдлрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрди рд╕рдХреНрдЫ

рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдпреЛрдЬрдирд╛ рдЖрджреЗрд╢рд▓реЗ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рд╕рд╣реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдпреЛрдЬрдирд╛ рдЙрддреНрдкрд╛рджрди рдЧрд░реНрджрдЫ, рддрд░ рд▓рд╛рдЧреВ рдЖрджреЗрд╢рд▓реЗ рддреНрд░реБрдЯрд┐ рдлрд░реНрдХрд╛рдЙрдБрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдЕрдзреНрдпрд╛рдп реи рдорд╛ рдкрд╣рд┐рд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрднрдПрдХреЛ IAM рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХрд╛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрднрдПрдХреЛ рдПрдЙрдЯреИ рдирд╛рдордХреЛ aws_iam_user рд╕реНрд░реЛрдд рдердкреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

resource "aws_iam_user" "existing_user" {
   # ╨Я╨╛╨┤╤Б╤В╨░╨▓╤М╤В╨╡ ╤Б╤О╨┤╨░ ╨╕╨╝╤П ╤Г╨╢╨╡ ╤Б╤Г╤Й╨╡╤Б╤В╨▓╤Г╤О╤Й╨╡╨│╨╛ ╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╨╡╨╗╤П IAM,
   # ╤З╤В╨╛╨▒╤Л ╨┐╨╛╨┐╤А╨░╨║╤В╨╕╨║╨╛╨▓╨░╤В╤М╤Б╤П ╨▓ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╨╜╨╕╨╕ ╨║╨╛╨╝╨░╨╜╨┤╤Л terraform import
   name = "yevgeniy.brikman"
}

рдЕрдм, рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпреЛрдЬрдирд╛ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, 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.

рдпрджрд┐ рддрдкрд╛рдЗрдБ рд▓рд╛рдЧреВ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ рддрдкрд╛рдЗрдБ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫ:

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 рд░рд╛рдЬреНрдп рдлрд╛рдЗрд▓рдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫред рдпрджрд┐ рд╕реНрд░реЛрддрд╣рд░реВ рдХреБрдиреИ рдЕрдиреНрдп рддрд░рд┐рдХрд╛рдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ AWS рдХрдиреНрд╕реЛрд▓рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реЗрд░), рддрд┐рдиреАрд╣рд░реВ рд░рд╛рдЬреНрдп рдлрд╛рдЗрд▓рдорд╛ рд╕рдорд╛рдкреНрдд рд╣реБрдиреЗрдЫреИрдирдиреН рд░ рддреНрдпрд╕реИрд▓реЗ Terraform рд▓реЗ рдпреЛрдЬрдирд╛ рдЖрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджрд╛ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреНрджреИрдиред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдкрд╣рд┐рд▓реЛ рдирдЬрд░рдорд╛ рд╕рд╣реА рд▓рд╛рдЧреНрдиреЗ рдпреЛрдЬрдирд╛ рдЕрд╕рдлрд▓ рд╣реБрдиреЗрдЫред

рдпрд╕рдмрд╛рдЯ рд╕рд┐рдХреНрдиреБрдкрд░реНрдиреЗ рджреБрдИрд╡рдЯрд╛ рдкрд╛рда рдЫрдиреНред

  • рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ Terraform рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдерд╛рд▓реНрдиреБрднрдПрдХреЛ рдЫ рднрдиреЗ, рдЕрд░реВ рдХреЗрд╣реА рдкреНрд░рдпреЛрдЧ рдирдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рддрдкрд╛рдИрдВрдХреЛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдХреЛ рдЕрдВрд╢ Terraform рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рд▓рд╛рдИ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдиред рдЕрдиреНрдпрдерд╛, рддрдкрд╛рдИрдВрд▓реЗ рдЕрдиреМрдареЛ Terraform рддреНрд░реБрдЯрд┐рд╣рд░реВ рдорд╛рддреНрд░ рдЬреЛрдЦрд┐рдордорд╛ рд░рд╛рдЦреНрдиреБрд╣реБрдиреНрди, рддрд░ рддрдкрд╛рдИрдВрд▓реЗ IaC рдХрд╛ рдзреЗрд░реИ рдлрд╛рдЗрджрд╛рд╣рд░реВрд▓рд╛рдИ рдкрдирд┐ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рдХрд┐рдирднрдиреЗ рдХреЛрдб рдЕрдм рддрдкрд╛рдИрдВрдХреЛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдХреЛ рд╕рд╣реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реБрдиреЗрдЫреИрдиред
  • рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рдХреЗрд╣реА рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдЫ рднрдиреЗ, рдЖрдпрд╛рдд рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдЕрд╡рд╕реНрдерд┐рдд рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдХреЛ рд╕рд╛рде Terraform рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдЯреЗрд░рд╛рдлрд░реНрдо рдЖрдпрд╛рдд рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд░рд╛рдЬреНрдп рдлрд╛рдЗрд▓рдорд╛ рдердкреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпрд╕ рддрд░рд┐рдХрд╛рд▓реЗ рдЯреЗрд░рд╛рдлрд░реНрдорд▓реЗ рдХреЗ рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗрд░ рдерд╛рд╣рд╛ рдкрд╛рдЙрдиреЗрдЫред рдЖрдпрд╛рдд рдЖрджреЗрд╢рд▓реЗ рджреБрдИ рддрд░реНрдХрд╣рд░реВ рд▓рд┐рдиреНрдЫред рдкрд╣рд┐рд▓реЛ рддрдкрд╛рдИрдВрдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ рд╕реНрд░реЛрдд рдареЗрдЧрд╛рдирд╛ рд╣реЛред рдпрд╣рд╛рдБ рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рд╕реНрд░реЛрдд рд▓рд┐рдЩреНрдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЬрд╕реНрддреИ рдЫ: _ред (рдЬрд╕реНрддреИ aws_iam_user.existing_user)ред рджреЛрд╕реНрд░реЛ рддрд░реНрдХ рдЖрдпрд╛рдд рдЧрд░рд┐рдиреЗ рд╕реНрд░реЛрддрдХреЛ ID рд╣реЛред рдорд╛рдиреМрдВ рд╕рдВрд╕рд╛рдзрди ID aws_iam_user рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдирд╛рдо рд╣реЛ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, yevgeniy.brikman), рд░ рд╕реНрд░реЛрдд ID aws_instance EC2 рд╕рд░реНрднрд░ ID рд╣реЛ (рдЬрд╕реНрддреИ i-190e22e5)ред рд╕реНрд░реЛрдд рдХрд╕рд░реА рдЖрдпрд╛рдд рдЧрд░реНрдиреЗ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдпрд╕рдХреЛ рдкреГрд╖реНрдардХреЛ рддрд▓рдХреЛ рдХрд╛рдЧрдЬрд╛рддрдорд╛ рд╕рдВрдХреЗрдд рдЧрд░рд┐рдПрдХреЛ рдЫред

    рддрд▓ рдПрдЙрдЯрд╛ рдЖрдпрд╛рдд рдЖрджреЗрд╢ рдЫ рдЬрд╕рд▓реЗ aws_iam_user рд╕реНрд░реЛрддрд▓рд╛рдИ рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬ рдЧрд░реНрджрдЫ рдЬреБрди рддрдкрд╛рдЗрдБрд▓реЗ рддрдкрд╛рдЗрдБрдХреЛ Terraform рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ IAM рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╕рдБрдЧ рдЕрдзреНрдпрд╛рдп 2 рдорд╛ рдердкреНрдиреБрднрдПрдХреЛ рдЫ (рдирд┐рд╢реНрдЪрдп рдиреИ yevgeniy.brikman рдХреЛ рд▓рд╛рдЧреА рддрдкрд╛рдЗрдБрдХреЛ рдирд╛рдо рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджреИ):

    $ terraform import aws_iam_user.existing_user yevgeniy.brikman

    Terraform рд▓реЗ рддрдкрд╛рдИрдВрдХреЛ IAM рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди AWS API рд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдиреЗрдЫ рд░ рддрдкрд╛рдИрдВрдХреЛ Terraform рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдпреЛ рд░ aws_iam_user.existing_user рд╕реНрд░реЛрдд рдмреАрдЪ рд░рд╛рдЬреНрдп рдлрд╛рдЗрд▓ рд╕рдореНрдмрдиреНрдз рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫред рдЕрдм рджреЗрдЦрд┐, рдЬрдм рддрдкрд╛рдЗрдБ рдпреЛрдЬрдирд╛ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫ, Terraform рдерд╛рд╣рд╛ рд╣реБрдиреЗрдЫ рдХрд┐ IAM рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рдЕрд╡рд╕реНрдерд┐рдд рдЫ рд░ рдпрд╕рд▓рд╛рдИ рдлреЗрд░рд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИрдиред

    рдпреЛ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ рдХрд┐ рдпрджрд┐ рддрдкрд╛рдИрдВрд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рдзреЗрд░реИ рд╕реНрд░реЛрддрд╣рд░реВ рдЫрдиреН рдЬреБрди рддрдкрд╛рдИрдВ Terraform рдорд╛ рдЖрдпрд╛рдд рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдкрдорд╛ рдХреЛрдб рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН рд░ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдПрдХ рдкрдЯрдХрдорд╛ рдЖрдпрд╛рдд рдЧрд░реНрди рдПрдХ рдЭрдиреНрдЭрдЯ рд╣реБрди рд╕рдХреНрдЫред рддреНрдпрд╕реИрд▓реЗ рдпреЛ Terraforming (http://terraforming.dtan4.net/) рдЬрд╕реНрддреИ рдЙрдкрдХрд░рдгрдорд╛ рд╣реЗрд░реНрди рд▓рд╛рдпрдХ рдЫ, рдЬрд╕рд▓реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рддрдкрд╛рдИрдВрдХреЛ AWS рдЦрд╛рддрд╛рдмрд╛рдЯ рдХреЛрдб рд░ рд░рд╛рдЬреНрдп рдЖрдпрд╛рдд рдЧрд░реНрди рд╕рдХреНрдЫред

    рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░рд┐рдЩрдорд╛ рдпрд╕рдХреЛ рдХрдордЬреЛрд░реА рд╣реБрди рд╕рдХреНрдЫ

    рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░рд┐рдЩ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдорд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рд╣реЛ рдЬрд╣рд╛рдБ рддрдкрд╛рдЗрдБ рдмрд╛рд╣реНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫреЛрдбреЗрд░ рдХреЛрдбрдХреЛ рдЖрдиреНрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реБрдиреНрдЫред рдпреЛ рдХреЛрдбрд▓рд╛рдИ рд╕реНрдкрд╖реНрдЯ, рд╕рдлрд╛ рд░ рдорд░реНрдордд рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рд╣реЛред Refactoring рдПрдХ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рдкреНрд░рд╡рд┐рдзрд┐ рд╣реЛ рдЬреБрди рдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрдкрд░реНрдЫред рддрд░ рдЬрдм рдпреЛ Terraform рд╡рд╛ рдХреБрдиреИ рдЕрдиреНрдп IaC рдЙрдкрдХрд░рдгрдХреЛ рдХреБрд░рд╛ рдЖрдЙрдБрдЫ, рддрдкрд╛рдИрд▓реЗ рдХреЛрдбрдХреЛ рдЯреБрдХреНрд░рд╛рдХреЛ "рдмрд╛рд╣реНрдп рд╡реНрдпрд╡рд╣рд╛рд░" рдХреЛ рдЕрд░реНрде рдХреЗ рд╣реЛ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдЕрддреНрдпрдиреНрдд рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреБ рдкрд░реНрдЫ, рдЕрдиреНрдпрдерд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЙрддреНрдкрдиреНрди рд╣реБрдиреЗрдЫрдиреНред

    рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░рдХреЛ рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░рд┐рдЩрд▓реЗ рдЪрд░ рд╡рд╛ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдирд╛рдорд╣рд░реВ рдердк рдмреБрдЭреНрди рд╕рдХрд┐рдиреЗ рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрд╕рдБрдЧ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджреИрдЫред рдзреЗрд░реИ IDE рд╣рд░реВ рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░рд┐рдЩрдХрд╛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрдорд┐рдд рд╕рдорд░реНрдерди рдЫрдиреН рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рднрд░ рдЪрд░ рд░ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдкреБрди: рдирд╛рдорд╛рдХрд░рдг рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рднрд╛рд╖рд╛рд╣рд░реВрдорд╛, рдпреЛ рдПрдЙрдЯрд╛ рдорд╛рдореВрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛ рдЬрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рддрдкрд╛рдИрдВрд▓реЗ рд╕реЛрдЪреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрди, рддрд░ Terraform рдорд╛ рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рд╕рдБрдЧ рдзреЗрд░реИ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреБ рдкрд░реНрдЫ, рдЕрдиреНрдпрдерд╛ рддрдкрд╛рдИрдВрд▓реЗ рдЖрдЙрдЯреЗрдЬ рдЕрдиреБрднрд╡ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

    рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╡реЗрдмрд╕рд░реНрднрд░-рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдбреНрдпреБрд▓рдорд╛ рдЗрдирдкреБрдЯ рдЪрд▓ cluster_name рдЫ:

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

    рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдореЛрдбреНрдпреБрд▓рд▓рд╛рдИ foo рднрдирд┐рдиреЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрдиреБрднрдпреЛред рдкрдЫрд┐, рддрдкрд╛рдЗрдБ рдЖрдлреНрдиреЛ рд╕реЗрд╡рд╛рд▓рд╛рдИ рдмрд╛рд░рдорд╛ рдкреБрди: рдирд╛рдорд╛рдХрд░рдг рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫред рдпреЛ рдкрд░рд┐рд╡рд░реНрддрди рдорд╛рдореВрд▓реА рд▓рд╛рдЧреНрди рд╕рдХреНрдЫ, рддрд░ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдпрд╕рд▓реЗ рд╕реЗрд╡рд╛ рдЕрд╡рд░реЛрдзрд╣рд░реВ рдирд┐рдореНрддреНрдпрд╛рдЙрди рд╕рдХреНрдЫред

    рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ рд╡реЗрдмрд╕рд░реНрднрд░-рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдбреНрдпреБрд▓рд▓реЗ рджреБрдИ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣рд╣рд░реВрдХреЛ рдирд╛рдо рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд░ 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 ID рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБ рд╣реЛред рдЙрджрд╛рд╣рд░рдгрдХреЛ рд░реВрдкрдорд╛ рд╡реЗрдмрд╕рд░реНрднрд░-рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдбреНрдпреБрд▓рдорд╛ aws_security_group рд╕реНрд░реЛрдд рд▓рд┐рдиреБрд╣реЛрд╕реН:

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

    рдпрд╕ рд╕реНрд░реЛрддрдХреЛ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛рд▓рд╛рдИ рдЙрджрд╛рд╣рд░рдг рднрдирд┐рдиреНрдЫред рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ refactoring рдХреЛ рд╕рдордпрдорд╛ рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рд▓рд╛рдИ рдердк рдмреБрдЭреНрди рдпреЛрдЧреНрдп (рддрдкрд╛рдИрдВрдХреЛ рд╡рд┐рдЪрд╛рд░рдорд╛) рдирд╛рдо cluster_instance рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдиреБрднрдпреЛ:

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

    рдЖрдЦрд┐рд░ рдХреЗ рд╣реБрдиреЗ рд╣реЛ ? рддреНрдпреЛ рд╕рд╣реА рдЫ: рдПрдХ рдЕрд╡рд░реЛрдзред

    Terraform рд▓реЗ рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рдпрдХ ID рд╕рдБрдЧ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд░реЛрдд ID рд╕рдореНрдмрджреНрдз рдЧрд░реНрджрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, iam_user AWS IAM рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ ID рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫ, рд░ aws_instance AWS EC2 рд╕рд░реНрднрд░ ID рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рд╕реНрд░реЛрдд ID (рдЙрджрд╛рд╣рд░рдгрдмрд╛рдЯ cluster_instance рднрдиреНрдиреБрд╣реЛрд╕реН, рдЬрд╕реНрддреИ aws_security_group рдХреЛ рдорд╛рдорд▓рд╛рдорд╛) рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рдпреЛ рддрдкрд╛рдИрдВрд▓реЗ рдкреБрд░рд╛рдиреЛ рд╕реНрд░реЛрдд рдореЗрдЯрд╛рдПрд░ рдирдпрд╛рдБ рдердкреНрдиреБрднрдПрдХреЛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреЗрдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпреА рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, Terraform рд▓реЗ рдкреБрд░рд╛рдиреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣ рдореЗрдЯрд╛рдЙрдиреЗрдЫ рд░ рдирдпрд╛рдБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫ, рдЬрдмрдХрд┐ рддрдкрд╛рдЗрдБрдХреЛ рд╕рд░реНрднрд░рд╣рд░реВрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЯреНрд░рд╛рдлрд┐рдХ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрди рдерд╛рд▓реНрдЫред

    рдпрд╣рд╛рдБ рдЪрд╛рд░ рдореБрдЦреНрдп рдкрд╛рдард╣рд░реВ рдЫрдиреН рдЬреБрди рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕ рдЫрд▓рдлрд▓рдмрд╛рдЯ рдЯрд╛рдврд╛ рд▓реИрдЬрд╛рдиреБрдкрд░реНрдЫред

    • рд╕рдзреИрдВ рдпреЛрдЬрдирд╛ рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрд╕рд▓реЗ рдпреА рд╕рдмреИ рд╕реНрдиреНрдпрд╛рдЧрд╣рд░реВ рдкреНрд░рдХрдЯ рдЧрд░реНрди рд╕рдХреНрдЫред рдпрд╕рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕рдореАрдХреНрд╖рд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рд╣рд░реВрдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдЬрд╣рд╛рдБ Terraform рд▓реЗ рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ рдореЗрдЯрд╛рдЙрди рдирд╣реБрдиреЗ рд╕реНрд░реЛрддрд╣рд░реВ рдореЗрдЯрд╛рдЙрдиреЗ рдпреЛрдЬрдирд╛ рдмрдирд╛рдЙрдБрдЫред
    • рддрдкрд╛рдИрдВрд▓реЗ рдореЗрдЯрд╛рдЙрдиреБ рдЕрдШрд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдХреБрдиреИ рд╕реНрд░реЛрдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдореВрд▓ рдореЗрдЯрд╛рдЙрдиреБ рдЕрдШрд┐ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рдЫреИрди рднрдиреЗрд░ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕реЛрдЪреНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рдЬрд╡рд╛рдл рд╣реЛ рднрдиреЗ, create_before_destroy рд▓реЗ рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫред рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреБрдИ рдЪрд░рдгрд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реЗрд░ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ: рдкрд╣рд┐рд▓реЗ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдирдпрд╛рдБ рд╕реНрд░реЛрдд рдердкреНрдиреБрд╣реЛрд╕реН рд░ рд▓рд╛рдЧреВ рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдмрд╛рдЯ рдкреБрд░рд╛рдиреЛ рд╕реНрд░реЛрдд рд╣рдЯрд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рдлреЗрд░рд┐ рд▓рд╛рдЧреВ рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
    • рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБ рд╕реНрд░реЛрддрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд ID рд▓рд╛рдИ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, aws_security_group instance рдмрд╛рдЯ cluster_instance рдорд╛ рдкреБрди: рдирд╛рдорд╛рдХрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН) рд╕реНрд░реЛрдд рдореЗрдЯрд╛рдЙрди рд░ рдпрд╕рдХреЛ рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдг рд╕рд┐рд░реНрдЬрдирд╛ рдирдЧрд░реА, рддрдкрд╛рдЗрдБрд▓реЗ Terraform рд░рд╛рдЬреНрдп рдлрд╛рдЗрд▓ рддрджрдиреБрд╕рд╛рд░ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпрд╕рд▓рд╛рдИ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдХрд╣рд┐рд▓реНрдпреИ рдирдЧрд░реНрдиреБрд╣реЛрд╕реН - рдпрд╕рдХреЛ рд╕рдЯреНрдЯрд╛рдорд╛ рдЯреЗрд░рд╛рдлрд░реНрдо рд╕реНрдЯреЗрдЯ рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛рд╣рд░реВ рдкреБрди: рдирд╛рдорд╛рдХрд░рдг рдЧрд░реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рдЯреЗрд░рд╛рдлреЙрд░реНрдо рд╕реНрдЯреЗрдЯ 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 рд▓реЗ рдкреБрд░рд╛рдиреЛ рд╕реНрд░реЛрдд рдореЗрдЯрд╛рдЙрдиреЗрдЫ рд░ рдпрд╕рдХреЛ рдард╛рдЙрдБрдорд╛ рдирдпрд╛рдБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд░реЛрдд рдкреГрд╖реНрдард▓реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдХреЗ рд╣реБрдиреНрдЫ рднрдиреЗрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ рдЬрдм рддрдкрд╛рдЗрдБ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реЗрдЯрд┐рдЩ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдХрд╛рдЧрдЬрд╛рдд рдЬрд╛рдБрдЪ рдЧрд░реНрди рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрдиреБрд╣реЛрд╕реНред рд╕рдзреИрдВ рдпреЛрдЬрдирд╛ рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╕рд┐рд░реНрдЬрдирд╛_рдкреВрд░реНрд╡_рдбрд┐рд╕реНрдЯреНрд░реЛрдп рд░рдгрдиреАрддрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

    рд╕реНрдердЧрд┐рдд рд╕реНрдерд┐рд░рддрд╛ рд╕реБрд╕рдВрдЧрдд рдЫ ... рд╕реНрдердЧрд┐рдд рд╕рдВрдЧ

    AWS рдЬрд╕реНрддрд╛ рдХреЗрд╣реА рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рдпрдХрд╣рд░реВрдХреЛ API рд╣рд░реВ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд╣реБрдиреН рд░ рд╕реНрдерд┐рд░рддрд╛рдорд╛ рдврд┐рд▓рд╛рдЗ рднрдПрдХреЛ рдЫред Asynchrony рдХреЛ рдЕрд░реНрде рд╣реЛ рдХрд┐ рдЗрдиреНрдЯрд░рдлреЗрд╕рд▓реЗ рдЕрдиреБрд░реЛрдз рдЧрд░рд┐рдПрдХреЛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирдЧрд░реА рддреБрд░реБрдиреНрддреИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдлрд░реНрдХрд╛рдЙрди рд╕рдХреНрдЫред рдврд┐рд▓рд╛рдЗ рднрдПрдХреЛ рд╕реНрдерд┐рд░рддрд╛ рднрдиреЗрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╕рдореНрдкреВрд░реНрдг рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдкреНрд░рдЪрд╛рд░ рдЧрд░реНрди рд╕рдордп рд▓рд╛рдЧреНрди рд╕рдХреНрдЫред рдпреЛ рднрдЗрд░рд╣реЗрдХреЛ рдмреЗрд▓рд╛, рддрдкрд╛рдЗрдБрдХрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рдЕрд╕рдВрдЧрдд рд╣реБрди рд╕рдХреНрдЫрдиреН рд░ рдХреБрди рдбрд╛рдЯрд╛ рд╕реНрд░реЛрдд рдкреНрд░рддрд┐рдХреГрддрд┐рд▓реЗ рддрдкрд╛рдЗрдБрдХреЛ 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

    рдЕрд░реНрдХреЛ рд╢рдмреНрджрдорд╛, рддрдкрд╛рдИрд▓реЗ рдПрдЙрдЯрд╛ рд╕реНрд░реЛрдд (рдЬрд╕реНрддреИ рд╕рдмрдиреЗрдЯ) рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗрд╣реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ (рдЬрд╕реНрддреИ рдирдпрд╛рдБ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рд╕рдмрдиреЗрдЯрдХреЛ рдЖрдИрдбреА), рд░ рдЯреЗрд░рд╛рдлрд░реНрдорд▓реЗ рдпрд╕рд▓рд╛рдИ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрджреИрдиред рдпреА рдзреЗрд░реИ рдмрдЧрд╣рд░реВ (6813 рд╕рд╣рд┐рдд) рдлрд┐рдХреНрд╕ рдЧрд░рд┐рдПрдХреЛ рдЫ, рддрд░ рддрд┐рдиреАрд╣рд░реВ рдЕрдЭреИ рдкрдирд┐ рд╕рдордп-рд╕рдордпрдорд╛ рдХреНрд░рдк рд╣реБрдиреНрдЫрдиреН, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЬрдм Terraform рдирдпрд╛рдБ рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд░рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рдердкреНрдЫред рдпреЛ рдХрд╖реНрдЯрдкреНрд░рдж рдЫ, рддрд░ рдзреЗрд░реИ рдЬрд╕реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдХреБрдиреИ рд╣рд╛рдирд┐ рдЧрд░реНрджреИрдиред рдЬрдм рддрдкрд╛рдЗрдБ рдЯреЗрд░рд╛рдлрд░реНрдо рд▓рд╛рдЧреВ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рдкреБрди: рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫ, рд╕рдмреИ рдХреБрд░рд╛рд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреБрдкрд░реНрдЫ, рдХрд┐рдирдХрд┐ рдпрд╕ рд╕рдордп рд╕рдореНрдо рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд┐рд▓реЗ рдиреИ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдлреИрд▓рд┐рдПрдХреЛ рд╣реБрдиреНрдЫред

    рдпреЛ рдЕрдВрд╢ Evgeniy Brikman рджреНрд╡рд╛рд░рд╛ рдкреБрд╕реНрддрдХрдмрд╛рдЯ рдкреНрд░рд╕реНрддреБрдд рдЧрд░рд┐рдПрдХреЛ рдЫ "рдЯреЗрд░рд╛рдлрд╛рд░реНрдо: рдХреЛрдб рд╕реНрддрд░рдорд╛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░".

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди