ืžืœื›ื•ื“ื•ืช Terraform

ืžืœื›ื•ื“ื•ืช Terraform
ื‘ื•ืื• ื ื“ื’ื™ืฉ ื›ืžื” ืžืœื›ื•ื“ื•ืช, ื›ื•ืœืœ ืืœื• ื”ืงืฉื•ืจื•ืช ืœืœื•ืœืื•ืช, ื”ืฆื”ืจื•ืช ื•ื˜ื›ื ื™ืงื•ืช ืคืจื™ืกื”, ื›ืžื• ื’ื ื‘ืขื™ื•ืช ื›ืœืœื™ื•ืช ื™ื•ืชืจ ื”ืžืฉืคื™ืขื•ืช ืขืœ Terraform ื‘ืื•ืคืŸ ื›ืœืœื™:

  • ืœืคืจืžื˜ืจื™ื ืกืคื™ืจื” ื•ืขื‘ื•ืจ_ื›ืœ ื™ืฉ ืžื’ื‘ืœื•ืช;
  • ื”ื’ื‘ืœืช ืืคืก ืคืจื™ืกื•ืช ื–ืžืŸ ื”ืฉื‘ืชื”;
  • ืืคื™ืœื• ืชื•ื›ื ื™ืช ื˜ื•ื‘ื” ื™ื›ื•ืœื” ืœื”ื™ื›ืฉืœ;
  • ืœ-refactoring ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืžืœื›ื•ื“ื•ืช;
  • ืงื•ื”ืจื ื˜ื™ื•ืช ื ื“ื—ื™ืช ืขื•ืœื” ื‘ืงื ื” ืื—ื“ ืขื ื“ื—ื™ื™ื”.

ืœืคืจืžื˜ืจื™ื ืกืคื™ืจื” ื•ืขื‘ื•ืจ_ื›ืœ ื™ืฉ ืžื’ื‘ืœื•ืช

ื”ื“ื•ื’ืžืื•ืช ื‘ืคืจืง ื–ื” ืขื•ืฉื•ืช ืฉื™ืžื•ืฉ ื ืจื—ื‘ ื‘ืคืจืžื˜ืจ ื”-count ื•ื‘ื‘ื™ื˜ื•ื™ for_each ื‘ืœื•ืœืื•ืช ื•ื‘ืœื•ื’ื™ืงื” ืžื•ืชื ื™ืช. ื”ื ืžืชืคืงื“ื™ื ื”ื™ื˜ื‘, ืื‘ืœ ื™ืฉ ืœื”ื ืฉืชื™ ืžื’ื‘ืœื•ืช ื—ืฉื•ื‘ื•ืช ืฉืืชื” ืฆืจื™ืš ืœื”ื™ื•ืช ืžื•ื“ืข ืืœื™ื”ืŸ.

  • Count ื•-for_each ืื™ื ื ื™ื›ื•ืœื™ื ืœื”ืชื™ื™ื—ืก ืœืžืฉืชื ื™ ืคืœื˜ ื›ืœืฉื”ื.
  • ืœื ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘-count ื•ื‘-for_each ื‘ืชืฆื•ืจืช ืžื•ื“ื•ืœ.

count ื•-for_each ืื™ื ื ื™ื›ื•ืœื™ื ืœื”ืชื™ื™ื—ืก ืœืžืฉืชื ื™ ืคืœื˜ ืฉืœ ืžืฉืื‘ื™ื

ืชืืจ ืœืขืฆืžืš ืฉืืชื” ืฆืจื™ืš ืœืคืจื•ืก ื›ืžื” ืฉืจืชื™ EC2 ื•ืžืฉื•ื ืžื” ืืชื” ืœื ืจื•ืฆื” ืœื”ืฉืชืžืฉ ื‘-ASG. ื”ืงื•ื“ ืฉืœืš ื™ื›ื•ืœ ืœื”ื™ื•ืช ื›ื–ื”:

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

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœื™ื”ื ืื—ื“ ืื—ื“.

ืžื›ื™ื•ื•ืŸ ืฉืคืจืžื˜ืจ ื”-count ืžื•ื’ื“ืจ ืœืขืจืš ืกื˜ื˜ื™, ืงื•ื“ ื–ื” ื™ืขื‘ื•ื“ ืœืœื ื‘ืขื™ื•ืช: ื›ืืฉืจ ืืชื” ืžืคืขื™ืœ ืืช ื”ืคืงื•ื“ื” apply, ื”ื•ื ื™ืฆื•ืจ ืฉืœื•ืฉื” ืฉืจืชื™ EC2. ืื‘ืœ ืžื” ืื ืชืจืฆื” ืœืคืจื•ืก ืฉืจืช ืื—ื“ ื‘ื›ืœ ืื–ื•ืจ ื–ืžื™ื ื•ืช (AZ) ื‘ืื–ื•ืจ ื”-AWS ื”ื ื•ื›ื—ื™ ืฉืœืš? ืืชื” ื™ื›ื•ืœ ืœื’ืจื•ื ืœืงื•ื“ ืฉืœืš ืœื˜ืขื•ืŸ ืจืฉื™ืžื” ืฉืœ ืื–ื•ืจื™ื ืžืžืงื•ืจ ื”ื ืชื•ื ื™ื 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. ื‘ื•ื ื ืจืื” ืžื” ืงื•ืจื” ืื ื ื ืกื” ืœื”ืฉืชืžืฉ ื‘ืคืœื˜ ืฉืœ ืžืฉืื‘ ื–ื” ื‘ืคืจืžื˜ืจ ื”-count ืฉืœ ื”ืžืฉืื‘ aws_instance:

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 ื“ื•ืจืฉ ืฉืกืคื™ืจื” ื•ืขื‘ื•ืจ_ื›ืœ ื™ื—ื•ืฉื‘ื• ื‘ืžื”ืœืš ืฉืœื‘ ื”ืชื›ื ื•ืŸ, ืœืคื ื™ ื™ืฆื™ืจืช ืื• ืฉื™ื ื•ื™ ืฉืœ ืžืฉืื‘ื™ื ื›ืœืฉื”ื. ื”ืžืฉืžืขื•ืช ื”ื™ื ืฉ-count and for_each ื™ื›ื•ืœื™ื ืœื”ืชื™ื™ื—ืก ืœืžื™ืœื•ืœื™, ืžืฉืชื ื™ื, ืžืงื•ืจื•ืช ื ืชื•ื ื™ื ื•ืืคื™ืœื• ืจืฉื™ืžื•ืช ืžืฉืื‘ื™ื (ื›ืœ ืขื•ื“ ื ื™ืชืŸ ืœืงื‘ื•ืข ืืช ืื•ืจื›ื ื‘ื–ืžืŸ ื”ืชื–ืžื•ืŸ), ืืš ืœื ืœืžืฉืชื ื™ ืคืœื˜ ืฉืœ ืžืฉืื‘ื™ื ืžื—ื•ืฉื‘ื™ื.

