[GitHub Actions]AWS CLI ver1とver2切り替えやマイナーバージョン固定での導入も手軽にできるAction「install-aws-cli-action」を試してみた

Actions上でAWSCLI ver2の導入を手軽に行えつつ、ver2への切り替えも楽にでき、特定マイナーバージョンでの固定可能なActionはないかと探していたところ、登場したばかりながら便利なActionを見つけたので紹介します。
2020.11.19

はじめに

Terminal上でawscliを実行した時に、以下のメッセージに気が付きました。念の為ActionsのWorkflowでも確認してみましたが同様でした。

Note: AWS CLI version 2, the latest major version of the AWS CLI, is now stable and recommended for general use. For more information, see the AWS CLI version 2 installation instructions at: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

今年始めに AWS CLI のversion2が出てから、DevIOでもたくさんの記事が投稿されました。

ただ、日々のCICD運用においては最新バージョンへの依存が求められない限り、優先順位は低くなりがちです。また、AWSCLI version2は単純にversion1と置き換わるものではないこともあります。そこで、今後バージョン更新が強制される前提を見越した対応を試みました。

GitHub Actions でversion 2を使う

Dockerを用いる方法が用意されているため、それを利用する方法があります。

ただ、個人的にはversion1とversion2を手軽に切り替えることができて、且つマイナーバージョンの固定も可能にしておきたいというのが本音です。実行される度に変わるとトラブルの原因になりかねません。

そこで以下のActionを利用します。これは、version 1とversion 2の指定が手軽にできる上に、マイナーバージョンの固定も可能になっています。

使い方

指定するversion表記を変えるくらいで、後は固定です。

version 1を例にあげます。マイナーバージョンを指定しない、つまりversion: 1とすることで、version 1の最新がインストールされます。

  test_specific_v1:
    runs-on: ubuntu-latest
    name: specific v1
    steps:
      - uses: actions/checkout@v2
      - id: install-aws-cli
        uses: unfor19/install-aws-cli-action@v1
        with:
          version: 1.18.137

Actions Workflow上での実動作

該当処理のログを貼っておきます。

Run unfor19/install-aws-cli-action@v1
  with:
    version: 1.18.137
>> [LOG]: Validating semantic version
>> [LOG]: Valid version input
>> [LOG]: Setting _DOWNLOAD_URL
>> [LOG]: _DOWNLOAD_URL = https://s3.amazonaws.com/aws-cli/awscli-bundle-1.18.137.zip
>> [LOG]: Checking if the provided version exists in AWS
>> [LOG]: Provided version exists - 1.18.137
>> [LOG]: Downloading …
-rw-r--r-- 1 root root 17M Sep 11 19:15 unfor19-awscli.zip
>> [LOG]: Unzipping unfor19-awscli.zip
>> [LOG]: Installing AWS CLI - 1.18.137
Running cmd: /usr/bin/python virtualenv.py --no-download --python /usr/bin/python /usr/local/aws
Running cmd: /usr/local/aws/bin/pip install --no-binary :all: --no-cache-dir --no-index --find-links file://. setuptools_scm-3.3.3.tar.gz
Running cmd: /usr/local/aws/bin/pip install --no-binary :all: --no-cache-dir --no-index --find-links file://. wheel-0.33.6.tar.gz
Running cmd: /usr/local/aws/bin/pip install --no-binary :all: --no-build-isolation --no-cache-dir --no-index  --find-links file:///home/runner/work/workflow-test/workflow-test/awscli-bundle/packages awscli-1.18.137.tar.gz
Symlink already exists: /usr/local/bin/aws
Removing symlink.
You can now run: /usr/local/bin/aws --version
Note: AWS CLI version 2, the latest major version of the AWS CLI, is now stable and recommended for general use. For more information, see the AWS CLI version 2 installation instructions at: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
>> [LOG]: Installation completed
total 17M
drwxr-xr-x 3 runner docker 4.0K Nov 19 08:34 .
drwxr-xr-x 3 runner docker 4.0K Nov 19 08:33 ..
drwxr-xr-x 3 root   root   4.0K Nov 19 08:34 awscli-bundle
-rw-r--r-- 1 root   root    17M Sep 11 19:15 unfor19-awscli.zip
total 8.0K
drwxr-xr-x 2 runner docker 4.0K Nov 19 08:34 .
drwxr-xr-x 3 runner docker 4.0K Nov 19 08:33 ..
>> [LOG]: Printing AWS CLI installed version
aws-cli/1.18.137 Python/2.7.17 Linux/5.4.0-1031-azure botocore/1.17.60
aws-cli/1.18.137 Python/2.7.17 Linux/5.4.0-1031-azure botocore/1.17.60
::set-output name=version::

バージョンが切り替わる仕組み

Actionのentrypointにて、バージョンによってダウンロードするインストーラを切り替えています。マイナーバージョンが指定されている際には該当のアーカイブに絞る形です。

set_download_url(){
    msg_log "Setting _DOWNLOAD<em>URL"
    # v1
    if [[ $_AWS_CLI_VERSION =~ ^1._$ ]]; then
        if [[ $_AWS_CLI_VERSION = "1" ]]; then
            _DOWNLOAD_URL="https://s3.amazonaws.com/aws-cli/awscli-bundle.zip"
        else
            _DOWNLOAD_URL="https://s3.amazonaws.com/aws-cli/awscli-bundle-${_AWS_CLI_VERSION}.zip"
        fi
    # v2
    elif [[ $_AWS_CLI_VERSION =~ ^2._$ ]]; then
        if [[ $_AWS_CLI_VERSION = "2" ]]; then
            # Latest v2
            _DOWNLOAD_URL="https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"
        else
            # Specific v2
            _DOWNLOAD_URL="https://awscli.amazonaws.com/awscli-exe-linux-x86</em>64-${_AWS_CLI_VERSION}.zip"
        fi
    fi
    msg_log "_DOWNLOAD_URL = ${_DOWNLOAD_URL}"
}

注意点

複数回実行も可能ですが、初回実行時に環境変数に記録されたバージョンを用いて更新を行う形となります。(例:初回ver1でインストールなら、2回目以降にver2を含んでいても、全てver1としてインストール

Run unfor19/install-aws-cli-action@v1
  with:
    version: 2
  env:
    AWS_CLI_VERSION: 1.18.137
echo "AWS_CLI_VERSION=2" >> $GITHUB_ENV
sudo /home/runner/work/_actions/unfor19/install-aws-cli-action/v1/entrypoint.sh $AWS_CLI_VERSION
>> [LOG]: Checking if the provided version exists in AWS
>> [LOG]: Provided version exists - 1.18.137
>> [LOG]: Downloading ...
-rw-r--r-- 1 root root 17M Sep 11 19:15 unfor19-awscli.zip
>> [LOG]: Unzipping unfor19-awscli.zip
>> [LOG]: Installing AWS CLI - 1.18.137

ぱっと見はAWS_CLI_VERSION=2で更新されているように見えますが、環境変数で直指定されたenv:AWS_CLI_VERSION: 1.18.137が優先される形です。

あとがき

AWS公式で用意しているActionが存在しないため、先行して作成されているActionを確認していましたが、Starを多く集めていたActionは約12ヶ月前にArchive入した状態でした。

自前で用意するしかないかと思っていたところ、以下のIssueにて12日前についたコメントから今回のActionを見つけました。

個人的にカバーしたい要件を全部満たしているため扱ってみました。自前で用意するにも手間という場合にはおすすめです。

参考リンク