Amazon Linux 2 迁移至 Amazon Linux 2023 全攻略:从规划到实践

Amazon Linux 2(AL2)作为 AWS 推出的广受欢迎的 Linux 发行版,自 2017 年发布以来,凭借其稳定性、安全性和对 AWS 服务的深度优化,成为了众多云上应用的首选操作系统。然而,随着技术迭代,AWS 于 2022 年推出了下一代发行版 Amazon Linux 2023(AL2023),带来了更现代的架构、更长期的支持周期和更强大的安全特性。

根据 AWS 官方公告,Amazon Linux 2 的标准支持将于 2025 年 6 月 30 日结束,扩展支持将持续至 2028 年 6 月 30 日。为避免业务受限于旧版本的安全漏洞和功能缺失,提前规划并执行从 AL2 到 AL2023 的迁移至关重要。

本文将详细介绍迁移的全流程,包括核心差异分析、迁移规划、实操步骤、常见问题解决及最佳实践,帮助您平稳完成升级。

目录#

  1. Amazon Linux 2 与 Amazon Linux 2023 核心差异
  2. 迁移前规划
  3. 迁移前准备工作
  4. 迁移实施步骤
  5. 迁移后验证
  6. 常见问题与解决方案
  7. 最佳实践总结
  8. 参考资料

1. Amazon Linux 2 与 Amazon Linux 2023 核心差异#

在开始迁移前,需先理解两者的核心差异,以便针对性调整配置和应用。

1.1 发行模型与生命周期#

特性Amazon Linux 2Amazon Linux 2023
发布模型单一长期支持(LTS)版本年度版本(如 AL2023、AL2024)+ 5 年支持周期
支持周期标准支持至 2025.6.30,扩展支持至 2028.6.30每个版本提供 5 年安全更新(如 AL2023 至 2028)
内核版本基于 Linux 4.14(长期维护)基于 Linux 6.1(最新稳定版,支持现代硬件)
架构支持x86_64、ARM64(Graviton2)x86_64、ARM64(Graviton3)、未来扩展

1.2 核心组件变更#

1.2.1 包管理器:从 yumdnf#

AL2 使用 yum(Yellowdog Updater Modified)作为包管理器,而 AL2023 采用 dnf(Dandified YUM)—— yum 的继任者,提供更快的速度、更好的依赖解析和并行下载支持。两者命令语法相似,但 dnf 功能更强大。

示例对比

# AL2 安装包
sudo yum install httpd
 
# AL2023 安装包(dnf 兼容 yum 命令,也可直接用 dnf)
sudo dnf install httpd  # 推荐
sudo yum install httpd  # 兼容,但实际调用 dnf

1.2.2 初始化系统:systemd 进一步强化#

AL2 和 AL2023 均使用 systemd,但 AL2023 基于更新的 systemd 版本(如 v252),提供更强的服务管理、日志集成和资源控制能力。

1.2.3 安全增强:SELinux 与默认强化#

  • SELinux:AL2023 中 SELinux 默认启用并设为 enforcing 模式(AL2 默认 permissive),提供更严格的访问控制。
  • 加密:默认启用 /tmp/var/tmp 的 tmpfs 加密,增强临时文件安全性。
  • 最小化攻击面:默认关闭不必要的服务(如 telnet),仅保留核心组件。

1.2.4 预装软件版本升级#

AL2023 预装了更现代的开发工具和运行时环境,例如:

  • Python 3.9+(AL2 为 Python 2.7/3.7)
  • GCC 12+(AL2 为 GCC 7.3)
  • OpenSSL 3.0(AL2 为 OpenSSL 1.0.2k)

2. 迁移前规划#

迁移前需系统性评估当前环境,明确目标和风险,避免业务中断。

2.1 环境评估#

2.1.1 资产盘点#

使用 AWS Systems Manager Inventory 或自定义脚本收集 AL2 实例信息:

  • 实例规格(CPU、内存、存储)、网络配置(VPC、安全组、子网)。
  • 已安装包列表:rpm -qa > al2_packages.txt
  • 自定义配置文件:find /etc -type f -mtime -365(近一年修改的文件)。
  • 运行中服务:systemctl list-unit-files --type=service --state=enabled

2.1.2 应用兼容性验证#

AL2023 的软件版本升级可能导致应用依赖冲突,需重点验证:

  • 运行时环境:例如 Python 2.7 应用需迁移至 Python 3.9+,Node.js 10.x 需升级至 16.x+。
  • 系统库依赖:通过 ldd /path/to/app 检查应用依赖的动态库,确保 AL2023 中存在对应版本。
  • 第三方软件:联系供应商确认是否提供 AL2023 兼容版本(如数据库、监控工具)。

2.2 迁移策略选择#