ืœื ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘-count ื•ื‘-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. ื–ื” ืขืฉื•ื™ ืœื”ื™ืจืื•ืช ื›ืžื• ืงื•ื“ ืกื‘ื™ืจ, ืืš ืชืงื‘ืœ ืืช ื”ืฉื’ื™ืื” ื”ื–ื• ื‘ืขืช ื”ืคืขืœืช ืชื•ื›ื ื™ืช 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, ื”ืฉื™ืžื•ืฉ ื‘-count ืื• for_each ื‘ืžืฉืื‘ ืžื•ื“ื•ืœ ืื™ื ื• ื ืชืžืš. ืขืœ ืคื™ ื”ืขืจื•ืช ื”ืฉื—ืจื•ืจ ืฉืœ Terraform 0.12 (http://bit.ly/3257bv4), HashiCorp ืžืชื›ื ื ืช ืœื”ื•ืกื™ืฃ ืืช ื”ื™ื›ื•ืœืช ื”ื–ื• ื‘ืขืชื™ื“, ื›ืš ืฉืชืœื•ื™ ืžืชื™ ืืชื” ืงื•ืจื ืืช ื”ืกืคืจ ื”ื–ื”, ื™ื™ืชื›ืŸ ืฉื”ื•ื ื›ื‘ืจ ื–ืžื™ืŸ. ื›ื“ื™ ืœื‘ืจืจ ื‘ื•ื•ื“ืื•ืช, ืงืจื ืืช ื™ื•ืžืŸ ื”ืฉื™ื ื•ื™ื™ื ืฉืœ Terraform ื›ืืŸ.

ืžื’ื‘ืœื•ืช ืฉืœ ืืคืก ืคืจื™ืกื•ืช ื–ืžืŸ ื”ืฉื‘ืชื”

ืฉื™ืžื•ืฉ ื‘ื‘ืœื•ืง create_before_destroy ื‘ืฉื™ืœื•ื‘ ืขื ASG ื”ื•ื ืคืชืจื•ืŸ ืžืฆื•ื™ืŸ ืœื™ืฆื™ืจืช ืคืจื™ืกื•ืช ืืคืก ื–ืžืŸ ื”ืฉื‘ืชื”, ืœืžืขื˜ ืื–ื”ืจื” ืื—ืช: ื›ืœืœื™ ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ืื™ื ื ื ืชืžื›ื™ื. ืื• ืœื™ืชืจ ื“ื™ื•ืง, ื–ื” ืžืืคืก ืืช ื’ื•ื“ืœ ื”-ASG ื‘ื—ื–ืจื” ืœ-min_size ื‘ื›ืœ ืคืจื™ืกื”, ืžื” ืฉื™ื›ื•ืœ ืœื”ื™ื•ืช ื‘ืขื™ื” ืื ื”ื™ื™ืช ืžืฉืชืžืฉ ื‘ื›ืœืœื™ ืงื ื” ืžื™ื“ื” ืื•ื˜ื•ืžื˜ื™ ื›ื“ื™ ืœื”ื’ื“ื™ืœ ืืช ืžืกืคืจ ื”ืฉืจืชื™ื ื”ืคื•ืขืœื™ื.

ืœื“ื•ื’ืžื”, ืžื•ื“ื•ืœ webserver-cluster ืžื›ื™ืœ ื–ื•ื’ ืžืฉืื‘ื™ aws_autoscaling_schedule, ืืฉืจ ื‘ืฉืขื” 9 ื‘ื‘ื•ืงืจ ืžื’ื“ื™ืœ ืืช ืžืกืคืจ ื”ืฉืจืชื™ื ื‘ืืฉื›ื•ืœ ืžืฉื ื™ื™ื ืœืขืฉืจื”. ืื ืชืคืจื•ืก, ืœืžืฉืœ, ื‘ืฉืขื” 11:9, ื”-ASG ื”ื—ื“ืฉ ื™ืืชื—ืœ ืขื ืฉื ื™ ืฉืจืชื™ื ื‘ืœื‘ื“ ื•ืœื ื‘ืขืฉืจื” ื•ื™ื™ืฉืืจ ื›ืš ืขื“ XNUMX ื‘ื‘ื•ืงืจ ืœืžื—ืจืช.

ื ื™ืชืŸ ืœืขืงื•ืฃ ืžื’ื‘ืœื” ื–ื• ื‘ื›ืžื” ื“ืจื›ื™ื.

  • ืฉื ื” ืืช ืคืจืžื˜ืจ ื”ื”ื™ืฉื ื•ืช ื‘-aws_autoscaling_schedule ืž-0 9 * * * ("ื”ืคืขืœ ื‘-9 ื‘ื‘ื•ืงืจ") ืœืžืฉื”ื• ื›ืžื• 0-59 9-17 * * * ("ืจื•ืฅ ื›ืœ ื“ืงื” ืž-9 ื‘ื‘ื•ืงืจ ืขื“ 5 ื‘ืขืจื‘"). ืื ืœ-ASG ื›ื‘ืจ ื™ืฉ ืขืฉืจื” ืฉืจืชื™ื, ื”ืคืขืœื” ืฉืœ ื›ืœืœ ืงื ื” ื”ืžื™ื“ื” ื”ืื•ื˜ื•ืžื˜ื™ ื”ื–ื” ืฉื•ื‘ ืœื ืชืฉื ื” ื›ืœื•ื, ื•ื–ื” ืžื” ืฉืื ื—ื ื• ืจื•ืฆื™ื. ืื‘ืœ ืื ื”-ASG ื ืคืจืก ืจืง ืœืื—ืจื•ื ื”, ื›ืœืœ ื–ื” ื™ื‘ื˜ื™ื— ืฉืชื•ืš ื“ืงื” ืžืงืกื™ืžื•ื ืžืกืคืจ ื”ืฉืจืชื™ื ืฉืœื• ื™ื’ื™ืข ืœืขืฉืจื”. ื–ื• ืœื ื’ื™ืฉื” ืืœื’ื ื˜ื™ืช ืœื’ืžืจื™, ื•ื’ื ืงืคื™ืฆื•ืช ื’ื“ื•ืœื•ืช ืžืขืฉืจื” ืœืฉื ื™ ืฉืจืชื™ื ื•ื‘ื—ื–ืจื” ืขืœื•ืœื•ืช ืœื’ืจื•ื ืœื‘ืขื™ื•ืช ืœืžืฉืชืžืฉื™ื.
  • ืฆื•ืจ ืกืงืจื™ืคื˜ ืžื•ืชืื ืื™ืฉื™ืช ื”ืžืฉืชืžืฉ ื‘-API ืฉืœ AWS ื›ื“ื™ ืœืงื‘ื•ืข ืืช ืžืกืคืจ ื”ืฉืจืชื™ื ื”ืคืขื™ืœื™ื ื‘-ASG, ืงืจื ืœื• ื‘ืืžืฆืขื•ืช ืžืงื•ืจ ื ืชื•ื ื™ื ื—ื™ืฆื•ื ื™ (ืจืื” "ืžืงื•ืจ ื ืชื•ื ื™ื ื—ื™ืฆื•ื ื™" ื‘ืขืžื•ื“ 249), ื•ื”ื’ื“ืจ ืืช ื”ืคืจืžื˜ืจ wish_capacity ืฉืœ ื”-ASG ืœืขืจืš ื”ืžื•ื—ื–ืจ ืขืœ ื™ื“ื™ ื”ืชืกืจื™ื˜. ื‘ื“ืจืš ื–ื•, ื›ืœ ืžื•ืคืข ASG ื—ื“ืฉ ื™ืคืขืœ ืชืžื™ื“ ื‘ืื•ืชื” ืงื™ื‘ื•ืœืช ื›ืžื• ืงื•ื“ Terraform ื”ืงื™ื™ื ื•ืžืงืฉื” ืขืœ ื”ืชื—ื–ื•ืงื”.

ื›ืžื•ื‘ืŸ, ื‘ืื•ืคืŸ ืื™ื“ื™ืืœื™ ืชื”ื™ื” ืœ- Terraform ืชืžื™ื›ื” ืžื•ื‘ื ื™ืช ืœืคืจื™ืกื•ืช ืืคืก ื–ืžืŸ ื”ืฉื‘ืชื”, ืื‘ืœ ื ื›ื•ืŸ ืœืžืื™ 2019, ืœืฆื•ื•ืช HashiCorp ืœื ื”ื™ื• ืชื•ื›ื ื™ื•ืช ืœื”ื•ืกื™ืฃ ืืช ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ื–ื• (ืคืจื˜ื™ื - ื›ืืŸ).

ื™ื™ืชื›ืŸ ืฉื”ืชื•ื›ื ื™ืช ื”ื ื›ื•ื ื” ืชื™ื•ืฉื ืœืœื ื”ืฆืœื—ื”

ืœืคืขืžื™ื ืคืงื•ื“ืช ื”ืชื•ื›ื ื™ืช ืžื™ื™ืฆืจืช ืชื•ื›ื ื™ืช ืคืจื™ืกื” ื ื›ื•ื ื” ืœื—ืœื•ื˜ื™ืŸ, ืืš ื”ืคืงื•ื“ื” ื”ื—ืœ ืžื—ื–ื™ืจื” ืฉื’ื™ืื”. ื ืกื”, ืœืžืฉืœ, ืœื”ื•ืกื™ืฃ ืืช ื”ืžืฉืื‘ aws_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.

ืื ืชืคืขื™ืœ ืืช ื”ืคืงื•ื“ื” applicer ืชืงื‘ืœ ืืช ื”ืฉื’ื™ืื” ื”ื‘ืื”:

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

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

ื”ื‘ืขื™ื”, ื›ืžื•ื‘ืŸ, ื”ื™ื ืฉืžืฉืชืžืฉ IAM ื‘ืฉื ื–ื” ื›ื‘ืจ ืงื™ื™ื. ื•ื–ื” ื™ื›ื•ืœ ืœืงืจื•ืช ืœื ืจืง ืœืžืฉืชืžืฉื™ IAM, ืืœื ื›ืžืขื˜ ืœื›ืœ ืžืฉืื‘. ื™ื™ืชื›ืŸ ืฉืžื™ืฉื”ื• ื™ืฆืจ ืืช ื”ืžืฉืื‘ ื”ื–ื” ื‘ืื•ืคืŸ ื™ื“ื ื™ ืื• ื‘ืืžืฆืขื•ืช ืฉื•ืจืช ื”ืคืงื•ื“ื”, ืื‘ืœ ื›ืš ืื• ื›ืš, ื”ืชืืžืช ืžื–ื”ื™ื ืžื•ื‘ื™ืœื” ืœื”ืชื ื’ืฉื•ื™ื•ืช. ื™ืฉื ืŸ ื•ืจื™ืืฆื™ื•ืช ืจื‘ื•ืช ืฉืœ ืฉื’ื™ืื” ื–ื• ืฉืœืขืชื™ื ืงืจื•ื‘ื•ืช ืชื•ืคืกื•ืช ืžืฆื˜ืจืคื™ื ื—ื“ืฉื™ื ืœ- Terraform ื‘ื”ืคืชืขื”.

ื ืงื•ื“ืช ื”ืžืคืชื— ื”ื™ื ืฉื”ืคืงื•ื“ื” ืฉืœ ืชื•ื›ื ื™ืช terraform ืœื•ืงื—ืช ื‘ื—ืฉื‘ื•ืŸ ืจืง ืืช ื”ืžืฉืื‘ื™ื ื”ืžืฆื•ื™ื ื™ื ื‘ืงื•ื‘ืฅ ื”ืžืฆื‘ ืฉืœ Terraform. ืื ืžืฉืื‘ื™ื ื ื•ืฆืจื™ื ื‘ื“ืจืš ืื—ืจืช (ืœืžืฉืœ, ื™ื“ื ื™ืช ืขืœ ื™ื“ื™ ืœื—ื™ืฆื” ื‘ืžืกื•ืฃ AWS), ื”ื ืœื ื™ื’ืžืจื• ื‘ืงื•ื‘ืฅ ื”ืžืฆื‘ ื•ืœื›ืŸ Terraform ืœื ื™ื™ืงื— ืื•ืชื ื‘ื—ืฉื‘ื•ืŸ ื‘ืขืช โ€‹โ€‹ื‘ื™ืฆื•ืข ืคืงื•ื“ืช ื”ืชื•ื›ื ื™ืช. ื›ืชื•ืฆืื” ืžื›ืš, ืชื•ื›ื ื™ืช ืฉื ืจืื™ืช ื ื›ื•ื ื” ื‘ืžื‘ื˜ ืจืืฉื•ืŸ ืชืชื‘ืจืจ ื›ืœื ืžื•ืฆืœื—ืช.

ื™ืฉ ืœืœืžื•ื“ ืžื›ืš ืฉื ื™ ืœืงื—ื™ื.

  • ืื ื›ื‘ืจ ื”ืชื—ืœืช ืœืขื‘ื•ื“ ืขื Terraform, ืืœ ืชืฉืชืžืฉ ื‘ืฉื•ื ื“ื‘ืจ ืื—ืจ. ืื ื—ืœืง ืžื”ืชืฉืชื™ืช ืฉืœืš ืžื ื•ื”ืœ ื‘ืืžืฆืขื•ืช Terraform, ืœื ืชื•ื›ืœ ืขื•ื“ ืœืฉื ื•ืช ืื•ืชื” ื‘ืื•ืคืŸ ื™ื“ื ื™. ืื—ืจืช, ืืชื” ืœื ืจืง ืžืกืชื›ืŸ ื‘ืฉื’ื™ืื•ืช ืžื•ื–ืจื•ืช ืฉืœ Terraform, ืืœื ืืชื” ื’ื ืžื‘ื˜ืœ ื”ืจื‘ื” ืžื”ื™ืชืจื•ื ื•ืช ืฉืœ IaC ืžื›ื™ื•ื•ืŸ ืฉื”ืงื•ื“ ื›ื‘ืจ ืœื ื™ื”ื•ื•ื” ื™ื™ืฆื•ื’ ืžื“ื•ื™ืง ืฉืœ ื”ืชืฉืชื™ืช ืฉืœืš.
  • ืื ื›ื‘ืจ ื™ืฉ ืœืš ืชืฉืชื™ืช ื›ืœืฉื”ื™, ื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื” ื™ื™ื‘ื•ื. ืื ืืชื” ืžืชื—ื™ืœ ืœื”ืฉืชืžืฉ ื‘- Terraform ืขื ืชืฉืชื™ืช ืงื™ื™ืžืช, ืชื•ื›ืœ ืœื”ื•ืกื™ืฃ ืื•ืชื” ืœืงื•ื‘ืฅ ื”ืžืฆื‘ ื‘ืืžืฆืขื•ืช ืคืงื•ื“ืช ื™ื™ื‘ื•ื โ€‹โ€‹terraform. ื›ืš Terraform ืชื“ืข ืื™ื–ื• ืชืฉืชื™ืช ืฆืจื™ืš ืœื ื”ืœ. ื”ืคืงื•ื“ื” ื™ื™ื‘ื•ื โ€‹โ€‹ืœื•ืงื—ืช ืฉื ื™ ืืจื’ื•ืžื ื˜ื™ื. ื”ืจืืฉื•ืŸ ื”ื•ื ื›ืชื•ื‘ืช ื”ืžืฉืื‘ ื‘ืงื•ื‘ืฆื™ ื”ืชืฆื•ืจื” ืฉืœืš. ื”ืชื—ื‘ื™ืจ ื›ืืŸ ื–ื”ื” ืœืงื™ืฉื•ืจื™ ืžืฉืื‘ื™ื: _. (ื›ืžื• aws_iam_user.existing_user). ื”ืืจื’ื•ืžื ื˜ ื”ืฉื ื™ ื”ื•ื ื”ืžื–ื”ื” ืฉืœ ื”ืžืฉืื‘ ืฉื™ืฉ ืœื™ื™ื‘ื. ื ื ื™ื— ืฉืžื–ื”ื” ื”ืžืฉืื‘ aws_iam_user ื”ื•ื ืฉื ื”ืžืฉืชืžืฉ (ืœื“ื•ื’ืžื”, yevgeniy.brikman), ื•ืžื–ื”ื” ื”ืžืฉืื‘ aws_instance ื”ื•ื ืžื–ื”ื” ื”ืฉืจืช EC2 (ื›ืžื• i-190e22e5). ื›ื™ืฆื“ ืœื™ื™ื‘ื ืžืฉืื‘ ืžืฆื•ื™ืŸ ื‘ื“ืจืš ื›ืœืœ ื‘ืชื™ืขื•ื“ ื‘ืชื—ืชื™ืช ื”ืขืžื•ื“ ืฉืœื•.

    ืœื”ืœืŸ ืคืงื•ื“ืช ื™ื™ื‘ื•ื โ€‹โ€‹ื”ืžืกื ื›ืจื ืช ืืช ื”ืžืฉืื‘ aws_iam_user ืฉื”ื•ืกืคืช ืœืชืฆื•ืจืช Terraform ืฉืœืš ื™ื—ื“ ืขื ืžืฉืชืžืฉ IAM ื‘ืคืจืง 2 (ื”ื—ืœืคืช ืฉืžืš ื‘-yevgeniy.brikman, ื›ืžื•ื‘ืŸ):

    $ terraform import aws_iam_user.existing_user yevgeniy.brikman

    Terraform ื™ืชืงืฉืจ ืœ-AWS API ื›ื“ื™ ืœืžืฆื•ื ืืช ืžืฉืชืžืฉ IAM ืฉืœืš ื•ืœื™ืฆื•ืจ ืฉื™ื•ืš ืงื•ื‘ืฅ ืžืฆื‘ ื‘ื™ื ื• ืœื‘ื™ืŸ ื”ืžืฉืื‘ aws_iam_user.existing_user ื‘ืชืฆื•ืจืช Terraform ืฉืœืš. ืžืขืชื”, ื›ืืฉืจ ืชืคืขื™ืœ ืืช ืคืงื•ื“ืช ื”ืชื•ื›ื ื™ืช, Terraform ืชื“ืข ืฉืžืฉืชืžืฉ IAM ื›ื‘ืจ ืงื™ื™ื ื•ืœื ื™ื ืกื” ืœื™ืฆื•ืจ ืื•ืชื• ืฉื•ื‘.

    ืจืื•ื™ ืœืฆื™ื™ืŸ ืฉืื ื›ื‘ืจ ื™ืฉ ืœืš ื”ืจื‘ื” ืžืฉืื‘ื™ื ืฉื‘ืจืฆื•ื ืš ืœื™ื™ื‘ื ืœ- Terraform, ื›ืชื™ื‘ืช ื”ืงื•ื“ ื™ื“ื ื™ืช ื•ื™ื‘ื•ื ื›ืœ ืื—ื“ ื‘ื›ืœ ืคืขื ื™ื›ื•ืœ ืœื”ื™ื•ืช ื˜ืจื—ื”. ืื– ื›ื“ืื™ ืœื‘ื“ื•ืง ื›ืœื™ ื›ืžื• Terraforming (http://terraforming.dtan4.net/), ืฉื™ื›ื•ืœ ืœื™ื™ื‘ื ืื•ื˜ื•ืžื˜ื™ืช ืงื•ื“ ื•ืžืฆื‘ ืžื—ืฉื‘ื•ืŸ AWS ืฉืœืš.

    ืœืฉื—ื–ื•ืจ ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ืžืœื›ื•ื“ื•ืช

    ืืจื’ื•ืŸ ืžื—ื“ืฉ ื”ื•ื ื ื•ื”ื’ ื ืคื•ืฅ ื‘ืชื›ื ื•ืช ืฉื‘ื• ืืชื” ืžืฉื ื” ืืช ื”ืžื‘ื ื” ื”ืคื ื™ืžื™ ืฉืœ ื”ืงื•ื“ ืชื•ืš ื”ืฉืืจืช ื”ื”ืชื ื”ื’ื•ืช ื”ื—ื™ืฆื•ื ื™ืช ืœืœื ืฉื™ื ื•ื™. ื–ืืช ื›ื“ื™ ืœื”ืคื•ืš ืืช ื”ืงื•ื“ ืœื‘ื”ื™ืจ ื™ื•ืชืจ, ืžืกื•ื“ืจ ื™ื•ืชืจ ื•ืงืœ ื™ื•ืชืจ ืœืชื—ื–ื•ืงื”. Refactoring ื”ื™ื ื˜ื›ื ื™ืงื” ื”ื›ืจื—ื™ืช ืฉื™ืฉ ืœื”ืฉืชืžืฉ ื‘ื” ื‘ืื•ืคืŸ ืงื‘ื•ืข. ืื‘ืœ ื›ืฉืžื“ื•ื‘ืจ ื‘-Terraform ืื• ื›ืœ ื›ืœื™ IaC ืื—ืจ, ืืชื” ืฆืจื™ืš ืœื”ื™ื•ืช ื–ื”ื™ืจ ื‘ื™ื•ืชืจ ืœืžื” ืืชื” ืžืชื›ื•ื•ืŸ ื‘"ื”ืชื ื”ื’ื•ืช ื—ื™ืฆื•ื ื™ืช" ืฉืœ ืงื˜ืข ืงื•ื“, ืื—ืจืช ื™ืชืขื•ืจืจื• ื‘ืขื™ื•ืช ื‘ืœืชื™ ืฆืคื•ื™ื•ืช.

    ืœื“ื•ื’ืžื”, ืกื•ื’ ื ืคื•ืฅ ืฉืœ ืจื™ืคืืงื˜ื•ืจื™ื ื’ ื”ื•ื ื”ื—ืœืคืช ืฉืžื•ืช ืฉืœ ืžืฉืชื ื™ื ืื• ืคื•ื ืงืฆื™ื•ืช ื‘ืฉืžื•ืช ืžื•ื‘ื ื™ื ื™ื•ืชืจ. ืœ-IDEs ืจื‘ื™ื ื™ืฉ ืชืžื™ื›ื” ืžื•ื‘ื ื™ืช ื‘-refactoring ื•ื”ื ื™ื›ื•ืœื™ื ืœืฉื ื•ืช ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ืืช ืฉืžื ืฉืœ ืžืฉืชื ื™ื ื•ืคื•ื ืงืฆื™ื•ืช ืœืื•ืจืš ื”ืคืจื•ื™ืงื˜. ื‘ืฉืคื•ืช ืชื›ื ื•ืช ืœืžื˜ืจื•ืช ื›ืœืœื™ื•ืช, ื–ื”ื• ื”ืœื™ืš ื˜ืจื™ื•ื•ื™ืืœื™ ืฉืื•ืœื™ ืœื ืชื—ืฉื•ื‘ ืขืœื™ื•, ืื‘ืœ ื‘- Terraform ืืชื” ืฆืจื™ืš ืœื”ื™ื•ืช ื–ื”ื™ืจ ืžืื•ื“ ืขื ื–ื”, ืื—ืจืช ืืชื” ืขืœื•ืœ ืœื—ื•ื•ืช ื”ืคืกืงื•ืช.

    ืœื“ื•ื’ืžื”, ืœืžื•ื“ื•ืœ ืฉืจืช ื”ืื™ื ื˜ืจื ื˜-ืืฉื›ื•ืœ ื™ืฉ ืžืฉืชื ื” ืงืœื˜ cluster_name:

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

    ืชืืจ ืœืขืฆืžืš ืฉื”ืชื—ืœืช ืœื”ืฉืชืžืฉ ื‘ืžื•ื“ื•ืœ ื”ื–ื” ื›ื“ื™ ืœืคืจื•ืก ืžื™ืงืจื•-ืฉื™ืจื•ืช ื‘ืฉื foo. ืžืื•ื—ืจ ื™ื•ืชืจ, ืชืจืฆื” ืœืฉื ื•ืช ืืช ืฉื ื”ืฉื™ืจื•ืช ืฉืœืš ืœืกืจื’ืœ. ื”ืฉื™ื ื•ื™ ื”ื–ื” ืื•ืœื™ ื ืจืื” ื˜ืจื™ื•ื•ื™ืืœื™, ืื‘ืœ ื‘ืžืฆื™ืื•ืช ื”ื•ื ื™ื›ื•ืœ ืœื’ืจื•ื ืœืฉื™ื‘ื•ืฉื™ื ื‘ืฉื™ืจื•ืช.

    ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉืžื•ื“ื•ืœ ืฉืจืช-ื”ืจืฉืช ืžืฉืชืžืฉ ื‘ืžืฉืชื ื” cluster_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]
    }

    ืื ืชืฉื ื” ืืช ืคืจืžื˜ืจ ื”ืฉื ื‘ืžืฉืื‘, Terraform ืชืžื—ืง ืืช ื”ื’ืจืกื” ื”ื™ืฉื ื” ืฉืœ ืื•ืชื• ืžืฉืื‘ ื•ืชื™ืฆื•ืจ ื’ืจืกื” ื—ื“ืฉื” ื‘ืžืงื•ืžื”. ืื‘ืœ ืื ื”ืžืฉืื‘ ื”ื–ื” ื”ื•ื ALB, ื‘ื™ืŸ ืžื—ื™ืงืชื• ืœื”ื•ืจื“ืช ื’ืจืกื” ื—ื“ืฉื”, ืœื ื™ื”ื™ื” ืœืš ืžื ื’ื ื•ืŸ ืœื”ืคื ื•ืช ืชืขื‘ื•ืจื” ืœืฉืจืช ื”ืื™ื ื˜ืจื ื˜ ืฉืœืš. ื‘ืื•ืคืŸ ื“ื•ืžื”, ืื ืงื‘ื•ืฆืช ืื‘ื˜ื—ื” ื ืžื—ืงืช, ื”ืฉืจืชื™ื ืฉืœืš ื™ืชื—ื™ืœื• ืœื“ื—ื•ืช ื›ืœ ืชืขื‘ื•ืจืช ืจืฉืช ืขื“ ืœื™ืฆื™ืจืช ืงื‘ื•ืฆื” ื—ื“ืฉื”.

    ืกื•ื’ ื ื•ืกืฃ ืฉืœ ืขื™ื‘ื•ื“ ืžื—ื“ืฉ ืฉืืชื” ืขืฉื•ื™ ืœื”ืชืขื ื™ื™ืŸ ื‘ื• ื”ื•ื ืฉื™ื ื•ื™ ืžื–ื”ื” Terraform. ื ื™ืงื— ืืช ื”ืžืฉืื‘ aws_security_group ื‘ืžื•ื“ื•ืœ ืฉืจืช-ื”ืจืฉืช ื›ื“ื•ื’ืžื”:

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

    ื”ืžื–ื”ื” ืฉืœ ืžืฉืื‘ ื–ื” ื ืงืจื ืžื•ืคืข. ืชืืจื• ืœืขืฆืžื›ื ืฉื‘ืžื”ืœืš ื”-refactoring ื”ื—ืœื˜ืชื ืœืฉื ื•ืช ืื•ืชื• ืœืฉื cluster_instance ืžื•ื‘ืŸ ื™ื•ืชืจ (ืœื“ืขืชื›ื):

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

    ืžื” ื™ืงืจื” ื‘ืกื•ืฃ? ื ื›ื•ืŸ: ืฉื™ื‘ื•ืฉ.

    Terraform ืžืฉื™ื™ืš ื›ืœ ืžื–ื”ื” ืžืฉืื‘ ืœืžื–ื”ื” ืกืคืง ื”ืขื ืŸ. ืœื“ื•ื’ืžื”, iam_user ืžืฉื•ื™ืš ืœืžื–ื”ื” ื”ืžืฉืชืžืฉ ืฉืœ AWS IAM, ื•-aws_instance ืžืฉื•ื™ืš ืœืžื–ื”ื” ืฉืจืช AWS EC2. ืื ืชืฉื ื” ืืช ืžื–ื”ื” ื”ืžืฉืื‘ (ื ื ื™ื— ืž-instance ืœ-cluster_instance, ื›ืคื™ ืฉืงื•ืจื” ื‘-aws_security_group), ืœ-Terraform ื–ื” ื™ื•ืคื™ืข ื›ืื™ืœื• ืžื—ืงืช ืืช ื”ืžืฉืื‘ ื”ื™ืฉืŸ ื•ื”ื•ืกืคืช ื—ื“ืฉ. ืื ืชื—ื™ืœ ืืช ื”ืฉื™ื ื•ื™ื™ื ื”ืืœื”, Terraform ืชืžื—ืง ืืช ืงื‘ื•ืฆืช ื”ืื‘ื˜ื—ื” ื”ื™ืฉื ื” ื•ืชื™ืฆื•ืจ ืงื‘ื•ืฆื” ื—ื“ืฉื”, ื‘ื–ืžืŸ ืฉื”ืฉืจืชื™ื ืฉืœืš ื™ืชื—ื™ืœื• ืœื“ื—ื•ืช ื›ืœ ืชืขื‘ื•ืจืช ืจืฉืช.

    ืœื”ืœืŸ ืืจื‘ืขื” ืœืงื—ื™ ืžืคืชื— ืฉื›ื“ืื™ ืœืงื—ืช ืžื”ื“ื™ื•ืŸ ื”ื–ื”.

    • ื”ืฉืชืžืฉ ืชืžื™ื“ ื‘ืคืงื•ื“ืช ื”ืชื•ื›ื ื™ืช. ื–ื” ื™ื›ื•ืœ ืœื—ืฉื•ืฃ ืืช ื›ืœ ื”ื—ืกืจื•ื ื•ืช ื”ืืœื”. ื‘ื“ื•ืง ื”ื™ื˜ื‘ ืืช ื”ืคืœื˜ ืฉืœื• ื•ืฉื ืœื‘ ืœืžืฆื‘ื™ื ืฉื‘ื”ื Terraform ืžืชื›ื ื ืช ืœืžื—ื•ืง ืžืฉืื‘ื™ื ืฉื›ื›ืœ ื”ื ืจืื” ืœื ืืžื•ืจื™ื ืœื”ื™ืžื—ืง.
    • ืฆื•ืจ ืœืคื ื™ ืฉืืชื” ืžื•ื—ืง. ืื ื‘ืจืฆื•ื ืš ืœื”ื—ืœื™ืฃ ืžืฉืื‘, ื—ืฉื•ื‘ ื”ื™ื˜ื‘ ืื ืขืœื™ืš ืœื™ืฆื•ืจ ืชื—ืœื™ืฃ ืœืคื ื™ ืžื—ื™ืงืช ื”ืžืงื•ืจ. ืื ื”ืชืฉื•ื‘ื” ื”ื™ื ื›ืŸ, create_before_destroy ื™ื›ื•ืœ ืœืขื–ื•ืจ. ื ื™ืชืŸ ืœื”ืฉื™ื’ ืืช ืื•ืชื” ืชื•ืฆืื” ื‘ืื•ืคืŸ ื™ื“ื ื™ ืขืœ ื™ื“ื™ ื‘ื™ืฆื•ืข ืฉื ื™ ืฉืœื‘ื™ื: ืชื—ื™ืœื” ื”ื•ืกืฃ ืžืฉืื‘ ื—ื“ืฉ ืœืชืฆื•ืจื” ื•ื”ืคืขืœ ืืช ืคืงื•ื“ืช ื”ื™ื™ืฉื•ื, ื•ืœืื—ืจ ืžื›ืŸ ื”ืกืจ ืืช ื”ืžืฉืื‘ ื”ื™ืฉืŸ ืžื”ืชืฆื•ืจื” ื•ื”ืฉืชืžืฉ ืฉื•ื‘ ื‘ืคืงื•ื“ื” ื”ื™ื™ืฉื•ื.
    • ืฉื™ื ื•ื™ ื”ืžื–ื”ื™ื ืžื—ื™ื™ื‘ ืฉื™ื ื•ื™ ืžืฆื‘. ืื ื‘ืจืฆื•ื ืš ืœืฉื ื•ืช ืืช ื”ืžื–ื”ื” ื”ืžืฉื•ื™ืš ืœืžืฉืื‘ (ืœื“ื•ื’ืžื”, ืœืฉื ื•ืช ืืช ืฉื aws_security_group ืž-instance ืœ-cluster_instance) ืžื‘ืœื™ ืœืžื—ื•ืง ืืช ื”ืžืฉืื‘ ื•ืœื™ืฆื•ืจ ื’ืจืกื” ื—ื“ืฉื” ืฉืœื•, ืขืœื™ืš ืœืขื“ื›ืŸ ืืช ืงื•ื‘ืฅ ื”ืžืฆื‘ ืฉืœ Terraform ื‘ื”ืชืื. ืœืขื•ืœื ืืœ ืชืขืฉื” ื–ืืช ื‘ืื•ืคืŸ ื™ื“ื ื™ - ื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื” terraform state ื‘ืžืงื•ื ื–ืืช. ื‘ืขืช ืฉื™ื ื•ื™ ืฉืžื•ืช ืฉืœ ืžื–ื”ื™ื, ืขืœื™ืš ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื” terraform state mv, ื‘ืขืœืช ื”ืชื—ื‘ื™ืจ ื”ื‘ื:
      terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>

      ORIGINAL_REFERENCE ื”ื•ื ื‘ื™ื˜ื•ื™ ื”ืžืชื™ื™ื—ืก ืœืžืฉืื‘ ื‘ืฆื•ืจืชื• ื”ื ื•ื›ื—ื™ืช, ื•-NEW_REFERENCE ื”ื•ื ื”ืžืงื•ื ืฉื‘ื• ืืชื” ืจื•ืฆื” ืœื”ืขื‘ื™ืจ ืื•ืชื•. ืœื“ื•ื’ืžื”, ื‘ืขืช ืฉื™ื ื•ื™ ืฉื ืงื‘ื•ืฆืช aws_security_group ืžืžื•ืคืข ืœ-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 ืื™ื ื” ืžืฆื™ื’ื” ืฉื™ื ื•ื™ื™ื, ืื– ืขืฉื™ืช ื”ื›ืœ ื ื›ื•ืŸ.

    • ืœื ื ื™ืชืŸ ืœืฉื ื•ืช ื—ืœืง ืžื”ื”ื’ื“ืจื•ืช. ื”ืคืจืžื˜ืจื™ื ืฉืœ ืžืฉืื‘ื™ื ืจื‘ื™ื ืื™ื ื ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™. ืื ืชื ืกื” ืœืฉื ื•ืช ืื•ืชื, Terraform ืชืžื—ืง ืืช ื”ืžืฉืื‘ ื”ื™ืฉืŸ ื•ืชื™ืฆื•ืจ ืื—ื“ ื—ื“ืฉ ื‘ืžืงื•ืžื•. ื›ืœ ื“ืฃ ืžืฉืื‘ื™ื ื™ืฆื™ื™ืŸ ื‘ื“ืจืš ื›ืœืœ ืžื” ืงื•ืจื” ื›ืืฉืจ ืืชื” ืžืฉื ื” ื”ื’ื“ืจื” ืžืกื•ื™ืžืช, ืื– ื”ืงืคื“ ืœื‘ื“ื•ืง ืืช ื”ืชื™ืขื•ื“. ื”ืฉืชืžืฉ ืชืžื™ื“ ื‘ืคืงื•ื“ื” ืชื•ื›ื ื™ืช ื•ืฉืงื•ืœ ืœื”ืฉืชืžืฉ ื‘ืืกื˜ืจื˜ื’ื™ื™ืช create_before_destroy.

    ืขืงื‘ื™ื•ืช ื“ื—ื•ื™ื” ืขื•ืœื” ื‘ืงื ื” ืื—ื“ ืขื ื“ื—ื™ื”

    ืžืžืฉืงื™ API ืฉืœ ืกืคืงื™ ืขื ืŸ ืžืกื•ื™ืžื™ื, ื›ื’ื•ืŸ AWS, ื”ื ืืกื™ื ื›ืจื•ื ื™ื™ื ื•ื™ืฉ ืœื”ื ืขืงื‘ื™ื•ืช ืžื•ืฉื”ื™ืช. ืืกื™ื ื›ืจื•ืŸ ืคื™ืจื•ืฉื” ืฉื”ืžืžืฉืง ื™ื›ื•ืœ ืœื”ื—ื–ื™ืจ ืชื’ื•ื‘ื” ืžื™ื™ื“ื™ืช ืžื‘ืœื™ ืœื—ื›ื•ืช ืœื”ืฉืœืžืช ื”ืคืขื•ืœื” ื”ืžื‘ื•ืงืฉืช. ืขืงื‘ื™ื•ืช ืžื•ืฉื”ื™ืช ืคื™ืจื•ืฉื” ืฉืฉื™ื ื•ื™ื™ื ืขืฉื•ื™ื™ื ืœืงื—ืช ื–ืžืŸ ืœื”ืชืคืฉื˜ ื‘ื›ืœ ื”ืžืขืจื›ืช; ื‘ื–ืžืŸ ืฉื–ื” ืงื•ืจื”, ื”ืชื’ื•ื‘ื•ืช ืฉืœืš ืขืฉื•ื™ื•ืช ืœื”ื™ื•ืช ืœื ืขืงื‘ื™ื•ืช ื•ืชืœื•ื™ื•ืช ื‘ืื™ื–ื” ืขื•ืชืง ืžืงื•ืจ ื ืชื•ื ื™ื ืžื’ื™ื‘ ืœืงืจื™ืื•ืช ื”-API ืฉืœืš.

    ืชืืจื• ืœืขืฆืžื›ื, ืœืžืฉืœ, ืฉืืชื ืžื‘ืฆืขื™ื ืงืจื™ืืช API ืœ-AWS ื•ืžื‘ืงืฉื™ื ืžืžื ื• ืœื™ืฆื•ืจ ืฉืจืช EC2. ื”-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

    ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ืืชื” ื™ื•ืฆืจ ืžืฉืื‘ (ื›ืžื• ืจืฉืช ืžืฉื ื”) ื•ืื– ืžื ืกื” ืœืงื‘ืœ ืงืฆืช ืžื™ื“ืข ืœื’ื‘ื™ื• (ื›ืžื• ื”ืžื–ื”ื” ืฉืœ ืจืฉืช ื”ืžืฉื ื” ื”ื—ื“ืฉื” ืฉื ื•ืฆืจื”), ื•- Terraform ืœื ืžื•ืฆื ืื•ืชื•. ืจื•ื‘ ื”ื‘ืื’ื™ื ื”ืœืœื• (ื›ื•ืœืœ 6813) ืชื•ืงื ื•, ืืš ื”ื ืขื“ื™ื™ืŸ ืฆืฆื™ื ืžืขืช ืœืขืช, ื‘ืžื™ื•ื—ื“ ื›ืืฉืจ Terraform ืžื•ืกื™ืฃ ืชืžื™ื›ื” ื‘ืกื•ื’ ืžืฉืื‘ ื—ื“ืฉ. ื–ื” ืžืขืฆื‘ืŸ, ืื‘ืœ ื‘ืจื•ื‘ ื”ืžืงืจื™ื ืœื ื’ื•ืจื ื ื–ืง. ื›ืืฉืจ ืืชื” ืžืคืขื™ืœ ืืช terraform app ืฉื•ื‘, ื”ื›ืœ ืืžื•ืจ ืœืขื‘ื•ื“, ืฉื›ืŸ ื‘ืฉืœื‘ ื–ื” ื”ืžื™ื“ืข ื›ื‘ืจ ื™ืชืคืฉื˜ ื‘ื›ืœ ื”ืžืขืจื›ืช.

    ืงื˜ืข ื–ื” ืžื•ื‘ื ืžืชื•ืš ืกืคืจื• ืฉืœ ื™ื‘ื’ื ื™ ื‘ืจื™ืงืžืŸ "Terraform: ืชืฉืชื™ืช ื‘ืจืžืช ื”ืงื•ื“".

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”