将您的 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 环境的平台版本

所有 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 平台版本与在 Amazon Linux AMI 平台版本中支持的每个平台支持相同的反向代理服务器。所有 Amazon Linux 2 平台版本都使用 nginx 作为其默认的反向代理服务器。Tomcat、Node.js、PHP 和 Python 平台也支持将 Apache HTTPD 作为替代方案。所有平台都以一致的方式启用代理服务器配置,如本节所述。但是,配置代理服务器与其在 Amazon Linux AMI 上时略有不同。以下是所有平台的区别:

  • 默认为 nginx – 所有 Amazon Linux 2 平台版本上的默认代理服务器为 nginx。在 Tomcat、PHP 和 Python 的 Amazon Linux AMI 平台版本上,默认代理服务器是 Apache HTTPD。

  • 一致的命名空间 – 所有 Amazon Linux 2 平台版本都使用 aws:elasticbeanstalk:environment:proxy 命名空间来配置代理服务器。在 Amazon Linux AMI 平台版本上,这是针对每个平台的决定,而 Node.js 使用了不同的命名空间。

  • 配置文件位置 – 应将代理配置文件放在所有 Amazon Linux 2 平台版本上的 .platform/nginx.platform/httpd 目录中。在 Amazon Linux AMI 平台版本上,这些位置分别为 .ebextensions/nginx.ebextensions/httpd

有关特定于平台的代理配置更改,请参阅平台特定注意事项。有关 Amazon Linux 2 平台上的代理配置的信息,请在扩展 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 平台版本的托管 AMI 不支持自定义平台

平台特定注意事项

本节讨论特定 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 平台版本支持新格式。有关详细信息,请参阅 使用私有存储库中的映像

代理服务器

Amazon Linux 2 Docker 平台版本不支持不在代理服务器后面运行的独立容器。在 Amazon Linux AMI Docker 平台版本上,这一点过去可以通过 aws:elasticbeanstalk:environment:proxy 命名空间中 ProxyServer 选项的 none 值来实现。

下表列出了 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。

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

Area 更改和信息

配置选项

在 Amazon Linux 2 平台版本上,Elastic Beanstalk 在 aws:elasticbeanstalk:environment:proxy 命名空间中仅支持配置选项和选项值的子集。以下是每个选项的迁移信息。

选项 迁移信息

GzipCompression

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

ProxyServer

Amazon Linux 2 Tomcat 平台版本同时支持 nginx 和 Apache HTTPD 版本 2.4 代理服务器。但是,不支持 Apache 版本 2.2。

在 Amazon Linux AMI 平台版本中,默认代理是 Apache 2.4。如果您使用了默认代理设置并添加了自定义代理配置文件,则代理配置在 Amazon Linux 2 上仍然正常工作。但是,如果您使用了 apache/2.2 选项值,则现在必须将代理配置迁移到 Apache 版本 2.4。

Amazon Linux 2 平台版本不支持 aws:elasticbeanstalk:container:tomcat:jvmoptions 命名空间中的 XX:MaxPermSize 选项。用于修改永久代大小的 JVM 设置仅适用于 Java 7 及更早版本,因此不适用于 Amazon Linux 2 平台版本。

应用程序路径。

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

下表列出了 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 平台分支。

Apache HTTPD 日志文件名

在 Amazon Linux 2 平台上,如果您使用 Apache HTTPD 代理服务器,则 HTTPD 日志文件名为 access_logerror_log,这与支持 Apache HTTPD 的所有其他平台一致。在 Amazon Linux AMI 平台版本上,这些日志文件分别命名为 access.logerror.log

有关所有平台的日志文件名和位置的详细信息,请参阅 Elastic Beanstalk 如何设置 CloudWatch Logs

配置选项

在 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 版本。有关详细信息,请参阅 使用程序包 .json 文件指定 Node.js 依赖项

GzipCompression

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

ProxyServer

在 Amazon Linux 2 Node.js 平台版本上,此选项移到 aws:elasticbeanstalk:environment:proxy 命名空间。您可以在 nginx(默认值)和 apache 之间进行选择。

Amazon Linux 2 Node.js 平台版本不支持未在代理服务器后面运行的独立应用程序。在 Amazon Linux AMI Node.js 平台版本上,这一点过去可以通过 aws:elasticbeanstalk:container:nodejs 命名空间中 ProxyServer 选项的 none 值来实现。如果您的环境运行独立应用程序,请更新您的代码以侦听代理服务器(nginx 或 Apache)将流量转发到的端口。

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 模块)。

代理服务器

Amazon Linux 2 PHP 平台版本同时支持 nginx 和 Apache HTTPD 代理服务器。默认为 nginx。

Amazon Linux AMI PHP 平台版本仅支持 Apache HTTPD。如果您添加了自定义 Apache 配置文件,则可以将 aws:elasticbeanstalk:environment:proxy 命名空间中的 ProxyServer 选项设置为 apache

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

Area 更改和信息

WSGI 服务器

在 Amazon Linux 2 平台上,Gunicorn 是默认 WSGI 服务器。默认情况下,Gunicorn 侦听端口 8000。该端口可能与您的应用程序在 Amazon Linux AMI 平台上使用的端口不同。如果您正在设置 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

代理服务器

Amazon Linux 2 Python 平台版本同时支持 nginx 和 Apache HTTPD 代理服务器。默认为 nginx。

Amazon Linux AMI Python 平台版本仅支持 Apache HTTPD。如果您添加了自定义 Apache 配置文件,则可以将 aws:elasticbeanstalk:environment:proxy 命名空间中的 ProxyServer 选项设置为 apache

下表列出了 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 平台