【完全版】Amazon Linux 2 EOLに伴うAL2023移行ガイド|dnfパッケージ管理・決定論的アップデート・Python 3.13環境構築

AWSの定番Linuxディストリビューションとして長年利用されてきた「Amazon Linux 2(AL2)」ですが、2026年6月30日をもって標準サポート終了(EOL)を迎えます。

サポート終了後はセキュリティパッチやバグ修正の提供が停止するため、後継ディストリビューションである「Amazon Linux 2023(AL2023)」への移行が急務となっています。しかし、AL2023はAL2から単なるバージョンアップにとどまらず、パッケージマネージャーの刷新(yumからdnfへ)、決定論的アップデート(Deterministic Updates)の導入、暗号化ポリシーの厳格化、最新言語ランタイム(Python 3.13など)への対応など、アーキテクチャ面で多くの変更が加えられています。

さらに重要な点として、AL2からAL2023へのインプレースアップグレード(稼働中OSの直接更新)はサポートされておらず、新しいインスタンスを立ち上げてアプリケーションを移行する「サイドバイサイド移行」が必須となります。

この記事では、Amazon Linux 2からAmazon Linux 2023へスムーズに移行するための手順、パッケージ管理(dnf)や決定論的アップデートの具体的な操作方法、Python 3.13環境の安全な構築手順、および本番移行時にハマりやすい注意点までを網羅して分かりやすく解説します。

  1. この記事で行うこと
  2. 前提条件と検証環境
  3. AL2からAL2023への主要な変更点と移行の基本方針
    1. 主な変更点比較表
    2. 移行の基本方針:サイドバイサイド移行
    3. AWS LambdaにおけるAL2023ランタイムへの移行
  4. 手順1:パッケージ管理の移行(yumからdnfへ)
    1. dnfコマンドの基本操作
    2. amazon-linux-extrasの廃止と名前空間パッケージ
    3. EPELリポジトリ非対応への注意点
  5. 手順2:決定論的アップデート(Deterministic Updates)の仕組みと運用
    1. 決定論的アップデートとは?
    2. 新バージョンの確認方法
    3. リポジトリバージョンのアップデート手順
    4. 恒久的なリポジトリバージョンの設定(本番運用のベストプラクティス)
  6. 手順3:Python 3.13環境のセットアップと安全な共存運用
    1. システムPython(3.9)とアプリケーションPython(3.13)の分離
    2. Python 3.13のインストール
    3. venvを用いた仮想環境の構築(推奨)
    4. systemdによる常駐サービス化の設定例
  7. 本番移行時の注意点とトラブルシューティング
    1. 1. SSH接続エラー(ssh-rsa / SHA-1無効化問題)
    2. 2. SELinuxのデフォルト動作(permissiveモード)
    3. 3. ネットワーク設定ツールの刷新
  8. よくある質問(FAQ)
    1. Q1. Amazon Linux 2のEC2をそのままAL2023にインプレースアップグレードできますか?
    2. Q2. dnf update を実行しても「No packages marked for update」と表示され、更新されません。
    3. Q3. Python 3.13をデフォルトの python コマンドとして呼び出したいのですが?
    4. Q4. AWS LambdaでPython 3.13を利用する場合、OSはどうなりますか?
  9. まとめ
  10. 参考情報

この記事で行うこと

  • Amazon Linux 2とAmazon Linux 2023の設計思想・主要な相違点を理解する
  • yum から dnf への移行、および amazon-linux-extras 廃止に伴う新しいパッケージ導入方法を実践する
  • AL2023特有の「決定論的アップデート(Deterministic Updates / releasever)」の仕組みと運用方法を習得する
  • システム用Python(3.9)を壊さずにPython 3.13環境を共存導入し、安全な仮想環境を構築する
  • SSH接続エラー(ssh-rsa無効化)やSELinux設定など、本番サーバー移行時の注意点とトラブルシューティングを把握する

前提条件と検証環境

この記事は、以下の環境および前提条件をもとに作成しています。

項目内容
移行元OSAmazon Linux 2 (x86_64 / aarch64)
移行先OSAmazon Linux 2023 (AL2023)
対象クラウドAmazon Web Services (AWS EC2, AWS Lambda)
操作端末SSHクライアント (OpenSSH, Tera Term 5等), AWS Management Console
必要権限EC2インスタンス作成権限、sudo(root)権限

AL2からAL2023への主要な変更点と移行の基本方針

移行作業を開始する前に、AL2とAL2023の違いを整理しておきましょう。AL2023はFedoraをベースにしたモダンな構成となっており、運用面やセキュリティ面で大きな進化を遂げています。

主な変更点比較表

