Terraform部署ECS服务至EC2遇异常:集群无可用容器实例
以下是针对你遇到的No Container Instances were found in your cluster报错,最可能的Terraform配置遗漏或错误点:
EC2实例未配置ECS集群注册脚本
预付费EC2实例必须通过用户数据(user data)配置ECS代理,指定要注册的ECS集群名称。示例配置如下:resource "aws_instance" "ecs_instance" { # 其他实例配置... user_data = <<-EOF #!/bin/bash echo "ECS_CLUSTER=${aws_ecs_cluster.your_cluster.name}" >> /etc/ecs/ecs.config EOF }缺少这段配置的话,EC2实例的ECS代理不知道要注册到哪个集群,自然不会出现在集群的容器实例列表中。
EC2实例IAM角色权限不足
EC2实例需要具备与ECS服务通信的权限,必须附加包含AmazonEC2ContainerServiceforEC2Role策略的IAM角色(或自定义等效权限的策略)。Terraform中需创建实例配置文件并关联到EC2实例:resource "aws_iam_role" "ecs_instance_role" { name = "ecs-instance-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } }] }) } resource "aws_iam_role_policy_attachment" "ecs_instance_policy" { role = aws_iam_role.ecs_instance_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role" } resource "aws_iam_instance_profile" "ecs_instance_profile" { name = "ecs-instance-profile" role = aws_iam_role.ecs_instance_role.name } # 在aws_instance中关联实例配置文件 resource "aws_instance" "ecs_instance" { # 其他配置... iam_instance_profile = aws_iam_instance_profile.ecs_instance_profile.name }权限不足会导致ECS代理无法向ECS控制平面注册实例。
安全组出站规则限制ECS代理通信
即使你临时全开端口,也要确保EC2实例的安全组允许出站HTTPS(443端口)流量到AWS服务。ECS代理需要通过HTTPS连接到ECS API完成注册,出站规则如果限制了这个流量,实例无法完成注册。ECS集群与EC2实例网络不匹配
确保EC2实例部署的子网属于ECS集群关联的VPC。如果集群配置了VPC,而实例在其他VPC或未关联的子网中,集群无法发现该实例。未使用ECS优化AMI
避免使用普通的Amazon Linux或自定义AMI,应选择官方的ECS优化AMI(比如Amazon Linux 2 ECS AMI)。这类AMI预装了ECS代理和必要依赖,自定义AMI可能缺少组件导致无法注册。
内容的提问来源于stack exchange,提问作者Moravas