AWS 推荐 “蓝绿迁移”(新建 AL2023 实例,验证后切换流量),而非“原地升级”(in-place upgrade),原因如下:

  • AL2 与 AL2023 基于不同的底层架构(如 glibc 版本差异),原地升级易导致兼容性问题。
  • 蓝绿迁移可保留回滚能力,降低业务中断风险。

2.3 定义成功标准#

明确迁移后需满足的指标:

  • 核心服务(如 Nginx、MySQL)启动成功率 100%。
  • 数据完整性(文件校验和一致,数据库无丢失)。
  • 应用性能(响应时间、吞吐量)不低于 AL2 环境。
  • 安全合规(SELinux 策略生效,漏洞扫描无高危项)。

3. 迁移前准备工作#

3.1 数据备份#

迁移前必须备份关键数据,推荐以下方案:

  • EBS 快照:为 AL2 实例的根卷和数据卷创建快照(通过 AWS Console 或 CLI):
    aws ec2 create-snapshot --volume-id vol-123456 --description "AL2 root volume backup before migration"
  • 应用数据备份:数据库(如 MySQL)通过 mysqldump 导出,静态文件通过 rsync 同步至 S3:
    mysqldump -u root -p --all-databases > al2_db_backup.sql
    aws s3 sync /data s3://my-backup-bucket/al2-data/

3.2 构建 AL2023 测试环境#

在非生产环境(如 staging)部署 AL2023 实例,模拟生产配置:

  1. 启动 AL2023 实例(通过 AWS Console 或 CLI):

    aws ec2 run-instances \
      --image-id ami-0abcdef1234567890  # AL2023 AMI ID(需替换为目标区域 AMI) \
      --instance-type t3.medium \
      --security-group-ids sg-123456 \
      --subnet-id subnet-123456 \
      --key-name my-key-pair \
      --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=AL2023-Staging}]'

    注意:AL2023 AMI ID 需通过 AWS Systems Manager Parameter Store 获取:
    aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2023-ami-hvm-x86_64-gp2 --query "Parameters[0].Value" --output text

  2. 复制 AL2 实例的安全组、IAM 角色和网络配置至测试实例,确保环境一致性。

3.3 预迁移兼容性测试#

在测试环境中执行以下步骤:

  1. 安装 AL2 中已部署的包(参考 al2_packages.txt):
    # 将 AL2 包列表转换为 dnf 安装命令(排除 AL2 特有包,如 amazon-linux-extras)
    cat al2_packages.txt | grep -v "amazon-linux-extras" | awk '{print $1}' | xargs sudo dnf install -y
  2. 迁移应用代码和配置文件,启动服务并验证功能:
    # 从 AL2 实例复制应用代码(假设已配置 SSH 免密登录)
    scp -r ec2-user@al2-instance-ip:/opt/myapp /opt/
    # 启动服务并检查状态
    sudo systemctl start myapp && sudo systemctl status myapp
  3. 修复兼容性问题(如依赖缺失、配置文件路径变更),记录解决方案。

4. 迁移实施步骤#

4.1 步骤 1:部署生产环境 AL2023 实例#

基于测试环境验证结果,启动生产用 AL2023 实例,确保:

  • 实例规格、存储配置与 AL2 一致(或根据性能需求调整)。
  • 网络配置(VPC、子网、安全组)与 AL2 一致,避免网络不通。
  • 挂载数据卷(如需要),并格式化(如使用新卷):
    sudo mkfs.xfs /dev/nvme1n1  # 格式化新卷(假设设备名为 nvme1n1)
    sudo mount /dev/nvme1n1 /data  # 挂载至 /data
    # 添加至 /etc/fstab 实现开机自动挂载
    echo "/dev/nvme1n1 /data xfs defaults 0 0" | sudo tee -a /etc/fstab

4.2 步骤 2:迁移应用与配置#

4.2.1 安装依赖包#

根据测试环境经验,在 AL2023 实例安装应用所需依赖:

# 示例:安装 Python 3.9、Node.js 18 和 Nginx
sudo dnf install -y python39 nodejs nginx

4.2.2 迁移数据与配置文件#

使用 rsyncscp 同步 AL2 实例的应用数据和配置:

# 同步应用代码(保留权限和软链接)
rsync -avz --delete ec2-user@al2-instance-ip:/opt/myapp /opt/
 
# 同步关键配置文件(如 /etc/nginx/nginx.conf、/etc/my.cnf)
scp ec2-user@al2-instance-ip:/etc/nginx/nginx.conf /etc/nginx/

注意:AL2023 的部分配置文件路径可能变更(如 dnf 仓库配置位于 /etc/yum.repos.d/,与 AL2 一致),需手动核对并调整。

