自由気ままに書いちゃおう

好きなことをつらつらと・・・

【AWS】CodeBuildプロジェクトで利用するランタイムバージョン指定について

今回は、CodeBuildプロジェクトのbuildspec.ymlで指定可能なruntime-versionsセクションについてです。

例)

version: 0.2
phases:
  install:
    runtime-versions:   # この部分についてです!!
      python: 3.12
  build:
    commands:
      - python --version

ランタイムとは

ランタイムは、javaやnode.js ,python などのプログラミング言語のこと。

ランタイムバージョンとは

例えば、python3.12.3 のようなセマンティックバージョン形式のバージョンのこと。

ランタイムバージョンの種類について

以下2種類が存在する。

  • プリインストールランタイムバージョン
  • カスタムランタイムバージョン

プリインストールランタイムバージョン

マネージド型イメージのランタイムバージョン(runtime-versions)には、イメージにプリインストールされているランタイムが存在する。

例えば、pythonの場合には

https://github.com/aws/aws-codebuild-docker-images/blob/master/al2/x86_64/standard/5.0/Dockerfile#L311-L327

で記載されているように以下のようにプリインストールされるバージョンが指定されている。

ENV PYTHON_311_VERSION="3.11.9" \
    PYTHON_312_VERSION="3.12.4" \
    PYTHON_310_VERSION="3.10.14" \
    PYTHON_39_VERSION="3.9.19" \

よって、runtime-versions: python3.xとした場合には、最新の3.12.4が利用されることになる。

カスタムランタイムバージョン

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/runtime-versions.html#custom-runtime

runtime-versions: python3とした場合には、

https://www.python.org/ftp/python/の最新版がDockerイメージにダウンロード&インストールされる。

ランタイムバージョンの指定方法

AWSマネージド型イメージ、カスタムイメージ問わず、buildspec.ymlのruntime-versionsの書式は以下URLで確認ができる。

javaのみメジャーバージョンの指定だけ可能となっている。(ただし、java:corretto21.x のようにxの指定は可能だが、結局のところjava:corretto21と同じになるため意味がない)

https://docs.aws.amazon.com/codebuild/latest/userguide/runtime-versions.html#custom-runtime

Runtime name Syntax Example
dotnet .. 5.0.408
golang .
..
1.19
1.19.1
java corretto corretto15
nodejs
.
..
14
14.21
14.21.3
php .. 8.0.30
python
.
..
3
3.7
3.7.16
ruby .. 3.0.6

java以外のランタイムについては、xを利用した場合、最新バージョンを意味する。

ランタイムバージョン指定の具体例

runtime-versionsセクションの記述の仕方により利用されるPythonバージョンは以下の通りの結果となった。

  • python:3pythno 3.12.5 を利用 # マネージド型イメージへ新規インストール
  • python:3.xPython 3.12.4 を利用 # Dockerfileでプリインストールされている
  • python:3.11Python 3.11.9 を利用 # Dockerfileでプリインストールされている
  • python:3.12Python 3.11.9 を利用 # Dockerfileでプリインストールされている
  • python:3.12.xは指定不可 # プロジェクト実行時にエラーとなる。
  • python:3.12.1Python 3.12.1 を利用 # マネージド型イメージへ新規インストール。期待通り、というか当たり前・・・・

上記結果より、必ずしもpython:3python3.xの結果が同じになるわけではないことに注意が必要。

python:3(ランタイムの最新バージョンを利用)

