0Pricing
AWS Solutions Architect · 课时

ECS 集群、任务定义与服务

使用容器镜像和资源限制定义 ECS 任务定义,将其注册到集群中,并创建服务以维持所需数量

ECS 集群、任务定义与服务 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

为什么在 AWS 上使用容器?

容器会将应用程序及其所有依赖项打包成可移植、相互隔离的单元,使其能够在不同环境中保持一致地运行。Amazon ECS(弹性容器服务)是 AWS 完全托管的容器编排服务,可运行 Docker 容器,而无需您管理控制平面。ECS 与 AWS 服务(IAM、ALB、CloudWatch、Secrets Manager)深度集成,是在不引入 Kubernetes 复杂性的情况下于 AWS 上运行容器的推荐方式。

ECS 集群:分组单元

ECS 集群是运行容器的计算资源逻辑分组。一个集群可以包含 EC2 实例(EC2 启动类型)、Fargate 容量(Fargate 启动类型),也可以同时包含两者。一个集群中可以有多个服务和独立任务。集群具有区域性,但会跨越多个可用区。常见做法是为每个环境(开发、预发布、生产)设置一个集群,并在每个集群中为不同微服务运行多个服务。

aws ecs create-cluster \
  --cluster-name 'MyAppCluster' \
  --capacity-providers FARGATE FARGATE_SPOT \
  --default-capacity-provider-strategy \
    capacityProvider=FARGATE,weight=1,base=1

任务定义:蓝图

任务定义是 ECS 中运行容器的蓝图,类似于 Docker Compose 文件。它指定:容器映像(ECR URI 或 Docker Hub)、CPU 和内存分配、端口映射、环境变量、日志配置、卷以及 IAM 任务角色。任务定义采用版本控制,每个修订版本都是不可变的。您可以为每个任务定义多个容器,以实现边车模式(主应用程序 + 日志转发器 + 监控代理)。

{
  'family': 'myapp-task',
  'networkMode': 'awsvpc',
  'requiresCompatibilities': ['FARGATE'],
  'cpu': '512',
  'memory': '1024',
  'executionRoleArn': 'arn:aws:iam::123456789012:role/ecsTaskExecutionRole',
  'taskRoleArn': 'arn:aws:iam::123456789012:role/myAppTaskRole',
  'containerDefinitions': [{
    'name': 'myapp',
    'image': '123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:latest',
    'portMappings': [{'containerPort': 8080}]
  }]
}

任务角色与执行角色

ECS 任务使用两个用途不同的独立 IAM 角色。任务执行角色由 ECS 代理使用,用于从 ECR 拉取容器映像、将日志发送到 CloudWatch,以及在任务启动期间从 Secrets Manager 或 Parameter Store 获取密钥。任务角色由容器内运行的应用程序代码使用,用于调用 AWS 服务(S3、DynamoDB、SQS)。请始终分别为每个角色分配最小权限,切勿向执行角色授予应用程序不需要的权限。

用于长时间运行工作负载的 ECS 服务

ECS 服务会维护指定数量的同时运行任务实例(即所需数量)。如果任务失败或停止,服务调度器会自动启动替代任务。服务还可以与 Elastic Load Balancing 集成以分配流量,并支持滚动部署和蓝绿部署。对于任何长时间运行的进程(Web 服务器、API 服务器、后台工作进程),请使用服务。对于一次性作业,请改为运行独立任务。

aws ecs create-service \
  --cluster 'MyAppCluster' \
  --service-name 'MyAppService' \
  --task-definition 'myapp-task:5' \
  --desired-count 3 \
  --launch-type FARGATE \
  --network-configuration '{
    "awsvpcConfiguration": {
      "subnets": ["subnet-aaa111", "subnet-bbb222"],
      "securityGroups": ["sg-xyz"],
      "assignPublicIp": "DISABLED"
    }
  }'

网络模式:awsvpc 与 bridge

awsvpc网络模式会为每个 ECS 任务分配其自己的弹性网络接口(ENI)和 VPC 内的私有 IP 地址,就像 EC2 实例一样。这使您能够针对每个任务进行细粒度的安全组控制,并且 Fargate 任务必须使用此模式。bridge网络模式使用主机上 Docker 内置的虚拟网络,并通过端口映射将主机端口映射到容器端口,同时共享主机 EC2 实例的 ENI。对于 SAA-C03 考试,请记住:Fargate 始终使用 awsvpc;EC2 启动类型可以使用任一模式。

将负载均衡器附加到 ECS 服务

