はじめに
AWSを利用する中で、「ちょっとした作業を自動化したい」「手動の手間を減らして楽をしたい」と思うことはありませんか?
今回は、「特定の順番で実行しなければならない2つの処理」 を、AWS CodeBuildを使って定期実行できるようにした事例を紹介します。
今回の背景と目的
複数の処理を自動化する場合、AWSではCodePipelineなどの利用が一般的ですが、今回は以下の背景からCodeBuildでの実装を選択しました。
- 実現したかったこと: 2つのCodeBuildプロジェクトを順番通りに実行する
-
選定理由: - 恒久的な仕組みではなく、一時的な対応としての側面が強かったため
- パイプラインを新規構築する工数を抑え、既存のCodeBuildを活かして迅速に実装したかったため
実装の概要
本来であればCodePipelineを導入するのが定石ですが、今回はスピード感とシンプルさを重視し、CodeBuildのみで完結させています。
- CodeBuild A: 最初の処理を実行
- CodeBuild B: Aの完了後、次の処理を実行
- cronベースのスケジュールでトリガー: これらをスケジュールに基づいて定期実行するように設定
構成について
version: 0.2
phases:
build:
commands:
# --- プロジェクトAの実行 ---
- echo "Starting Project A..."
- |
BUILD_ID_A=$(aws codebuild start-build --project-name "Project A" --query 'build.id' --output text)
echo "Build ID: $BUILD_ID_A"
# --- プロジェクトAの完了を待機 (ポーリング) ---
- |
echo "Waiting for Project A to complete..."
while true; do
# ステータスを取得
STATUS=$(aws codebuild batch-get-builds --ids "$BUILD_ID_A" --query 'builds[0].buildStatus' --output text)
echo "Current Status: $STATUS"
if [ "$STATUS" = "SUCCEEDED" ]; then
echo "Project A succeeded!"
break
elif [ "$STATUS" = "FAILED" ] || [ "$STATUS" = "STOPPED" ] || [ "$STATUS" = "FAULT" ] || [ "$STATUS" = "TIMED_OUT" ]; then
echo "Project A failed with status: $STATUS"
exit 1 # 呼び出し元のビルドも失敗として終了させる
else
# IN_PROGRESS などの場合は30秒待機して再試行
sleep 30
fi
done
# --- プロジェクトBの実行 ---
- echo "Project A finished successfully. Now starting Project B..."
- aws codebuild start-build --project-name "Project B"
- 1つ目のCodeBuildのSTATUSを一定時間ごとに確認を行い、進捗状況によって2つ目の実行を行うようにしました
- トリガーを作成し、cronベースのスケジュールで実行しました
まとめとこれから
今回の対応を通じて、AWSでの効率化を始めて自主的に挑戦してみました。
これまでは「とりあえず動くもの」を作る段階でしたが、これからは、何かを効率化したいと思ったときに、「どのAWSサービスを組み合わせるのが最適か」を即座に判断し、すぐに実行に移せるスキルを身につけていきたいと考えています。
AWSで「楽」をもっとできるよう、引き続き学習を進めていきます。