任务定义注意事项 - Amazon ECS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

任务定义注意事项

使用 Fargate 启动类型的任务并不支持所有可用的 Amazon ECS 任务定义参数。某些参数完全不受支持,而其他参数对于 Fargate 任务的行为则不同。

以下任务定义参数在 Fargate 任务中无效:

  • devices

  • disableNetworking

  • dnsSearchDomains

  • dnsServers

  • dockerSecurityOptions

  • dockerVolumeConfiguration

  • extraHosts

  • host

  • hostname

  • links

  • placementConstraints — 默认情况下,Fargate 任务分布在可用区中。

  • privileged

  • sharedMemorySize

  • tmpfs

重要

当任一任务定义参数不受支持时,假定该参数的任何子标志也不受支持。

以下任务定义参数在用于 Fargate 任务时具有不同的行为:

  • 使用 logConfiguration 时,Fargate 任务支持的日志驱动程序是 awslogssplunkawsfirelens 日志驱动程序。

  • linuxParameters 用于 capabilities 时,可以使用 drop 参数,但不支持 add 参数。

  • 只有使用平台版本 1.1.0 或更高版本的 healthCheck 任务支持 Fargate 参数。

  • 如果您使用 portMappings 参数,则应仅指定 containerPort。 可以留空或设置为与 hostPort 相同的值。containerPort

为确保您的任务定义可验证能否用于 Fargate 启动类型,可在注册任务定义时指定以下内容:

  • 在 AWS 管理控制台中,为 Requires Compatibilities (需要兼容性) 字段指定 FARGATE

  • 在 AWS CLI 中,为 --requires-compatibilities 选项指定 FARGATE

  • 在 API 中指定 requiresCompatibilities 标记。

网络模式

Fargate 任务定义需要将网络模式设置为 awsvpc。 网络模式为每个任务提供其自己的弹性网络接口。awsvpc创建服务或手动运行任务时还需要网络配置。有关更多信息,请参阅 Fargate 中的 任务联网适用于 AWS Fargate 的 Amazon Elastic Container Service 用户指南。

任务 CPU 和内存

Fargate 任务定义需要您在任务级别指定 CPU 和内存。虽然您还可以在容器级别为 Fargate 任务指定 CPU 和内存,但这是可选的。只需在任务级别指定这些资源便可满足大多数使用案例。下表显示了任务级 CPU 和内存的有效组合。

CPU 值

内存值

256 (.25 vCPU)

0.5GB、1GB、2GB

512 (.5 vCPU)

1GB、2GB、3GB、4GB

1024 (1 vCPU)

2GB、3GB、4GB、5GB、6GB、7GB、8GB

2048 (2 vCPU)

4GB 到 16GB 之间(以 1GB 为增量)

4096 (4 vCPU)

8GB 到 30GB 之间(以 1GB 为增量)

Logging

Fargate 任务定义只支持用于日志配置的 awslogssplunkawsfirelens 日志驱动程序。以下代码显示了任务定义中配置 awslogs 日志驱动程序的代码段:

"logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group" : "/ecs/fargate-task-definition", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "ecs" }

有关如何在任务定义中使用 awslogs 日志驱动程序以将容器日志发送到 CloudWatch Logs 的更多信息,请参阅使用 awslogs 日志驱动程序

有关在任务定义中使用 awsfirelens 日志驱动程序的更多信息,请参阅自定义日志路由

Amazon ECS 任务执行 IAM 角色

可以使用 Fargate 指定一个可选的任务执行 IAM 角色,以允许您的 Fargate 任务对 Amazon ECR 进行 API 调用。这些 API 调用会拉取容器映像并调用 CloudWatch 来存储容器应用程序日志。有关更多信息,请参阅Amazon ECS 任务执行 IAM 角色

示例任务定义

以下是使用 Fargate 启动类型设置 Web 服务器的示例任务定义:

{ "containerDefinitions": [ { "command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ], "entryPoint": [ "sh", "-c" ], "essential": true, "image": "httpd:2.4", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group" : "/ecs/fargate-task-definition", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "ecs" } }, "name": "sample-fargate-app", "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ] } ], "cpu": "256", "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole", "family": "fargate-task-definition", "memory": "512", "networkMode": "awsvpc", "requiresCompatibilities": [ "FARGATE" ] }

任务存储

对于 Fargate 上的 Amazon ECS 任务,支持以下存储类型:

  • Amazon EFS 卷(用于持久性存储)。有关更多信息,请参阅 Amazon EFS 卷

  • 临时存储(用于非持久性存储)。

预置后,Fargate 上的每个 Amazon ECS 任务都会收到以下短暂存储。短暂存储配置取决于任务所使用的平台版本。 Fargate 任务停止后,短暂存储将被删除。有关 Amazon ECS 默认服务限制的更多信息,请参阅Amazon ECS 服务配额

使用平台版本 1.4.0 或更高版本的 Fargate 任务

使用平台版本 1.4.0 或更高版本的 Fargate 任务上的所有 Amazon ECS 都会获得至少 20 GB 的短暂存储。为任务拉取、压缩和未压缩的容器映像都存储在短暂存储中。要确定任务必须使用的短暂存储总量,必须从总容量中减去容器映像使用的存储量。短暂存储量是不可调节的。

对于使用平台版本 1.4.0 或更高版本且在 2020 年 5 月 28 日或之后启动的任务,将使用 AES-256 加密算法通过 AWS Fargate 托管加密密钥对短暂存储进行加密。

使用平台版本 1.3.0 或更早版本的 Fargate 任务

对于使用平台版本 1.3.0 或更早版本的 Fargate 任务上的 Amazon ECS,每个任务都会收到以下短暂存储。

  • 10 GB 的 Docker 层存储

    注意

    此数量包括压缩和未压缩的容器映像构件。

  • 额外 4 GB 用于卷挂载。可在任务定义中使用 volumesmountPointsvolumesFrom 参数挂载此存储和在容器之间共享此存储。

    注意

    hostsourcePath 参数不支持 Fargate 任务。

示例任务定义

在此示例中,您有两个应用程序容器需要访问同一个临时文件存储位置。

为 Fargate 任务中的容器提供非持久性的空存储

  1. 在任务定义 volumes 部分中,使用名称 application_scratch 定义卷。

    "volumes": [ { "name": "application_scratch", "host": {} } ]
  2. containerDefinitions 部分中,创建应用程序容器定义,以便它们挂载非持久性存储。

    "containerDefinitions": [ { "name": "application1", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_scratch", "containerPath": "/var/scratch" } ] }, { "name": "application2", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_scratch", "containerPath": "/var/scratch" } ] } ]