
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環境の安全な構築手順、および本番移行時にハマりやすい注意点までを網羅して分かりやすく解説します。
この記事で行うこと
前提条件と検証環境
この記事は、以下の環境および前提条件をもとに作成しています。
| 項目 | 内容 |
|---|---|
| 移行元OS | Amazon Linux 2 (x86_64 / aarch64) |
| 移行先OS | Amazon 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) | 公式非対応(コアリポジトリや個別ツールで対応) |
| システムPython | Python 2.7 / 3.7 / 3.8 | Python 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に依存していたパッケージがある場合は、以下の代替手段を検討してください。
手順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)」や接続切断エラーが発生します。
対処法:
# 暗号化ポリシー変更スクリプトのインストールと適用
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への移行における重要ポイントを振り返ります。
サポート終了直前に慌てないよう、早めに検証環境でAL2023の動作検証と移行計画を進めていきましょう。
