Amazon Linux 2 から Amazon Linux 2023 Amazon ECS 最適化 AMI への移行
Amazon Linux
Amazon Linux 2023 は、デフォルトで安全性を確保するアプローチを採用し、事前設定されたセキュリティポリシー、Permissive モードの SELinux、デフォルトで有効になっている IMDSv2-only モード、最適化された起動時間、セキュリティとパフォーマンスの向上を目的として改善されたパッケージ管理機能を提供します。
Amazon Linux 2 と Amazon Linux 2023 の Amazon ECS 最適化 AMI は互換性が高く、ほとんどのお客様が感じる 2 つのオペレーティングシステム間でのワークロードの変化は最小限となるか、全く感じられないでしょう。
AL2 および AL2023 間の主な相違点の詳細については、「Amazon Linux 2023 ユーザーガイド」の「Amazon Linux 2 と Amazon Linux 2023 の比較」と「AL 2023 に関するよくある質問
互換性に関する考慮事項
パッケージ管理と OS の更新
Amazon Linux の以前のバージョンとは異なり、Amazon ECS 向けに最適化された Linux 2023 AMI の Amazon Linux リポジトリは特定のバージョンにロックされています。このため、不要な変更や互換性を破る変更を引き起こす可能性のあるパッケージを誤って更新することがありません。詳細については、「Amazon Linux 2023 ユーザーガイド」の「Managing repositories and OS updates in Amazon Linux 2023」を参照してください。
Linux カーネルバージョン
Amazon Linux 2 AMI は Linux カーネル 4.14 および 5.10 をベースにしており、Amazon Linux 2023 は Linux カーネル 6.1 および 6.12 を使用しています。Amazon Linux 2023 の詳細については、「Amazon Linux 2023 ユーザーガイド」の「Comparing Amazon Linux 2 and Amazon Linux 2023 kernels」を参照してください。
パッケージアベイラビリティの変更
Amazon Linux 2023 でのパッケージにおける重要な変更点は次のとおりです。
-
Amazon Linux 2 の一部のソースバイナリパッケージは、Amazon Linux 2023 では利用できなくなりました。詳細については、「Amazon Linux 2023 リリースノート」の「Packages removed from Amazon Linux 2023」を参照してください。
-
Amazon Linux がさまざまなバージョンのパッケージをサポートする方法が変更されました。Amazon Linux 2 で使用される
amazon-linux-extrasシステムは、Amazon Linux 2023 には存在しません。すべてのパッケージは、単純に「コア」リポジトリから使用できます。 -
Enterprise Linux (EPEL) の追加パッケージは Amazon Linux 2023 ではサポートされません。詳細については、「Amazon Linux 2023 ユーザーガイド」の「EPEL compatibility in Amazon Linux 2023」を参照してください。
-
32-bit アプリケーションは Amazon Linux 2023 ではサポートされていません。詳細については、「Amazon Linux 2023 ユーザーガイド」の「Deprecated features from Amazon Linux 2」を参照してください。
コントロールグループ (cgroups) の変更点
コントロールグループ (cgroup) は、プロセスを階層的に整理し、システムリソースをプロセス間で分散するための Linux カーネルの機能です。コントロールグループは、コンテナランタイムの実装や、さまざまな用途に systemd によって使用されています。
Amazon Linux 2023 はデフォルトで cgroupv2 を使用し、Amazon Linux 2 は cgroupv1 を使用します。Amazon ECS エージェント、Docker、および containerd はすべて cgroupv1 と cgroupv2 の両方をサポートしています。cgroupv2 の詳細については、「Amazon Linux 2023 ユーザーガイド」の「Control groups v2 in Amazon Linux 2023」を参照してください。
メモリ使用量レポート
cgroupv2 は、コンテナメモリ使用量の計算方法を変更します。cgroupv1 (Amazon Linux 2) では、コンテナランタイムによってレポートされたコンテナのメモリ使用率には通常、ページキャッシュは含まれません。cgroupv2 (Amazon Linux 2023) では、ページキャッシュはレポートされたメモリ使用率に含まれます。実際のアプリケーションのメモリ消費量が変更されていない場合でも、Amazon Linux 2023 では、Amazon Linux 2 と比較して、同じワークロードで高いメモリ使用率がレポートされる可能性があります。
本番ワークロードを移行する前に、Amazon Linux 2023 インスタンスのメモリ使用率をベンチマークし、必要に応じてタスクとコンテナのメモリ制限を調整することをお勧めします。Container Insights を使用して、Amazon Linux 2 と Amazon Linux 2023 のメモリ使用率を比較できます。
タスクメモリの可視性制限
コンテナレベルのメモリ制限を設定せずにタスクレベルでメモリを設定すると、Amazon ECS はその制限をタスクの cgroup に適用します。これは、タスクに属するすべてのコンテナの実効メモリ制限として機能します。cgroupv1 (Amazon Linux 2) では、子 cgroup は独自のレベルで有効なメモリ制限を読み取ることができます。cgroup 階層をトラバースする必要はありません。cgroupv2 (Amazon Linux 2023) では、有効な制限はコンテナに表示されません。さらに、Docker はデフォルトでプライベート cgroup 名前空間でコンテナを実行します。これにより、コンテナは cgroup 階層を通過して親の制限を検出できなくなります。
cgroup メモリ制限を読み取り、使用可能なメモリを決定するコンテナ内のプロセスには、タスクレベルの制限ではなくホストメモリ全体が表示されます。例えば、Java 仮想マシン (JVM) はこの問題の影響を受けることが知られています。cgroup 制限を使用してヒープを自動的にサイズ設定します。真の制限を検出できない場合、メモリを過剰に割り当ててしまい、メモリ不足 (OOM) による強制終了のリスクが高まります。リソース決定の cgroup 制限を読み取る他のランタイムまたはフレームワークも同様に影響を受ける可能性があります。
これは、タスクレベルのメモリが設定されているが、タスク定義でコンテナレベル memory が設定されていない場合に発生します。
この問題を解決するには、以下のいずれかの回避策を選択してください。
コンテナレベルのメモリ制限の設定 (推奨)
タスク定義のコンテナレベルで、memory パラメータをタスクレベルのメモリ値と等しく明示的に設定します。このアプローチは安全で信頼性が高く、インフラの変更も不要です。
エージェントレベルのタスクメモリ制限の伝播を有効にする
Amazon ECS エージェントで ECS_PROPAGATE_TASK_MEMORY_LIMIT_CGROUPV2 環境変数を true に設定します。有効化されていて cgroupv2 の場合、コンテナに明示的なコンテナレベルのメモリ制限が設定されていない場合、エージェントは各コンテナのメモリ制限をタスクレベルの値に自動的に設定します。これにより、タスク定義を変更することなく、コンテナ内でタスクのメモリ制限を可視化できます。
これは、Amazon EC2 インスタンスの Amazon ECS エージェント設定ファイル (/etc/ecs/ecs.config) で設定できます。
ECS_PROPAGATE_TASK_MEMORY_LIMIT_CGROUPV2=true
このオプションを使用するには、Amazon ECS エージェントのバージョン 1.104.0 以降が必要です。cgroupv2 を使用する Linux インスタンスにのみ適用されます。Windows ではサポートされていません。
インスタンスメタデータサービス (IMDS) の変更点
Amazon Linux 2023 では、デフォルトではインスタンスメタデータサービスのバージョン 2 (IMDSv2) が必要になります。IMDSv2 には、セキュリティ体制の改善に役立ついくつかの利点があります。セッション指向の認証方式を使用しており、セッションを開始するためにシンプルな HTTP PUT リクエストでシークレットトークンを作成する必要があります。セッショントークンの有効期間は 1 秒~ 6 時間です。
IMDSv1 から IMDSv2 への移行の詳細については、「Amazon EC2 ユーザーガイド」の「インスタンスメタデータサービスバージョン 2 の使用への移行」を参照してください。
IMDSv1 を使用する場合は、インスタンスのメタデータオプションの起動プロパティで設定を手動で上書きすることで使用可能になります。
メモリスワップの変更点
コンテナごとのメモリスワップは、Amazon Linux 2023 および cgroups v2 ではサポートされていません。詳細については、「Amazon ECS のコンテナスワップメモリ空間の管理」を参照してください。
FIPS 検証の変更点
Amazon Linux 2 は FIPS 140-2 に基づいて認定されており、Amazon Linux 2023 は FIPS 140-3 に基づいて認定されています。
Amazon Linux 2023 で FIPS モードを有効にするには、Amazon EC2 インスタンスに必要なパッケージをインストールし、「Amazon Linux 2023 ユーザーガイド」の「Enable FIPS Mode on Amazon Linux 2023」に記載された手順に従って設定を行います。
インスタンスのサポートの高速化
Amazon ECS 向けに最適化された Amazon Linux 2023 AMI は、Neuron と GPU の両方の高速化インスタンスタイプをサポートしています。詳細については、「Amazon ECS に最適化された Linux AMI」を参照してください。
カスタム AMI の構築
Amazon Linux 2023 では、正式にサポートおよび公開されている Amazon ECS 最適化 AMI に移行することをお勧めしますが、Amazon ECS 最適化 AMI の Linux バリアントの構築に使用されているオープンソースのビルドスクリプトを使用することで、引き続きカスタム Amazon Linux 2 Amazon ECS 最適化 AMI を構築できます。詳細については、「Amazon ECS 最適化 Linux AMI のビルドスクリプト」を参照してください。
移行戦略
徹底的なアプリケーションテストを含む移行計画を作成して実装することをお勧めします。以下のセクションでは、Amazon ECS インフラストラクチャの管理方法に基づくさまざまな移行戦略についての概要を説明します。
Amazon ECS キャパシティプロバイダーを利用した移行
-
新しい起動テンプレートを使用して、新しいキャパシティプロバイダーを作成します。これは、既存の起動テンプレートと類似した起動テンプレートを持つ Auto Scaling グループを参照する必要がありますが、Amazon Linux 2 Amazon ECS 最適化 AMI ではなく、Amazon Linux 2023 バリアントのいずれかを指定する必要があります。この新しいキャパシティプロバイダーを既存の Amazon ECS クラスターに追加します。
-
クラスターのデフォルトのキャパシティプロバイダー戦略を更新して、既存の Amazon Linux 2 キャパシティプロバイダーと新しい Amazon Linux 2023 キャパシティプロバイダーの両方が含まれるようにします。Amazon Linux 2 プロバイダーの重みを大きく、Amazon Linux 2023 プロバイダーの重みを小さく設定します (Amazon Linux 2: 重み 80、Amazon Linux 2023: 重み 20 など)。これにより、新しいタスクがスケジュールされると、Amazon ECS は Amazon Linux 2023 インスタンスのプロビジョニングを開始します。インスタンスが正しく登録されていること、タスクが新しいインスタンスで正常に実行できることを確認します。
-
クラスターのデフォルト戦略におけるキャパシティプロバイダーの重みを徐々に調整し、Amazon Linux 2023 プロバイダーの重みを増加させつつ、Amazon Linux 2 プロバイダーの重みを時間の経過とともに減らします (例: 60/40、40/60、20/80)。個々のサービスプロバイダー戦略を更新して、Amazon Linux 2023 インスタンスを優先させることもできます。タスクの配置を監視して、Amazon Linux 2023 インスタンスで正常に実行されていることを確認します。
-
必要に応じて Amazon Linux 2 コンテナインスタンスをドレインして、タスクの移行を高速化します。Amazon Linux 2023 に置き換える十分な容量がある場合は、Amazon ECS コンソールまたは AWS CLI を使用して Amazon Linux 2 コンテナインスタンスを手動でドレインすることで、Amazon Linux 2 から Amazon Linux 2023 へのタスクの移行を高速化できます。移行が完了したら、クラスターから Amazon Linux 2 キャパシティプロバイダーを削除し、関連する Auto Scaling グループを削除します。
Amazon EC2 Auto Scaling グループを使用した移行
-
新しい起動テンプレートを使用して、新しい Amazon EC2 Auto Scaling グループを作成します。これは既存の起動テンプレートと類似しているはずですが、Amazon Linux 2 Amazon ECS 最適化 AMI の代わりに、Amazon Linux 2023 バリアントのいずれかを指定する必要があります。この新しい Auto Scaling グループは、既存のクラスターにインスタンスを起動できます。
-
Auto Scaling グループをスケールアップして、Amazon Linux 2023 インスタンスがクラスターに登録されるようにします。インスタンスが正しく登録されていること、タスクが新しいインスタンスで正常に実行できることを確認します。
-
タスクが Amazon Linux 2023 で動作することを検証したら、Amazon Linux 2023 Auto Scaling グループをスケールアップしつつ、Amazon Linux 2 Auto Scaling グループを徐々にスケールダウンし、すべての Amazon Linux 2 インスタンスが完全に置き換えられるまで継続します。
-
Amazon Linux 2023 に置き換える十分な容量がある場合は、コンテナインスタンスを明示的にドレインすることで、Amazon Linux 2 から Amazon Linux 2023 へのタスクの移行を高速化できます。詳細については、「Amazon ECS コンテナインスタンスをドレインする」を参照してください。
手動マネージドインスタンスを使用した移行
-
Amazon Linux 2 の代わりに Amazon ECS に最適化された Amazon Linux 2023 AMI を使用して、新しい Amazon EC2 インスタンスを手動で起動 (または起動するスクリプトを調整) します。これらのインスタンスが既存の Amazon Linux 2 インスタンスと同じセキュリティグループ、サブネット、IAM ロール、クラスター設定を使用していることを確認します。インスタンスは、起動時に既存の Amazon ECS クラスターに自動的に登録される必要があります。
-
新しい Amazon Linux 2023 インスタンスが Amazon ECS クラスターに正常に登録され、
ACTIVE状態であることを確認します。自然にタスクが配置されるのを待つか、一部のタスクを手動で停止/開始してスケジュール変更を開始することで、これらの新しいインスタンスでタスクを適切にスケジュールして実行できることをテストします。 -
必要に応じて追加の Amazon Linux 2023 インスタンスを起動し、Amazon Linux 2 インスタンスを手動でドレインして 1 つずつ終了することで、Amazon Linux 2 インスタンスを段階的に置き換えます。インスタンスを
DRAININGステータスに設定することで、Amazon ECS コンソールからインスタンスをドレインできます。これにより、インスタンスへの新しいタスクの配置が停止し、既存のタスクの終了や別の場所への再スケジュールが可能になります。