Terraform部署AWS CodeDeploy ECS环境时部署停滞问题求助
排查AWS CodeDeploy ECS部署停滞在Install阶段的问题
可能的原因及排查步骤
1. 任务定义权限问题
- 检查ECS任务执行角色是否具备拉取新nginx镜像的权限:确保角色包含
AmazonEC2ContainerRegistryReadOnly权限(若使用ECR),或对应第三方镜像源的访问权限(如Docker Hub需配置网络出口或凭证)。 - 验证Terraform中任务执行角色的策略配置,示例正确配置:
resource "aws_iam_role_policy_attachment" "ecs_task_execution_policy" { role = aws_iam_role.ecs_task_execution_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" }
2. CodeDeploy部署组配置缺失
- 确认部署组关联了正确的负载均衡目标组:Terraform中
aws_codedeploy_deployment_group的load_balancer_info必须指向ECS服务绑定的目标组,且目标组健康检查规则匹配nginx配置(默认路径为/)。 - 检查部署组的健康阈值设置:若最小健康百分比设为100%且当前任务数为1,新任务无法调度会导致部署停滞。示例合理配置:
resource "aws_codedeploy_deployment_group" "ecs_deployment_group" { # ...其他基础配置 deployment_config_name = "CodeDeployDefault.ECSAllAtOnce" load_balancer_info { target_group_info { name = aws_lb_target_group.ecs_target_group.name } } auto_rollback_configuration { enabled = true events = ["DEPLOYMENT_FAILURE"] } }
3. ECS服务与任务定义关联问题
- 确认ECS服务的部署控制器类型为
CODE_DEPLOY:这是CodeDeploy管理ECS部署的必要前提,Terraform配置示例:resource "aws_ecs_service" "ecs_service" { name = "ecs-service" cluster = aws_ecs_cluster.ecs_cluster.id task_definition = aws_ecs_task_definition.ecs_task_definition.arn desired_count = 1 deployment_controller { type = "CODE_DEPLOY" } # ...负载均衡、网络配置等 } - 验证更新后的任务定义ARN是否被ECS服务正确引用,避免手动修改任务定义后未同步Terraform配置。
4. VPC网络连通性问题
- 检查ECS任务所在子网的网络出口:若使用私有子网,需配置NAT网关或ECR VPC端点(
com.amazonaws.region.ecr.dkr和com.amazonaws.region.ecr.api),确保任务能拉取镜像。 - 确认安全组规则允许任务与负载均衡、镜像仓库的通信:比如开放容器端口给目标组,允许出站流量到镜像仓库端口。
5. 日志与事件排查
- 查看CodeDeploy部署详情的事件日志:即使无报错,也可能存在任务启动失败的隐性事件(如容器退出但未触发告警)。
- 检查CloudWatch日志中ECS任务的启动日志:搜索镜像拉取、容器启动相关的错误信息,比如权限不足、端口冲突等。
6. Terraform配置一致性问题
- 执行
terraform plan检查是否存在配置漂移:比如手动修改AWS资源后,Terraform配置与实际资源状态不一致,导致部署逻辑冲突。 - 确保更新任务定义后执行了
terraform apply,将新配置同步到AWS。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

