Contents
はじめにと全体概要
GitHub へのコードプッシュをトリガーに、Amplify の本番環境・ステージング環境・プレビュー環境へ即座にデプロイできる仕組みを構築します。本記事では GitHub OIDC による安全な認証、Amplify CLI のノンインタラクティブ化、不要リソースの自動削除までをハンズオン形式で解説するので、セットアップだけでなく運用フェーズでも役立ちます。
前提条件と環境準備
このセクションでは、作業開始前に必ず用意すべき AWS アカウント・Amplify アプリ・GitHub リポジトリの概要を説明します。各リソースは最小限の権限で作成し、後続の CI/CD でシークレットとして参照できる状態にすることがポイントです。
AWS アカウントと Amplify アプリの作成
- AWS アカウントをまだお持ちでない場合は https://aws.amazon.com/jp/ から新規登録してください。
- コンソール上部のリージョンセレクタで
ap-northeast-1(東京)など利用したいリージョンに切り替え、Amplify コンソールへ移動します。 - 「アプリの作成」ボタンをクリックし、Git リポジトリは後ほど接続という形で空の Amplify アプリを作ります。作成完了画面に表示される Amplify App ID と デフォルトブランチ名(通常
main)は必ずメモしておき、GitHub シークレット登録時に使用します。
GitHub リポジトリの用意
- GitHub にログインし、本プロジェクト用のリポジトリを作成します。
- ブランチ戦略の例として以下を推奨します(必要に応じて変更可)
main→ 本番デプロイdevelopまたはstaging→ ステージング環境feature/*→ プレビュー環境(プルリクエスト単位)
ポイント:ブランチ名は後続の OIDC 条件式や Amplify 環境名に直接マッピングできるよう、シンプルかつ一意に保ちます。
Amplify と GitHub OIDC の連携設定
この章では、GitHub Actions が AWS に対して 長期的なアクセスキーを持たずに操作できるよう、OIDC 信頼関係と最小権限 IAM ロールを作成する手順を解説します。
IAM ロール・ポリシーの作成
- コンソール → IAM → ロール → ロールを作成 を選択。
- 「信頼されたエンティティ」画面で OpenID Connect (OIDC) プロバイダーを選び、以下の JSON を入力します(GitHub が提供する OIDC URL と Audience は固定です)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" }, "StringLike": { "token.actions.githubusercontent.com:sub": "repo:<GitHub_Org>/<Repo_Name>:ref:refs/heads/*" } } } ] } |
-
StringLikeの*は 全ブランチ を許可するワイルドカードです。複数の特定ブランチだけを許可したい場合は"repo:<Org>/<Repo>:ref:refs/heads/main"や"repo:<Org>/<Repo>:ref:refs/heads/develop"などカンマ区切りで列挙できます(JSON 配列はサポートされませんので、複数条件はStringLikeの配列にせず個別に書くか、正規表現的に"*/main"といった形で記述します)。 -
次の インラインポリシー をロールに添付し、Amplify に必要な最小権限だけを許可します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "amplify:ListApps", "amplify:GetApp", "amplify:CreateBackendEnvironment", "amplify:DeleteBackendEnvironment", "amplify:StartJob", "amplify:StopJob", "amplify:UpdateBackendEnvironment", "amplify:GetBackendEnvironment" ], "Resource": "*" } ] } |
注意:
*のリソースは Amplify が App ID を内部で判定するため許容されていますが、さらに絞り込みたい場合はarn:aws:amplify::<account-id>:apps/<app-id>/branches/*と指定できます。
OIDC プロバイダーの登録手順
- IAM コンソール左側メニューから ID プロバイダー → プロバイダーを追加 を選択。
- 種類は
OpenID Connect (OIDC)、プロバイダー URL にhttps://token.actions.githubusercontent.com、Audience はsts.amazonaws.comと入力し、作成ボタンをクリックします。
GitHub リポジトリへのシークレット登録
| シークレット名 | 用途 |
|---|---|
AWS_REGION |
デプロイ先リージョン(例:ap-northeast-1) |
AMPLIFY_APP_ID |
前節で取得した Amplify App ID |
AWS_ROLE_ARN |
先ほど作成した IAM ロールの ARN |
GITHUB_REPO |
<Org>/<Repo>(サブスクリプション条件に使用) |
リポジトリ → Settings → Secrets and variables → Actions から上表のシークレットを 暗号化保存 してください。
GitHub Actions ワークフロー構築
本章では、実際に動作する 2 つのワークフロー(ci-cd.yml と preview.yml)を紹介します。すべての Amplify CLI コマンドは 非対話モード (--yes) を付与し、CI 環境でもプロンプトが出ないようにしています。
共通前提:Ubuntu ランナーに jq をインストール
jq はデフォルトでインストールされていないことがあります。以下のステップを各ジョブの最初に追加してください。
|
1 2 3 4 5 |
- name: Install jq (JSON processor) run: | sudo apt-get update -y sudo apt-get install -y jq |
1. 本番・ステージング向けワークフロー ci-cd.yml
ワークフロー全体像(概要)
このファイルは push イベントをトリガーに、main と develop ブランチへ自動デプロイします。ブランチ名から Amplify 環境名 (prod / staging) を導出し、環境が未作成の場合は安全に作成・チェックアウトします。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
name: Amplify CI/CD (Prod & Staging) on: push: branches: - main - develop permissions: id-token: write # OIDC 用必須権限 contents: read jobs: build-and-deploy: runs-on: ubuntu-latest steps: # 1️⃣ 必要ツールのインストール - name: Install jq and Amplify CLI run: | sudo apt-get update -y && sudo apt-get install -y jq npm install -g @aws-amplify/cli # 2️⃣ リポジトリ取得 - name: Checkout repository uses: actions/checkout@v4 # 3️⃣ OIDC による AWS 認証設定 - name: Configure AWS credentials (OIDC) uses: aws-actions/configure-aws-credentials@v3 with: role-to-assume: ${{ secrets.AWS_ROLE_ARN }} aws-region: ${{ secrets.AWS_REGION }} # 4️⃣ 環境名をブランチから決定(導入文) - name: Determine Amplify environment id: env run: | if [[ "${GITHUB_REF#refs/heads/}" == "main" ]]; then echo "env=prod" >> $GITHUB_OUTPUT elif [[ "${GITHUB_REF#refs/heads/}" == "develop" ]]; then echo "env=staging" >> $GITHUB_OUTPUT else echo "env=${{ github.ref_name }}" >> $GITHUB_OUTPUT fi # 5️⃣ 環境が存在しなければ作成、既にある場合はチェックアウト - name: Ensure Amplify environment exists env: AMPLIFY_APP_ID: ${{ secrets.AMPLIFY_APP_ID }} ENV_NAME: ${{ steps.env.outputs.env }} run: | # 環境一覧を JSON で取得し、対象環境があるか確認 if amplify env list --json | jq -e ".[] | select(.name == \"$ENV_NAME\")" > /dev/null; then echo "Environment $ENV_NAME already exists → checkout" amplify env checkout $ENV_NAME --yes else echo "Creating new environment $ENV_NAME" amplify env add $ENV_NAME --yes fi # 6️⃣ バックエンドをローカルに同期(非対話モード) - name: Pull Amplify backend env: AMPLIFY_APP_ID: ${{ secrets.AMPLIFY_APP_ID }} ENV_NAME: ${{ steps.env.outputs.env }} run: | amplify pull \ --appId $AMPLIFY_APP_ID \ --envName $ENV_NAME \ --yes # 7️⃣ デプロイ実行(リトライロジック付き) - name: Deploy with retry env: ENV_NAME: ${{ steps.env.outputs.env }} run: | n=0; until [ $n -ge 3 ]; do amplify push --environment $ENV_NAME --yes && break n=$((n+1)) echo "Retry #$n after failure" sleep 10 done |
ポイントまとめ
| ステップ | 主な目的 |
|---|---|
Determine Amplify environment |
ブランチ名 → 環境名のマッピングを一元化 |
Ensure Amplify environment exists |
同名環境が既にある場合は checkout、無ければ add で作成(エラーハンドリング) |
Deploy with retry |
ネットワーク障害等で失敗した際の自動再試行(最大 3 回) |
2. プレビュー環境向けワークフロー preview.yml
ワークフロー概要(導入文)
プルリクエストが作成・更新されるたびに、一時的な Amplify 環境 を自動生成し、マージ後または PR が閉じられたときに安全に削除します。環境名は preview-<PR番号> でユニーク化しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
name: Amplify Preview (Pull Request) on: pull_request: types: [opened, synchronize, closed] permissions: id-token: write contents: read jobs: preview-up: if: github.event.action != 'closed' # PR が開かれた/更新されたときだけ実行 runs-on: ubuntu-latest steps: - name: Install jq and Amplify CLI run: | sudo apt-get update && sudo apt-get install -y jq npm install -g @aws-amplify/cli - name: Checkout repository uses: actions/checkout@v4 - name: Configure AWS credentials (OIDC) uses: aws-actions/configure-aws-credentials@v3 with: role-to-assume: ${{ secrets.AWS_ROLE_ARN }} aws-region: ${{ secrets.AWS_REGION }} # 環境名は preview-<PR番号> に固定。既に同名環境がある場合は再利用。 - name: Set preview environment name id: set-env run: | echo "env=preview-${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT # 既存チェック → 無ければ作成、あれば checkout - name: Ensure preview env exists env: AMPLIFY_APP_ID: ${{ secrets.AMPLIFY_APP_ID }} ENV_NAME: ${{ steps.set-env.outputs.env }} run: | if amplify env list --json | jq -e ".[] | select(.name == \"$ENV_NAME\")" > /dev/null; then echo "Preview env exists – checking out" amplify env checkout $ENV_NAME --yes else echo "Creating preview environment $ENV_NAME" amplify env add $ENV_NAME --yes fi - name: Pull backend for preview env: AMPLIFY_APP_ID: ${{ secrets.AMPLIFY_APP_ID }} ENV_NAME: ${{ steps.set-env.outputs.env }} run: | amplify pull \ --appId $AMPLIFY_APP_ID \ --envName $ENV_NAME \ --yes - name: Deploy preview env: ENV_NAME: ${{ steps.set-env.outputs.env }} run: | amplify push --environment $ENV_NAME --yes preview-cleanup: if: github.event.action == 'closed' # PR が閉じられたときだけ実行 runs-on: ubuntu-latest needs: preview-up steps: - name: Install Amplify CLI run: npm install -g @aws-amplify/cli - name: Configure AWS credentials (OIDC) uses: aws-actions/configure-aws-credentials@v3 with: role-to-assume: ${{ secrets.AWS_ROLE_ARN }} aws-region: ${{ secrets.AWS_REGION }} - name: Delete preview environment env: ENV_NAME: preview-${{ github.event.pull_request.number }} run: | # amplify env remove は対話的なので --yes で自動承認 amplify env remove $ENV_NAME --yes || echo "Env $ENV_NAME not found – nothing to delete" |
重要ポイント
| 項目 | 内容 |
|---|---|
--yes の徹底使用 |
CI 環境でプロンプトがブロックしないようにする |
| 環境重複チェック | amplify env list --json | jq … で事前に存在を確認、エラー回避 |
| 削除コマンドの正しい形 | amplify env remove <env> --yes(amplify delete はアプリ全体削除用) |
運用のベストプラクティスとまとめ
エラーハンドリングとログ可視化
- 各ステップはデフォルトで
continue-on-error: falseです。失敗時はジョブが即座に停止し、GitHub の UI に赤字で表示されます。 - Amplify のビルドログは
amplify logsコマンドで取得でき、以下のように GitHub のサマリへ出力するとトラブルシューティングが楽になります。
|
1 2 3 4 5 6 7 |
- name: Output Amplify logs on failure if: failure() run: | amplify status --verbose > amplify-status.txt cat amplify-status.txt echo "::error file=amplify-status.txt::Amplify ビルド失敗" |
コスト最適化:プレビュー環境の定期クリーンアップ
jq がインストール済みである前提で、30 日以上更新が無いプレビュー環境を一括削除するスケジュールジョブ例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
name: Stale Preview Cleanup on: schedule: - cron: '0 3 * * SUN' # 毎週日曜 03:00 UTC jobs: cleanup: runs-on: ubuntu-latest steps: - name: Install jq and Amplify CLI run: | sudo apt-get update && sudo apt-get install -y jq npm install -g @aws-amplify/cli - name: Configure AWS credentials (OIDC) uses: aws-actions/configure-aws-credentials@v3 with: role-to-assume: ${{ secrets.AWS_ROLE_ARN }} aws-region: ${{ secrets.AWS_REGION }} - name: Delete stale preview environments env: AMPLIFY_APP_ID: ${{ secrets.AMPLIFY_APP_ID }} run: | # 30 日 (= 2592000 秒) 前に更新された環境を対象に削除 for env in $(amplify env list --json | jq -r '.[] | select(.lastUpdated < (now - 2592000)) .name'); do if [[ $env == preview-* ]]; then echo "Removing stale environment: $env" amplify env remove $env --yes || true fi done |
セキュリティベストプラクティス
| 項目 | 推奨設定 |
|---|---|
| OIDC 権限 | permissions.id-token: write のみ付与し、長期キーは作成しない |
| IAM ポリシー | 必要アクションだけを列挙(上記 JSON 参照) |
| シークレット管理 | GitHub Secrets に暗号化保存し、Workflow から ${{ secrets.<NAME> }} の形で参照。コードベースにハードコーディングしない |
| 環境名のサニタイズ | PR 番号やブランチ名をそのまま使用せず、preview-${PR_NUMBER} のようにプレフィックスを付与し衝突リスクを低減 |
まとめ
- 前提:AWS アカウント・Amplify アプリ・GitHub リポジトリを用意し、OIDC 用 IAM ロールとシークレットを設定。
- 非対話化:
--yesオプションと事前の環境存在チェックで CI 環境でもスムーズに動作させる。 - ワークフロー構成:本番・ステージングは
ci-cd.yml、プレビューはpreview.yml、定期クリーンアップはスケジュールジョブで実装。 - 運用ポイント:エラーハンドリング、ログ出力、再試行ロジックを組み込み、不要環境の自動削除でコスト最適化。
以上の手順とベストプラクティスに従えば、GitHub Actions と AWS Amplify(Gen 2)による 安全・高速・低コスト な CI/CD パイプラインが構築できます。ぜひ本稿をリファレンスに、プロジェクト固有の要件に合わせてカスタマイズしてみてください。