使用 Amazon ECS 平台分支 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Amazon ECS 平台分支

本主题介绍了在 Amazon Linux 2 上运行的 Amazon ECS 平台分支,以及它替换的平台分支,即,AL1 上的多容器 Docker(也由 ECS 托管)。除非另有说明,本主题中的所有信息均适用于这两个平台分支。

注意

2022 年 7 月 18 日,Elastic Beanstalk 将基于 Amazon Linux AMI(AL1)的所有平台分支的状态设置为已停用

从 AL1 上的多容器 Docker 迁移

如果您目前在使用已停用的在 AL1 上运行的多容器 Docker,则可以迁移到最新的在 AL2023 上运行的 ECS 平台分支。最新的平台分支支持已停产平台分支的所有功能。源代码无需更改。有关更多信息,请参阅将在 Amazon Linux 上运行的多容器 Docker 迁移到 Amazon Linux 2023 上的 ECS

ECS 托管的 Docker 平台

Elastic Beanstalk 使用 Amazon Elastic Container Service (Amazon ECS) 来协调 ECS 托管式 Docker 环境中的容器部署。Amazon ECS 提供工具来管理运行 Docker 容器的实例的集群。Elastic Beanstalk 处理 Amazon ECS 任务,包括集群创建、任务定义和执行。环境中的每个实例都运行相同的容器组,如 Dockerrun.aws.json v2 文件所定义。为了充分利用 Docker,Elastic Beanstalk 允许您创建 Amazon EC2 实例可在其中并排运行多个 Docker 容器的环境。

下图显示了一个示例 Elastic Beanstalk 环境,该环境配置有三个在 Auto Scaling 组中的每个 Amazon EC2 实例上运行的 Docker 容器:

注意

Elastic Beanstalk 为其所有平台提供了可扩展性功能,以用来自定义应用程序的部署和运行。对于在 Amazon Linux 2 上运行的 ECS 平台分支,这些功能的实例部署工作流实现与其他平台有所不同。有关更多信息,请参阅在 Amazon Linux 2 及更高版本上运行的 ECS 的实例部署工作流

Dockerrun.aws.json file

容器实例 – 在 Elastic Beanstalk 环境中运行 ECS 托管式 Docker 的 Amazon EC2 实例 – 需要名为 Dockerrun.aws.json 的配置文件。此文件特定于 Elastic Beanstalk,可以单独使用,也可以与源包中的源代码和内容结合使用,以在 Docker 平台上创建环境。

注意

Dockerrun.aws.json 格式的版本 1 用于将单个 Docker 容器启动到 Amazon Linux AMI(Amazon Linux 2 之前的版本)上运行的 Elastic Beanstalk 环境。该环境基于 64 位 Amazon Linux 上运行的 Docker 平台分支(将于 2022 年 7 月 18 日停用)。要了解有关 Dockerrun.aws.json v1 格式的更多信息,请参阅 Docker 平台配置 - 不含 Docker Compose

Dockerrun.aws.json 版本 2 格式增加了对每个 Amazon EC2 实例对应多个容器的支持,并且只能与 ECS 托管的 Docker 平台一起使用。格式与上一个版本存在很大的差异。

有关更新的格式和示例文件的详细信息,请参阅Dockerrun.aws.json v2

Docker 映像

适用于 Elastic Beanstalk 的 ECS 托管式 Docker 平台需要预构建映像并将其存储在公有或私有的在线映像存储库中。

注意

Elastic Beanstalk 上的 ECS 托管式 Docker 平台不支持使用 Dockerfile 在部署期间构建自定义映像。在创建 Elastic Beanstalk 环境之前,先构建映像并将其部署到在线存储库中。

Dockerrun.aws.json v2 中按名称指定映像。记下这些约定:

  • Docker Hub 上的官方存储库中的映像使用一个名称 (例如,ubuntumongo)。

  • Docker Hub 上其他存储库中的映像通过组织名称 (例如,amazon/amazon-ecs-agent) 进行限定。

  • 其他在线注册表中的映像由域名 (例如,quay.io/assemblyline/ubuntu) 进行进一步限定。

要将 Elastic Beanstalk 配置为向私有存储库进行身份验证,请在 authentication v2 文件中包含 Dockerrun.aws.json 参数。

容器实例角色

Elastic Beanstalk 将 Amazon ECS 优化的 AMI 与在 Docker 容器中运行的 Amazon ECS 容器代理结合使用。该代理与 Amazon ECS 通信以协调容器部署。为了与 Amazon ECS 通信,每个 Amazon EC2 实例都必须在 IAM 中具有相应的权限。当您在 Elastic Beanstalk 控制台中创建环境时,这些权限将附加到默认的实例配置文件

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ECSAccess", "Effect": "Allow", "Action": [ "ecs:Poll", "ecs:StartTask", "ecs:StopTask", "ecs:DiscoverPollEndpoint", "ecs:StartTelemetrySession", "ecs:RegisterContainerInstance", "ecs:DeregisterContainerInstance", "ecs:DescribeContainerInstances", "ecs:Submit*" ], "Resource": "*" } ] }

