рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХреЗ рдиреБрдХрд╕рд╛рди

рдЫрд╡рд┐

рд╣рдо рдХрдИ рдЦрд╛рдорд┐рдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд▓реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдпрджрд┐ рдХрдерди, рдФрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рддрдХрдиреАрдХ, рд╕рд╛рде рд╣реА рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдореБрджреНрджреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдкреВрд░реНрдг рд░реВрдк рд╕реЗ Terraform рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддреЗ рд╣реИрдВ:

  • рдЧрд┐рдирддреА рдФрд░ for_each рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВ;
  • рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рддрд┐рдмрдВрдз
  • рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЕрдЪреНрдЫреА рдпреЛрдЬрдирд╛ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ;
  • refactoring рдХреА рдЕрдкрдиреА рдЪрд╛рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ;
  • рдЖрд╕реНрдердЧрд┐рдд рд╕рдВрдЧрддрд┐ рд╕реБрд╕рдВрдЧрдд рд╣реИ ... рдбрд┐рдлрд░рд▓ рдХреЗ рд╕рд╛рдеред

рдЧрдгрдирд╛ рдФрд░ for_each рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВ


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

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

рдЧрд┐рдирддреА рдФрд░ for_each рд╕рдВрд╕рд╛рдзрди рдХреЗ рдХрд┐рд╕реА рднреА рдЖрдЙрдЯрдкреБрдЯ рдЪрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИ


рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрдИ рдИрд╕реА 2 рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдк рдПрдПрд╕рдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

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

рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрджрд▓реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

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

рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЧрдгрдирд╛ рдФрд░ 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"
}

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

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.

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬрд┐рд╕ рд╕рдордп рдЯреЗрд░рд╛рдлреЙрд░реНрдо 0.12.6 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕ рд╕рдордп рдореЙрдбреНрдпреВрд▓ рд╕рдВрд╕рд╛рдзрди рдореЗрдВ рдЧрд┐рдирддреА рдпрд╛ for_each рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдерд╛ред рдЯреЗрд░рд╛рдлреЙрд░реНрдо 0.12 рд░рд┐рд▓реАрдЬ рдиреЛрдЯреНрд╕ (http://bit.ly/3257bv4) рдХреЗ рдЕрдиреБрд╕рд╛рд░, HashiCorp рдиреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдЗрд╕ рдкреБрд╕реНрддрдХ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдЯреЗрд░рд╛рдлрд╝реЙрд░реНрдо рдкрд░рд┐рд╡рд░реНрддрди рд▓реЙрдЧ рджреЗрдЦреЗрдВ ред


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

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

рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

рд╕рд╣реА рдпреЛрдЬрдирд╛ рдХреЛ рдЕрд╕рдлрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдХрднреА-рдХрднреА рдЬрдм рдЖрдк рдкреНрд▓рд╛рди рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдпреЛрдЬрдирд╛ рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд╛рдЧреВ рдХрдорд╛рдВрдб рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, aAM_iam_user рд╕рдВрд╕рд╛рдзрди рдХреЛ рдЙрд╕реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдиреЗ IAM рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЕрдзреНрдпрд╛рдп 2 рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛:

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

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

рдЗрд╕рд╕реЗ рджреЛ рд╕рдмрдХ рд╕реАрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

  • рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЕрдиреНрдпрдерд╛, рдЖрдк рди рдХреЗрд╡рд▓ рдЕрдЬреАрдм рдЯреЗрд░рд╛рдлрд╝реЙрд░реНрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЖрдИрдПрд╕реА рдХреЗ рдХрдИ рд▓рд╛рднреЛрдВ рдХреЛ рднреА рдирдХрд╛рд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдЕрдм рдЖрдкрдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рд╕рдЯреАрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
  • - , 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: ┬╗.

All Articles