比較項目Amazon Linux 2 (AL2)Amazon Linux 2023 (AL2023)
サポート終了日 (EOL)2026年6月30日標準サポート: 2027年6月30日 / メンテナンス延長サポート: 2029年6月30日
アップグレード方式インプレース不可インプレース不可(サイドバイサイド移行必須)
パッケージマネージャーyum (YUM v3)dnf (DNF v4/v5、yum コマンドもエイリアス動作)
追加パッケージ導入amazon-linux-extras廃止(コアリポジトリの名前空間パッケージに統合)
リポジトリ更新挙動実行時に最新パッケージを取得決定論的アップデート(AMI作成時のバージョンに固定)
EPELリポジトリ対応 (EPEL7)公式非対応(コアリポジトリや個別ツールで対応)
システムPythonPython 2.7 / 3.7 / 3.8Python 3.9(Python 3.11 / 3.12 / 3.13 も共存可能)
暗号化ポリシーレガシー暗号許容DEFAULTポリシー厳格化ssh-rsa / SHA-1無効)
SELinuxデフォルト無効 (disabled)デフォルト permissive(ログ記録モード)
IMDS (メタデータ)IMDSv1 / v2 対応IMDSv2 デフォルト推奨・必須化対応

移行の基本方針:サイドバイサイド移行

AL2からAL2023へは、コマンド一発でOSを丸ごと書き換えるインプレースアップグレードはできません。以下の手順による「サイドバイサイド移行」を実施します。

  • 新環境の構築: AL2023の最新AMIを使用して新規EC2インスタンスを起動する
  • ミドルウェア・ランタイム導入dnf コマンドを用いてWebサーバーやPython 3.13等をセットアップする
  • データ移行・動作検証: アプリケーションコード、設定ファイル、データベース等を移行し、ステージング検証を行う
  • トラフィック切り替え: Route 53(DNS)やALB(Application Load Balancer)のターゲットを切り替える
  • 旧環境の停止・削除: 切り替え後の安定稼働を確認したのち、旧AL2インスタンスを安全に廃棄する

AWS LambdaにおけるAL2023ランタイムへの移行

サーバーレス環境(AWS Lambda)においても、AL2ベースの古いランタイム(Python 3.8/3.9/3.10、Node.js 16/18など)の非推奨化が進んでおり、AL2023ベースのランタイム(Python 3.12/3.13、Node.js 20/22、provided.al2023)への移行が推奨されています。EC2インスタンスだけでなく、Lambda関数やコンテナイメージのベースOSもAL2023へ足並みを揃えてアップデートすることが望ましい設計です。

手順1:パッケージ管理の移行(yumからdnfへ)

AL2023では、従来の yum に代わり、より高速で依存関係解決に優れた dnf が標準のパッケージマネージャーとなりました。

dnfコマンドの基本操作

コマンド体系は yum とほぼ互換性があるため、従来の感覚で利用できます(互換性のために yum と入力しても内部的に dnf が呼び出されます)。

パッケージ情報の更新とインストール:

# パッケージキャッシュの更新
sudo dnf check-update

# パッケージのインストール
sudo dnf install -y nginx

# パッケージの検索
dnf search python3.13

# インストール済みパッケージ一覧の確認
dnf list installed

amazon-linux-extrasの廃止と名前空間パッケージ

AL2で新しいバージョンのソフトウェアを導入する際に使われていた amazon-linux-extras コマンドは、AL2023で完全に廃止されました。

AL2023では、特定バージョンのソフトウェアが「名前空間パッケージ(Namespaced Packages)」としてコアリポジトリに直接提供されています。

例えば、PostgreSQLやRedis、言語ランタイムを導入する場合は、Extrasのトピックを有効化することなく直接 dnf で指定します。

# AL2の場合(旧手順)
# sudo amazon-linux-extras install postgresql14

# AL2023の場合(新手順:パッケージ名を直接指定)
sudo dnf install -y postgresql15

これにより、UserDataやAnsibleなどの構成自動化スクリプトが非常にシンプルになります。

EPELリポジトリ非対応への注意点

AL2では amazon-linux-extras install epel 等で Fedora プロジェクトの EPEL(Extra Packages for Enterprise Linux)リポジトリを利用できましたが、AL2023ではEPELリポジトリは公式にサポートされていません。

EPELに依存していたパッケージがある場合は、以下の代替手段を検討してください。

  • AL2023のコアリポジトリに同等パッケージが含まれていないか検索する (dnf search <名前>)
  • 言語固有のパッケージマネージャー(Pythonの pip、Node.jsの npm、Rustの cargo 等)を利用する
  • 公式のバイナリ配布やソースコードビルドを利用する
  • 該当ミドルウェアをDockerコンテナ化して実行する

手順2:決定論的アップデート(Deterministic Updates)の仕組みと運用

AL2023の最も画期的な特徴が「決定論的アップデート(Deterministic Updates / リポジトリバージョンロック)」です。

決定論的アップデートとは?