请将 ECS 服务注册到 ALB 目标组,以便在任务实例之间分配流量。新任务启动时,ECS 会自动将其注册到目标组;任务停止时,ECS 会将其注销。请配置运行状况检查宽限期(例如 60-120 秒),为容器留出启动时间,然后再执行运行状况检查。如果没有宽限期,ALB 可能会在容器准备就绪前将启动缓慢的容器标记为运行状况不佳,从而导致反复替换任务。

aws ecs create-service \
  --cluster 'MyAppCluster' \
  --service-name 'MyAppService' \
  --load-balancers \
    'targetGroupArn=arn:aws:elasticloadbalancing:...,containerName=myapp,containerPort=8080' \
  --health-check-grace-period-seconds 120 \
  --task-definition 'myapp-task:5' \
  --desired-count 3

滚动部署与蓝绿部署

ECS 服务支持两种部署策略:滚动更新会逐步用新任务替换旧任务,可通过 minimumHealthyPercent(下限)和 maximumPercent(上限)进行配置。将两者设置为 100/200 表示在启动新任务的同时运行旧任务(要求保持 100% 的运行状况良好任务,容量最多可达到 200%)。蓝绿部署(通过 AWS CodeDeploy)会在旧任务旁边创建新的任务集,利用 ALB 加权路由逐步转移流量,并在验证完成后终止旧任务。蓝绿部署支持零停机回滚。

来自 ECS 的 CloudWatch 日志

请在任务定义中配置 awslogs 日志驱动程序,将容器的标准输出和标准错误直接发送到 CloudWatch Logs。请指定日志组、区域和流前缀。任务执行角色需要 logs:CreateLogStream 和 logs:PutLogEvents 权限。若要集中聚合多个服务的日志,可以考虑使用 FireLens(带有 Fluent Bit 或 Fluentd 的边车容器),将日志路由到 S3、OpenSearch 或第三方日志系统。

'logConfiguration': {
    'logDriver': 'awslogs',
    'options': {
        'awslogs-group': '/ecs/myapp',
        'awslogs-region': 'us-east-1',
        'awslogs-stream-prefix': 'myapp'
    }
}

使用 Cloud Map 实现 ECS 服务发现

当 ECS 中的微服务需要相互通信时,硬编码的 IP 地址无法正常工作,因为任务具有临时性,每次启动都会获得新的 IP。请使用 AWS Cloud Map(ECS 服务发现)将每个任务的 IP 和端口注册到 DNS 命名空间中。其他服务解析 myservice.namespace.local,即可获得当前运行状况良好的任务 IP。ECS 会自动注册新任务并注销失败的任务,无需手动管理即可使 DNS 记录保持准确。

ECS 任务定义中的密钥

切勿在任务定义中硬编码凭证。请改为在任务定义中引用 Secrets Manager 或 Parameter Store 密钥,ECS 会在任务启动时将其注入为环境变量。任务执行角色必须具有获取这些密钥的权限。对于 Secrets Manager,请使用 secretsmanager:GetSecretValue;对于 Parameter Store,请使用 ssm:GetParameters。密钥只会在容器启动时获取一次;轮换密钥后,必须替换任务才能获取新值。

'secrets': [
    {
        'name': 'DB_PASSWORD',
        'valueFrom': 'arn:aws:secretsmanager:us-east-1:123456789012:secret:myapp/db-password-AbCdEf'
    },
    {
        'name': 'API_KEY',
        'valueFrom': 'arn:aws:ssm:us-east-1:123456789012:parameter/myapp/api-key'
    }
]

快速检查

请测试您对本课 AWS 解决方案架构师(SAA-C03)概念的理解。

课程回顾

在本课中,您学习了以下内容:ECS 集群对运行任务的计算资源进行分组;任务定义以版本化蓝图的形式定义容器映像、CPU/内存、角色和日志配置;ECS 服务维护所需任务数量,与 ALB 集成以分配流量,并支持滚动部署或蓝绿部署。接下来,我们将比较 EC2 启动类型与无服务器 Fargate 启动类型。

常见问题解答

「ECS 集群、任务定义与服务」课时是免费的吗?

是的 — 「ECS 集群、任务定义与服务」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「ECS 集群、任务定义与服务」这节课中我会学到什么?

使用容器镜像和资源限制定义 ECS 任务定义,将其注册到集群中,并创建服务以维持所需数量 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「ECS 集群、任务定义与服务」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. ECS 集群、任务定义与服务
  2. EC2 启动类型与 Fargate
  3. ECR:存储和拉取容器镜像
  4. ECS 服务自动扩展与负载均衡
← 返回 AWS Solutions Architect