View a markdown version of this page

为 Beanstalk 集群环境构建容器镜像 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

为 Beanstalk 集群环境构建容器镜像

Beanstalk 集群环境通过容器镜像运行应用程序。与 Beanstalk 标准一样,应用程序版本也部署到环境中。在 Beanstalk 集群环境中,应用程序版本要么提供 Elastic Beanstalk 按原样运行的镜像,要么提供 Elastic Beanstalk 构建到镜像中的来源。本主题涵盖先决条件、创建路径、处理状态以及特定于 Beanstalk 集群环境的删除行为。部署、标记和版本配额在这两种模式下的工作方式相同,一般的创建和删除过程也是如此。请参阅管理应用程序版本和标记应用程序版本。

对于 Beanstalk 集群部署,使用仅包含两个成员ImageConfiguration之一的创建应用程序版本。Source标识已构建的容器镜像,并Build指定 Elastic Beanstalk 如何从源包构建镜像。Elastic Beanstalk 会拒绝同时ImageConfiguration提供两个成员或两者都不提供成员的请求、同时提供ImageConfiguration.Source和 a 的请求SourceBundle,以及ImageConfiguration与BuildConfiguration参数(为 Beanstalk 标准配置 Amazon CodeBuild 应用程序版本)相结合的请求。CreateApplicationVersion以下各节描述了每条路径。

先决条件

本主题中的示例使用 Amazon CLI。在运行命令之前对其进行安装和配置;他们在您的 Amazon CLI 配置中使用账户和 Amazon 区域。请参阅开始前的准备工作。

准备以下资源和访问权限:

  • 对于源代码构建,CodeBuildServiceRole必填项ImageConfiguration.Build。这是环境的镜像构建角色,Elastic Beanstalk 控制台创建时就是这样创建的。aws-elasticbeanstalk-eks-image-build-role有关其可信服务和策略以及角色边界,请参阅您提供的角色和Beanstalk 集群的权限。

  • 例如ImageConfiguration.Source,已经推送到其注册表的容器镜像。环境使用的节点角色必须能够提取映像。请参阅您提供的角色。

  • 对于源代码构建SourceBundle,a 是包含应用程序源代码的 Amazon S3 对象。按照中的说明创建档案创建 Elastic Beanstalk 应用程序源包,将其上传到您账户中的 Amazon S3 存储桶,然后将存储桶和对象密钥作为S3Bucket和传递S3Key。设置Processtrue为开始构建;否则版本保持不变UNPROCESSED。

容器镜像输入

为已经构建并推送到注册表的容器镜像提供Source成员。ImageConfigurationElastic Beanstalk 无需构建步骤即可运行映像。Source带有指向图像的单个字段。Uri该映像可以在亚马逊弹性容器注册表 (Amazon ECR) 中,也可以在任何允许未经身份验证的提取的注册表中。对于私有镜像,请使用 Amazon ECR:环境的节点角色对其进行身份验证。根据提供的映像创建的应用程序版本无需构建,因此 Elastic Beanstalk 会将其与状态一起记录下来,UNPROCESSED并且已准备好部署到 Beanstalk 集群环境中。

无论是命名标签还是摘要,Elastic Beanstalk 都会严格按照您提供的 URI 进行记录。Elastic Beanstalk 构建的图像由摘要记录下来。

当单独的管道生成映像或部署由先前应用程序版本生成的图像时,使用此形状。要让 Elastic Beanstalk 构建镜像,请提供源包和Build成员,如下所述。

为 Elastic Beanstalk 的构建提供源代码

在 Elastic Beanstalk 必须从应用程序源构建容器镜像SourceBundle时提供。使用两个字段SourceBundle标识亚马逊简单存储服务 (Amazon S3) 中的源档案,S3Bucket和S3Key。源包还要求ImageConfiguration其Build成员指定 Elastic Beanstalk 如何将源文件转换为图像。在CreateApplicationVersion请求true中设置Process为开始构建;使用 Amazon CLI,使用--process。如果省略此设置,则基于源代码的应用程序版本将保持不变,UNPROCESSED并且无法开始构建。处理开始时,Elastic Beanstalk 会生成镜像并将其推送到您账户中的亚马逊弹性容器注册表。有关 Docker 和编译包编译类型及其设置,请参阅构建配置。

注意

在 macOS 上,使用zip -X -r ../my-app.zip .源目录内部创建源存档。Finder 的 Comp ress 命令会添加__MACOSX元数据条目,如果命名一个不是你创建的文件zip: not a valid zip file,则构建包可能会在其中一个条目上失败。

