AWS Elastic Beanstalk
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

自定义平台

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

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

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

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

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

注意

自定义平台是特定于区域的。如果您需要在多个区域中使用 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 definition file platform.yaml,来定义用于创建自定义平台的生成器的类型。此文件的格式在Platform.yaml 文件格式中描述。您可以从头开始创建自定义平台,或使用某个示例自定义平台作为起始点。

使用示例自定义平台

创建您自己的自定义平台的一个替代方法是使用一个 platform definition archive 示例来引导您的自定义平台。您必须先在示例中配置然后才能使用的唯一项目是源 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 示例。

下载示例platform definition archive:NodePlatform_Ubuntu.zip。此文件包含 platform definition file、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 definition file 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" ] } ] }

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

  • 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 使用示例 platform definition archive 创建您的第一个自定义平台。

创建自定义平台

  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 ...