GitHub Actionsを使ってAWS Batchをデプロイする

背景

前回、AWS Batchのジョブ定義ファイルを取得するため、AWS CLIでスイッチロール先のAWSアカウントのCredentialsの設定を行いました。

今回はそのジョブ定義ファイルを使って、GitHub ActionsでAWS Batchのデプロイを行いたいと思います。

Batchのデプロイ

Batchのデプロイの範囲ですが、今回は以下の部分を対象とします。

  • ECRにログイン
  • Batch実行コンテナイメージのビルド
  • Batch実行コンテナイメージをECRに登録
  • ジョブ定義ファイル内に記載したコンテナイメージのURLを上記で登録したコンテナイメージのURLで置き換え
  • ジョブ定義ファイルのデプロイ

GitHub Actionsの実装

ではGitHub Actionsを実装していきます。環境変数が至る所で参照されていますが、jobsの上あたりで全て定義してあります。また、GitHub上でsecretsを登録しております。

ECRにログイン

ECRへのログインはAmazon ECSのテンプレートと同じ形で実行できます。

1
2
3
4
5
6
7
8
9
10
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}

- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1

ここではまだ永続的なCredentialsを使っていますが、近いうちにIAM Roleを利用した一時的なCredentialsに置き換えようと思います。

コンテナイメージのビルド、ECRへ登録

コンテナイメージのビルドとECRへの登録もAmazon ECSのテンプレートと同じ形で実行できます。

1
2
3
4
5
6
7
8
9
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"

最後に、コンテナイメージのURLを出力しています。

ジョブ定義ファイルの更新

次にジョブ定義ファイルの更新を行います。

ジョブ定義ファイル内のコンテナイメージのURLを新しくECRに登録したコンテナイメージのURLに差し替える必要があります。

いろんな方法があると思いますが、わたしは前回取得したジョブ定義ファイルをテンプレートファイルとしてGit管理しておき、そのテンプレートファイルのコンテナイメージURLの部分だけ置換するような方法にしました。

1
2
3
4
5
6
- name: Fill in the new image ID in the AWS Batch job definition
id: task-def
env:
IMAGE: ${{ steps.build-image.outputs.image }}
run: |
sed -e "s#__image__#$IMAGE#" $BATCH_JOB_DEFINITION_TEMPLATE > $BATCH_JOB_DEFINITION

ジョブ定義ファイル内のコンテナイメージの箇所は__image__としておき、それをECRに登録したコンテナイメージのURLに置き換え、ファイルとして保存します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"jobDefinitionName": "test-batch",
"type": "container",
"parameters": {},
"retryStrategy": {
"attempts": 1,
"evaluateOnExit": []
},
"containerProperties": {
"image": "__image__",
"command": [
"echo",
"'hello world'"
],

コマンドの箇所はplaceholderが利用できるようですが、コマンドの箇所だけのようです。
https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/job_definition_parameters.html#parameters

これで新しいコンテナイメージのジョブ定義ファイルが作成できました。

ジョブ定義ファイルのデプロイ

最後にジョブ定義ファイルのデプロイを行います。

1
2
3
4
- name: Deploy AWS Batch job definition
id: deploy-job-def
run: |
aws batch register-job-definition --cli-input-json file://$BATCH_JOB_DEFINITION

aws batch register-job-definitionコマンドを用いて、ジョブ定義ファイルを登録します。そうすることで新しいジョブ定義ファイルが有効になります。

異常で、AWS Batchのデプロイは完了です。

まとめ

今回はAWS BatchをGitHub Actionsを用いてデプロイしました。AWS BatchのトリガーとしてAmazon EventBridgeを利用しているのであれば、EventBridge側の変更も必要になるかもしれません。こちらは近いうちに調査してみます。

また、今回はaccess_key_id, secret_access_keyという永続的なCredentialsを利用しましたが、セキュリティ的に永続的なCredentialsを利用するのは好ましくありません。次回は一時的なCredentialsを利用してAWS Batchをデプロイするよう修正したいと思います。