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

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

Elastic Beanstalk 自定义平台

注意

2022 年 7 月 18 日,Elastic Beanstalk 将基于 Amazon Linux AMI(AL1)的所有平台分支的状态设置为已停用这包括自定义平台。Elastic Beanstalk 不支持自定义平台。有关停用 Amazon Linux AMI 的 Elastic Beanstalk 的更多信息,请参阅 平台停用常见问题

本文档中保留了此主题,供在 ElasticBeanstalk 自定义平台功能停用之前使用该功能的客户参考。过去,Elastic Beanstalk 自定义平台支持从 Amazon Linux AMI、RHEL 7、RHEL 6 或 Ubuntu 16.04 基础 AMI 构建 AMI。Elastic Beanstalk 不再支持这些操作系统。若要详细了解不再支持的自定义平台功能,请展开以下主题。

从很多方面而言,自定义平台都是比自定义映像更高级的自定义方式。您可通过自定义平台从头开始开发整个新平台,自定义 Elastic Beanstalk 在平台实例上运行的操作系统、附加软件和脚本。如果 Elastic Beanstalk 并未针对应用程序使用的语言或其他基础设施软件提供托管平台,您也可以灵活地为应用程序构建一个平台。自定义映像是由您修改 Amazon Machine Image (AMI) 以便与现有 Elastic Beanstalk 平台结合使用,而 Elastic Beanstalk 仍旧提供平台脚本,并控制平台的软件堆栈。此外,对于自定义平台,您使用自动化、脚本化的方式创建自定义并进行维护;而自定义映像是您对正在运行的实例进行手动更改。

要创建自定义平台,您需要基于所支持的操作系统 Ubuntu、RHEL 或 Amazon Linux(有关确切版本号,请参阅 Platform.yaml 文件格式中的 flavor 条目)之一构建 AMI 并进一步添加自定义。您可使用 Packer(一种开源工具,用于为多种平台创建系统映像,包括用于 Amazon Elastic Compute Cloud (Amazon EC2) 的 AMI)创建您自己的 Elastic Beanstalk 平台。Elastic Beanstalk 平台包括被配置为运行一组软件以支持应用程序的 AMI,以及可以包含自定义配置选项和默认配置选项设置的元数据。

Elastic Beanstalk 将 Packer 作为单独的内置平台进行管理,您无需担心 Packer 的配置和版本。

您可以通过为 Elastic Beanstalk 提供 Packer 模板、脚本及供模板调用以构建 AMI 的文件来创建平台。这些组件使用指定模板和元数据的平台定义文件打包成一个称作平台定义存档的 ZIP 存档。

在创建自定义平台时,您可以启动单一实例环境,无需运行 Packer 的弹性 IP。Packer 可以随即启动另一个实例来构建映像。您可以对多个平台及每个平台的多个版本重用此环境。

注意

自定义平台是特定于Amazon区域的。如果您需要在多个区域中使用 Elastic Beanstalk,则必须在每个区域中单独创建平台。

在某些情况下,系统不会清理 Packer 启动的实例,必须手动将其终止。要了解如何手动清理这些实例,请参阅 Packer 实例清理

您账户中的用户可以通过在创建环境期间指定平台 ARN 来使用您的自定义平台。这些 ARN 由您用于创建自定义平台的 eb platform create 命令返回。

您每次构建自定义平台时,Elastic Beanstalk 都会创建新的平台版本。用户可以通过名称指定平台以只获取此平台的最新版本,也可以包含版本号来获取特定的版本。

例如,要部署 ARN 为 MyCustomPlatformARN 的自定义平台的最新版本(可以是 3.0 版),您的 EB CLI 命令行将如下所示:

eb create -p MyCustomPlatformARN

要部署 2.1 版,您的 EB CLI 命令行将如下所示:

eb create -p MyCustomPlatformARN --version 2.1

您可以在创建自定义平台版本和编辑现有自定义平台版本的标签时向其应用标签。有关详细信息,请参阅 标记自定义平台版本

