将您的 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2 - AWS Elastic Beanstalk
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

将您的 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2

AWS 提供了两个 Amazon Linux 版本:Amazon Linux 2Amazon Linux AMI。AWS Elastic Beanstalk 同时为这两个 Amazon Linux 版本维护平台分支。有关 Linux 平台的详细信息,请参阅 Elastic Beanstalk Linux 平台

如果您的 Elastic Beanstalk 应用程序基于 Amazon Linux AMI 平台分支,并且该平台具有较新一代的 Amazon Linux 2 平台分支,请使用此页面以了解如何将应用程序的环境迁移到 Amazon Linux 2。这两代平台不能保证与现有应用程序向后兼容。此外,即使您的应用程序代码成功部署到新平台版本,其行为和性能也可能会因操作系统和运行时而异。虽然 Amazon Linux AMI 和 Amazon Linux 2 使用的是相同的 Linux 内核,但它们在初始化系统、 libc 版本、编译器工具链和各种软件包方面有所不同。我们还更新了特定于平台的运行时版本、构建工具和其他依赖项。因此,我们建议您花些时间在开发环境中彻底测试您的应用程序,并进行任何必要的调整。

当您准备开始生产时,Elastic Beanstalk 需要蓝/绿部署才能执行升级。有关平台更新策略的详细信息,请参阅 更新 Elastic Beanstalk 环境的平台版本

重要

如果您使用测试版的 Amazon Linux 2 平台进行评估,请不要开始生产。请等待,直到我们发布受支持的平台版本。测试版平台版本并非最终版本,我们可能会在完全支持这些平台之前更改一些命名和实现细节。

所有 Linux 平台的注意事项

下表讨论了在规划将应用程序迁移到 Amazon Linux 2 时应注意的事项。这些注意事项适用于任何 Elastic Beanstalk Linux 平台,而不管平台采用何种特定的编程语言或应用程序服务器。

Area 更改和信息

配置文件

在 Amazon Linux 2 平台上,您可以像以前一样使用配置文件,并且所有部分的工作方式相同。但是,某些特定设置的工作方式可能与早期 Amazon Linux AMI 平台上的工作方式不同。例如:

  • 使用配置文件安装的某些软件包可能在 Amazon Linux 2 上不可用,或者其名称可能已更改。

  • 某些特定于平台的配置选项已从其平台特定的命名空间移动到与平台无关的不同命名空间。

  • .ebextensions/nginx 目录中提供的代理配置文件应移动到 .platform/nginx 平台挂钩目录。有关详细信息,请在 扩展 Elastic Beanstalk Linux 平台 中展开反向代理配置部分。

我们建议使用平台挂钩在环境实例上运行自定义代码。您仍可以在 .ebextensions 配置文件中使用命令和容器命令,但这并不简单。例如,在 YAML 文件中编写命令脚本可能非常繁琐且很难测试。

对于需要引用 AWS CloudFormation 资源的任何脚本,您仍需要使用 .ebextensions 配置文件。

平台挂钩

Amazon Linux 2 平台引入了一种新的方法来扩展您的环境平台,即将可执行文件添加到环境实例上的挂钩目录中。对于以前的 Linux 平台版本,您可能使用了自定义平台挂钩。这些挂钩不是为托管平台设计的,因此不受支持,但在某些情况下使用可能会有效。对于 Amazon Linux 2 平台版本,自定义平台挂钩不起作用。应当将所有挂钩迁移到新的平台挂钩。有关详细信息,请在 扩展 Elastic Beanstalk Linux 平台 中展开平台挂钩部分。

支持的代理服务器

Amazon Linux 2 平台不再支持 Apache HTTPD。它们仅支持 nginx 代理服务器。如果您有任何 HTTPD 自定义配置(.ebextensions/httpd 目录中的文件或 .ebextensions 配置文件的 commands:container_commands: 部分中的命令),请将它们修改为使用 nginx。有关 nginx 代理配置的信息,请在 扩展 Elastic Beanstalk Linux 平台 中展开反向代理配置部分。

实例配置文件

Amazon Linux 2 平台需要配置实例配置文件。如果没有该配置文件,环境创建可能会暂时成功,但是当需要实例配置文件的操作开始失败时,该环境可能会在创建后很快出现错误。有关详细信息,请参阅 管理 Elastic Beanstalk 实例配置文件

增强型运行状况

