
aws-containers
热门用于在 ECS、Fargate 和 ECR 上部署及运维容器化工作负载。涵盖任务定义(Task Definition)、Fargate 服务、ECR 镜像仓库搭建与生命周期策略、ECS Exec 调试、服务弹性扩缩容、部署策略、负载均衡器集成以及日志配置。当需要在 AWS 上部署、调试或优化容器时使用。同时适用于容器部署选型(ECS 与 ECS Express 模式对比)、网络模式、健康检查排错、OOM 报错分析、密钥注入、蓝绿部署、ECR 镜像管理,以及 App Runner 停运指南与迁移方案。不适用于 Kubernetes、EKS 或 CI/CD 流水线。
用于在 ECS、Fargate 和 ECR 上部署及运维容器化工作负载。涵盖任务定义(Task Definition)、Fargate 服务、ECR 镜像仓库搭建与生命周期策略、ECS Exec 调试、服务弹性扩缩容、部署策略、负载均衡器集成以及日志配置。当需要在 AWS 上部署、调试或优化容器时使用。同时适用于容器部署选型(ECS 与 ECS Express 模式对比)、网络模式、健康检查排错、OOM 报错分析、密钥注入、蓝绿部署、ECR 镜像管理,以及 App Runner 停运指南与迁移方案。不适用于 Kubernetes、EKS 或 CI/CD 流水线。
AWS Containers
Service Overview
| 开发者需求 | 推荐方案 | 关键 CLI / CDK |
|---|---|---|
| 最简容器部署(HTTP 应用/API,新客户) | ECS Express Mode | aws ecs create-express-gateway-service |
| Web 应用、后台 Worker、批处理、定时任务 | ECS on Fargate | aws ecs create-service / CDK ecsPatterns.ApplicationLoadBalancedFargateService |
| GPU 工作负载或 >16 vCPU | ECS on EC2 | CDK ecs.Ec2Service |
| 存储容器镜像 | ECR | aws ecr create-repository |
| 挂载负载均衡器的 Web 应用 | ECS Fargate + ALB | CDK ecsPatterns.ApplicationLoadBalancedFargateService |
| 根据队列深度扩缩容 SQS Worker | ECS Fargate + SQS | CDK ecsPatterns.QueueProcessingFargateService |
| Cron 作业 / 定时任务 | ECS Fargate + EventBridge | CDK ecsPatterns.ScheduledFargateTask |
| 服务网格 / 服务间通信 | ECS Service Connect | 在 ECS 服务上配置 Cloud Map 命名空间 |
| 调试运行中的容器 | ECS Exec | aws ecs execute-command --interactive --command "/bin/sh" |
当开发者在未指定具体服务的情况下说“部署我的容器”时:对于简单的 HTTP 应用,优先推荐 ECS Express Mode(面向新客户取代 App Runner);其他场景一律推荐 ECS Fargate。除非明确要求使用 Kubernetes,否则切勿推荐 EKS。
Overview
提供使用 Amazon ECS、AWS Fargate、Amazon ECR 以及 AWS App Runner 构建、部署和运维容器化工作负载的专业知识。
推荐配置: 安装 AWS MCP 服务器以获得沙箱化执行、审计日志和企业级管控能力。参见:aws.amazon.com/mcp
未使用 AWS MCP 时: 本 Skill 可与任何具备 AWS CLI 访问权限的 Agent 配合工作。所有命令均使用标准 AWS CLI 语法。
何时不要使用本 Skill:
- Kubernetes 或 EKS 工作负载 → 使用 kubernetes skill
- 容器部署的 CI/CD 流水线搭建 → 使用 deploy skill
- VPC 子网设计与安全组架构 → 使用 networking skill
- 无容器的代码运行(Lambda、Step Functions)→ 使用 serverless skill
执行任何命令之前:
- 在运行命令前,你必须确认 AWS CLI v2 已安装并配置完成
- 如果缺少所需工具(AWS CLI、Docker、Session Manager 插件),你必须明确告知用户
- 你必须尊重用户在任何阶段作出的终止决定
Gotchas
每次操作均须遵守以下规定。以下内容针对 Agent 在无明确指令时容易犯的错误进行了纠正:
-
Fargate CPU/内存必须为合法组合。 随意配置会导致
Invalid 'cpu' setting for task报错:- 256 (0.25 vCPU): 512 MiB, 1 GB, 2 GB
- 512 (0.5 vCPU): 1–4 GB(以 1 GB 递增)
- 1024 (1 vCPU): 2–8 GB(以 1 GB 递增)
- 2048 (2 vCPU): 4–16 GB(以 1 GB 递增)
- 4096 (4 vCPU): 8–30 GB(以 1 GB 递增)
- 8192 (8 vCPU): 16–60 GB(以 4 GB 递增)
- 16384 (16 vCPU): 32–120 GB(以 8 GB 递增)
若用户请求了非法组合,须主动告知并推荐最接近的合法选项。绝不能默默生成非法的任务定义(Task Definition)。
-
Fargate 必须使用
awsvpc网络模式——无一例外。 Agent 经常错误地为 Fargate 任务建议bridge或host模式,这会导致注册直接失败。所有 Fargate 任务定义中的networkMode必须设为awsvpc。在 EC2 上推荐使用awsvpc;bridge模式仅作为遗留模式保留。 -
执行角色(Execution role)与任务角色(Task role)切勿混淆。
executionRoleArn:ECS Agent 用于拉取镜像、获取密钥及写入日志。taskRoleArn:应用代码用于调用 AWS API。ECS Exec 权限(ssmmessages:*)应配置在任务角色上。ECR 拉取权限应配置在执行角色上。ecr:GetAuthorizationToken必须使用Resource: "*"(属于注册表级别的操作)。 -
密钥仅在任务启动时注入——不支持热重载。 密钥修改后需要执行
aws ecs update-service --force-new-deployment强制重新部署。在 Secrets Manager 中引用特定的 JSON key 格式为:arn:aws:secretsmanager:region:account:secret:name-hash:json-key::——末尾冒号为必填项(代表空的版本阶段和版本 ID 字段)。也可以使用 SSM Parameter Store,将valueFrom指向参数 ARN——执行角色需要ssm:GetParameters权限。 -
ALB 销毁注销延迟(Deregistration delay)默认长达 300 秒——建议缩短至 30–60 秒。 这是导致部署缓慢的头号原因。请在目标组(Target Group)上进行设置。该数值应当大于你最长的请求持续时间。
-
每个挂载在 ALB 后的 ECS 服务都必须设置
healthCheckGracePeriodSeconds。 若不设置,ALB 会在任务就绪前将其判定为不健康,导致熔断器误计失败次数并触发部署回滚。JVM / Spring Boot 应用通常需要 60–120 秒。 -
务必开启带回滚功能的部署熔断器(Deployment circuit breaker)。 若未开启,异常部署可能会保持“在进行中”状态长达 30 分钟以上。在 CDK 中:
circuitBreaker: { rollback: true }(显式指定该属性即默认开启;enable默认为true)。 -
私有子网中的 Fargate 任务需要 NAT 网关或全部 4 个 VPC 端点。 必需的端点为:
ecr.dkr(接口)、ecr.api(接口)、s3(网关——ECR 将镜像层存放在 S3 中)、logs(接口——用于 CloudWatch)。其中 S3 网关端点最容易遗漏。若要使用 ECS Exec,还需添加ssmmessages。 -
ECR 生命周期策略会在 24 小时内生效评估——非即时生效。 被 Manifest List 引用的多架构镜像无法直接过期删除,必须先删除 Manifest List。应用前建议先预览:先运行
aws ecr start-lifecycle-policy-preview --repository-name $REPO,再运行aws ecr get-lifecycle-policy-preview --repository-name $REPO --output json查看受影响的镜像。 -
ECS Exec 需要的是任务角色权限,而非执行角色。 任务角色需要
ssmmessages:CreateControlChannel、CreateDataChannel、OpenControlChannel、OpenDataChannel权限。在开启enableExecuteCommand之前启动的任务无法支持 ECS Exec——需强制重新部署。容器镜像必须包含--command指定的二进制文件(例如交互式会话所需的/bin/sh)。如需将命令日志输出到 S3 或 CloudWatch Logs,还须安装script和cat。Fargate 平台版本必须为 1.4.0+。 -
awslogs日志驱动模式——请检查账号默认设置。 依据 ECS 文档,ECS 服务默认采用non-blocking(非阻塞)模式,当缓冲区满时会丢弃日志。账号级别的defaultLogDriverMode设置可能会覆盖此默认行为。对于要求保证日志送达(如审计/合规)的场景,请在logConfiguration.options中显式设置"mode": "blocking"。运行aws ecs list-account-settings --name defaultLogDriverMode --effective-settings --output json查看当前生效的默认值。 -
App Runner VPC 连接器会将应用发起的全部出站流量路由过 VPC。(App Runner 已停运退役——新客户应改用 ECS Express Mode。)若缺少 NAT 网关,应用代码发起的外部 API 调用和 AWS 服务调用将会中断。App Runner 自身托管的流量(拉取镜像、推送日志、获取密钥)不会经过 VPC,不受此影响。请在应用启动时的数据库连接逻辑中加入带退避策略的重试逻辑。
-
针对
desiredCount=1的零停机部署:请设置minimumHealthyPercent=100, maximumPercent=200。 这需要在部署期间具备同时运行 2 个任务的容量。若需要零停机部署,绝不能将minimumHealthyPercent设为 0。 -
ALB 返回 502 Bad Gateway——按以下顺序排查: (a) 容器未在目标组指定的端口上监听。(b) 容器在响应前崩溃。(c) 任务安全组未放行来自 ALB 安全组在容器端口上的入站流量。(d) 健康检查路径未返回 200。(e) 健康检查超时时间设得比响应时间还短。
-
Fargate 平台版本:务必使用
LATEST或1.4.0。 1.3.0 版本将于 2026 年 6 月 15 日弃用,并于 2026 年 6 月 30 日彻底终止支持。 -
SQS Worker 扩缩容:使用自定义的“单任务积压量”(backlog-per-task)指标。 直接使用原始的
ApproximateNumberOfMessagesVisible结合目标追踪(Target Tracking)无法正常工作,因为增加任务并不会等比例降低队列深度。请使用自定义指标(ApproximateNumberOfMessagesVisible / RunningTaskCount)结合目标追踪,或者使用步进扩缩容(Step Scaling)。CDK 的QueueProcessingFargateService已通过scalingSteps自动处理了此逻辑。Worker 必须能在stopTimeout时间内(默认 30 秒,Fargate 上最高 120 秒)优雅处理 SIGTERM 信号。 -
蓝绿部署:对于新服务,请使用 ECS 原生蓝绿部署(2025 年 7 月起提供)。 支持全量(all-at-once)、金丝雀(canary)和线性(linear)流量切流(金丝雀/线性于 2025 年 10 月新增),并支持 Service Connect、无头服务(headless services)、EBS 卷及生命周期钩子(lifecycle hooks)。CodeDeploy 蓝绿部署现已废弃——原生 ECS 蓝绿部署已具备完整的功能对等性。
-
容器依赖
HEALTHY条件要求被依赖的容器必须配置健康检查。 若未配置健康检查,被依赖的容器永远不会启动——ECS 不会将其推进至下一个状态。若设置了startTimeout(最高 120 秒),依赖项超时会导致任务失败;若未设置,依赖容器将无限期阻塞。对于初始化容器(init containers),请改用SUCCESS条件。
Quick-Start: CDK Fargate Web App
import * as cdk from 'aws-cdk-lib';
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as ecsPatterns from 'aws-cdk-lib/aws-ecs-patterns';
const service = new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'WebApp', {
taskImageOptions: {
image: ecs.ContainerImage.fromEcrRepository(repo, 'latest'),
containerPort: 8080,
secrets: { DB_PASSWORD: ecs.Secret.fromSecretsManager(dbSecret) },
},
cpu: 512,
memoryLimitMiB: 1024,
desiredCount: 2,
publicLoadBalancer: true,
circuitBreaker: { rollback: true },
minHealthyPercent: 100,
});
service.targetGroup.setAttribute('deregistration_delay.timeout_seconds', '30');
const scaling = service.service.autoScaleTaskCount({ minCapacity: 2, maxCapacity: 10 });
scaling.scaleOnCpuUtilization('CpuScaling', { targetUtilizationPercent: 70 });
CDK L3 pattern 会自动创建 VPC、集群、ALB、目标组以及安全组。生产环境中建议单独创建这些资源并传入。ApplicationLoadBalancedFargateService 默认设为 assignPublicIp: false——位于公有子网的任务需要设置 assignPublicIp: true 才能访问外网,或者使用带 NAT 的私有子网。
Quick-Start: ECS Exec
# 1. 在服务上开启 ECS Exec(已有任务不支持,需强制重新部署)
aws ecs update-service --cluster $CLUSTER --service $SERVICE \
--enable-execute-command --force-new-deployment --output json
# 2. 连接容器(任务角色必须具备 ssmmessages:* 权限)
aws ecs execute-command --cluster $CLUSTER --task $TASK_ID \
--container $CONTAINER --interactive --command "/bin/sh"
若遇到 TargetNotConnectedException 报错:请等待 30–60 秒待 SSM Agent 启动完成,检查 NAT / VPC 端点是否开启 ssmmessages,并确认任务角色(非执行角色)已赋予相应权限。
Common Workflows
AWS 相关操作请使用最佳的可用工具(MCP 服务器、AWS CLI 或 SDK)。下方命令展示的是 AWS CLI 形式。
仅当对话需要更深入的细节时再读取参考文件。
- 若用户需要了解更详细的任务定义编写规范,请阅读 references/task-definition-authoring.md