従来のLinuxディストリビューションでは、起動時やCI/CDパイプライン実行時に yum update や dnf install を実行すると、その瞬間にリポジトリにある最新バージョンが取得されていました。そのため、「先週起動したインスタンス」と「今日Auto Scalingでスケールアウトしたインスタンス」でパッケージのマイナーバージョンがズレてしまい、予期せぬ不具合が発生するリスクがありました。

AL2023では、AMIごとにリポジトリバージョン(releasever)が初期状態で固定(ロック)されています。そのため、普通に dnf update を実行しても、そのリリースバージョン内のセキュリティ修正のみが適用され、大規模なバージョン変更が自動で入ることはありません。

新バージョンの確認方法

システムに新しいリポジトリバージョンがリリースされているかどうかを確認するには、dnf check-release-update コマンドを実行します。

sudo dnf check-release-update

実行結果例:

The following release is available for your instance:
Amazon Linux 2023.6.20241120
To update your instance to this release, run:
  dnf upgrade --releasever=2023.6.20241120

リポジトリバージョンのアップデート手順

ステージング環境等で動作検証を行った後、新しいリポジトリバージョンへ全体をアップグレードするには --releasever オプションを指定します。

# 特定のリリースタグに固定してアップグレード
sudo dnf upgrade --releasever=2023.6.20241120

# または最新(常に最新リポジトリを追従したい場合)
sudo dnf upgrade --releasever=latest

恒久的なリポジトリバージョンの設定(本番運用のベストプラクティス)

フリート全体で常に特定のバージョンを強制したい場合や、逆に自動で最新を追従させたい場合は、/etc/dnf/vars/releasever ファイルで設定できます。

# 常に最新リポジトリを追従させる設定にする場合
echo "latest" | sudo tee /etc/dnf/vars/releasever

# 特定のバージョンに固定する場合
echo "2023.6.20241120" | sudo tee /etc/dnf/vars/releasever

本番環境のベストプラクティスとしては、latest に設定して無条件更新するのではなく、CI/CD環境で特定のバージョン(例: 2023.6.20241120)でのテストをパスした後に、本番環境の releasever を一斉に引き上げる運用が推奨されます。

手順3:Python 3.13環境のセットアップと安全な共存運用

Web開発や自動化スクリプトで広く使われるPythonですが、AL2023では最新のPython 3.13が公式リポジトリから提供されています。

システムPython(3.9)とアプリケーションPython(3.13)の分離

AL2023のOS内部ツール(dnf や cloud-init など)は、システム標準の python3(Python 3.9)に依存しています。

そのため、/usr/bin/python3 のシンボリックリンクを強制的に Python 3.13 に張り替える行為は絶対に避けてください。OSのパッケージ管理機能がクラッシュする原因になります。

AL2023では、異なるバージョンのPythonを完全に共存(Side-by-Side)させることができます。

Python 3.13のインストール

以下のコマンドで Python 3.13、パッケージ管理ツール pip、およびC拡張ビルドに必要な開発用ヘッダー devel をインストールします。

sudo dnf install -y python3.13 python3.13-pip python3.13-devel

インストールが成功したかバージョンを確認します。

python3.13 --version
# 出力例: Python 3.13.x

# システムPythonはそのまま維持されていることを確認
python3 --version
# 出力例: Python 3.9.x

venvを用いた仮想環境の構築(推奨)

本番アプリケーションの運用では、OSのグローバル環境を汚さないよう、venv による仮想環境を作成して依存パッケージを分離管理します。

# アプリケーション用ディレクトリの作成
mkdir -p /var/www/my-app
cd /var/www/my-app

# Python 3.13を使った仮想環境の作成
python3.13 -m venv .venv

# 仮想環境のアクティベート
source .venv/bin/activate

# 仮想環境内のPythonバージョンを確認
python --version
# 出力例: Python 3.13.x

# 必要なパッケージをインストール(例: FastAPI, Uvicorn)
pip install --upgrade pip
pip install fastapi uvicorn gunicorn

systemdによる常駐サービス化の設定例

Pythonアプリケーション(例: FastAPI / Gunicorn)をAL2023上で常駐サービスとして起動する際は、systemdのサービスファイルを作成します。

/etc/systemd/system/myapp.service を作成します。

[Unit]
Description=My Python 3.13 Web Application
After=network.target

[Service]
User=ec2-user
WorkingDirectory=/var/www/my-app
ExecStart=/var/www/my-app/.venv/bin/gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8000
Restart=always
RestartSec=5
Environment="PATH=/var/www/my-app/.venv/bin"

[Install]
WantedBy=multi-user.target

サービスの有効化と起動:

sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
sudo systemctl status myapp.service

本番移行時の注意点とトラブルシューティング

AL2からAL2023へ移行する際、多くのエンジニアが直面する代表的なトラブルと対処法をまとめました。

