Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

AWS CodeBuild ビルドホストのAL2からAL2023への変更点

はじめに

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"

参考

使用可能なランタイム