4.2.3 服务与权限配置#

  • 用户与组:迁移 /etc/passwd/etc/group/home 目录下的用户数据,确保应用运行权限一致:
    # 复制用户账号(需谨慎,避免覆盖系统用户)
    scp ec2-user@al2-instance-ip:/etc/passwd /tmp/al2_passwd
    grep "myapp-user" /tmp/al2_passwd | sudo tee -a /etc/passwd
  • 服务自启动:通过 systemctl 启用应用服务:
    sudo systemctl enable --now myapp  # 启用并立即启动服务

4.3 步骤 3:流量切换与回滚准备#

  • 流量切换:通过负载均衡器(如 ALB)逐步将流量切至 AL2023 实例(例如先切 10% 流量,观察无异常后全量切换)。
  • 回滚机制:保留 AL2 实例至少 1 周,确保出现问题时可快速切回流量。

5. 迁移后验证#

5.1 基础功能验证#

  • 服务状态systemctl list-units --type=service --state=active,确保核心服务(如 httpdmysqld)正常运行。
  • 数据完整性:通过校验和(如 md5sum)或数据库查询验证数据一致性:
    # 对比文件校验和
    md5sum /opt/myapp/data/file.txt  # AL2023 实例
    md5sum /opt/myapp/data/file.txt  # AL2 实例(应一致)
  • 网络连通性:测试内外网访问(如 curl http://localhost、从公网访问应用),检查安全组和 NACL 规则是否生效。

5.2 性能与安全验证#

  • 性能监控:通过 CloudWatch 监控 CPU、内存、磁盘 I/O 和网络吞吐量,确保与 AL2 环境持平或更优。
  • SELinux 状态:检查 SELinux 日志(/var/log/audit/audit.log),修复 denied 事件:
    sudo ausearch -m AVC -ts recent  # 查看最近的 SELinux 拒绝事件
  • 漏洞扫描:使用 Amazon Inspector 或 dnf audit 扫描系统漏洞:
    sudo dnf audit  # 检查已安装包的安全漏洞

6. 常见问题与解决方案#

6.1 问题 1:依赖包缺失或版本冲突#

现象dnf install 提示“未找到包”或“依赖关系不满足”。
解决方案

  • 搜索包名:sudo dnf search <package-name>(如 sudo dnf search python3-devel)。
  • 启用额外仓库:AL2023 默认启用 amazonlinuxamazonlinux-updates 仓库,可添加 EPEL 仓库(需手动配置):
    sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm  # EPEL 9 适用于 AL2023

6.2 问题 2:SELinux 导致服务启动失败#

现象:服务启动时报错“Permission denied”,audit.log 中有 avc: denied 记录。
解决方案

  • 临时切换至 permissive 模式排查:sudo setenforce 0,验证服务是否正常启动。
  • 生成并应用 SELinux 策略模块:
    sudo audit2allow -a -M myapp-policy  # 从日志生成策略模块
    sudo semodule -i myapp-policy.pp  # 加载模块
    sudo setenforce 1  # 恢复 enforcing 模式

6.3 问题 3:Python 应用因版本不兼容报错#

现象:Python 应用启动时报 SyntaxError 或模块缺失(如 imp 模块在 Python 3.9+ 中移除)。
解决方案

  • 使用 pyenvvirtualenv 管理多版本 Python:
    # 安装 pyenv
    curl https://pyenv.run | bash
    # 安装 Python 3.7(假设应用依赖 3.7)
    pyenv install 3.7.17
    pyenv local 3.7.17  # 在应用目录启用 3.7

7. 最佳实践总结#

  1. 优先使用 IaC 自动化迁移
    通过 Terraform 或 CloudFormation 定义 AL2023 实例配置,确保环境一致性和可重复性:

    # Terraform 示例:定义 AL2023 实例
    resource "aws_instance" "al2023_prod" {
      ami           = data.aws_ssm_parameter.al2023_ami.value
      instance_type = "t3.large"
      # 其他配置:安全组、密钥对、标签...
    }
     
    data "aws_ssm_parameter" "al2023_ami" {
      name = "/aws/service/ami-amazon-linux-latest/amzn2023-ami-hvm-x86_64-gp2"
    }
  2. 分阶段迁移,先非核心后核心业务
    从低优先级服务(如测试环境、监控节点)开始迁移,积累经验后再迁移核心业务,降低风险。

  3. 利用 AWS 工具简化迁移

    • AWS Application Migration Service:自动化从 AL2 到 AL2023 的迁移,支持批量实例复制。
    • Systems Manager Run Command:远程执行命令(如安装包、同步配置),避免手动操作。
  4. 文档化迁移过程
    记录迁移步骤、问题及解决方案,形成内部知识库,为后续版本升级(如 AL2024)提供参考。

8. 参考资料#