View a markdown version of this page

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

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

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

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

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

注意

Elastic Amazon CodeBuild Beanstalk 用于从源代码构建容器镜像,因此该功能在支持的区域中可用 Amazon 。 Amazon CodeBuild有关可用区域的列表,请参阅中的Amazon CodeBuild 终端节点和配额Amazon Web Services 一般参考。 Amazon CodeBuild 在其他区域,请提供预先构建的容器ImageConfiguration.Source镜像。

先决条件

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

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

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

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

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

容器图像输入

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

无论是命名标签还是摘要,Elastic Beanstalk 都会完全按照你提供的方式记录 URI。Elastic Beanstalk 构建的图像由摘要记录下来。

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

为 Elastic Beanstalk 提供构建来源

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

注意

在 macOS 上,zip -X -r ../my-app.zip .从源目录中使用创建源存档。Finder 的 C ompres s 命令会添加__MACOSX元数据条目,而其中一个条目的 buildpack 构建可能会失败zip: not a valid zip file,命名不是你创建的文件。

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

构建配置

的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 使用 Cloud Native Buildpack 构建镜像。例如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

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

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

响应中还带有logs.deepLink,用于在 Amazon 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" } }'

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

删除和恢复应用程序版本

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

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

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

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