创建自定义平台

要创建自定义平台,应用程序的根目录必须包含一个平台定义 platform.yaml,定义用于创建自定义平台的生成器的类型。此文件的格式在Platform.yaml 文件格式中描述。您可以从头开始创建自定义平台,或使用某个示例自定义平台作为起始点。

使用示例自定义平台

创建您自己的自定义平台的一个替代方法是使用一个平台定义存档示例来引导您的自定义平台。您必须先在示例中配置然后才能使用的唯一项目是源 AMI 和区域。

注意

请勿在生产中使用未经修改的示例自定义平台。示例的目的是展示可用于自定义平台的一些功能,但是它们没有被强化以用于生产环境。

NodePlatform_Ubuntu.zip

此自定义平台基于 Ubuntu 16.04 并支持 Node.js 4.4.4。我们在本节的示例中使用此自定义平台。

NodePlatform_RHEL.zip

此自定义平台基于 RHEL 7.2 并支持 Node.js 4.4.4

NodePlatform_AmazonLinux.zip

此自定义平台基于 Amazon Linux 2016.09.1 并支持 Node.js 4.4.4

TomcatPlatform_Ubuntu.zip

此自定义平台基于 Ubuntu 16.04 并支持 Tomcat 7/Java 8

CustomPlatform_NodeSampleApp.zip

一个使用 expressejs 显示静态网页的 Node.js 示例。

CustomPlatform_TomcatSampleApp.zip

一个在部署时显示静态网页的 Tomcat 示例。

下载示例平台定义存档:NodePlatform_Ubuntu.zip。此文件包含平台定义文件、Packer 模板、Packer 在映像创建期间运行的脚本以及 Packer 在平台创建期间复制到生成器实例上的脚本和配置文件。

例 NodePlatform_Ubuntu.zip
|-- builder Contains files used by Packer to create the custom platform |-- custom_platform.json Packer template |-- platform.yaml Platform definition file |-- ReadMe.txt Briefly describes the sample

平台定义文件 platform.yaml 告知 Elastic Beanstalk Packer 模板 custom_platform.json 的名称。

version: "1.0" provisioner: type: packer template: custom_platform.json flavor: ubuntu1604

Packer 模板告诉 Packer 如何针对平台构建 AMI,而且要使用 Ubuntu AMI 作为 HVM 实例类型的平台映像的基础。provisioners 部分告知 Packer 将存档中 builder 文件夹内的所有文件复制到实例,并在实例上运行 builder.sh 脚本。脚本完成后,Packer 从修改的实例创建映像。

Elastic Beanstalk 创建三个可用于在 Packer 中标记 AMI 的环境变量:

AWS_EB_PLATFORM_ARN

自定义平台的 ARN。

AWS_EB_PLATFORM_NAME

自定义平台的名称。

AWS_EB_PLATFORM_VERSION

自定义平台的版本。

示例 custom_platform.json 文件使用这些变量来定义它在脚本中使用的以下值:

  • platform_name,由 platform.yaml 设置

  • platform_version,由 platform.yaml 设置

  • platform_arn,由主生成脚本 builder.sh 设置,该脚本显示在示例 custom_platform.json 文件的结尾。

custom_platform.json 文件包含两个您必须为其提供值的属性:source_amiregion。有关选择正确的 AMI 和区域值的详细信息,请参阅 eb-custom-platforms-samples GitHub 存储库中的更新 Packer 模板

例 custom_platform.json
{ "variables": { "platform_name": "{{env `AWS_EB_PLATFORM_NAME`}}", "platform_version": "{{env `AWS_EB_PLATFORM_VERSION`}}", "platform_arn": "{{env `AWS_EB_PLATFORM_ARN`}}" }, "builders": [ { ... "region": "", "source_ami": "", ... } ], "provisioners": [ {...}, { "type": "shell", "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo {{ .Path }}", "scripts": [ "builder/builder.sh" ] } ] }

