🚢

AWS CLIでAmplify Hostingのデプロイを開始・監視する方法

2024/07/15に公開

はじめに

前回、こちらの記事で、CDKメインのプロジェクトでAmplifyを使う方法について紹介しました。
https://zenn.dev/tkg216/articles/81e8023f7ae685

その中で、

enableAutoBuild: false,

と設定すると、GitHubなどのリポジトリと連携して自動ビルドを開始せず、CLIなどを使ってビルド・デプロイを開始することが必要になります。

本記事では、AWS CLIを使用してAmplifyのデプロイジョブを開始し、その状態を自動的に監視するシェルスクリプトの作成方法を紹介します。

課題

AWS CLIを使ってAmplifyのデプロイを開始することは以下のコマンドを実行することで可能です。

aws amplify start-job --app-id $APP_ID --branch-name $BRANCH_NAME --job-type RELEASE

しかし、AWS CLIを使ってデプロイジョブを管理する際には以下の課題があります。

  • ジョブの失敗を即時に検知できない
  • ジョブの成功タイミングがわからない

これらの課題は、CI/CDパイプラインをGitHub ActionsやAWS CodePipeline/CodeBuildで構成している場合に前後の処理に影響を及ぼすこともあり、顕著になることがあるでしょう。

解決策:デプロイ監視スクリプトの作成

今記事で解決策として紹介するのは、AWS CLIを使ったジョブの状態監視を行う方法です。

スクリプトの主な機能は以下です。

  • aws amplify start-jobコマンドでデプロイジョブを開始
  • aws amplify get-jobコマンドで定期的にジョブの状態を確認
  • ジョブの成功または失敗を検知して適切に終了
  • 長時間実行されているジョブのタイムアウト処理

詳細の条件は以下です。

  • 10秒に一回監視する
  • statusがSUCCEEDになった場合は正常終了し、FAILEDになった場合は場合は異常終了する
  • 10分以上成功にならない場合はタイムアウトして異常終了する

これらの条件でシェルスクリプトを作成しました。
特にこだわりがないので、Claudeさんに書いていただきました。

出来上がったシェルスクリプトは以下です。

#!/bin/bash

# 変数の設定
APP_ID=""
BRANCH_NAME="main"
TIMEOUT=600  # 10分(秒単位)

# ジョブの開始
echo "Amplifyジョブを開始します..."
JOB_RESULT=$(aws amplify start-job --app-id $APP_ID --branch-name $BRANCH_NAME --job-type RELEASE)

# ジョブIDの取得
JOB_ID=$(echo $JOB_RESULT | jq -r '.jobSummary.jobId')
echo "ジョブID: $JOB_ID"

# ジョブの状態監視
start_time=$(date +%s)
while true; do
    # 経過時間の確認
    current_time=$(date +%s)
    elapsed_time=$((current_time - start_time))
    
    if [ $elapsed_time -ge $TIMEOUT ]; then
        echo "タイムアウト: 10分以上経過しました。"
        exit 1
    fi

    # ジョブの状態取得
    JOB_STATUS=$(aws amplify get-job --app-id $APP_ID --branch-name $BRANCH_NAME --job-id $JOB_ID | jq -r '.job.summary.status')
    
    echo "現在のステータス: $JOB_STATUS"

    # ステータスに応じた処理
    case $JOB_STATUS in
        "SUCCEED")
            echo "ジョブが正常に完了しました。"
            exit 0
            ;;
        "FAILED")
            echo "ジョブが失敗しました。"
            exit 1
            ;;
        *)
            # 10秒待機
            sleep 10
            ;;
    esac
done

補足

aws amplify start-job コマンドのレスポンス

{
    "job": {
        "summary": {
            "jobArn": "arn:aws:amplify:ap-northeast-1:111111111111:apps/app_id/branches/main/jobs/0000000004",
            "jobId": "4",
            "commitId": "HEAD",
            "commitTime": "2024-07-15T13:07:58.000000+09:00",
            "startTime": "2024-07-15T13:07:58.999999+09:00",
            "status": "RUNNING"
        },

aws amplify get-job コマンドのレスポンス(一部抜粋)

{
    "job": {
        "summary": {
            "jobArn": "arn:aws:amplify:ap-northeast-1:11111111111:apps/app_id/branches/main/jobs/0000000004",
            "jobId": "4",
            "commitId": "HEAD",
            "commitTime": "2024-07-15T13:07:58.000000+09:00",
            "startTime": "2024-07-15T13:07:58.999999+09:00",
            "status": "SUCCEED",
            "endTime": "2024-07-15T13:10:03.000000+09:00"
        },

実行結果

スクリプトを実行すると、以下のような出力が得られます。

 % ./amplify-deploy-monitor.sh
Amplifyジョブを開始します...
ジョブID: 7
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: RUNNING
現在のステータス: SUCCEED
ジョブが正常に完了しました。

ログや監視の間隔は調整して使うことをお勧めします。

まとめ

以上が、Amplify HostingのデプロイをAWS CLIで開始・管理する方法の紹介になります。
Amplify を使っていてGitHubとは連携せずに使いたい方にとっては参考になる部分があれば幸いです!!

一方で、今回紹介した方法はAmplifyやCDKなどのツールを使う前提がありつつもAWS CLIを使ったシェルスクリプトを書くという泥臭いというか少しスマートでない部分は感じています。
もし、もっといい方法があるよっていうことをご存知の方いらっしゃいましたら教えていただけると嬉しいです!!

Discussion