現状ではプリインストールされたバージョン(= https://github.com/aws/aws-codebuild-docker-images/blob/master/al2/x86_64/standard/5.0/Dockerfile#L311-L327 )ではなく、ビルド時にインストール処理が実行されたため時間を要した。

# 以下はCodeBuildログ
[Container] 2024/09/09 01:49:38.229406 Running on CodeBuild On-demand
[Container] 2024/09/09 01:49:38.229421 Waiting for agent ping
[Container] 2024/09/09 01:49:38.430845 Waiting for DOWNLOAD_SOURCE
[Container] 2024/09/09 01:49:39.736007 Phase is DOWNLOAD_SOURCE
[Container] 2024/09/09 01:49:39.779612 CODEBUILD_SRC_DIR=/codebuild/output/src479052281/src
[Container] 2024/09/09 01:49:39.779719 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2024/09/09 01:49:39.779815 No commands found for phase name: install
[Container] 2024/09/09 01:49:39.781705 Processing environment variables
[Container] 2024/09/09 01:49:40.142691 Selecting 'python' runtime version '3' based on manual selections...
[Container] 2024/09/09 01:49:40.143432 Running command echo "Installing custom Python version 3 ..."
Installing custom Python version 3 ...
[Container] 2024/09/09 01:49:40.183798 Running command pyenv install 3 && rm -rf /tmp/*
Downloading Python-3.12.5.tar.xz...
-> https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tar.xz
Installing Python-3.12.5...
Installed Python-3.12.5 to /root/.pyenv/versions/3.12.5
[Container] 2024/09/09 01:53:10.799590 Running command pyenv global 3
[Container] 2024/09/09 01:53:10.853358 Moving to directory /codebuild/output/src479052281/src
※中略※
[Container] 2024/09/09 01:53:11.257019 Running command python --version
Python 3.12.5
python:3.x(イメージのプリインストールランタイムバージョンを利用)

マネージド型イメージを管理する Github リポジトリの Dockerfile より、

現時点におけるPYTHON_312_VERSIONに対応するバージョンがpython 3.12.4であり、当該バージョンがプリインストールされているため、処理が早い。

aws-codebuild-docker-images/al2/x86_64/standard/5.0/Dockerfile at master

https://github.com/aws/aws-codebuild-docker-images/blob/master/al2/x86_64/standard/5.0/Dockerfile#L311-L327

# ============== Dockerfileの抜粋 ==============
ENV PYTHON_311_VERSION="3.11.9" \
    PYTHON_312_VERSION="3.12.4" \
    PYTHON_310_VERSION="3.10.14" \
    PYTHON_39_VERSION="3.9.19" \
    PYTHON_PIP_VERSION=24.0 \
    PYYAML_VERSION=5.4.1 \
    PYTHON_CONFIGURE_OPTS="--enable-shared --enable-loadable-sqlite-extensions"

#Python312
RUN set -ex \
    && pyenv install $PYTHON_312_VERSION \
    && pyenv global $PYTHON_312_VERSION \
    && pip3 install --no-cache-dir --upgrade --force-reinstall "pip==$PYTHON_PIP_VERSION" \
    && pip3 install wheel \
    && pip3 install --no-cache-dir --upgrade 'setuptools==67.7.2' boto3 pipenv virtualenv \
    && pip3 install --no-build-isolation "Cython<3" "PyYAML==$PYYAML_VERSION" \
    && pip3 uninstall cython --yes
#=================================
# 以下はCodeBuildログ

[Container] 2024/09/09 01:48:17.635652 Running on CodeBuild On-demand
[Container] 2024/09/09 01:48:17.635664 Waiting for agent ping
[Container] 2024/09/09 01:48:17.836872 Waiting for DOWNLOAD_SOURCE
[Container] 2024/09/09 01:48:18.802588 Phase is DOWNLOAD_SOURCE
[Container] 2024/09/09 01:48:18.841674 CODEBUILD_SRC_DIR=/codebuild/output/src1329998659/src
[Container] 2024/09/09 01:48:18.841778 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2024/09/09 01:48:18.841905 No commands found for phase name: install
[Container] 2024/09/09 01:48:18.843555 Processing environment variables
[Container] 2024/09/09 01:48:19.059676 Resolved 'python' runtime alias '3.x' to '3.12'.     # 3.x は 3.12のエイリアスになっていることがわかる
[Container] 2024/09/09 01:48:19.059698 Selecting 'python' runtime version '3.12' based on manual selections...
[Container] 2024/09/09 01:48:19.060131 Running command echo "Installing Python version 3.12 ..."
Installing Python version 3.12 ...
[Container] 2024/09/09 01:48:19.065223 Running command pyenv global $PYTHON_312_VERSION
[Container] 2024/09/09 01:48:19.624601 Moving to directory /codebuild/output/src1329998659/src
※中略※
[Container] 2024/09/09 01:48:20.037920 Running command python --version
Python 3.12.4
python:3.11(イメージのプリインストールランタイムバージョンを利用。マイナーバージョンまで指定)
ENV PYTHON_311_VERSION="3.11.9" \   # ここが採用される
    PYTHON_312_VERSION="3.12.4" \
    PYTHON_310_VERSION="3.10.14" \
    PYTHON_39_VERSION="3.9.19" \
# 以下はCodeBuildログ

[Container] 2024/09/10 02:10:34.777572 Running on CodeBuild On-demand
[Container] 2024/09/10 02:10:34.777587 Waiting for agent ping
[Container] 2024/09/10 02:10:34.979207 Waiting for DOWNLOAD_SOURCE
[Container] 2024/09/10 02:10:35.988167 Phase is DOWNLOAD_SOURCE
[Container] 2024/09/10 02:10:36.026751 CODEBUILD_SRC_DIR=/codebuild/output/src2788348075/src
[Container] 2024/09/10 02:10:36.026860 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2024/09/10 02:10:36.026982 No commands found for phase name: install
[Container] 2024/09/10 02:10:36.028742 Processing environment variables
[Container] 2024/09/10 02:10:36.265217 Selecting 'python' runtime version '3.11' based on manual selections...
[Container] 2024/09/10 02:10:36.266401 Running command echo "Installing Python version 3.11 ..."
Installing Python version 3.11 ...

[Container] 2024/09/10 02:10:36.272895 Running command pyenv global $PYTHON_311_VERSION

[Container] 2024/09/10 02:10:36.782329 Moving to directory /codebuild/output/src2788348075/src
[Container] 2024/09/10 02:10:36.786230 Unable to initialize cache download: no paths specified to be cached
[Container] 2024/09/10 02:10:36.956001 Configuring ssm agent with target id: codebuild:7ae6e695-67ab-41a0-93d7-849d7fcda447
[Container] 2024/09/10 02:10:36.990119 Successfully updated ssm agent configuration
[Container] 2024/09/10 02:10:36.990516 Registering with agent
[Container] 2024/09/10 02:10:37.033173 Phases found in YAML: 2
[Container] 2024/09/10 02:10:37.033200  BUILD: 1 commands
[Container] 2024/09/10 02:10:37.033206  INSTALL: 0 commands
[Container] 2024/09/10 02:10:37.033455 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
[Container] 2024/09/10 02:10:37.033468 Phase context status code:  Message: 
[Container] 2024/09/10 02:10:37.099366 Entering phase INSTALL
[Container] 2024/09/10 02:10:37.139116 Phase complete: INSTALL State: SUCCEEDED
[Container] 2024/09/10 02:10:37.139138 Phase context status code:  Message: 
[Container] 2024/09/10 02:10:37.169767 Entering phase PRE_BUILD
[Container] 2024/09/10 02:10:37.171037 Phase complete: PRE_BUILD State: SUCCEEDED
[Container] 2024/09/10 02:10:37.171053 Phase context status code:  Message: 
[Container] 2024/09/10 02:10:37.203012 Entering phase BUILD
[Container] 2024/09/10 02:10:37.204390 Running command python --version
Python 3.11.9
python:3.12(イメージのプリインストールランタイムバージョンを利用。マイナーバージョンまで指定)
ENV PYTHON_311_VERSION="3.11.9" \
    PYTHON_312_VERSION="3.12.4" \   # ここが採用される
    PYTHON_310_VERSION="3.10.14" \
    PYTHON_39_VERSION="3.9.19" \
# 以下はCodeBuildログ

[Container] 2024/09/10 02:14:07.604339 Running on CodeBuild On-demand
[Container] 2024/09/10 02:14:07.604356 Waiting for agent ping
[Container] 2024/09/10 02:14:07.805692 Waiting for DOWNLOAD_SOURCE
[Container] 2024/09/10 02:14:08.881262 Phase is DOWNLOAD_SOURCE
[Container] 2024/09/10 02:14:08.922034 CODEBUILD_SRC_DIR=/codebuild/output/src2042592390/src
[Container] 2024/09/10 02:14:08.922144 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2024/09/10 02:14:08.922275 No commands found for phase name: install
[Container] 2024/09/10 02:14:08.925821 Processing environment variables
[Container] 2024/09/10 02:14:09.132194 Selecting 'python' runtime version '3.12' based on manual selections...
[Container] 2024/09/10 02:14:09.132890 Running command echo "Installing Python version 3.12 ..."
Installing Python version 3.12 ...

[Container] 2024/09/10 02:14:09.140304 Running command pyenv global $PYTHON_312_VERSION

[Container] 2024/09/10 02:14:09.739548 Moving to directory /codebuild/output/src2042592390/src
[Container] 2024/09/10 02:14:09.744535 Unable to initialize cache download: no paths specified to be cached
[Container] 2024/09/10 02:14:09.818249 Configuring ssm agent with target id: codebuild:ce5719c2-62ab-4778-9fc8-5ab5e63f79fa
[Container] 2024/09/10 02:14:09.819011 Successfully updated ssm agent configuration
[Container] 2024/09/10 02:14:09.819352 Registering with agent
[Container] 2024/09/10 02:14:09.862506 Phases found in YAML: 2
[Container] 2024/09/10 02:14:09.862533  INSTALL: 0 commands
[Container] 2024/09/10 02:14:09.862538  BUILD: 1 commands
[Container] 2024/09/10 02:14:09.862804 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
[Container] 2024/09/10 02:14:09.862817 Phase context status code:  Message: 
[Container] 2024/09/10 02:14:09.957947 Entering phase INSTALL
[Container] 2024/09/10 02:14:09.997787 Phase complete: INSTALL State: SUCCEEDED
[Container] 2024/09/10 02:14:09.997810 Phase context status code:  Message: 
[Container] 2024/09/10 02:14:10.035922 Entering phase PRE_BUILD
[Container] 2024/09/10 02:14:10.037316 Phase complete: PRE_BUILD State: SUCCEEDED
[Container] 2024/09/10 02:14:10.037333 Phase context status code:  Message: 
[Container] 2024/09/10 02:14:10.072946 Entering phase BUILD
[Container] 2024/09/10 02:14:10.073920 Running command python --version
Python 3.12.4
python:3.12.x(指定不可)

Codebuildプロジェクト実行時にエラーとなる。

# 以下はCodeBuildログ

[Container] 2024/09/10 01:52:03.396918 Selecting 'python' runtime version '3.12.x' based on manual selections...
[Container] 2024/09/10 01:52:03.397771 Running command echo "Installing custom Python version 3.12.x ..."
Installing custom Python version 3.12.x ...

[Container] 2024/09/10 01:52:03.405520 Running command pyenv install 3.12.x && rm -rf /tmp/*
python-build: definition not found: 3.12.x

See all available versions with `pyenv install --list`.

If the version you need is missing, try upgrading pyenv:

  cd /root/.pyenv/plugins/python-build/../.. && git pull && cd -

[Container] 2024/09/09 01:52:05.636930 Command did not exit successfully pyenv install 3.12.x && rm -rf /tmp/* exit status 2
[Container] 2024/09/09 01:52:05.637744 Phase complete: DOWNLOAD_SOURCE State: FAILED
[Container] 2024/09/09 01:52:05.637770 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while installing runtimes.
python:3.12.1(パッチバージョンまで指定)

現状ではプリインストールされたバージョン(= https://github.com/aws/aws-codebuild-docker-images/blob/master/al2/x86_64/standard/5.0/Dockerfile#L311-L327 )ではなく、ビルド時にインストール処理が実行されたため時間を要す。

# 以下はCodeBuildログ

[Container] 2024/09/09 01:59:37.241820 Running on CodeBuild On-demand
[Container] 2024/09/09 01:59:37.241835 Waiting for agent ping
[Container] 2024/09/09 01:59:37.443809 Waiting for DOWNLOAD_SOURCE
[Container] 2024/09/09 01:59:38.448435 Phase is DOWNLOAD_SOURCE
[Container] 2024/09/09 01:59:38.485429 CODEBUILD_SRC_DIR=/codebuild/output/src360147743/src
[Container] 2024/09/09 01:59:38.486291 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2024/09/09 01:59:38.486413 No commands found for phase name: install
[Container] 2024/09/09 01:59:38.492229 Processing environment variables
[Container] 2024/09/09 01:59:38.762981 Selecting 'python' runtime version '3.12.1' based on manual selections...
[Container] 2024/09/09 01:59:38.763783 Running command echo "Installing custom Python version 3.12.1 ..."
Installing custom Python version 3.12.1 ...
[Container] 2024/09/09 01:59:38.770743 Running command pyenv install 3.12.1 && rm -rf /tmp/*
Downloading Python-3.12.1.tar.xz...
-> https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tar.xz
Installing Python-3.12.1...
Installed Python-3.12.1 to /root/.pyenv/versions/3.12.1
[Container] 2024/09/09 02:03:10.193598 Running command pyenv global 3.12.1
[Container] 2024/09/09 02:03:10.238044 Moving to directory /codebuild/output/src360147743/src
※中略※

[Container] 2024/09/09 02:03:10.587418 Running command python --version
Python 3.12.1

AWSマネージド型イメージによる利用可能なランタイムについて

AWSマネージド型イメージには複数の種類があり、イメージごとに利用可能なランタイムやランタイムバージョンは以下URLにて記載されている。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/available-runtimes.html

ただし、上記URL内の「Amazon Linux 2023 x86_64 standard:5.0」のようなAL2023ベースとなるイメージ名は存在せず、

AL2023イメージの正確なイメージ名はaws/codebuild/amazonlinux2-x86_64-standard:5.0となっていることに注意。

https://docs.aws.amazon.com/codebuild/latest/userguide/ec2-compute-images.html

AWSマネージド型イメージで提供していないランタイムやランタイムバージョンを使いたい場合

カスタムイメージを利用する。

https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker-custom-image.html

以上です。