根据要对实例进行的修改,您在平台定义存档中包含的脚本和其他文件将大不相同。示例平台包含以下脚本:

  • 00-sync-apt.sh – 已注释掉:apt -y update。我们已将此命令注释掉,因为它会提示用户输入信息,这样会中断自动软件包更新。Ubuntu 可能会出现此问题。但是,仍建议运行 apt -y update,这是最佳实践。出于此原因,我们在示例脚本中留下了这条命令作为参考。

  • 01-install-nginx.sh – 安装 nginx。

  • 02-setup-platform.sh – 安装 wgettreegit。将挂钩和日志记录配置复制到实例,并创建以下目录:

    • /etc/SampleNodePlatform – 在部署期间上传容器配置文件的位置。

    • /opt/elasticbeanstalk/deploy/appsource/ – 其中 00-unzip.sh 脚本在部署期间上传应用程序代码(有关此脚本的信息,请参阅 平台脚本工具 部分)。

    • /var/app/staging/ – 部署期间应用程序源代码在此进行处理。

    • /var/app/current/ – 应用程序源代码处理后在此运行。

    • /var/log/nginx/healthd/增强型运行状况代理将日志写入到此位置。

    • /var/nodejs – 在部署期间上传 Node.js 文件的位置。

通过 EB CLI 使用示例平台定义存档创建您的第一个自定义平台。

创建自定义平台
  1. 安装 EB CLI

  2. 创建一个目录,您将在其中提取示例自定义平台。

    ~$ mkdir ~/custom-platform
  3. NodePlatform_Ubuntu.zip 提取到目录,然后更改为提取的目录。

    ~$ cd ~/custom-platform ~/custom-platform$ unzip ~/NodePlatform_Ubuntu.zip ~/custom-platform$ cd NodePlatform_Ubuntu
  4. 编辑 custom_platform.json 文件,并为 source_amiregion 属性提供值。有关详细信息,请参阅更新 Packer 模板

  5. 运行 eb platform init 并按照提示初始化平台存储库。

    您可以将 eb platform 缩短为 ebp

    注意

    Windows PowerShell 使用 ebp 作为命令别名。如果您在 Windows PowerShell 中运行 EB CLI,请使用此命令的长格式 eb platform

    ~/custom-platform$ eb platform init

    该命令还会在当前目录中创建目录 .elasticbeanstalk 并将配置文件 config.yml 添加到该目录中。请勿更改或删除此文件,因为 Elastic Beanstalk 在创建自定义平台时依赖此文件。

    默认情况下,eb platform init 使用当前文件夹的名称作为自定义平台的名称,在此示例中这将是 custom-platform

  6. 运行 eb platform create 以启动 Packer 环境并获取自定义平台的 ARN。稍后您需要此值从自定义平台创建环境。

    ~/custom-platform$ eb platform create ...

    默认情况下,Elastic Beanstalk 为自定义平台创建实例配置文件 aws-elasticbeanstalk-custom-platform-ec2-role。但是,如果您想使用现有实例配置文件,请向 eb platform create 命令中添加选项 -ip INSTANCE_PROFILE

    注意

    如果您使用 Elastic Beanstalk 默认实例配置文件 aws-elasticbeanstalk-ec2-role,Packer 将无法创建自定义平台。

    EB CLI 会显示 Packer 环境的事件输出,直到构建完成。您可以按 Ctrl+C 来退出事件视图。

  7. 您可以使用 eb platform logs 命令检查日志有无错误。

    ~/custom-platform$ eb platform logs ...
  8. 稍后,您可以使用 eb platform events 来检查过程。

    ~/custom-platform$ eb platform events ...
  9. 使用 eb platform status 检查平台状态。

    ~/custom-platform$ eb platform status ...

操作完成后,您就拥有了一个可以用于启动 Elastic Beanstalk 环境的平台。

在从控制台创建环境时,可以使用自定义平台。请参阅创建新环境向导

