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

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

注意

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

如果您的 Elastic Beanstalk 应用程序基于 Amazon Linux AMI 平台分支,请使用此页面以了解如何将应用程序的环境迁移到 Amazon Linux 2。Amazon Elastic Beanstalk 使用 Amazon Linux 2 作为适用于 Linux 平台的操作系统。上一代平台分支基于 Amazon Linux AMI 而建,但现已弃用。

差异和兼容性

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

迁移过程

当您准备开始生产时,Elastic Beanstalk 需要蓝/绿部署才能执行升级。遵循推荐使用蓝/绿部署过程进行迁移的最佳实践,您将创建一个基于 Amazon Linux 2 平台分支的新环境,然后将您的应用程序代码部署到该环境。在您通过测试和调整新环境进行迭代时,您的现有生产环境将保持活动状态且不受影响。当您的新环境准备好投入生产时,您将交换两个环境的规范名称记录 (CNAMEs),将流量重定向到新环境。有关蓝/绿部署最佳实践方法的更多信息,请参阅蓝/绿方法。要参靠蓝/绿部署过程的具体步骤,请参阅蓝/绿部署

以下参考资料可能有助于规划您的迁移。

所有 Linux 平台的注意事项

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

领域 更改和信息

配置文件

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

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

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

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

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

对于需要引用 Amazon 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 平台特有的迁移注意事项。

基于 Amazon Linux AMI (AL1) 的 Docker 平台分支系列包括三个平台分支。我们建议为每个平台分支制定一条特定的迁移路径。

AL1 平台分支 迁移到 Amazon Linux 2 的路径

由运行于 Amazon Linux AMI (AL1) 上的 Amazon ECS 托管的多容器 Docker

基于 ECS 的 Docker AL2 平台分支

基于 ECS 的 Docker AL2 平台分支将为多容器 Docker AL1 平台分支上运行的环境提供直接迁移路径。

  • 类似于先前的多容器 Docker AL1 分支,它将使用 Amazon ECS 将多个 Docker 容器协调部署到 Elastic Beanstalk 环境中的 Amazon ECS 集群。

  • 它支持先前的多容器 Docker AL1 分支的所有功能。

  • 它还支持相同的 Dockerrun.aws.json v2 文件。

有关将在多容器 Docker Amazon Linux 平台分支上运行的应用程序迁移到在 Amazon Linux 2 上运行的 Amazon ECS 平台分支的更多信息,请参阅 将在 Amazon Linux 上运行的多容器 Docker 迁移到 Amazon Linux 2 上的 ECS

在 Amazon Linux AMI (AL1) 上运行的 Docker

运行 Amazon Linux AMI (AL1) 的预配置 Docker (Glassfish 5.0)

在 Amazon Linux 2 平台分支上运行的 Docker

我们建议您将在基于预配置 Docker (Glassfish 5.0)在 Amazon Linux AMI (AL1) 上运行的 Docker 的环境中运行的应用程序,迁移到基于在 Amazon Linux 2 平台分支上运行的 Docker 的环境中。

如果您的环境基于预配置 Docker (Glassfish 5.0) 平台分支,请参阅 将 GlassFish 应用程序部署到 Docker 平台:迁移到 Amazon Linux 2 的路径

下表列出了特定于平台分支在 Amazon Linux 2 上运行的 Docker 的迁移信息。

领域 更改和信息

存储

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

对于 Amazon Linux AMI,如果您使用 BlockDeviceMappings 命名空间 aws:autoscaling:launchconfiguration 选项向 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 平台版本的迁移信息。

领域 更改和信息

端口传递

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

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

领域 更改和信息

Corretto 与 OpenJDK

为了实现标准版 (Java SE) Java 平台,Amazon Linux 2 平台分支使用 Amazon Corretto,它是开放式 Java 开发工具包 (OpenJDK) 的 Amazon 分发版。早期 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 平台版本的迁移信息。

领域 更改和信息

配置选项

在 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 平台版本的迁移信息。

领域 更改和信息

已安装的 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 版本。有关详细信息,请参阅 使用 package.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 || 5000; app.listen(port, function() { console.log('Server running at http://127.0.0.1:%s', port); });

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

领域 更改和信息

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 平台版本的迁移信息。

领域 更改和信息

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 平台版本的迁移信息。

领域 更改和信息

已安装 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 平台