

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

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

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

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

## 先决条件
<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)。
+ 对于源代码构建`SourceBundle`，a 是包含应用程序源代码的 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) 中，也可以在任何允许未经身份验证的提取的注册表中。对于私有镜像，请使用 Amazon ECR：环境的节点角色对其进行身份验证。根据提供的映像创建的应用程序版本无需构建，因此 Elastic Beanstalk 会将其与状态一起记录下来，`UNPROCESSED`并且已准备好部署到 Beanstalk 集群环境中。

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

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

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

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

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

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

## 构建配置
<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 使用云原生构建包来构建镜像。例如`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
```

这些事件确定哪个阶段失败了。要查看构建本身失败的原因，请使用基于源代码`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`。处理成功只能证明该映像可用于应用程序版本；它不能验证环境部署。

## 示例应用程序
<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"
    }
  }'
```

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

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

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