áá¯ááºááŒááºáá»ááºáá»á¬ážááŸáá·áº á¡áá¯á¶ážáá»ááŸá¯áááºážááá¬áá»á¬ážá¡ááŒáẠáá±áá¯áá»á¡á¬ážááŒáá·áº Terraform ááᯠáááºáá±á¬ááºááŸá¯ááŸááá±á¬ áá±á¬ááºááẠáá±áá°áá»ááŒá¿áá¬áá»á¬ážááŸááá»áŸáẠááœááºážáááºáá»á¬ážááŸáá·áºáááºááá¯ááºááá·áºá¡áá¬áá»á¬ážá¡áá«á¡ááẠáá»áá¯á·ááœááºážáá»ááºá¡áá»áá¯á·ááᯠáá®ážáá±á¬ááºážááá¯ážááŒááŒáá«á
áá¯á·á
- á¡áá±á¡ááœááºááŸáá·áº ááá·áºáááºáá»ááºáá áºáá¯á á®ááœáẠááá·áºáááºáá»ááºáá»á¬ážááŸááááºá
- á ááºáááºáá»áááºááᯠáá¯á¶ážá ááá·áºáááºáá«á
- á¡á á®á¡á á¥áºáá±á¬ááºážáá áºáá¯ááẠáá¡á±á¬ááºááŒááºááá¯ááºáá«á
- refactoring ááẠáááºážá áá»áá¯á·ááœááºážáá»ááºáá»á¬áž ááŸáááá¯ááºáááºá
- deferred coherence áááº... ááœáŸá±á·ááá¯ááºážááŒááºážááŸáá·áº ááá¯ááºáá®áááºá
á¡áá±á¡ááœááºááŸáá·áº ááá·áºáááºáá»ááºáá áºáá¯á á®ááœáẠááá·áºáááºáá»ááºáá»á¬ážááŸááááºá
á€á¡áááºážááŸá ááá°áá¬áá»á¬ážááẠcount parameter ááŸáá·áº loops ááŸáá·áº conditional logic ááá¯á·ááœáẠfor_each expression ááᯠáá»ááºáá»ááºááŒáá·áºááŒáá·áº á¡áá¯á¶ážááŒá¯á á±áááºá áááºážááá¯á·ááẠáá±á¬ááºážááœááºá áœá¬ áá¯ááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž áááºážááá¯á·ááœáẠáááºááááá¬ážáááºááá¯á¡ááºááá·áº á¡áá±ážááŒá®ážáá±á¬ ááá·áºáááºáá»ááºááŸá áºáá¯ááŸááááºá
- Count ááŸáá·áº for_each ááẠáááºááá·áº á¡áááºážá¡ááŒá Ạáá¯ááºáá±ážááá·áº ááááºážááŸááºáá»á¬ážááá¯áá»áŸ ááá¯ážáá¬ážá áááá«á
- count ááŸáá·áº for_each ááᯠmodule configuration ááœáẠá¡áá¯á¶ážáááŒá¯ááá¯ááºáá«á
count ááŸáá·áº for_each ááẠáááºááá·áºá¡áááºážá¡ááŒá áºááŸááœááºááŸáááá·áºááááºážááŸááºáá»á¬ážááᯠááá¯ážáá¬ážááááá«á
áááºááẠEC2 áá¬áá¬áá»á¬ážá áœá¬ááᯠá¡áá¯á¶ážááŒá¯ááẠááá¯á¡ááºááŒá®áž ASG ááᯠá¡áá¯á¶ážáááŒá¯ááá¯áá±á¬ á¡ááŒá±á¬ááºážááŒáá»ááºá¡áá»áá¯á·ááŒá±á¬áá·áº ááœá±ážááŒáá·áºáá«á ááá·áºáá¯ááºááẠá€áá²á·ááá¯á· ááŒá áºááá¯ááºáááº-
resource "aws_instance" "example_1" {
count = 3
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
á¡á²áá«ááœá±ááᯠáá áºáá¯á¶áá»ááºážááŒáá·áºáá¡á±á¬ááºá
count parameter ááᯠstatic value áá áºáá¯á¡ááŒá áºáááºááŸááºáá¬ážáá±á¬ááŒá±á¬áá·áºá á€áá¯ááºááẠááŒá¿áá¬áááŸááá² á¡áá¯ááºááŒá áºáááá·áºáááº- áááºá¡áá¯á¶ážááŒá¯ááá·áºá¡áááá·áºááᯠrun áá±á¬á¡áá«á áááºážááẠEC2 áá¬áá¬áá¯á¶ážáá¯ááá¯áááºáá®ážáááá·áºáááºá áá«áá±ááá·áº áááºážáá²á· áááºááŸá AWS áá±áá¡ááœááºáž Availability Zone (AZ) áá áºáá¯á á®ááŸá¬ áá¬áá¬áá áºáá¯ááᯠá¡áá¯á¶ážáá»áá»ááºáááºááá¯áááºáá±á¬á ááá·áºáá¯ááºááẠaws_availability_zones áá±áá¬áááºážááŒá áºá០áá¯ááºáá»á¬ážá á¬áááºážááᯠáááºááá¯ááºááŒá®áž áá áºáá¯áá»ááºážá á®ááᯠááŸáá·áºáááºáᬠá¡áá±á¡ááœááºááá·áºáááºáá»ááºááŸáá·áº array á¡ááœáŸááºážááᯠá¡áá¯á¶ážááŒá¯á áááºážááœáẠ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 á¡áááºážá¡ááŒá áºá count parameter ááœáẠá€á¡áááºážá¡ááŒá áºá output ááá¯á¡áá¯á¶ážááŒá¯áááºááŒáá¯ážá á¬ážáá«á áá¬ááŒá áºááœá¬ážáááºááᯠááŒáá·áºááŒáá«á áá¯á·á
resource "aws_instance" "example_3" {
count = random_integer.num_instances.result
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
áááºááẠá€áá¯ááºááœáẠterraform á¡á á®á¡á ááºááᯠáá¯ááºáá±á¬ááºáá«áá áááºááẠá¡á±á¬ááºáá« á¡ááŸá¬ážááᯠáááŸááááá·áºáááº-
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 ááẠá á¬áá¬ážáá»á¬ážá ááááºážááŸááºáá»á¬ážá áá±áá¬áááºážááŒá áºáá»á¬ážááŸáá·áº á¡áááºážá¡ááŒá áºá á¬áááºážáá»á¬ážááá¯ááẠáááºááœáŸááºážááá¯ááºááẠ(á¡áá»áááºááá¬ážááœá²áá¬ážááá·áºá¡áá»áááºá áááºážááá¯á·áá¡ááŸááºááᯠáá¯á¶ážááŒááºááá¯ááºáááœá±á·)á ááá¯á·áá±á¬áº ááœááºáá»ááºáá¬ážáá±á¬ á¡áááºážá¡ááŒá áºá¡ááœááºááááºážááŸááºáá»á¬ážááá¯á· ááá¯ááºáá«á
count ááŸáá·áº for_each ááᯠmodule configuration ááœáẠá¡áá¯á¶ážáááŒá¯ááá¯ááºáá«á
áá áºáá±á·áá±á·ááœáẠááá·áº module configuration ááœáẠcount parameter áá áºáá¯ááá·áºááẠááœá±ážáá±á¬ááºáá¶áááá¯ááºáááº-
module "count_example" {
source = "../../../../modules/services/webserver-cluster"
count = 3
cluster_name = "terraform-up-and-running-example"
server_port = 8080
instance_type = "t2.micro"
}
á€áá¯ááºááẠwebserver-cluster áááºážááŒá áºááááá¹áá°áá¯á¶ážáá»áá¯ážáááºáá®ážááẠmodule áá áºáá¯á¡ááœááºážá count ááá¯á¡áá¯á¶ážááŒá¯ááẠááŒáá¯ážá á¬ážáááºá ááá¯á·ááá¯áẠáááºážá count parameter ááᯠ0 ááá¯á· áááºááŸááºááŒááºážááŒáá·áº Boolean á¡ááŒá±á¡áá±á¡áá»áá¯á·á¡áá±á«áº áá°áááºá module áá áºáá¯ááᯠá áááºááŒáá¯ááºááœá±ážáá»ááºá áá»áááºáááºááŒááºážááᯠááŒá¯áá¯ááºááá¯áá±áááºá áááºážááẠáá»áá¯ážááŒá±á¬ááºážáá®áá»á±á¬áºáá±á¬ áá¯ááºáá²á·ááá¯á· ááŒá áºáá±á¬ááºážááŒá áºááá¯ááºáá±á¬áºáááºáž terraform á¡á á®á¡á ááºááᯠáá¯ááºáá±á¬ááºááá·áºá¡áá«ááœáẠáááºááẠá€á¡ááŸá¬ážááᯠáááŸááááá·áºáááº-
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 á¡áá module á¡áááºážá¡ááŒá
áºáá
áºáá¯ááŸá count ááá¯á·ááá¯áẠfor_each ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááᯠáá¶á·ááá¯ážááá¬ážáá«á Terraform 0.12 áá¯ááºáá±ááŸá¯ááŸááºá
á¯áá»á¬áž (http://bit.ly/3257bv4) á¡á HashiCorp ááẠá€á
áœááºážáááºááᯠá¡áá¬áááºááœáẠááá·áºááœááºážááẠá
á®á
ááºáá¬ážáááºá ááá¯á·ááŒá±á¬áá·áº á€á
á¬á¡á¯ááºááᯠáááºáááºááá·áºá¡áá»áááºáá±á«áºáá°áááºá áááºážááᯠáááá¯ááºáá±ááŒá®ááŒá
áºáááºá áá±áá»á¬ááááá¯á·á
Zero Downtime Deployments á ááá·áºáááºáá»ááºáá»á¬áž
ASG ááŸáá·áº áá±á«ááºážá ááºáá¬ážáá±á¬ create_before_destroy ááá±á¬ááºááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááẠááááá±ážáá»ááºáá áºáá¯ááŸááœá²á áá¯á¶ážáá ááºáááºááœá¬ážááŒááºážáá»á¬ážááᯠáááºáá®ážááŒááºážá¡ááœáẠá¡áá±á¬ááºážáá¯á¶ážááŒá±ááŸááºážáá»ááºáá áºáá¯ááŒá áºáááº- á¡ááá¯á¡áá»á±á¬áẠá¡ááœááºá¡á á¬ážáááºááŸááºááŒááºážá ááºážáá»ááºážáá»á¬ážááᯠáá¶á·ááá¯ážááá¬ážáá«á ááá¯á·ááá¯áẠááá¯ááá¯áááá»á á±áááºá áááºážááẠááŒáá·áºáá»ááºááŸá¯ááá¯ááºážááœáẠASG á¡ááœááºá¡á á¬ážááᯠmin_size ááá¯á· ááŒááºáááºáááºááŸááºáá±ážáááºá áááºážááẠá¡áá¯á¶ážááŒá¯áá±ááá·áº áá¬áá¬á¡áá±á¡ááœááºááᯠááá¯ážááŒáŸáá·áºáááºá¡ááœáẠá¡ááá¯á¡áá»á±á¬ááºá¡ááá¯ááºážá¡áá¬á ááºážáá»ááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá±áá«á ááŒá¿áá¬ááŸáááá¯ááºáááºá
á¥ááá¬á¡á¬ážááŒáá·áºá webserver-cluster module ááœáẠaws_autoscaling_schedule áááºážááŒá áºáá áºá á¯á¶áá«ááŸááááºá áá¶ááẠ9 áá¬áá®ááœáẠcluster ááŸá server á¡áá±á¡ááœááºááᯠááŸá áºáá¯á០áááºáá¯á¡ááááá¯ážá á±áááºá á¡áááºá áááºááẠáá¶ááẠáá áá¬áá®ááœáẠááŒáá·áºáá»ááºáááºááá¯áá«áá ASG á¡áá áºááẠáááºáá¯ááẠáá¬áá¬ááŸá áºáá¯áᬠá áááºááœáá·áºáááºááŒá áºááŒá®áž áá±á¬ááºáá áºáá±á· áá¶ááẠá áá¬áá®á¡áá áááºážáá¯á¶á á¶á¡ááá¯ááºáž ááŸááá±áááºááŒá áºáááºá
á€ááá·áºáááºáá»ááºááᯠáááºážáááºážáá»á¬ážá áœá¬ááŒáá·áº áá»á±á¬áºááœáŸá¬ážááá¯ááºáááºá
- aws_autoscaling_schedule ááœáẠ0 9 * * * ("áááẠ9 áá¬áá®ááœáẠáááºáááºáááº") á០0-59 9-17 * * * ("áááá áºááá¯ááºáž 9 áá¶ááẠ5 áá¬áá®á០ááá± XNUMX áá¬áá®á¡áá") ááá¯á· ááŒááºááŒá áºááŒááºáž ááá·áºáááºáá±á¬ááºááᯠááŒá±á¬ááºážáá«á ASG ááœáẠáá¬áá¬áááºáá¯ááŸáááŒá®ážááŒá áºáá«áá á€á¡ááá¯á¡áá»á±á¬ááºá áá±ážáá»á²á·ááŒááºážá ááºážáá»ááºážááᯠáááºáá¶áá¯ááºáá±á¬ááºááŒááºážááẠáá»áœááºá¯ááºááá¯á·ááá¯áá»ááºááá·áºá¡áá¬ááŒá áºááŒá®áž áááºááá·áºá¡áá¬ááá¯áá»áŸ ááŒá±á¬ááºážáá²áááºááá¯ááºáá«á ááá¯á·áá±á¬áº ASG ááᯠáááŒá¬áá±ážáá®áá០ááŒáá·áºáá»ááºáá¬ážáá«áá á€á ááºážáá»ááºážááẠáááºážááá¬áá¬áá»á¬ážá á¡áá»á¬ážáá¯á¶ážáá áºáááá áºá¡ááœááºáž á¡áá±á¡ááœáẠáááºáá¯ááá¯á·áá±á¬ááºááŸáááẠáá±áá»á¬á á±áááºááŒá áºáááºá á€áááºááŸá¬ áá¯á¶ážáááᯠá¡á¶áááºááœááºáá» áá»ááºážáááºááŸá¯ááá¯ááºáá«á áááºáá¯á០áá¬áá¬ááŸá áºáá¯ááŸáá·áº áá±á¬ááºááá¯á· ááŒá®ážáá¬ážáá±á¬ áá¯ááºááŒááºážáá»á¬ážáááºáááºáž áá¯á¶ážá áœá²áá°áá»á¬ážá¡ááœáẠááŒá¿áá¬ááŒá áºá á±ááá¯ááºáááºá
- ASG ááœááºáááºááŒáœáá±á¬áá¬áá¬á¡áá±á¡ááœááºááá¯áá¯á¶ážááŒááºááẠAWS API ááá¯á¡áá¯á¶ážááŒá¯ááá·áºá áááºááŒáá¯áẠscript áá áºáá¯ááá¯áááºáá®ážáá«á áááºážááá¯ááŒááºááá±áá¬á¡áááºážá¡ááŒá áºááá¯á¡áá¯á¶ážááŒá¯ááá±á«áºááá¯áá« (á á¬áá»ááºááŸá¬ 249 ááœáẠ"ááŒááºááá±áá¬á¡áááºážá¡ááŒá áº" ááá¯ááŒáá·áºáá«) ááŸáá·áº ASG áá¡ááá¯ááŸááá±á¬_capacity ááá·áºáááºáá±á¬ááºááᯠááŒááºáá±ážááá·áºáááºááá¯ážá¡ááŒá ẠáááºááŸááºáá«á áá¬ááºááœáŸááºážá á€áááºážá¡á¬ážááŒáá·áºá ASG á¡áá áºáá áºáá¯á á®ááẠáááºááŸá Terraform áá¯ááºáá²á·ááá¯á· áá°áá®áá±á¬á áœááºážáááºááŒáá·áº á¡ááŒá²áááºáááºáá±áááºááŒá áºááŒá®áž ááááºážááááºážááẠááá¯ááá¯áááºáá²á á±áááºá
áá¯ááºáá«áááºá Terraform ááẠáá¯á¶ážáá
ááºáááºááœá¬ážááŒááºážáá»á¬ážá¡ááœáẠá
á¶ááŒá¡á¬ážááŒáá·áº Built-in áá¶á·ááá¯ážááŸá¯ááŸáááŒá®ážá ááá¯á·áá±á¬áº 2019 áá¯ááŸá
Ạáá±áááœáẠHashiCorp á¡ááœá²á·ááẠá€áá¯ááºáá±á¬ááºáá»ááºááᯠááá·áºááœááºážááẠá¡á
á®á¡á
ááºáááŸááá« (
ááŸááºáááºáá±á¬á¡á á®á¡á á¥áºááᯠáá¡á±á¬ááºááŒááºááá¯ááºáá«á
áá áºáá«áá áºáá¶ááœáẠplan command ááẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ ááŸááºáááºáá±á¬ ááŒáá·áºáá»ááºááŸá¯ á¡á á®á¡á ááºááᯠáááºáá®ážáá±ážáá±á¬áºáááºáž á¡áá¯á¶ážáá»ááá·áº command ááẠerror áá áºáᯠááŒááºáá±ážáááºá á¥ááá¬á¡á¬ážááŒáá·áºá á¡áááºáž 2 ááœáẠá¡á á±á¬ááá¯ááºážá áááºáááºáá®ážáá²á·áá±á¬ 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.
á¡áááºá áááºááẠapply command ááᯠrun áá«á á¡á±á¬ááºáá« error ááᯠáááŸááááá·áºááẠá
Error: Error creating IAM User yevgeniy.brikman: EntityAlreadyExists:
User with name yevgeniy.brikman already exists.
on main.tf line 10, in resource "aws_iam_user" "existing_user":
10: resource "aws_iam_user" "existing_user" {
ááŒá¿áá¬ááŸá¬ áá±áá»á¬áááºááŸá¬ ááá¯á¡áááºááŒáá·áº IAM á¡áá¯á¶ážááŒá¯áá° ááŸáááŸáá·áºááŒá®ážáá¬ážááŒá áºáááºá áááºážááẠIAM á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡ááœááºáá¬áá á¡áááºážá¡ááŒá áºááá¯ááºážáá®ážáá«ážááœáẠááŒá áºááœá¬ážááá¯ááºáááºá áá áºá á¯á¶áá áºáá±á¬ááºááẠá€á¡áááºážá¡ááŒá áºááᯠááá¯ááºááá¯ááºáááºáá®ážááŒááºáž ááá¯á·ááá¯áẠá¡áááá·áºáá±ážá á¬ááá¯ááºážááᯠá¡áá¯á¶ážááŒá¯ááŒááºáž ááŒá áºááá¯ááºáá±á¬áºáááºážá ááá¯ááºáá®áá±á¬ ID áá»á¬ážááẠáááááá¹ááá»á¬ážááᯠááŒá áºá á±áááºá Terraform ááœáẠá¡áá áºáááºáá¬áá°áá»á¬ážááᯠá¡á¶á·á¡á¬ážááá·áºá á±ááá·áº á€á¡ááŸá¬ážáá»áá¯ážááœá²áá»á¬ážá áœá¬ááŸááááºá
á¡áááá¡áá»ááºááŸá¬ terraform plan command ááẠTerraform state file ááœáẠáááºááŸááºáá¬ážááá·áº á¡áááºážá¡ááŒá áºáá»á¬ážááá¯áᬠááá·áºááœááºážááœááºáá»ááºááŒááºážááŒá áºáááºá á¡áááºážá¡ááŒá áºáá»á¬ážááᯠáá áºáááºážáá áºáá¯á¶ áááºáá®ážáá¬ážáá»áŸáẠ(á¥ááá¬á AWS ááœááºááá¯ážááºááœáẠááá¯ááºááá¯ááºááá áºááŸáááºááŒááºážááŒáá·áº) áááºážááá¯á·ááẠááŒááºáááºááá¯ááºááœáẠá¡áá»á¯á¶ážáááºáááºááá¯ááºáá±á¬ááŒá±á¬áá·áº Terraform ááẠá¡á á®á¡á ááºá¡áááá·áºááᯠáá¯ááºáá±á¬ááºááá·áºá¡áá« áááºážááá¯á·ááᯠááá·áºááœááºážá ááºážá á¬ážáááºááá¯ááºáá«á ááááºá¡áá±ááŒáá·áºá ááááá áºáá»ááºááœáẠááŸááºáááºáááºáá¯áááºááá±á¬ á¡á á®á¡á ááºááẠáá¡á±á¬ááºááŒááºáá±á¬á·áá«á
áá®ááá± áááºáááºážá á¬áá°á áᬠááŸá áºáá¯ááŸááááºá
- ááẠTerraform ááŸáá·áº á áááºáá¯ááºáá±á¬ááºáá±ááŒá®ááá¯áá»áŸááºá á¡ááŒá¬ážáááºááá·áºá¡áá¬ááá¯áá»áŸ ááá¯á¶ážáá«ááŸáá·áºá áááºáá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶áá¡á áááºá¡ááá¯ááºážááᯠTerraform ááá¯á¡áá¯á¶ážááŒá¯á á á®áá¶ááá·áºááœá²áá«áá áááºážááᯠáááºááá¯ááºááá¯ááºááœááºážáá¶ááá¯ááºáá±á¬á·áááºááá¯ááºáá«á ááá¯ááºáá«áá áááºááẠáá°ážáááºážáá±á¬ Terraform á¡ááŸá¬ážáá»á¬ážááᯠá áœáá·áºá á¬ážáá¯á¶áá¬áá IaC á á¡áá»áá¯ážáá»á±ážáá°ážáá»á¬ážá áœá¬ááá¯áááºáž ááŒááºážááá¯áá¬ážáá±á¬ááŒá±á¬áá·áº áá¯ááºááẠáááºáá¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠá áááá»áá±á¬ááá¯ááºá á¬ážááŒá¯ááŸá¯ááá¯ááºáá±á¬á·áá«á
- ááá·áºááœáẠá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶á¡áá»áá¯á·ááŸááá±ááŒá®ááá¯áá»áŸááºá áááºááœááºážááá·áºá¡áááá·áºááᯠá¡áá¯á¶ážááŒá¯áá«á áááºááŸáá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááŒáá·áº Terraform ááᯠá
áááºá¡áá¯á¶ážááŒá¯áá±áá«áá Terraform áááºááœááºážááŸá¯á¡áááá·áºááᯠá¡áá¯á¶ážááŒá¯á áááºážááᯠááŒááºáááºááá¯ááºááœáẠááá·áºááœááºážááá¯ááºáááºá á€áááºážááŒáá·áº Terraform ááẠáááºááá·áºá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááᯠá
á®áá¶ááá·áºááœá²ááẠááá¯á¡ááºáááºááᯠááááŸááááºááŒá
áºáááºá áááºááœááºážááá·áºá¡áááá·áºááẠá¡ááŒááºážá¡áá¯á¶ááŸá
áºáá¯ááᯠáá°áááºá áááá¡áá»ááºááŸá¬ áááºáááœá²á·á
ááºážáá¯á¶ááá¯ááºáá»á¬ážááœáẠáááºážááŒá
áºááááºá
á¬ááŒá
áºáááºá á€áá±áá¬ááœáẠsyntax ááẠá¡áááºážá¡ááŒá
áºááá·áºááºáá»á¬ážá¡ááœáẠáá°áá®áááº- _. (aws_iam_user.existing_user áá²á·ááá¯á·)á áá¯áááá¡ááŒááºážá¡áá¯á¶ááẠáááºááœááºážáááá·áº á¡áááºážá¡ááŒá
áºá ID ááŒá
áºáááºá á¡áááºážá¡ááŒá
ẠID aws_iam_user ááẠá¡áá¯á¶ážááŒá¯áá°á¡ááẠ(á¥ááá¬á yevgeniy.brikman) ááŒá
áºááŒá®áž á¡áááºážá¡ááŒá
ẠID aws_instance ááẠEC2 áá¬áᬠID (i-190e22e5 áá²á·ááá¯á·) ááá¯ááŒáá«á
áá¯á·á á¡áááºážá¡ááŒá
áºáá
áºáá¯á¡á¬áž áááºááœááºážáá¯á¶á¡á¬áž áááºážáá
á¬áá»ááºááŸá¬á¡á±á¬ááºááŒá±ááŸá á
á¬ááœááºá
á¬áááºážáá»á¬ážááœáẠááœáŸááºááŒáááºáááºá
á¡á±á¬ááºááœáẠáááºá¡áááºáž 2 ááŸá IAM á¡áá¯á¶ážááŒá¯áá°ááŸáá·áºá¡áá° áááºá Terraform ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááœáẠáááºááá·áºááœááºážáá¬ážááá·áº aws_iam_user áááºážááŒá áºááᯠáááºáá°ááŒá¯áá±á¬ ááœááºážáá¯ááºá¡áááá·áºáá áºáá¯ááŒá áºááẠ(á¡ááŸááºááẠááá·áºá¡áááºááᯠyevgeniy.brikman ááŒáá·áº á¡á á¬ážááá¯ážáá±áááº)á
$ terraform import aws_iam_user.existing_user yevgeniy.brikman
Terraform ááẠáááºá IAM á¡áá¯á¶ážááŒá¯áá°ááᯠááŸá¬ááẠAWS API ááᯠáá±á«áºááŒá®áž áááºážááŸáá·áº áááºá Terraform ááœá²á·á ááºážááŸá¯á áá áºááœáẠaws_iam_user.existing_user áááºážááŒá áºááŒá¬ážááŸá ááŒááºáááºááá¯ááºáá»áááºáááºááŸá¯áá áºáá¯ááᯠáááºáá®ážáá«áááºá ááá¯á¡áá»áááºááŸá áá á¡á á®á¡á ááºá¡áááá·áºááᯠáááºáá¯ááºáá±á¬ááºááá·áºá¡áá«á Terraform ááẠIAM á¡áá¯á¶ážááŒá¯áá°ááŸáááŸáá·áºááŒá®ážááŒá áºááŒá±á¬ááºážááŸáá·áº áááºážááᯠáááºáá¶áááºáá®ážááẠááŒáá¯ážá á¬ážáááºááá¯ááºááŒá±á¬ááºáž Terraform á០ááááŸááááºááŒá áºáááºá
Terraform ááœáẠáááºááá·áºááœááºážááá¯ááá·áº á¡áááºážá¡ááŒá áºáá»á¬ážá áœá¬ááŸááá±ááŒá®ááá¯áá»áŸááºá áá¯ááºááᯠááá¯ááºááá¯ááºáá±ážááŒá®áž áá áºáá¯áá»ááºážá á®ááᯠáá áºááŒáááºá á® áááºááœááºážáá¬ááœáẠá¡áááºá¡áá²ááŒá áºááá¯ááºáááºááᯠáááááŒá¯ááá·áºáááºá ááá¯á·ááŒá±á¬áá·áº Terraforming (http://terraforming.dtan4.net/) áá²á·ááá¯á· áááºá AWS á¡áá±á¬áá·áºá០áá¯ááºááŸáá·áº ááŒááºáááºáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠáááºááœááºážááá¯ááºááá·áº áááááá¬áá áºáá¯ááᯠááŸá¬ááœá±ááá»áá¯ážáááºáá«áááºá
ááŒááºáááºááŒá¯ááŒááºááŒááºážááẠáááºážá áá»áá¯á·ááœááºážáá»ááºáá»á¬áž ááŸáááá¯ááºáááºá
ááŒááºáááºááŒá¯ááŒááºááŒááºážá ááŒááºáá¡ááŒá¯á¡áá°ááᯠáááŒá±á¬ááºážáá²áá² áá¬ážáá²á·á ááºááœáẠáááºááẠcode áá¡ááœááºážááá¯ááºážáááºáá±á¬ááºáá¯á¶á¡á¬áž ááŒá±á¬ááºážáá²ááá·áº áááá¯ááááºáá±ážáá¬ážááŒááºážááœáẠáá¯ááºááá¯ážáá¯ááºá ááºáá áºáá¯ááŒá áºáááºá áááºážááẠáá¯ááºááᯠááá¯ááá¯ááŸááºážáááºážá á±áááºá áááºáááºááŒá®áž ááááºážááááºážáááœááºáá°á á±áááºááŒá áºáááºá ááŒááºáááºááŒá¯ááŒááºááŒááºážááẠáááŸááááŒá áºááá¯á¡ááºáá±á¬ áááºážááá¬áá áºáá¯ááŒá áºááŒá®áž áá¯á¶ááŸááºá¡áá¯á¶ážááŒá¯ááá·áºáááºá Terraform ááá¯á·ááá¯áẠá¡ááŒá¬ážáá±á¬ IaC tool áá áºáá¯áá¯ááŸáá·áº áááºáááºáá¬áá±á¬á¡áá«á áááºááẠáá¯ááºá¡ááá¯ááºážá¡á á "ááŒááºáá¡ááŒá¯á¡áá°" á ááá¯ááá¯áááºážááᯠá¡ááœááºááááá¬ážááááºá ááá¯ááºáá«á ááá»áŸá±á¬áºááá·áºáá¬ážáá±á¬ ááŒá¿áá¬áá»á¬áž áá±á«áºáá±á«ááºáá¬áááºááŒá áºáááºá
á¥ááá¬á¡á¬ážááŒáá·áºá á¡áá»á¬ážá¡á¬ážááŒáá·áº refactoring á¡áá»áá¯ážá¡á á¬ážááẠááá¯ááá¯áá¬ážáááºááá¯ááºáá±á¬ ááááºážááŸááºáá»á¬áž ááá¯á·ááá¯áẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá á¡áááºáá»á¬ážááᯠá¡á á¬ážááá¯ážááŒááºážááŒá áºáááºá IDE á¡áá»á¬ážá¡ááŒá¬ážááœáẠááŒááºáááºááŒá¯ááŒááºááŒááºážá¡ááœáẠbuilt-in áá¶á·ááá¯ážááŸá¯ááŸáááŒá®áž ááá±á¬áá»ááºáá áºáá»áŸá±á¬ááºáá¯á¶ážááœáẠááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ ááááºážááŸááºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠá¡áááºááŒá±á¬ááºážááá¯ááºáá«áááºá áá±áá°áá»á¡á¬ážááŒáá·áº áááºááœááºáá¬ážáá±á¬ áááá¯ááááºážáááºážáá¬áá¬á áá¬ážáá»á¬ážááœááºá áááºážááẠáááºáá ááºážá á¬ážááá¯ááºáá±á¬ á¡áá±ážá¡ááœá²áá¯ááºáááºážá ááºáá áºáá¯ááŒá áºáá±á¬áºáááºáž Terraform ááœáẠáááºááẠáááºážááᯠá¡ááœááºááááá¬ážááááºááŒá áºááŒá®áž ááá¯á·ááá¯ááºáá«á áááºááẠááŒááºáá±á¬ááºááŸá¯áá»á¬ážááŒá¯á¶ááœá±á·áááá¯ááºáááºá
á¥ááá¬á¡á¬ážááŒáá·áºá webserver-cluster module ááœáẠinput variable cluster_name ááŸááááº-
variable "cluster_name" { description = "The name to use for all the cluster resources" type = string }
foo áá¯áá±á«áºáá±á¬ ááá¯ááºáááá¯áá¬ážáá áºááᯠá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠáááºááẠဠmodule ááᯠá áááºá¡áá¯á¶ážááŒá¯áááºáᯠááŒááºáá±á¬ááºááŒáá·áºáá«á áá±á¬ááºááá¯ááºážááœááºá áááºááẠáááºááááºáá±á¬ááºááŸá¯ááᯠáá¬ážá¡ááŒá Ạá¡áááºááŒá±á¬ááºážááá¯áá«áááºá á€ááŒá±á¬ááºážáá²ááŸá¯ááẠá¡áá±ážá¡ááœá²áᯠáááºááá±á¬áºáááºáž áááºááœá±á·ááœáẠáááºážááẠáááºáá±á¬ááºááŸá¯ááᯠá¡ááŸá±á¬áá·áºá¡ááŸááºááŒá áºá á±ááá¯ááºáááºá
á¡ááŸááºááŸá¬ webserver-cluster module ááẠáá¯á¶ááŒá¯á¶áá±ážá¡á¯ááºá á¯ááŸá áºá á¯ááŸáá·áº ALB á name parameter á¡áá«á¡ááẠá¡áááºážá¡ááŒá áºá¡áá»á¬ážá¡ááŒá¬ážááœáẠcluster_name variable ááá¯á¡áá¯á¶ážááŒá¯áááº-
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 ááá¯ááŒá±á¬ááºážáá²ááŒááºážáááºááŒá áºáááºá ááá°áá¬á¡ááŒá Ạwebserver-cluster module ááŸá aws_security_group á¡áááºážá¡ááŒá áºááᯠáá°ááŒáá«á áá¯á·á
resource "aws_security_group" "instance" { # (...) }
á€áááºážááŒá áºá ááœá²ááŒá¬ážáááºááŸááºááŒááºážááᯠinstance áá¯áá±á«áºáááºá ááŒááºáááºááŒá¯ááŒááºááŒááºážááœáẠáááºááẠáááºážá¡á¬áž ááá¯ááá¯áá¬ážáááºááá¯ááºáá±á¬ (ááá·áºáááºááŒááºáá°ááá»ááº) á¡ááẠcluster_instance ááá¯á· ááŒá±á¬ááºážáá²ááẠáá¯á¶ážááŒááºáá²á·áááºááᯠá áááºáá°ážááŒáá·áºáá«-
resource "aws_security_group" "cluster_instance" { # (...) }
á¡áá¯á¶ážááŸá¬ áá¬ááŒá áºááá²á ááŸááºáááº- á¡ááŸá±á¬áá·áºá¡ááŸááºáá áºáá¯á
Terraform ááẠá¡áááºážá¡ááŒá ẠID áá áºáá¯á á®ááᯠcloud áááºáá±á¬ááºááŸá¯áá±ážáá° ID ááŸáá·áº áááºá ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá iam_user ááẠAWS IAM á¡áá¯á¶ážááŒá¯áá° ID ááŸáá·áº áááºá ááºáá±ááŒá®áž aws_instance ááẠAWS EC2 áá¬áᬠID ááŸáá·áº áááºá ááºáá±áááºá á¡áááºá áááºááẠá¡áááºážá¡ááŒá ẠID (instance á០cluster_instance ááá¯á·á aws_security_group áá²á·ááá¯á·) Terraform ááá¯á· ááŒá±á¬ááºážáá«áá áááºááẠá¡áááºážá¡ááŒá áºáá±á¬ááºážááᯠáá»ááºááŒá®áž á¡áá áºáá áºáᯠáááºááá·áºááá¯ááºááŒááºážáá²á·ááá¯á· áá±á«áºáá¬áááá·áºáááºá á€á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠáááºá¡áá¯á¶ážááŒá¯áá«áá Terraform ááẠáá¯á¶ááŒá¯á¶áá±ážá¡ááœá²á·áá±á¬ááºážááᯠáá»ááºááŒá®áž á¡áá áºáá áºáá¯áááºáá®ážáááºááŒá áºááŒá®ážá áááºááá¬áá¬áá»á¬ážááẠááœááºáááºá¡ááœá¬ážá¡áá¬ááᯠá áááºáááºáá»áá±áá»áááºááœáẠTerraform á០áá¯ááºáá±á¬ááºáá±ážáááºááŒá áºáááºá
á€áááºááŸá¬ á€ááœá±ážááœá±ážááŸá¯á០áááºáá°ááá·áºááá·áº á¡ááááááºáááºážá á¬áá±ážáá¯ááŒá áºáááºá
- á¡á á®á¡á ááºá¡áááá·áºááᯠá¡ááŒá²áá¯á¶ážáá«á á€á¡áá¬áá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá±á¬áºáá¯ááºááŒáááá¯ááºáááºá áááºážáááœááºááŸáááŸá¯ááᯠááá¯áá áá¯ááºááŒááºáááºáá¯á¶ážáááºááŒá®áž Terraform ááẠááá»ááºááá·áºáá±á¬ á¡áááºážá¡ááŒá áºáá»á¬ážááᯠáá»ááºáá áºááá·áº á¡ááŒá±á¡áá±áá»á¬ážááᯠá¡á¬áá¯á¶á áá¯ááºáá«á
- ááá»ááºááẠáááºáá®ážáá«á áááºážááŒá áºáá áºáá¯á¡á¬áž á¡á á¬ážááá¯ážááá¯áá«á áá°áááºážááá¯ááá»ááºáá® á¡á á¬ážááá¯ážáá áºáá¯áááºáá®ážááẠááá¯á¡ááºáááºááá¯áááºááᯠáá±áá»á¬á ááºážá á¬ážáá«á á¡ááŒá±á áá¯ááºáááºááá¯ááẠcreate_before_destroy á áá°áá®ááá¯ááºáá«áááºá á¡ááá·áºááŸá áºááá·áºááᯠáá¯ááºáá±á¬ááºááŒááºážááŒáá·áº áá°áá®áá±á¬ááááºááᯠááá¯ááºááá¯ááºáááŸáááá¯ááºáááº- ááááŠážá áœá¬ áááºážááŒá áºá¡áá áºáá áºáá¯ááᯠááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááœáẠááá·áºááœááºážááŒá®áž áááºááá¯ááºááá·áºá¡áááá·áºááᯠáá¯ááºáá±á¬ááºáá¬á ááá¯á·áá±á¬áẠá¡áááºážá¡ááŒá áºáá±á¬ááºážááᯠááœá²á·á ááºážááŸá¯á áá áºá០áááºááŸá¬ážááŒá®áž áá»áŸá±á¬ááºáá¬ážááá·áºá¡áááá·áºááᯠáááºáá¶á¡áá¯á¶ážááŒá¯áá«á
- ááœá²ááŒá¬ážáááºááŸááºááŸá¯áá»á¬ážááᯠááŒá±á¬ááºážáá²ááŒááºážááẠá¡ááŒá±á¡áá±ááᯠááŒá±á¬ááºážáá²ááẠááá¯á¡ááºáááºá áááºážááŒá
áºáá
áºáá¯ááŸáá·áºáááºá
ááºáá±áá±á¬ ID ááá¯ááŒá±á¬ááºážáá²ááá¯áá«á (á¥ááá¬á aws_security_group á¡á¬áž instance á០cluster_instance ááá¯á·) á¡áááºááŒá±á¬ááºážááá¯áá«áá áááºážááá¬ážááŸááºážá¡áá
áºááá¯áááºáá®ážááá¯áá«á Terraform ááŒááºáááºááá¯ááºááᯠá¡ááºááááºáá¯ááºááá«áááºá áá«ááᯠáááºáá±á¬á·á០ááá¯ááºááá¯ááºááá¯ááºáá«áá²á· - á¡á²áá®á¡á
á¬áž terraform state command ááá¯áá¯á¶ážáá«á identifier áá»á¬ážááᯠá¡áááºááŒá±á¬ááºážááá·áºá¡áá«á á¡á±á¬ááºáá« syntax áá«ááŸááá±á¬ terraform state mv command ááᯠrun ááá«áááºá
terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>
ORIGINAL_REFERENCE ááẠáááºážá áááºááŸááá¯á¶á á¶ááŸá á¡áááºážá¡ááŒá áºááᯠáááºááœáŸááºážááá·áº á áá¬ážáááºááŒá áºááŒá®áž NEW_REFERENCE ááẠáááºážááᯠáááºááœáŸá±á·ááá¯ááá·áº áá±áá¬ááŒá áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá aws_security_group á¡ááœá²á·á¡á¬áž instance á០cluster_instance ááá¯á· á¡áááºááŒá±á¬ááºážááá·áºá¡áá«á áááºááẠá¡á±á¬ááºáá« command ááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááº-
$ terraform state mv aws_security_group.instance aws_security_group.cluster_instance
áááºážááẠááááºá aws_security_group.instance ááŸáá·áº ááááºá áááºá ááºáá²á·ááá·áº á¡ááŒá±á¡áá±ááẠaws_security_group.cluster_instance ááŸáá·áº áááºá ááºááá·áºáááºáᯠTerraform á¡á¬áž ááŒá±á¬ááŒáááºá ဠcommand terraform á¡á á®á¡á á¥áºááᯠá¡áááºááŒá±á¬ááºážááŒá®áž áá¯ááºáá±á¬ááºááŒá®ážáá±á¬ááºááœáẠáááºááá·áºááŒá±á¬ááºážáá²ááŸá¯á០áááŒáá«áá áááºááẠá¡áá¬á¡á¬ážáá¯á¶ážááᯠááŸááºáááºá áœá¬ áá¯ááºáá±á¬ááºáá²á·áááºá
- á¡áá»áá¯á·áááºáááºáá»á¬ážááᯠááŒá±á¬ááºážáá²ááááá«á á¡áááºážá¡ááŒá áºáá»á¬ážá áœá¬á ááá·áºáááºáá»ááºáá»á¬ážááẠááŒá±á¬ááºážáá²ááááá«á áááºážááá¯á·ááᯠááŒá±á¬ááºážáá²ááẠááŒáá¯ážá á¬ážáá«á Terraform ááẠá¡áááºážá¡ááŒá áºáá±á¬ááºážááᯠáá»ááºááŒá®áž áááºážááá±áá¬ááœáẠá¡áá áºáá áºáᯠáááºáá®ážáááºááŒá áºáááºá áááºážááŒá áºá á¬áá»ááºááŸá¬áá áºáá¯á á®ááẠá¡áá»á¬ážá¡á¬ážááŒáá·áº áááºááŸááºáááºáááºáá áºáá¯ááᯠáááºááŒá±á¬ááºážáá²áá±á¬á¡áá« áá¬ááŒá áºááœá¬ážáááºááᯠááœáŸááºááŒáá±ážáááºááŒá áºáá±á¬ááŒá±á¬áá·áº á á¬ááœááºá á¬áááºážáá»á¬ážááᯠáá±áá»á¬á á áºáá±ážáá«á á¡á á®á¡á ááºá¡áááá·áºááᯠá¡ááŒá²áááºážá¡áá¯á¶ážááŒá¯ááŒá®áž create_before_destroy áááºážáá»á°áá¬ááᯠá¡áá¯á¶ážááŒá¯ááẠá ááºážá á¬ážáá«á
Deferred áá®ááœááºááŸá¯áááº... ááœáŸá±á·ááá¯ááºážááŒááºážááŸáá·áº áááááºáááºážááŒá áºáááºá
AWS áá²á·ááá¯á· á¡áá»áá¯á·áá±á¬ cloud áááºáá±á¬ááºááŸá¯áá±ážáá°áá»á¬ážá API áá»á¬ážááẠáá áºááŒáá¯ááºáááºáááºáž ááŸá±á¬áá·áºááŸá±ážááŒáá·áºááŒá¬ááŸá¯ááŸááááºá Asynchrony ááá¯áááºááŸá¬ á¡ááºáá¬áá±á·á áºááẠáá±á¬ááºážááá¯áá¬ážáá±á¬áá¯ááºáá±á¬ááºáá»ááºááᯠááŒá®ážááŒá±á¬ááºá¡á±á¬ááºáá á±á¬áá·áºáá² áá¯á¶á·ááŒááºááŸá¯ááᯠáá»ááºáá»ááºážááŒááºáá±ážááá¯ááºáááºáᯠááá¯ááá¯áááºá ááŸá±á¬áá·áºááŸá±ážáá±áá±á¬ áá áºááááºáááºážááŒá áºáá±á¬ á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááẠá áá áºáá áºáá¯áá¯á¶ážááœáẠááŒáá·áºááœá¬ážááẠá¡áá»áááºáá°áááá¯ááºáááºá ááá¯ááá¯á·ááŒá áºáá±áá»áááºááœáẠáááºááá¯á¶á·ááŒááºááŸá¯áá»á¬ážááẠááœá²ááœá²áá±ááŒá®áž áááºááá·áºáá±áá¬áááºážááŒá áºáá¯á¶áá°ááẠáááºá API áá±á«áºááá¯ááŸá¯áá»á¬ážááᯠáá¯á¶á·ááŒááºááá·áºá¡áá±á«áº áá°áááºáá«áááºá
á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠEC2 áá¬áá¬áá áºáá¯áááºáá®ážááẠAWS ááá¯á· API áá±á«áºááá¯ááŸá¯ááᯠááŒá¯áá¯ááºáááºáᯠááŒááºáá±á¬ááºááŒáá·áºáá«á 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
áá áºáááºážááá¯ááá±á¬áº áááºááẠáááºážááŒá áºáá áºáᯠ(subnet áá áºáá¯áá²á·ááá¯á·) áááºáá®ážááŒá®áž áááºážááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºá¡áá»áá¯á· (á¡áá áºáááºáá®ážáá¬ážáá±á¬ subnet á ID áá²á·ááá¯á·) ááá¯ááá°áááºááŒáá¯ážá á¬ážááŒá®áž Terraform ááẠáááºážááᯠááŸá¬áááœá±á·áá«á á€áá»áá¯á·ááœááºážáá»ááºá¡áá»á¬ážá ᯠ(6813 á¡áá«á¡áááº) ááᯠááŒááºáááºááŒá®ážáá±á¬áºáááºážá á¡áá°ážáááŒáá·áº Terraform ááẠá¡áááºážá¡ááŒá áºá¡áá»áá¯ážá¡á á¬ážá¡áá áºá¡ááœáẠáá¶á·ááá¯ážááŸá¯ááá·áºááá·áºá¡áá«ááœáẠáááºážááá¯á·ááẠá¡áá«á¡á¬ážáá»á±á¬áºá áœá¬ ááŒááºáá±á¬ááºáá²ááŒá áºáááºá áá«á á áááºá¡ááŸá±á¬ááºá¡ááŸááºááŒá áºáá±áá²á· ááá á¹á áá±á¬áºáá±á¬áºáá»á¬ážáá»á¬ážááŸá¬ áá¬á¡áá¹ááá¬ááºá០áááŒá áºá á±áá«áá°ážá ááẠterraform ááá¯áááºáá¶á¡áá¯á¶ážááŒá¯áá±á¬á¡áá«á á¡áá¬á¡á¬ážáá¯á¶ážáááºá¡áá¯ááºáá¯ááºááá·áºáááºá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áºá€á¡áá»áááºááœááºá¡áá»ááºá¡áááºáá»á¬ážáááºá áá áºáá áºáá¯áá¯á¶ážáá»á¶á·ááŸá¶á·ááœá¬ážáááá·áºáááºá
á€áá±á¬ááºáá¯ááºáá»ááºááᯠEvgeniy Brikman á á á¬á¡á¯ááºá០áááºááŒáá¬ážáá«áááºá
"Terraform- áá¯ááºá¡ááá·áºááŸá á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠ" .
source: www.habr.com