今回は、CodeBuildプロジェクトのbuildspec.ymlで指定可能なruntime-versions
セクションについてです。
例)
version: 0.2 phases: install: runtime-versions: # この部分についてです!! python: 3.12 build: commands: - python --version
- ランタイムとは
- ランタイムバージョンとは
- ランタイムバージョンの種類について
- ランタイムバージョンの指定方法
- AWSマネージド型イメージによる利用可能なランタイムについて
- AWSマネージド型イメージで提供していないランタイムやランタイムバージョンを使いたい場合
ランタイムとは
ランタイムは、javaやnode.js ,python などのプログラミング言語のこと。
ランタイムバージョンとは
例えば、python3.12.3 のようなセマンティックバージョン形式のバージョンのこと。
ランタイムバージョンの種類について
以下2種類が存在する。
- プリインストールランタイムバージョン
- カスタムランタイムバージョン
プリインストールランタイムバージョン
マネージド型イメージのランタイムバージョン(runtime-versions
)には、イメージにプリインストールされているランタイムが存在する。
例えば、pythonの場合には
で記載されているように以下のようにプリインストールされるバージョンが指定されている。
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:3
はpythno 3.12.5
を利用 # マネージド型イメージへ新規インストールpython:3.x
はPython 3.12.4
を利用 # Dockerfileでプリインストールされているpython:3.11
はPython 3.11.9
を利用 # Dockerfileでプリインストールされているpython:3.12
はPython 3.11.9
を利用 # Dockerfileでプリインストールされているpython:3.12.x
は指定不可 # プロジェクト実行時にエラーとなる。python:3.12.1
はPython 3.12.1
を利用 # マネージド型イメージへ新規インストール。期待通り、というか当たり前・・・・
上記結果より、必ずしもpython:3
とpython3.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
# ============== 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
以上です。