Amazon Linux 2 平台版本默认启用增强型运行状况。如果您未使用 Elastic Beanstalk 控制台创建环境,则该功能是一种更改。无论平台版本如何,默认情况下,该控制台尽可能启用增强型运行状况。有关详细信息,请参阅 增强型运行状况报告和监控

自定义 AMI

如果您的环境使用自定义 AMI,请根据 Amazon Linux 2 为使用 Elastic Beanstalk Amazon Linux 2 平台的新环境创建新 AMI。

限制

Amazon Linux 2 平台与 Amazon Linux AMI 平台(先前的 Amazon Linux 2)相比,缺少一些功能。

平台特定注意事项

本节讨论特定 Elastic Beanstalk Linux 平台特有的迁移注意事项。

下表中列出了 Docker 平台中 Amazon Linux 2 平台版本的迁移信息。

Area 更改和信息

存储

Elastic Beanstalk 将 Docker 配置为使用存储驱动程序来存储 Docker 映像和容器数据。在 Amazon Linux AMI 上,Elastic Beanstalk 使用了设备映射器存储驱动程序。为了提高性能,Elastic Beanstalk 预配置了额外的 Amazon EBS 卷。在 Amazon Linux 2 Docker 平台版本上,Elastic Beanstalk 使用 OverlayFS 存储驱动程序,并在不再需要单独卷的情况下实现更好的性能。

对于 Amazon Linux AMI,如果您使用了 aws:autoscaling:launchconfiguration 命名空间的 BlockDeviceMappings 选项将自定义存储卷添加到 Docker 环境,我们建议您还需添加 Elastic Beanstalk 预配置的 /dev/xvdcz Amazon EBS 卷。Elastic Beanstalk 不再预配置此卷,因此您应该将其从配置文件中删除。有关详细信息,请参阅 Amazon Linux AMI(先前的 Amazon Linux 2)上的 Docker 配置

私有存储库身份验证

当您提供 Docker 生成的身份验证文件以连接到私有存储库时,您不再需要将其转换为 Amazon Linux AMI Docker 平台版本需要的旧格式。Amazon Linux 2 Docker 平台版本支持新格式。有关详细信息,请参阅 使用私有存储库中的映像

下表列出了 Go 平台中 Amazon Linux 2 平台版本的迁移信息。

Area 更改和信息

端口传递

在 Amazon Linux 2 平台上,Elastic Beanstalk 不会通过 PORT 环境变量将端口值传递给应用程序进程。您可以通过亲自配置 PORT 环境属性来模拟进程的此类行为。但是,如果您具有多个进程,并且您依赖于 Elastic Beanstalk 将增量端口值(5000、5100、5200 等)传递给进程,则应当修改您的实现。有关详细信息,请展开 扩展 Elastic Beanstalk Linux 平台 中的反向代理配置部分。

下表列出了 Java SE 平台中的 Corretto 平台分支的迁移信息。

Area 更改和信息

Corretto 与OpenJDK

为了实现标准版 (Java SE) Java 平台,Amazon Linux 2 平台分支使用 Amazon Corretto,它是开放式 Java 开发工具包 (OpenJDK) 的 AWS 分发版。早期 Elastic Beanstalk Java SE 平台分支使用 Amazon Linux AMI 随附的 OpenJDK 软件包。

构建工具

Amazon Linux 2 平台具有较新版本的构建工具:gradlemavenant

JAR 文件处理

在 Amazon Linux 2 平台上,如果源包(ZIP 文件)包含单个 JAR 文件而不包含其他文件,Elastic Beanstalk 不再将 JAR 文件重命名为 application.jar。仅当提交 JAR 文件自身(而不是包含在 ZIP 文件中)时,才会重命名。

端口传递

在 Amazon Linux 2 平台上,Elastic Beanstalk 不会通过 PORT 环境变量将端口值传递给应用程序进程。您可以通过亲自配置 PORT 环境属性来模拟进程的此类行为。但是,如果您具有多个进程,并且您依赖于 Elastic Beanstalk 将增量端口值(5000、5100、5200 等)传递给进程,则应当修改您的实现。有关详细信息,请展开 扩展 Elastic Beanstalk Linux 平台 中的反向代理配置部分。

Java 7

Elastic Beanstalk 不支持 Amazon Linux 2 Java 7 平台分支。如果您具有 Java 7 应用程序,请将其迁移到 Corretto 8 或 Corretto 11。

下表列出了 Node.js 平台中 Amazon Linux 2 平台版本的迁移信息。

