AWS CodeBuildでビルド実行時に使うShellの指定ができるようになりました

記事タイトルとURLをコピーする

2020年6月25日のAWS CodeBuildのアップデートです。

AWS CodeBuildが追加のシェル環境をサポートするようになりました。
AWS CodeBuild Now Supports Additional Shell Environments

AWS CodeBuildを利用すると、ビルド用コンテナが作成され、その中でShellが起動し、buildspec.ymlで定義したコマンドが実行されます。 どのShellが起動するかは、今までは指定できず、Linuxコンテナならsh、WindowsコンテナならPowershellと決まっていましたが、今回のアップデートで他のShellも選択できるようになりました。

For Linux operating systems, supported shell tags are: • bash • /bin/sh For Windows operating systems, supported shell tags are: • powershell.exe • cmd.exe Build specification reference for CodeBuild

以下でShellを指定し、動作確認してみます。

なお、一般的にCodeBuildはアプリケーションをビルドしたり、コンテナイメージを作成したりするのに使われますが、今回は単純にどのShellが動いているのか確認するだけのビルドプロジェクトを作成します。

1.Amazon Linux 2で動作確認

まずはAmazon Linux 2のイメージでShellをbashに指定してみます。

1-1.S3バケットの作成

buildspec.ymlを含むビルドスクリプトを格納するためのS3バケットを作成します。

# 任意の名前のS3バケットの作成
$ aws s3 mb s3://codebuild-shelltest-project-input

1-2.ビルドスクリプトの作成

今回は手元のMacBookで操作しました。

作業ディレクトリ作成

# 任意の名前の作業ディレクトリの作成し、移動
$ mkdir codebuild-shelltest-project
$ cd codebuild-shelltest-project

buildspec.yml作成

version: 0.2

env:
  shell: bash

phases:
  install:
    commands:
      - echo Nothing to do in the install phase...
      - ps -p $$
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
      - ps -p $$
  build:
    commands:
      - echo Nothing to do in the build phase...
      - ps -p $$
  post_build:
    commands:
      - echo Nothing to do in the post_build phase...
      - ps -p $$

3〜4行目が今回のアップデート部分で、Shellを指定しています。 また、現在動いているプロセスを確認するために、ps -p $$を実行させます。

zipで固める

# 任意の名前のzipファイルを作成
$ zip -r codebuild-shelltest.zip .

1-3.S3へビルドスクリプトをアップロード

# zipファイルをS3バケットへアップロード
$ aws s3 cp codebuild-shelltest.zip s3://codebuild-shelltest-project-input/codebuild-shelltest.zip

1-4.CodeBuildプロジェクトの作成

設定項目
プロジェクト名 任意
ソースプロバイダ Amazon S3
バケット 上記作成したS3バケット名
S3 オブジェクトキーまたは S3 フォルダ 上記でアップロードしたzipファイル名
環境イメージ マネージド型イメージ(Amazon Linux 2)
ビルド仕様 buildspecファイルを使用する

1-5.ビルドの実行

プロジェクトを指定し、ビルドの開始をします。

1-6.ビルドログ確認

ビルドが完了すると、ビルドログが表示され、bashが実行されているのがわかります。

ビルドログ抜粋

[Container] 2020/06/29 03:41:17 Running command ps -p $$
  PID TTY          TIME CMD
   55 ?        00:00:00 bash

ビルドログ全行

[Container] 2020/06/29 03:41:13 Waiting for agent ping
[Container] 2020/06/29 03:41:15 Waiting for DOWNLOAD_SOURCE
[Container] 2020/06/29 03:41:17 Phase is DOWNLOAD_SOURCE
[Container] 2020/06/29 03:41:17 CODEBUILD_SRC_DIR=/codebuild/output/src788750357/src
[Container] 2020/06/29 03:41:17 YAML location is /codebuild/output/src788750357/src/buildspec.yml
[Container] 2020/06/29 03:41:17 Selecting shell bash as specified in buildspec.
[Container] 2020/06/29 03:41:17 Processing environment variables
[Container] 2020/06/29 03:41:17 No runtime version selected in buildspec.
[Container] 2020/06/29 03:41:17 Moving to directory /codebuild/output/src788750357/src
[Container] 2020/06/29 03:41:17 Registering with agent
[Container] 2020/06/29 03:41:17 Phases found in YAML: 4
[Container] 2020/06/29 03:41:17  BUILD: 2 commands
[Container] 2020/06/29 03:41:17  POST_BUILD: 2 commands
[Container] 2020/06/29 03:41:17  INSTALL: 2 commands
[Container] 2020/06/29 03:41:17  PRE_BUILD: 2 commands
[Container] 2020/06/29 03:41:17 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
[Container] 2020/06/29 03:41:17 Phase context status code:  Message: 
[Container] 2020/06/29 03:41:17 Entering phase INSTALL
[Container] 2020/06/29 03:41:17 Running command echo Nothing to do in the install phase...
Nothing to do in the install phase...