如果您自行创建实例配置文件,可连接 AWSElasticBeanstalkMulticontainerDocker 托管策略,以确定许可保持最新。有关在 IAM 中创建策略和角色的说明,请参阅《IAM 用户指南》中的创建 IAM 角色

由 Elastic Beanstalk 创建的 Amazon ECS 资源

当您使用 ECS 托管的 Docker 平台创建环境时,Elastic Beanstalk 会在构建环境的同时自动创建并配置多个 Amazon Elastic Container Service 资源。在此过程中,它会在每个 Amazon EC2 实例上创建所需的容器。

  • Amazon ECS 集群 – Amazon ECS 中的容器实例被组成集群。与 Elastic Beanstalk 一起使用时,始终为每个 ECS 托管式 Docker 环境创建一个集群。

  • Amazon ECS 任务定义 – Elastic Beanstalk 使用您项目中的 Dockerrun.aws.json v2 生成用于在环境中配置容器实例的 Amazon ECS 任务定义。

  • Amazon ECS 任务 – Elastic Beanstalk 与 Amazon ECS 进行通信以在环境中的每个实例上运行一个任务,从而协调容器部署。在可扩展的环境中,只要将一个实例添加到集群中,Elastic Beanstalk 就会启动一个新任务。在极少数情况下,您可能需要增加为容器和映像预留的空间量。请阅读配置 Docker 环境部分了解更多信息。

  • Amazon ECS 容器代理 – 代理在环境中实例上的 Docker 容器中运行。该代理轮询 Amazon ECS 服务并等待任务运行。

  • Amazon ECS 数据卷 – Elastic Beanstalk 在任务定义中插入卷定义(除了您在 Dockerrun.aws.json v2 中定义的卷之外),以方便日志收集。

    Elastic Beanstalk 在 /var/log/containers/containername 处的容器实例上创建日志卷(为每个容器创建一个日志卷)。这些卷将命名为 awseb-logs-containername 并提供给要挂载的容器。请参阅 容器定义格式 以了解有关如何装载容器的详细信息。

使用多个 Elastic Load Balancing 侦听器

您可以在 ECS 托管式 Docker 环境中配置多个 Elastic Load Balancing 侦听器,以支持不在默认 HTTP 端口上运行的代理或其他服务的入站流量。

在您的源包中创建一个 .ebextensions 文件夹并添加一个文件扩展名为 .config 的文件。以下示例显示了用于在端口 8080 上创建 Elastic Load Balancing 侦听器的配置文件。

.ebextensions/elb-listener.config

option_settings: aws:elb:listener:8080: ListenerProtocol: HTTP InstanceProtocol: HTTP InstancePort: 8080

如果您的环境在您创建的自定义 Amazon Virtual Private Cloud (Amazon VPC) 中运行,则 Elastic Beanstalk 会处理其余任务。在默认 VPC 中,您需要配置实例的安全组以允许来自负载均衡器的入口流量。添加将入口流量规则添加到安全组的第二个配置文件:

.ebextensions/elb-ingress.config

Resources: port8080SecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]} IpProtocol: tcp ToPort: 8080 FromPort: 8080 SourceSecurityGroupName: { "Fn::GetAtt": ["AWSEBLoadBalancer", "SourceSecurityGroup.GroupName"] }

有关配置文件格式的更多信息,请参阅添加和自定义 Elastic Beanstalk 环境资源选项设置

除了将侦听器添加到 Elastic Load Balancing 配置并在安全组中打开端口外,您还需要将主机实例上的端口映射到 Dockerrun.aws.json v2 文件 containerDefinitions 部分的 Docker 容器上的端口。以下摘录显示了一个示例:

"portMappings": [ { "hostPort": 8080, "containerPort": 8080 } ]

有关 Dockerrun.aws.json v2 文件格式的详细信息,请参阅 Dockerrun.aws.json v2

失败的容器部署

如果 Amazon ECS 任务失败,您的 Elastic Beanstalk 环境中的一个或多个容器将不会启动。由于 Amazon ECS 任务失败,Elastic Beanstalk 不会回滚多容器环境。如果容器在您的环境中无法启动,请从 Elastic Beanstalk 控制台中重新部署当前版本或以前的正常工作版本。

部署现有版本
  1. 在您环境的区域中打开 Elastic Beanstalk 控制台。

  2. 单击应用程序名称右侧的操作,然后单击查看应用程序版本

  3. 选择应用程序的版本,然后单击部署