Area 更改和信息

已安装的 Node.js 版本

在 Amazon Linux 2 平台上,Elastic Beanstalk 维护多个 Node.js 平台分支,并且仅在每个平台版本上安装与平台分支对应的最新版本的 Node.js 主版本。例如,Node.js 12 平台分支中的每个平台版本在默认情况下仅安装 Node.js 12.x.y。在 Amazon Linux AMI 平台版本上,我们在每个平台版本上安装了多个 Node.js 版本的多个版本,并且只维护一个平台分支。

选择与您的应用程序所需的 Node.js 主版本对应的 Node.js 平台分支。

配置选项

在 Amazon Linux 2 平台上,Elastic Beanstalk 不支持 aws:elasticbeanstalk:container:nodejs 命名空间中的配置选项。其中一些选项具有备用项。以下是每个选项的迁移信息。

选项 迁移信息

NodeCommand

使用 package.json 文件中的 Procfilescripts 关键字指定启动脚本。

NodeVersion

使用 package.json 文件中的 engines 关键字指定 Node.js 版本。请注意,您只能指定与平台分支对应的 Node.js 版本。例如,如果您使用的是 Node.js 12 平台分支,则只能指定 12.x.y Node.js 版本。有关详细信息,请参阅 使用 package.json 文件配置 Node.js

GzipCompression

在 Amazon Linux 2 平台版本不支持。

ProxyServer

Amazon Linux 2 Node.js 平台版本仅支持 nginx。不支持 Apache 代理服务器。

此外,这些平台版本不支持未在代理服务器后面运行的独立应用程序。曾经可以通过 ProxyServer 选项的 none 值来实现这一点。如果您的环境运行独立应用程序,请更新您的代码以侦听 nginx 将流量转发到的端口。

var port = process.env.PORT || 8080; app.listen(port, function() { console.log('Server running at http://127.0.0.1:%s', port); });

下表列出了 Python 平台中 Amazon Linux 2 平台版本的迁移信息。

Area 更改和信息

PHP 文件处理

在 Amazon Linux 2 平台上,将通过 PHP-FPM(CGI 进程管理器)处理 PHP 文件。在 Amazon Linux AMI 平台上,我们使用的是 mod_php(一个 Apache 模块)。

下表列出了 Python 平台中的 Amazon Linux 2 平台版本的迁移信息。

Area 更改和信息

WSGI 服务器

在 Amazon Linux 2 平台上,Gunicorn 是默认 WSGI 服务器。如果您正在设置 aws:elasticbeanstalk:container:python 命名空间的 WSGIPath 选项,请将该值替换为 Gunicorn 语法。有关详细信息,请参阅 Python 配置命名空间

此外,您可以使用 Procfile 指定和配置 WSGI 服务器。有关详细信息,请参阅 使用 Procfile 配置 WSGI 服务器

应用程序路径。

在 Amazon Linux 2 平台上,您的环境的 Amazon EC2 实例上的应用程序目录路径为 /var/app/current。该路径在 Amazon Linux AMI 平台上为 /opt/python/current/app

下表列出了 Ruby 平台中的 Amazon Linux 2 平台版本的迁移信息。

Area 更改和信息

已安装 Ruby 版本

在 Amazon Linux 2 平台上,Elastic Beanstalk 仅在每个平台版本上安装与平台分支对应的单个 Ruby 版本的最新版本。例如,Ruby 2.6 平台分支中的每个平台版本仅安装了 Ruby 2.6.x。在 Amazon Linux AMI 平台版本上,我们安装了多个 Ruby 版本的最新版本,例如 2.4.x、2.5.x 和 2.6.x。

如果您的应用程序使用的 Ruby 版本与您正在使用的平台分支不对应,建议您切换到具有适合您的应用程序的 Ruby 版本的平台分支。

应用程序服务器

在 Amazon Linux 2 平台上,Elastic Beanstalk 仅在所有 Ruby 平台版本上安装 Puma 应用程序服务器。您可以使用 Procfile 启动其他应用程序服务器,并使用 Gemfile 来安装它。

在 Amazon Linux AMI 平台上,对于每个 Ruby 版本,我们支持两种平台分支—一种具有 Puma 应用程序服务器,另一种具有 Passenger 应用服务器。如果您的应用程序使用 Passenger,则可以将 Ruby 环境配置为安装和使用 Passenger。

有关更多信息以及示例,请参阅 使用 Elastic Beanstalk Ruby 平台