[Container] 2020/06/29 03:41:17 Running command ps -p $$
  PID TTY          TIME CMD
   55 ?        00:00:00 bash

[Container] 2020/06/29 03:41:18 Phase complete: INSTALL State: SUCCEEDED
[Container] 2020/06/29 03:41:18 Phase context status code:  Message: 
[Container] 2020/06/29 03:41:18 Entering phase PRE_BUILD
[Container] 2020/06/29 03:41:18 Running command echo Nothing to do in the pre_build phase...
Nothing to do in the pre_build phase...

[Container] 2020/06/29 03:41:18 Running command ps -p $$
  PID TTY          TIME CMD
   66 ?        00:00:00 bash

[Container] 2020/06/29 03:41:18 Phase complete: PRE_BUILD State: SUCCEEDED
[Container] 2020/06/29 03:41:18 Phase context status code:  Message: 
[Container] 2020/06/29 03:41:18 Entering phase BUILD
[Container] 2020/06/29 03:41:18 Running command echo Nothing to do in the build phase...
Nothing to do in the build phase...

[Container] 2020/06/29 03:41:18 Running command ps -p $$
  PID TTY          TIME CMD
   73 ?        00:00:00 bash

[Container] 2020/06/29 03:41:18 Phase complete: BUILD State: SUCCEEDED
[Container] 2020/06/29 03:41:18 Phase context status code:  Message: 
[Container] 2020/06/29 03:41:18 Entering phase POST_BUILD
[Container] 2020/06/29 03:41:18 Running command echo Nothing to do in the post_build phase...
Nothing to do in the post_build phase...

[Container] 2020/06/29 03:41:18 Running command ps -p $$
  PID TTY          TIME CMD
   80 ?        00:00:00 bash

[Container] 2020/06/29 03:41:18 Phase complete: POST_BUILD State: SUCCEEDED
[Container] 2020/06/29 03:41:18 Phase context status code:  Message: 

1-7.POSIXモードを使うかどうか

さて、CodeBuildでbash使えるようになりました。 しかし、Amazon Linux 2に詳しい方は、疑問に思うかもしれません。 なぜなら、実はAmazon Linux 2のshは、bashのシンボリックリンクになっているからです。

[Container] 2020/06/29 04:20:23 Running command cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
[Container] 2020/06/29 04:20:23 Running command ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Apr  7 01:49 /bin/sh -> bash

[Container] 2020/06/29 04:20:23 Running command ls -l /bin/bash
-rwxr-xr-x 1 root root 935968 Jan 16 00:56 /bin/bash

[Container] 2020/06/29 04:20:23 Running command ls -l /usr/bin/sh
lrwxrwxrwx 1 root root 4 Apr  7 01:49 /usr/bin/sh -> bash

[Container] 2020/06/29 04:20:23 Running command ls -l /usr/bin/bash
-rwxr-xr-x 1 root root 935968 Jan 16 00:56 /usr/bin/bash

それでは、どれを使ってもbashで違いは無いのでは?と思ってしまいますが、意味はあります。 shでbashを呼び出すと、bashがPOSIXモードで動作するようになります。 どのように動作が変わるかは下記リンク先に記載があります。

6.11 Bash POSIX Mode When invoked as sh, Bash enters POSIX mode after reading the startup files.

結論として、いわゆるBashを使いたい場合は、設定をした方が良いと思います。

2.Ubuntuでのbash利用

Ubuntuのshは、実はshでもなく、bashでもなく、dashです。 したがって、Ubuntuでbashを指定するのは意味があります。

[Container] 2020/06/28 17:11:54 Running command cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
[Container] 2020/06/29 04:25:27 Running command ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Apr  3 17:13 /bin/sh -> dash

[Container] 2020/06/29 04:25:27 Running command ls -l /bin/bash
-rwxr-xr-x 1 root root 1113504 Jun  6  2019 /bin/bash

[Container] 2020/06/29 04:25:27 Running command ls -l /bin/rbash
lrwxrwxrwx 1 root root 4 Jun  6  2019 /bin/rbash -> bash

[Container] 2020/06/29 04:25:27 Running command ls -l /bin/dash
-rwxr-xr-x 1 root root 121432 Jan 25  2018 /bin/dash

まとめ

今までは、AWS CodeBuildのビルドスクリプトの中で、Amazon Linux 2はsh(POSIX互換のBash)、Ubuntuはdash、WindowsはPowershellが利用可能でした。 今後は、bashやCMDも利用可能となりました。

渡辺 信秀(記事一覧)

2017年入社 / 地味な内容を丁寧に書きたい