1. SSH接続エラー(ssh-rsa / SHA-1無効化問題)

AL2023では、OpenSSL 3.0の導入に伴いシステム全体の暗号化ポリシー(Crypto Policies)が厳格化されています。古いアルゴリズムである ssh-rsa(SHA-1ハッシュ署名)はデフォルトで無効化されています。

この影響で、Tera Term 4系などの古いSSHクライアントや、古いRSA鍵を使用している場合に「Permission denied (publickey)」や接続切断エラーが発生します。

対処法:

  • 推奨: SSHキーペアを ED25519 または RSA 4096bit (SHA-2署名) で再作成する
  • 推奨: SSHクライアントを最新版(例: Tera Term 5.x、最新のPuTTY、VS Code Remote SSH)にアップデートする
  • 一時的な回避策(非推奨): どうしても旧クライアントからのアクセスが必要な場合は、AWS Systems Manager(Session Manager)等からログインし、暗号ポリシーを LEGACY に緩和します。
# 暗号化ポリシー変更スクリプトのインストールと適用
sudo dnf install -y crypto-policies-scripts
sudo update-crypto-policies --set LEGACY

# 設定確認(LEGACYと表示されれば完了)
update-crypto-policies --show

2. SELinuxのデフォルト動作(permissiveモード)

AL2ではデフォルトで無効(disabled)だったSELinuxが、AL2023ではデフォルトで permissive モード(制限は行わないが、アクセス拒否ログを記録するモード)になっています。

将来的に enforcing(強制拒否)へ移行する準備段階として設計されています。意図しないログ肥大化や動作への影響を確認したい場合は、モードを確認してください。

# 現在のSELinuxモードを確認
getenforce
# 出力: Permissive

# 設定ファイルの確認
cat /etc/selinux/config

3. ネットワーク設定ツールの刷新

AL2で長年使われてきた network-scripts/etc/sysconfig/network-scripts/ifcfg-*)は非推奨・廃止となり、AL2023では systemd-networkd および NetworkManager がネットワーク管理を担います。

静的IPや独自ルーティングをスクリプトで直接書き換えていた場合は、設定ファイルの配置場所を見直す必要があります。

よくある質問(FAQ)

Q1. Amazon Linux 2のEC2をそのままAL2023にインプレースアップグレードできますか?

A. できません。AL2とAL2023ではパッケージマネージャー、Cライブラリ(glibc)、コンパイラツールチェーン等の基盤が大きく刷新されているため、インプレースアップグレード用のツールは提供されていません。AL2023の新しいEC2インスタンスを起動し、設定とデータを移行する「サイドバイサイド移行」を行ってください。

Q2. dnf update を実行しても「No packages marked for update」と表示され、更新されません。

A. AL2023の「決定論的アップデート」仕様による正常な動作です。インスタンスのリポジトリバージョンがAMI作成時のバージョンに固定されています。新しいパッケージを取得したい場合は、sudo dnf check-release-update で最新バージョンを確認し、sudo dnf upgrade --releasever=<バージョン> を実行してください。

Q3. Python 3.13をデフォルトの python コマンドとして呼び出したいのですが?

A. システム全体の /usr/bin/python3 を置き換えるのではなく、ユーザー環境の .bashrc でエイリアスを設定するか、本番アプリケーション専用の仮想環境(venv)をアクティベートして利用することを強く推奨します。

# ユーザーの ~/.bashrc に追記する例
alias python=python3.13
alias pip=pip3.13

Q4. AWS LambdaでPython 3.13を利用する場合、OSはどうなりますか?

A. AWS Lambdaの python3.13 マネージドランタイムは、ベースOSとしてAL2023(provided.al2023)を採用しています。これにより、EC2上のAL2023環境で開発・ビルドしたPython 3.13のネイティブバイナリパッケージを、Lambda環境へ互換性を保ったままデプロイすることが可能です。

まとめ

Amazon Linux 2のEOL(2026年6月30日)は、インフラの近代化とセキュリティ強化を図る絶好の機会です。

AL2023への移行における重要ポイントを振り返ります。

  • 移行方式: インプレース不可のため、新規インスタンスを構築するサイドバイサイド移行を実施する
  • パッケージ管理yum や amazon-linux-extras から dnf と名前空間パッケージ(postgresql15 等)へ切り替える
  • 決定論的アップデート: フリート全体のバージョンを releasever で明示的に管理し、予期せぬアップデートによる障害を防ぐ
  • Python環境: システムPython(3.9)を保護しつつ、python3.13 と venv を活用してモダンな実行環境を構築する
  • セキュリティ: OpenSSL 3.0や暗号化ポリシーによるSSH接続仕様変更を事前に把握し、最新クライアントやED25519鍵を用意する

サポート終了直前に慌てないよう、早めに検証環境でAL2023の動作検証と移行計画を進めていきましょう。

参考情報