はじめに
AWS CodeBuildのビルドホストが Amazon Linux 2(以下、AL2)から Amazon Linux 2023(以下、AL2023)へ変更されるというAWSからのアナウンスを受け、ビルドプロジェクトの検証を行ったところ、予期せぬエラーが発生しました。 その原因と、ビルドホストAL2からAL2023への変更点を調査しましたので以下にまとめます。
背景
AWSからのアナウンス
AWSから以下のような通知が届きました。
件名:[Updated Messaging][Action may be required] AWS CodeBuild migrating build hosts to AL2023
Starting October 1, 2024, AWS CodeBuild will be upgrading its fleet of build hosts to use Amazon Linux 2023 (AL2023) as the operating system. Currently, the build hosts have Amazon Linux 2 (AL2) as their operating system. CodeBuild provided AL2 container images are compatible with AL2023 hosts and will continue running without requiring any action from your end [1]. You may need to update your buildspec and any custom images only if your builds make an assumption that the underlying operating system is AL2 or relies on AL2 functionality from the underlying operating system which is removed in AL2023 [2]. This may be the case for builds using privileged mode or builds testing for a specific OS kernel version. CodeBuild provides managed container images, including ones based on AL2023, containing many of the popular runtimes [3].
このアナウンスの要点は、「ビルドホストAL2が廃止となり、AL2023へアップグレードされる」というものです。
AWSは両バージョン間の互換性を謳っていますが、慎重を期して検証環境でテストを実施しました。
発生した問題
検証中、ビルドホスト上で実行したAWS CLIコマンドが以下のようなエラーを引き起こしました。
aws: error: argument operation: Invalid choice, valid choices are: ~省略~ Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: <AWS CLIコマンド>. Reason: exit status 252
問題の原因
調査を進めると、AL2に導入されているAWS CLIはv1であるのに対して、AL2023ではv2であることが判明しました。
実行していたAWS CLIコマンドがv2に対応しておらず、エラーとなっていたようです。
この事例から、AL2とAL2023の間には導入されているランタイムやそのバージョンに無視できない差異があることが明らかになりました。
そこで、他にも潜在的な問題がないかを確認するため、両環境のランタイムの違いについて詳細な調査を行うことにしました。
前提
今回調査するイメージは以下2点です。
・Amazon Linux 2(aws/codebuild/amazonlinux2-x86_64-standard:4.0)
・Amazon Linux 2023(aws/codebuild/amazonlinux2-x86_64-standard:5.0)
変更点の調査
調査に使うbuildspecファイル
本調査に使うbuildspecファイルは以下の通りです。
version: 0.2 phases: build: commands: - aws --version - docker --version - docker-compose --version - mvn --version - gradle -v - python -V - python3 -V - java -version - php -v - ruby -v - perl -v - go version - node --version - echo '---------------------------------------------' - ls -l /usr/lib/jvm/ - echo '---------------------------------------------' - env | sort - echo '---------------------------------------------' - rpm -qa --qf "%{NAME},%{VERSION}\n" | sort - echo '---------------------------------------------' - for x in ${PATH//:/ }; do ls -1 $x; done | sort | uniq - echo '---------------------------------------------' - alias
ランタイム
AWSドキュメントに、各イメージ毎のライセンスバージョンがまとめられていますので以下に抜粋します。
ランタイム | Amazon Linux 2 | Amazon Linux 2023 |
---|---|---|
dotnet | 6.0 | 6.0, 8.0 |
Golang | 1.18 | 1.20, 1.21, 1.22 |
Java | corretto17 | corretto8, corretto11, corretto17, corretto21 |
Node.js | 16 | 18, 20 |
PHP | 8.1 | 8.2, 8.3 |
Python | 3.9 | 3.9, 3.10, 3.11, 3.12 |
Ruby | 3.1 | 3.1, 3.2, 3.3 |
AL2では各ランタイムバージョンは1つのみなのに対して、AL2023では複数バージョンが導入されており環境に合わせて選択できるようですね。
個人的に気になったランタイムバージョン
次に個人的に気になったランタイムのバージョン情報を、ビルドホストを動作させて調査しましたので以下にまとめます。 上記で複数バージョン導入されているJavaやPython等のデフォルトバージョンが何なのかが気になりました。
ランタイム | Amazon Linux 2 | Amazon Linux 2023 |
---|---|---|
AWS CLI | 1.34.28 | 2.17.60 |
Docker | 20.10.24 | 26.1.4 |
docker-compose | 1.29.2 | 2.27.0 |
Maven | 3.9.5 | 3.9.5 |
Gradle | 7.6.2 | 8.3 |
Perl | 5.16.3 | 5.32.1 |
Golang | 1.18.10 | 1.20.14 |
Java | 17.0.12 | 17.0.12 |
Node.js | 16.20.1 | 18.20.3 |
PHP | 8.1.20 | 8.2.20 |
Python | 3.9.17 | 3.11.9 |
Python3 | 3.9.17 | 3.11.9 |
Ruby | 3.1.4p223 | 3.2.4 |
また、Javaの導入先ディレクトリを見てみると以下のようになっているので、alternatives
コマンドで切り替えられそうです。
[Container] 2024/10/16 05:51:41.615988 Running command ls -l /usr/lib/jvm/ total 0 lrwxrwxrwx 1 root root 32 Sep 26 22:46 java-1.8.0 -> /etc/alternatives/java_sdk_1.8.0 drwxr-xr-x 9 root root 210 Sep 26 22:46 java-1.8.0-amazon-corretto.x86_64 lrwxrwxrwx 1 root root 40 Sep 26 22:46 java-1.8.0-openjdk -> /etc/alternatives/java_sdk_1.8.0_openjdk lrwxrwxrwx 1 root root 29 Sep 26 22:45 java-11 -> /etc/alternatives/java_sdk_11 drwxr-xr-x 8 root root 94 Sep 26 22:45 java-11-amazon-corretto.x86_64 lrwxrwxrwx 1 root root 37 Sep 26 22:45 java-11-openjdk -> /etc/alternatives/java_sdk_11_openjdk lrwxrwxrwx 1 root root 29 Sep 26 22:45 java-17 -> /etc/alternatives/java_sdk_17 drwxr-xr-x 8 root root 94 Sep 26 22:45 java-17-amazon-corretto.x86_64 lrwxrwxrwx 1 root root 37 Sep 26 22:45 java-17-openjdk -> /etc/alternatives/java_sdk_17_openjdk lrwxrwxrwx 1 root root 29 Sep 26 22:45 java-21 -> /etc/alternatives/java_sdk_21 drwxr-xr-x 8 root root 94 Sep 26 22:45 java-21-amazon-corretto.x86_64 lrwxrwxrwx 1 root root 37 Sep 26 22:45 java-21-openjdk -> /etc/alternatives/java_sdk_21_openjdk lrwxrwxrwx 1 root root 27 Sep 26 22:46 jre-1.8.0 -> /etc/alternatives/jre_1.8.0 lrwxrwxrwx 1 root root 35 Sep 26 22:46 jre-1.8.0-openjdk -> /etc/alternatives/jre_1.8.0_openjdk lrwxrwxrwx 1 root root 24 Sep 26 22:45 jre-11 -> /etc/alternatives/jre_11 lrwxrwxrwx 1 root root 32 Sep 26 22:45 jre-11-openjdk -> /etc/alternatives/jre_11_openjdk lrwxrwxrwx 1 root root 24 Sep 26 22:45 jre-17 -> /etc/alternatives/jre_17 lrwxrwxrwx 1 root root 32 Sep 26 22:45 jre-17-openjdk -> /etc/alternatives/jre_17_openjdk lrwxrwxrwx 1 root root 24 Sep 26 22:45 jre-21 -> /etc/alternatives/jre_21 lrwxrwxrwx 1 root root 32 Sep 26 22:45 jre-21-openjdk -> /etc/alternatives/jre_21_openjdk
Pythonだと以下コマンドが実行できるようです。
python3.9
python3.10
python3.11
python3.12
まとめ
今回は、AL2とAL2023の変更点として主にランタイム、ランタイムバージョンの差異をまとめてみました。 バージョンが変わったこと以外に、複数バージョンが導入されているようなのでビルドできる範囲が広がって便利になりましたね。 なお、細かすぎるので本記事には載せませんが、以下のようなコマンドで実行可能なコマンドやバージョン一覧が取得できるので、気になる方はご自身の環境で実行してみてください。
$ for x in ${PATH//:/ }; do ls -1 $x; done | sort | uniq
$ rpm -qa --qf "%{NAME},%{VERSION}\n"