在您的自定义平台上启动环境
  1. 为您的应用程序创建一个目录。

    ~$ mkdir custom-platform-app ~$ cd ~/custom-platform-app
  2. 初始化应用程序存储库。

    ~/custom-platform-app$ eb init ...
  3. 下载示例应用程序 NodeSampleApp.zip

  4. 提取示例应用程序。

    ~/custom-platform-app$ unzip ~/NodeSampleApp.zip
  5. 运行 eb create -p CUSTOM-PLATFORM-ARN,其中 CUSTOM-PLATFORM-ARNeb platform create 命令返回的 ARN,用于启动运行您自定义平台的环境。

    ~/custom-platform-app$ eb create -p CUSTOM-PLATFORM-ARN ...

平台定义存档内容

平台定义存档是相当于应用程序源包的平台。平台定义存档是一种 ZIP 文件,其中包含平台定义文件、Packer 模板以及 Packer 模板用来创建平台的脚本和文件。

注意

当您使用 EB CLI 创建自定义平台时,EB CLI 将从平台存储库中的文件和文件夹创建平台定义存档,因此您不需要手动创建存档。

平台定义文件是 YAML 格式的文件,名称必须为 platform.yaml 并且位于平台定义存档的根目录中。有关平台定义文件中支持的必需和可选键的列表,请参阅 创建自定义平台

您不必以特定方式命名 Packer 模板,但文件的名称必须与平台定义文件中指定的配置器模板匹配。有关创建 Packer 模板的说明,请参阅官方 Packer 文档

您的平台定义存档中的其他文件是模板在创建 AMI 之前自定义实例所要使用的脚本和文件。

自定义平台挂钩

Elastic Beanstalk 在自定义平台上为挂钩使用了标准化的目录结构。挂钩是在生命周期事件期间运行以响应管理操作的脚本,如启动环境中的实例时、当用户启动部署或使用重新启动应用程序服务器功能时。

将您希望挂钩触发的脚本置于 /opt/elasticbeanstalk/hooks/ 文件夹的一个子文件夹中。

警告

不支持在托管平台上使用自定义平台挂钩。自定义平台挂钩是为自定义平台设计的。在 Elastic Beanstalk 托管平台上,它们的行为可能不同或存在一些问题,而且其行为可能因平台而异。在 Amazon Linux AMI 平台(Amazon Linux 2 以前的版本)上,在某些情况下,它们可能仍然有用;请谨慎使用它们。

自定义平台挂钩是 Amazon Linux AMI 平台上存在的旧功能。在 Amazon Linux 2 平台上,/opt/elasticbeanstalk/hooks/ 文件夹中的自定义平台挂钩将完全中断。Elastic Beanstalk 不会读取或执行它们。Amazon Linux 2 平台支持一种新型平台挂钩,专门设计用于扩展 Elastic Beanstalk 托管平台。您可以将自定义脚本和程序直接添加到应用程序源包的挂钩目录中。Elastic Beanstalk 在不同实例预置阶段运行它们。有关更多信息,请在 扩展 Elastic Beanstalk Linux 平台 中展开平台挂钩部分。

挂钩组织到以下文件夹中:

  • appdeploy - 在应用程序部署期间运行的脚本。Elastic Beanstalk 在启动新实例时以及在客户端启动新版本部署时执行应用程序部署。

  • configdeploy – 当客户端执行影响实例上的软件配置的配置更新(如通过设置环境属性或启用到 Amazon S3 的日志轮换)时运行的脚本。

  • restartappserver - 当客户端执行重新启动应用程序服务器操作时运行的脚本。

  • preinit - 在实例引导启动期间运行的脚本。

  • postinit - 在实例引导启动后运行的脚本。

appdeployconfigdeployrestartappserver 文件夹包含 preenactpost 子文件夹。在操作的每个阶段,pre 文件夹、enact 文件夹和 post 文件夹中的所有脚本依次按字母顺序运行。