构建运行时,应用程序版本会报告状态BUILDING。它移至构建和推送映像的时间,FAILED或者在构建不成功PROCESSED时移动。

构建配置

的Build成员ImageConfiguration随附一个源包,用于控制 Elastic Beanstalk 构建镜像的方式。它带有以下字段以及下文描述的构建类型:

  • CodeBuildServiceRole, Amazon CodeBuild 假定在您的账户中运行构建版本的 IAM 角色。此字段是源代码构建的必填字段。

  • ComputeType,编译版本的可选大小计算为:BUILD_GENERAL1_SMALLBUILD_GENERAL1_MEDIUM、或BUILD_GENERAL1_LARGE。如果你省略它,Elastic Beanstalk 会使用。BUILD_GENERAL1_MEDIUM

  • TimeoutInMinutes,这是可选的分钟数,在此之后,Elastic Beanstalk 会停止尚未完成的构建。该值可以是从头5到尾的480。如果你省略它,Elastic Beanstalk 会占用几分钟。60

Build成员通过其Type字段选择两种版本类型之一,这是必填的:

  • docker,Elastic Beanstalk 根据源代码中的 Dockerfile 构建镜像。设置DockerfileLocation为 Dockerfile 的路径;如果你省略它,Elastic Beanstalk 会使用Dockerfile源文件的根目录。

  • buildpack,Elastic Beanstalk 使用云原生构建包来构建镜像。例如Buildpack,设置为构建器使用的生成器镜像paketobuildpacks/builder-jammy-base;Elastic Beanstalk 将值逐字传递给构建。编译包需要生成器。Elastic Beanstalk 无法为您检测到一个,并且没有生成器集合的编译包编译失败。

该Architecture字段设置映像的目标 CPU 架构,为amd64或arm64。如果你省略它,Elastic Beanstalk 会为之构建。amd64使用与环境arch设置相同的架构进行构建,也默认为amd64。为一种架构构建的映像不能在另一个架构上运行。对于 arch,请参阅Beanstalk 集群环境的配置选项。

检查和监控处理状态

基于源代码的版本会在 Elastic Beanstalk 构建其镜像BUILDING时进行报告。仅在它报告之后才进行部署PROCESSED。状态为FAILED表示构建不成功,版本无法部署。状态为UNPROCESSED表示处理未开始,例如CreateApplicationVersion请求省略时Process。根据提供的映像创建的应用程序版本也会报告UNPROCESSED,但由于其映像不需要构建,因此可以随时部署。

应用程序版本的描述将其映像状态报告为两个成员,ImageSource和ImageBuildConfiguration。对于基于源代码的版本,ImageBuildConfiguration会呼应编译设置,ImageSource并且在版本报告时不存在。BUILDING构建成功后,ImageSource返回构建生成和推送的图像的摘要固定的 URI。

使用DescribeApplicationVersions检查源版本的处理状态。设置operation_start为紧接在CreateApplicationVersion请求之前记录的时间戳;随后的事件查询使用它来将事件范围限定为构建。

$ aws elasticbeanstalk describe-application-versions \ --application-name my-app \ --version-labels v1-build \ --query 'ApplicationVersions[0].Status' \ --output text

重复此命令,直到版本达到终端状态。BUILDING表示构建仍在运行。只有在版本报告之后才能部署该版本PROCESSED;状态为FAILED或UNPROCESSED表示无法部署该版本。

对于基于源代码的版本,PROCESSED状态和映像构建完成事件可确认 Elastic Beanstalk 构建并记录了映像。检索特定版本的事件,以区分终端故障和仍在运行的构建:

$ aws elasticbeanstalk describe-events \ --application-name my-app \ --version-label v1-build \ --start-time "$operation_start" \ --max-items 20

如果版本达到FAILED,请添加--severity ERROR以检索其失败事件。这些事件区分了源代码下载、角色假设、Amazon ECR 身份验证以及映像构建或推送失败等故障:

$ aws elasticbeanstalk describe-events \ --application-name my-app \ --version-label v1-build \ --severity ERROR \ --start-time "$operation_start" \ --max-items 20

这些事件确定哪个阶段失败了。要查看构建本身失败的原因,请使用基于源代码BuildArn的版本报告的 that,它可以识别运行构建的 Amazon CodeBuild执行情况。将其传递给以下命令以获取构建的状态及其日志的位置:

