无法使用 terraform 将容量提供程序添加到 AWS ECS 集群
Unable to add capacity provider to AWS ECS cluster with terraform
我正在尝试使用 terraform 将容量提供程序添加到 ECS 集群,以便它可以自动缩放。自动缩放组需要知道集群才能在集群中创建实例,但集群也需要通过其容量提供程序了解自动缩放组。我如何使用 terraform 和容量提供程序解决这种循环依赖?
这是我创建集群的基础设施代码
# The ECS cluster
resource "aws_ecs_cluster" "my_cluster" {
name = "my-cluster"
capacity_providers = [aws_ecs_capacity_provider.my_cp.name]
}
# The capacity provider
resource "aws_ecs_capacity_provider" "my_cp" {
name = "my-cp"
auto_scaling_group_provider {
auto_scaling_group_arn = aws_autoscaling_group.my_asg.arn
managed_termination_protection = "DISABLED"
managed_scaling {
maximum_scaling_step_size = 1000
minimum_scaling_step_size = 1
status = "ENABLED"
target_capacity = 10
}
}
}
这是自动缩放组及其依赖项的基础结构代码
# The image for the cluster instances
data "aws_ssm_parameter" "instance_image" {
name = "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
}
# The launch config of the instances
resource "aws_launch_configuration" "my_launch_config" {
name = "my-launch-config"
image_id = data.aws_ssm_parameter.instance_image.value
instance_type = "t3.small"
iam_instance_profile = my_iam_profile
security_groups = my_security_groups
associate_public_ip_address = false
key_name = "my-keypair"
}
# The placement group of the autosclaing group
resource "aws_placement_group" "my_pg" {
name = "my-pg"
strategy = "spread"
}
# The autoscaling gorup
resource "aws_autoscaling_group" "my_asg" {
name = "my-asg"
max_size = 2
min_size = 1
desired_capacity = 1
health_check_type = "EC2"
health_check_grace_period = 300
force_delete = true
placement_group = aws_placement_group.my_pg.id
launch_configuration = aws_launch_configuration.my_launch_config.id
vpc_zone_identifier = my_subnets_ids
tag {
key = "Name"
value = "myInstance"
propagate_at_launch = true
}
}
应用此 Terraform 时,我的集群上确实有一个容量提供程序,但实例位于集群 default
而不是 my-cluster
中。有人会说我只需要添加
user_data = <<EOF
#!/bin/bash
echo ECS_CLUSTER=${aws_ecs_cluster.my_cluster.name} >> /etc/ecs/ecs.config
EOF
到启动配置,但我无法在启动配置中引用集群,因为集群依赖于容量提供程序,而容量提供程序又依赖于自动缩放组,而自动缩放组又依赖于启动配置。所以我会有一个循环依赖。话虽如此,如果我们不能在集群创建后添加容量提供程序,那么在 Terraform 中对容量提供程序的支持似乎完全没有用。
我处理这个问题的方式是基于这样一个事实,即您的启动配置 (LC) 只需要知道 集群名称 。目前你是 hard-coding 集群定义中的名称:
name = "my-cluster"
因此,我这样做的方法是 variable
名称为:
variable "cluster_name" {
default = "my-cluster"
}
现在您可以在任何需要的地方引用该名称,而无需实际创建集群:
# The ECS cluster
resource "aws_ecs_cluster" "my_cluster" {
name = var.cluster_name
capacity_providers = [aws_ecs_capacity_provider.my_cp.name]
}
user_data = <<EOF
#!/bin/bash
echo ECS_CLUSTER=${var.cluster_name} >> /etc/ecs/ecs.config
EOF
我正在尝试使用 terraform 将容量提供程序添加到 ECS 集群,以便它可以自动缩放。自动缩放组需要知道集群才能在集群中创建实例,但集群也需要通过其容量提供程序了解自动缩放组。我如何使用 terraform 和容量提供程序解决这种循环依赖?
这是我创建集群的基础设施代码
# The ECS cluster
resource "aws_ecs_cluster" "my_cluster" {
name = "my-cluster"
capacity_providers = [aws_ecs_capacity_provider.my_cp.name]
}
# The capacity provider
resource "aws_ecs_capacity_provider" "my_cp" {
name = "my-cp"
auto_scaling_group_provider {
auto_scaling_group_arn = aws_autoscaling_group.my_asg.arn
managed_termination_protection = "DISABLED"
managed_scaling {
maximum_scaling_step_size = 1000
minimum_scaling_step_size = 1
status = "ENABLED"
target_capacity = 10
}
}
}
这是自动缩放组及其依赖项的基础结构代码
# The image for the cluster instances
data "aws_ssm_parameter" "instance_image" {
name = "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
}
# The launch config of the instances
resource "aws_launch_configuration" "my_launch_config" {
name = "my-launch-config"
image_id = data.aws_ssm_parameter.instance_image.value
instance_type = "t3.small"
iam_instance_profile = my_iam_profile
security_groups = my_security_groups
associate_public_ip_address = false
key_name = "my-keypair"
}
# The placement group of the autosclaing group
resource "aws_placement_group" "my_pg" {
name = "my-pg"
strategy = "spread"
}
# The autoscaling gorup
resource "aws_autoscaling_group" "my_asg" {
name = "my-asg"
max_size = 2
min_size = 1
desired_capacity = 1
health_check_type = "EC2"
health_check_grace_period = 300
force_delete = true
placement_group = aws_placement_group.my_pg.id
launch_configuration = aws_launch_configuration.my_launch_config.id
vpc_zone_identifier = my_subnets_ids
tag {
key = "Name"
value = "myInstance"
propagate_at_launch = true
}
}
应用此 Terraform 时,我的集群上确实有一个容量提供程序,但实例位于集群 default
而不是 my-cluster
中。有人会说我只需要添加
user_data = <<EOF
#!/bin/bash
echo ECS_CLUSTER=${aws_ecs_cluster.my_cluster.name} >> /etc/ecs/ecs.config
EOF
到启动配置,但我无法在启动配置中引用集群,因为集群依赖于容量提供程序,而容量提供程序又依赖于自动缩放组,而自动缩放组又依赖于启动配置。所以我会有一个循环依赖。话虽如此,如果我们不能在集群创建后添加容量提供程序,那么在 Terraform 中对容量提供程序的支持似乎完全没有用。
我处理这个问题的方式是基于这样一个事实,即您的启动配置 (LC) 只需要知道 集群名称 。目前你是 hard-coding 集群定义中的名称:
name = "my-cluster"
因此,我这样做的方法是 variable
名称为:
variable "cluster_name" {
default = "my-cluster"
}
现在您可以在任何需要的地方引用该名称,而无需实际创建集群:
# The ECS cluster
resource "aws_ecs_cluster" "my_cluster" {
name = var.cluster_name
capacity_providers = [aws_ecs_capacity_provider.my_cp.name]
}
user_data = <<EOF
#!/bin/bash
echo ECS_CLUSTER=${var.cluster_name} >> /etc/ecs/ecs.config
EOF