aws-containers

aws-containers

热门

用于在 ECS、Fargate 和 ECR 上部署及运维容器化工作负载。涵盖任务定义(Task Definition)、Fargate 服务、ECR 镜像仓库搭建与生命周期策略、ECS Exec 调试、服务弹性扩缩容、部署策略、负载均衡器集成以及日志配置。当需要在 AWS 上部署、调试或优化容器时使用。同时适用于容器部署选型(ECS 与 ECS Express 模式对比)、网络模式、健康检查排错、OOM 报错分析、密钥注入、蓝绿部署、ECR 镜像管理,以及 App Runner 停运指南与迁移方案。不适用于 Kubernetes、EKS 或 CI/CD 流水线。

2191Star
211Fork
更新于 2026/7/31
SKILL.md
只读
名称
aws-containers
描述

用于在 ECS、Fargate 和 ECR 上部署及运维容器化工作负载。涵盖任务定义(Task Definition)、Fargate 服务、ECR 镜像仓库搭建与生命周期策略、ECS Exec 调试、服务弹性扩缩容、部署策略、负载均衡器集成以及日志配置。当需要在 AWS 上部署、调试或优化容器时使用。同时适用于容器部署选型(ECS 与 ECS Express 模式对比)、网络模式、健康检查排错、OOM 报错分析、密钥注入、蓝绿部署、ECR 镜像管理,以及 App Runner 停运指南与迁移方案。不适用于 Kubernetes、EKS 或 CI/CD 流水线。

版本
1

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 在无明确指令时容易犯的错误进行了纠正:

  1. 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)。

  2. Fargate 必须使用 awsvpc 网络模式——无一例外。 Agent 经常错误地为 Fargate 任务建议 bridgehost 模式,这会导致注册直接失败。所有 Fargate 任务定义中的 networkMode 必须设为 awsvpc。在 EC2 上推荐使用 awsvpcbridge 模式仅作为遗留模式保留。

  3. 执行角色(Execution role)与任务角色(Task role)切勿混淆。 executionRoleArn:ECS Agent 用于拉取镜像、获取密钥及写入日志。taskRoleArn:应用代码用于调用 AWS API。ECS Exec 权限(ssmmessages:*)应配置在任务角色上。ECR 拉取权限应配置在执行角色上。ecr:GetAuthorizationToken 必须使用 Resource: "*"(属于注册表级别的操作)。

  4. 密钥仅在任务启动时注入——不支持热重载。 密钥修改后需要执行 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 权限。

  5. ALB 销毁注销延迟(Deregistration delay)默认长达 300 秒——建议缩短至 30–60 秒。 这是导致部署缓慢的头号原因。请在目标组(Target Group)上进行设置。该数值应当大于你最长的请求持续时间。

  6. 每个挂载在 ALB 后的 ECS 服务都必须设置 healthCheckGracePeriodSeconds 若不设置,ALB 会在任务就绪前将其判定为不健康,导致熔断器误计失败次数并触发部署回滚。JVM / Spring Boot 应用通常需要 60–120 秒。

  7. 务必开启带回滚功能的部署熔断器(Deployment circuit breaker)。 若未开启,异常部署可能会保持“在进行中”状态长达 30 分钟以上。在 CDK 中:circuitBreaker: { rollback: true }(显式指定该属性即默认开启;enable 默认为 true)。

  8. 私有子网中的 Fargate 任务需要 NAT 网关或全部 4 个 VPC 端点。 必需的端点为:ecr.dkr(接口)、ecr.api(接口)、s3(网关——ECR 将镜像层存放在 S3 中)、logs(接口——用于 CloudWatch)。其中 S3 网关端点最容易遗漏。若要使用 ECS Exec,还需添加 ssmmessages

  9. 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 查看受影响的镜像。

  10. ECS Exec 需要的是任务角色权限,而非执行角色。 任务角色需要 ssmmessages:CreateControlChannelCreateDataChannelOpenControlChannelOpenDataChannel 权限。在开启 enableExecuteCommand 之前启动的任务无法支持 ECS Exec——需强制重新部署。容器镜像必须包含 --command 指定的二进制文件(例如交互式会话所需的 /bin/sh)。如需将命令日志输出到 S3 或 CloudWatch Logs,还须安装 scriptcat。Fargate 平台版本必须为 1.4.0+。

  11. awslogs 日志驱动模式——请检查账号默认设置。 依据 ECS 文档,ECS 服务默认采用 non-blocking(非阻塞)模式,当缓冲区满时会丢弃日志。账号级别的 defaultLogDriverMode 设置可能会覆盖此默认行为。对于要求保证日志送达(如审计/合规)的场景,请在 logConfiguration.options 中显式设置 "mode": "blocking"。运行 aws ecs list-account-settings --name defaultLogDriverMode --effective-settings --output json 查看当前生效的默认值。

  12. App Runner VPC 连接器会将应用发起的全部出站流量路由过 VPC。(App Runner 已停运退役——新客户应改用 ECS Express Mode。)若缺少 NAT 网关,应用代码发起的外部 API 调用和 AWS 服务调用将会中断。App Runner 自身托管的流量(拉取镜像、推送日志、获取密钥)不会经过 VPC,不受此影响。请在应用启动时的数据库连接逻辑中加入带退避策略的重试逻辑。

  13. 针对 desiredCount=1 的零停机部署:请设置 minimumHealthyPercent=100, maximumPercent=200 这需要在部署期间具备同时运行 2 个任务的容量。若需要零停机部署,绝不能将 minimumHealthyPercent 设为 0。

  14. ALB 返回 502 Bad Gateway——按以下顺序排查: (a) 容器未在目标组指定的端口上监听。(b) 容器在响应前崩溃。(c) 任务安全组未放行来自 ALB 安全组在容器端口上的入站流量。(d) 健康检查路径未返回 200。(e) 健康检查超时时间设得比响应时间还短。

  15. Fargate 平台版本:务必使用 LATEST1.4.0 1.3.0 版本将于 2026 年 6 月 15 日弃用,并于 2026 年 6 月 30 日彻底终止支持。

  16. SQS Worker 扩缩容:使用自定义的“单任务积压量”(backlog-per-task)指标。 直接使用原始的 ApproximateNumberOfMessagesVisible 结合目标追踪(Target Tracking)无法正常工作,因为增加任务并不会等比例降低队列深度。请使用自定义指标(ApproximateNumberOfMessagesVisible / RunningTaskCount)结合目标追踪,或者使用步进扩缩容(Step Scaling)。CDK 的 QueueProcessingFargateService 已通过 scalingSteps 自动处理了此逻辑。Worker 必须能在 stopTimeout 时间内(默认 30 秒,Fargate 上最高 120 秒)优雅处理 SIGTERM 信号。

  17. 蓝绿部署:对于新服务,请使用 ECS 原生蓝绿部署(2025 年 7 月起提供)。 支持全量(all-at-once)、金丝雀(canary)和线性(linear)流量切流(金丝雀/线性于 2025 年 10 月新增),并支持 Service Connect、无头服务(headless services)、EBS 卷及生命周期钩子(lifecycle hooks)。CodeDeploy 蓝绿部署现已废弃——原生 ECS 蓝绿部署已具备完整的功能对等性。

  18. 容器依赖 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 形式。

仅当对话需要更深入的细节时再读取参考文件。