AWS CodeBuildを使ったバッチ処理のススメ | SEEDS Creators' Blog | 株式会社シーズ

AWS CodeBuildを使ったバッチ処理のススメ

クラウドソリューション事業部の上野です。

サーバーエンジニアとして特定の処理(シェルスクリプト等)を実行するだけの環境が必要になることがあります。
EC2インスタンスやECSでコンテナを立ち上げて処理を実行するという方法もありますが、AWS CodeBuildを使ってお手軽に実装することができますので、その方法を紹介したいと思います。

AWS CodeBuildとは

そもそもCodeBuildとはどういうサービスでしょうか。
AWSのドキュメントによるとこのように記載されています。

AWS CodeBuild は、ソースコードをコンパイルし、テストを実行し、デプロイ可能なソフトウェアパッケージを作成できる完全マネージド型のビルドサービスです。

その名のとおりソースコードをコンパイルすることができるサービスのようですね。CodeBuildを実際に設定すると分かるのですが、AWSに管理されたコンテナ環境上で指定された処理を実行し、その結果をアウトプットするというものになります。

この指定された処理という部分でソースコードのコンパイルやテストを実施するのですが、実際はそれ以外の処理、例えばスクリプトの実行などもすることができます。

ということで今回はCodeBuildを利用して、指定の時間にEC2インスタンスのAMIを取得する処理を実装してみたいと思います。

構成図

構成図はこのようになります。

S3バケットの作成

CodeBuildで利用されるbuildspecファイル(buildspec.yml)や実際に実行されるシェルスクリプトを保管するためのS3バケットを作成します。
バケットを作成後にファイルを設置するためのフォルダ『shell』を作成します。

シェルスクリプトの作成

CodeBuildで実行させたいシェルスクリプトを作成します。
今回はEC2のAMIをaws cliにて取得するシェルスクリプト(get_ami.sh)を作成します。

#!/bin/sh
aws ec2 create-image --instance-id  i-XXXXXXXXXXX --name "TestServer-AMI-$(date +%Y%m%d%H%M)" --no-reboot

buildspecファイルの作成

buildspecファイル(buildspec.yml)はCodeBuildで利用されるコンテナ環境上でどういう処理を行うかというビルドの仕様を記載するファイルです。
コンテナ環境にaws cliをインストールし、事前に作成したシェルスクリプト(get_ami.sh)を実行するという内容を記載します。

version: 0.2
 phases:
   install:
     commands:
       - echo install aws cli v2
       - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
       - unzip awscliv2.zip
       - ./aws/install --bin-dir /root/.pyenv/shims --install-dir /usr/local/aws-cli --update
   pre_build:
     commands:
       - export TZ="Asia/Tokyo"
   build:
     commands:
       - echo create ami
       - sh ./get_ami.sh
 post_build:
     commands:
       - echo Build completed on date

シェルスクリプトとbuildspecファイルをS3にアップロード

作成したシェルスクリプトとbuildspecファイルを事前に作成したS3バケットの『shell』フォルダにアップロードします。

IAMロールの作成

CodeBuildを実行時に利用されるIAMロールを作成します。
EC2のAMIを取得するという処理を実行するので、そのために必要な権限をもったIAMロールを作成します。
ロール作成時のユースケースの選択では『CodeBuild』を指定します。
今回はテストなのでAmazonEC2FullAccessのポリシーをアタッチしたIAMロールを作成しています。本番環境などで設定される場合はポリシーを厳密に制限してください。

ビルドプロジェクトの作成

事前の準備ができましたので、本題のCodeBuildを設定していきます。
CodeBuildの画面から『プロジェクトの作成』を選択します。

プロジェクト名を入力します。

『ソースプロバイダ』はAmazon S3を選択します。
『バケット』は事前に作成したバケットを指定します。
『S3オブジェクトキーまたはS3フォルダ』に事前にバケット内に作成したフォルダを指定します
※S3フォルダの指定で最後の / スラッシュを忘れないようにしましょう。

環境は利用したいコンテナ環境に応じて設定します。
今回はマネージド型イメージで最新のAmazon Linux 2の環境を利用します。

ロールの設定では『既存のサービスロール』を選択し、事前に作成したIAMロールのARNを指定します。
『AWS CodeBuild にこのサービスロールの編集を許可し〜』のチェックボックスはチェックします。

Buildspecの項目では『buildspecファイルを使用する』を選択します。

ログの設定ではCloudWatch Logsを有効にします。
『グループ名』にログのグループ名を設定します。
CodeBuildで実行された結果のログがCloudWatch Logsの該当のロググループに出力されるようになります。

最後に『ビルドプロジェクトを作成する』ボタンを押して完成です。

ビルドの開始

ビルドプロジェクトが作成できたら、試しにビルドしてみましょう。
CodeBuild > ビルドプロジェクト > 作成したプロジェクトを開き、画面右上の『ビルドを開始』ボタンを押します。

ビルドが始まると『ビルドステータス』の画面に切り替わります。この画面で処理途中のログや処理結果を確認することができます。
ステータスが『成功』になっていれば完了です。

このようにAMIが取得できていることが確認できます。

これでCodeBuildの設定は完了です。

Amazon EventBridgeによるCodeBuildの定期実行

次はAmazon EventBridgeを使い指定した時間にCodeBuildを動かして、処理を実行させるようにしましょう。
Amazon EventBridgeの画面から『ルールを作成』を選択します。

パターンを定義の項目で、『スケジュール』を選択します。
『Cron式』を選択し、実施したいスケジュールを記入します。
ここで指定する時間はUTCになりますので注意してください。

ターゲットは『CodeBuild プロジェクト』を指定します。
プロジェクトARNは作成したCodeBuildのプロジェクトのARNを指定します。
CodeBuildのプロジェクトのARNは以下の形式になります。

arn:aws:codebuild:“region-ID”:“account-ID”:project/“project-name”

その他の項目はデフォルトの設定値のまま作成します。

後は所定の時間になるとCodeBuildが実行されます。
CodeBuildのビルド履歴を確認すると送信者が『rule/EC2Backup』となっておりAmazon EventBridge経由でビルドが実行されたことが分かります。

処理結果の通知

CodeBuildで実行された処理結果をSNSトピックやAWS Chatbotと連携して通知することができます。詳細は説明しませんが、プロジェクトの設定画面より『通知』の項目がありますので、そこから設定してください。

試しにAWS Chatbotと連携してSlackに処理結果を通知するとこのようになります。上がビルド処理が正常終了した場合、下がビルド処理でエラーが発生した場合です。エラーが発生した場合は、どういった原因でエラーになっているかということも確認できます。

さいごに

CodeBuildを使ったバッチ処理の設定方法を説明いたしました。
CodeBuildはソースコードをコンパイルするためのものというイメージがありますが、使いようによっては幅広く色々な処理を行うことができそうです。
なお、EC2のAMIをスケジュールで取得したい場合は、今回のようなCodeBuildを使う方法ではなく、AWS Backupを使いましょう。