在启动实例时,Elastic Beanstalk 会按顺序运行 preinitappdeploypostinit。在到正在运行的实例的后续部署中,Elastic Beanstalk 会运行 appdeploy 挂钩。configdeploy 挂钩在用户更新实例软件配置设置时运行。restartappserver 挂钩只在用户执行应用程序服务器重新启动时运行。

当脚本遇到错误时,它们能以非零状态退出并写入 stderr,以使操作失败。写入 stderr 的消息将显示在操作失败时输出的事件中。Elastic Beanstalk 还会将此信息捕获到日志文件 /var/log/eb-activity.log 中。如果您不想使操作失败,请返回 0(零)。写入 stderrstdout 的消息会显示在部署日志中,但除非操作失败,否则不会显示在事件流中。

Packer 实例清理

在某些情况下,例如在 Packer 生成器进程完成之前将其停止,Packer 启动的实例将不会被清理。这些实例不是 Elastic Beanstalk 环境的一部分,只能使用 Amazon EC2 服务查看和终止。

手动清理这些实例
  1. 打开 Amazon EC2 控制台

  2. 确保您位于使用 Packer 创建实例的同一Amazon区域。

  3. Resources(资源)下,选择 N 个正在运行的实例,其中 N 指示正在运行的实例数量。

  4. 在查询文本框中单击。

  5. 选择 Name (名称) 标签。

  6. 输入 packer

    查询应类似于:tag:Name: packer

  7. 选择符合查询条件的任何实例。

  8. 如果实例状态正在运行,请依次选择操作实例状态停止,然后再依次选择操作实例状态终止

Platform.yaml 文件格式

platform.yaml 文件采用以下格式。

version: "version-number" provisioner: type: provisioner-type template: provisioner-template flavor: provisioner-flavor metadata: maintainer: metadata-maintainer description: metadata-description operating_system_name: metadata-operating_system_name operating_system_version: metadata-operating_system_version programming_language_name: metadata-programming_language_name programming_language_version: metadata-programming_language_version framework_name: metadata-framework_name framework_version: metadata-framework_version option_definitions: - namespace: option-def-namespace option_name: option-def-option_name description: option-def-description default_value: option-def-default_value option_settings: - namespace: "option-setting-namespace" option_name: "option-setting-option_name" value: "option-setting-value"

使用以下值替换占位符:

version-number

必需。YAML 定义的版本。必须是 1.0

provisioner-type

必需。用于创建自定义平台的生成器的类型。必须是 packer

provisioner-template

必需。包含 provisioner-type 设置的 JSON 文件。

provisioner-flavor

可选。用于 AMI 的基本操作系统。下列情况之一:

amazon (默认)

Amazon Linux。如果未指定,则是创建该平台时的 Amazon Linux 的最新版本。

Amazon Linux 2 不是支持的操作系统版本。

ubuntu1604

Ubuntu 16.04 LTS

rhel7

RHEL 7

rhel6

RHEL 6

metadata-maintainer

可选。平台所有者的联系信息 (100 个字符)。

metadata-description

可选。平台的描述 (2000 个字符)。

metadata-operating_system_name

可选。平台的操作系统的名称 (50 个字符)。在筛选 ListPlatformVersions API 的输出时,该值可用。

metadata-operating_system_version

可选。平台的操作系统的版本 (20 个字符)。

metadata-programming_language_name

可选。平台支持的编程语言 (50 个字符)

metadata-programming_language_version

可选。平台的语言的版本 (20 个字符)。

metadata-framework_name

可选。平台使用的 Web 框架的名称 (50 个字符)。

metadata-framework_version

可选。平台的 Web 框架的版本 (20 个字符)。

option-def-namespace

可选。aws:elasticbeanstalk:container:custom 下的命名空间(100 个字符)。

option-def-option_name

可选。选项的名称 (100 个字符)。您可以定义最多 50 个由平台向用户提供的自定义配置选项。

