ืืืื ื ืืืืฉ ืืื ืืืืืืืช, ืืืื ืืื ืืงืฉืืจืืช ืืืืืืืช, ืืฆืืจืืช ืืืื ืืงืืช ืคืจืืกื, ืืื ืื ืืขืืืช ืืืืืืช ืืืชืจ ืืืฉืคืืขืืช ืขื 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 ืืชืื ื ืช ืืืืกืืฃ ืืช ืืืืืืช ืืื ืืขืชืื, ืื ืฉืชืืื ืืชื ืืชื ืงืืจื ืืช ืืกืคืจ ืืื, ืืืชืื ืฉืืื ืืืจ ืืืื. ืืื ืืืจืจ ืืืืืืืช,
ืืืืืืช ืฉื ืืคืก ืคืจืืกืืช ืืื ืืฉืืชื
ืฉืืืืฉ ืืืืืง 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