$ aws codebuild batch-get-builds \ --ids build-arn \ --query 'builds[0].{status:buildStatus,logGroup:logs.groupName,logStream:logs.streamName}'

该响应还带有logs.deepLink,用于在亚马逊 CloudWatch 控制台中打开版本的日志流。

更正事件标识的源位置、编译配置或角色配置。使用新标签创建新的应用程序版本并将其Process设置为true,然后将其轮询到PROCESSED。不要在中部署版本FAILED。处理成功只能证明该映像可用于应用程序版本;它不能验证环境部署。

示例应用程序

创建 Beanstalk 集群环境时,应用程序版本是可选的。当调CreateEnvironment用时没有版本标签(或使用空白标签),Elastic Beanstalk 会部署一个示例应用程序以提供运行环境。Elastic Beanstalk 使用预建的容器镜像来支持示例,因此部署不需要构建步骤。无法将示例应用程序选择或配置为客户应用程序;当未指定版本标签时,Elastic Beanstalk 会将其部署。要部署应用程序,请按照本主题中的说明创建应用程序版本并将其版本标签传递给CreateEnvironment。有关环境创建的信息,请参阅Beanstalk 集群入门。

示例

以下CreateApplicationVersion请求提供了现有的容器镜像。Elastic Beanstalk 按原样运行映像,无需构建。

aws elasticbeanstalk create-application-version \ --application-name my-app \ --version-label v1-image \ --image-configuration Source={Uri=111122223333.dkr.ecr.us-east-1.amazonaws.com/my-app:v1}

以下请求改为在 Amazon S3 中提供源包和构建配置,用于从 Dockerfile 为该arm64架构构建镜像。要运行此映像,请将环境的arch选项也设置arm64为。

operation_start=$(date -u +%Y-%m-%dT%H:%M:%SZ) aws elasticbeanstalk create-application-version \ --application-name my-app \ --version-label v1-build \ --process \ --source-bundle S3Bucket=my-source-bucket,S3Key=my-app/v1.zip \ --image-configuration '{ "Build": { "Type": "docker", "DockerfileLocation": "Dockerfile", "Architecture": "arm64", "CodeBuildServiceRole": "arn:aws:iam::111122223333:role/my-build-role", "ComputeType": "BUILD_GENERAL1_SMALL", "TimeoutInMinutes": 30 } }'

以下请求使用云原生构建包而不是 Dockerfile 来构建镜像。源代码不需要 Dockerfile,生成器决定如何组装镜像。该请求省略了Architecture,因此 Elastic Beanstalk 是为之构建的。amd64

operation_start=$(date -u +%Y-%m-%dT%H:%M:%SZ) aws elasticbeanstalk create-application-version \ --application-name my-app \ --version-label v1-buildpack \ --process \ --source-bundle S3Bucket=my-source-bucket,S3Key=my-app/v1.zip \ --image-configuration '{ "Build": { "Type": "buildpack", "Buildpack": "paketobuildpacks/builder-jammy-base", "CodeBuildServiceRole": "arn:aws:iam::111122223333:role/my-build-role" } }'

在源包构建完成后PROCESSED,通过将其版本标签传递给CreateEnvironment或,将其中任何版本部署到 Beanstalk 集群环境中UpdateEnvironment,就像 Beanstalk 标准应用程序版本一样。要配置运行它的环境,请参阅配置 Elastic Beanstalk 环境。

删除和恢复应用程序版本

应用程序版本生命周期策略不会删除 Beanstalk 集群应用程序版本。DeleteApplicationVersion用于删除应用程序版本记录。当版本存在时,Elastic Beanstalk 会拒绝请求BUILDING;等待终端处理状态后再将其删除。

对于 Beanstalk 集群应用程序版本,该DeleteSourceBundle选项不会从 Amazon S3 中删除源包。 Source-object 保留期是分开管理的。

DeleteApplicationVersion移除 Elastic Beanstalk 应用程序版本记录。它不会删除通过提供的图像ImageConfiguration.Source、源版本生成的图像或包含该图像的 Amazon ECR 存储库。您可以管理您提供的图像的保留。当 Elastic Beanstalk 为源版本创建 Amazon ECR 存储库时,它会对该存储库应用生命周期策略;删除一个应用程序版本不会立即执行映像或存储库清理。

无法部署FAILED处于该状态的基于源的版本。更正源代码或编译版本配置,CreateApplicationVersion使用新版本标签调用并将其Process设置为true。要重复使用失败版本的标签,请先在版本记录离开后将其删除BUILDING,然后创建更正后的版本。