option-def-description

可选。选项的描述 (1024 个字符)。

option-def-default_value

可选。在用户未指定值时使用的默认值。

以下示例将创建选项 NPM_START

options_definitions: - namespace: "aws:elasticbeanstalk:container:custom:application" option_name: "NPM_START" description: "Default application startup command" default_value: "node application.js"
option-setting-namespace

可选。选项的命名空间。

option-setting-option_name

可选。选项的名称。您可以指定最多 50 个由 Elastic Beanstalk 提供的选项

option-setting-value

可选。在用户未指定值时使用的值。

以下示例将创建选项 TEST

option_settings: - namespace: "aws:elasticbeanstalk:application:environment" option_name: "TEST" value: "This is a test"

标记自定义平台版本

您可以将标签应用到 Amazon Elastic Beanstalk 自定义平台版本。标签是与Amazon资源关联的键/值对。有关 Elastic Beanstalk 资源标记、使用案例、标签键和值约束以及支持的资源类型的信息,请参阅标记 Elastic Beanstalk 应用程序资源

您可以在创建自定义平台版本时指定标签。在现有自定义平台版本中,您可以添加或删除标签,以及更新现有标签的值。您最多可以为每个自定义平台版本添加 50 个标签。

在自定义平台版本创建期间添加标签

如果使用 EB CLI 创建自定义平台版本,则可以使用 eb platform create--tags 选项添加标签。

~/workspace/my-app$ eb platform create --tags mytag1=value1,mytag2=value2

对于 Amazon CLI 或其他基于 API 的客户端,可以使用 create-platform-version 命令的 --tags 参数添加标签。

$ aws elasticbeanstalk create-platform-version \ --tags Key=mytag1,Value=value1 Key=mytag2,Value=value2 \ --platform-name my-platform --platform-version 1.0.0 --platform-definition-bundle S3Bucket=DOC-EXAMPLE-BUCKET,S3Key=sample.zip

管理现有自定义平台版本的标签

您可以在现有 Elastic Beanstalk 自定义平台版本中添加、更新和删除标签。

如果使用 EB CLI 更新自定义平台版本,则可使用 eb tags 来添加、更新、删除或列出标签。

例如,以下命令会列出自定义平台版本中的标签。

~/workspace/my-app$ eb tags --list --resource "arn:aws:elasticbeanstalk:us-east-2:my-account-id:platform/my-platform/1.0.0"

以下命令会更新标签 mytag1 并删除标签 mytag2

~/workspace/my-app$ eb tags --update mytag1=newvalue --delete mytag2 \ --resource "arn:aws:elasticbeanstalk:us-east-2:my-account-id:platform/my-platform/1.0.0"

有关选项和更多示例的完整列表,请参阅 eb tags

对于 Amazon CLI 或其他基于 API 的客户端,可使用 list-tags-for-resource 命令列出自定义平台版本的标签。

$ aws elasticbeanstalk list-tags-for-resource --resource-arn "arn:aws:elasticbeanstalk:us-east-2:my-account-id:platform/my-platform/1.0.0"

使用 update-tags-for-resource 命令可在自定义平台版本中添加、更新或删除标签。

$ aws elasticbeanstalk update-tags-for-resource \ --tags-to-add Key=mytag1,Value=newvalue --tags-to-remove mytag2 \ --resource-arn "arn:aws:elasticbeanstalk:us-east-2:my-account-id:platform/my-platform/1.0.0"

--tags-to-addupdate-tags-for-resource 参数中指定要添加的标签和要更新的标签。添加了一个不存在的标签,更新了现有标签的值。

注意

要将某些 EB CLI 和 Amazon CLI 命令与 Elastic Beanstalk 自定义平台版本一起使用,您需要自定义平台版本的 ARN。您可以使用下面的命令检索该 ARN。

$ aws elasticbeanstalk list-platform-versions

使用 --filters 选项从输出筛选出自定义平台的名称。