

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

# 为 Beanstalk 集群环境构建容器映像
<a name="beanstalk-cluster-app-versions"></a>

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

对于 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 一般参考*](https://docs.amazonaws.cn/general/latest/gr/codebuild.html)。 Amazon CodeBuild 在其他区域，请提供预先构建的容器`ImageConfiguration.Source`镜像。

## 先决条件
<a name="beanstalk-cluster-app-versions-prerequisites"></a>

本主题中的示例使用 Amazon CLI。在运行命令之前对其进行安装和配置；它们在您的 Amazon CLI 配置中使用账户和 Amazon 区域。请参阅[开始前的准备工作](beanstalk-cluster-getting-started.md#beanstalk-cluster-getting-started-prerequisites)。

准备以下资源和访问权限：
+ 对于源代码版本，是`CodeBuildServiceRole`必需的`ImageConfiguration.Build`。这是环境的*镜像构建角色*，Elastic Beanstalk 控制台将其创建为该角色。`aws-elasticbeanstalk-eks-image-build-role`有关其可信服务和策略以及角色界限的信息，请参阅[您提供的角色](beanstalk-cluster-permissions.md#beanstalk-cluster-permissions-customer-roles)和[Beanstalk 集群的权限](beanstalk-cluster-permissions.md)。
+ 对于`ImageConfiguration.Source`，是已经推送到其注册表的容器镜像。环境使用的节点角色必须能够拉取镜像。请参阅[您提供的角色](beanstalk-cluster-permissions.md#beanstalk-cluster-permissions-customer-roles)。
+ 对于源代码构建，a`SourceBundle`，包含应用程序源的 Amazon S3 对象。按照中所述创建档案[创建 Elastic Beanstalk 应用程序源包](applications-sourcebundle.md)，将其上传到您账户中的 Amazon S3 存储桶，然后将存储桶和对象密钥作为`S3Bucket`和传递`S3Key`。设置`Process``true`为可开始构建；否则版本保持不变`UNPROCESSED`。

## 容器图像输入
<a name="beanstalk-cluster-app-versions-image"></a>

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

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

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

## 为 Elastic Beanstalk 提供构建来源
<a name="beanstalk-cluster-app-versions-source"></a>

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

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

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

## 构建配置
<a name="beanstalk-cluster-app-versions-buildconfig"></a>

的`Build`成员`ImageConfiguration`附带源包，用于控制 Elastic Beanstalk 如何构建映像。它在接下来描述的版本类型旁边带有以下字段：
+ `CodeBuildServiceRole`，即 Amazon CodeBuild 假设在您的账户中运行构建的 IAM 角色。此字段是源代码版本的必填字段。
+ `ComputeType`，构建计算的可选大小：`BUILD_GENERAL1_SMALL``BUILD_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 集群环境的配置选项](command-options-general-eks.md)。

## 检查和监控处理状态
<a name="beanstalk-cluster-app-versions-processing"></a>

在 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`。处理成功仅证明该映像适用于应用程序版本；它并不能验证环境部署。

## 示例应用程序
<a name="beanstalk-cluster-app-versions-sample"></a>

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

## 示例
<a name="beanstalk-cluster-app-versions-example"></a>

以下`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 环境](customize-containers.md)。

## 删除和恢复应用程序版本
<a name="beanstalk-cluster-app-versions-delete"></a>

应用程序版本生命周期策略不会删除 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`，然后创建更正后的版本。