プライベートな Git サブモジュールがあるプロジェクトを AWS Amplify にデプロイする方法
以前書いた プライベートな Git サブモジュールがあるプロジェクトを Vercel にデプロイする方法 の AWS Amplify 版。やっていることはほとんど同じです。
1. Fine-grained personal access token を作る
https://github.com/settings/tokens?type=beta
上記ページから、 Generate new token をクリック。

Repository access は、 Only select repositories を選択し、必要最低限のリポジトリを選択する。
Repository permissions は Contents の Read-only のみ付与する。

Generate token ボタンを押して生成する。
2. Amplify の環境変数に登録する
左メニューの「ホスティング」から「環境変数」を選択し、「変数を管理」を選択。

GITHUB_PAT という名前でトークンを追加する。

3. ビルドスクリプトを作る
sh/pre-build-for-amplify.sh という名前で作成する。
推奨: GIT_ASKPASS を使う方法
URL にトークンを直接埋め込む方法はセキュリティリスクがあるため、GIT_ASKPASS を使う方法を推奨する。
GIT_ASKPASS は、git が認証情報を必要とするときに自動実行されるスクリプトを指定する環境変数。
トークンが URL や git config に残らないため安全。
#!/usr/bin/env bash
cd $(dirname $0)/../ || exit
set -e
if [ -z "${GITHUB_PAT}" ]; then
echo "環境変数 GITHUB_PAT が設定されていません。Github の Fine-grained トークンを再生成して、Amplify の環境変数 GITHUB_PAT に登録してください。"
echo "https://github.com/settings/tokens?type=beta"
echo "https://ap-northeast-1.console.aws.amazon.com/amplify/apps/"
exit 1
fi
# GIT_ASKPASS でトークンを渡す (URL にトークンを含めない)
ASKPASS_SCRIPT="$(mktemp)"
trap 'rm -f "${ASKPASS_SCRIPT}"' EXIT
cat > "${ASKPASS_SCRIPT}" <<'SCRIPT'
#!/usr/bin/env bash
case "$1" in
*Username*) echo "x-access-token" ;;
*Password*) echo "${GITHUB_PAT}" ;;
*) echo ;;
esac
SCRIPT
chmod 700 "${ASKPASS_SCRIPT}"
export GIT_ASKPASS="${ASKPASS_SCRIPT}"
export GIT_TERMINAL_PROMPT=0
git submodule set-url <my-submodule> "https://github.com/ytyng/<my-submodule>.git"
git submodule sync
git submodule update --init
ポイント:
GIT_ASKPASSに指定した一時スクリプトが、git の認証要求に対して自動的にトークンを返すtrapでビルド完了後に一時スクリプトを自動削除- サブモジュール URL にトークンを含めないため、git config にトークンが残らない
GIT_TERMINAL_PROMPT=0で対話的なプロンプトを無効化
以前の方法 (非推奨)
以下は URL にトークンを直接埋め込む方法。動作はするがセキュリティリスクがあるため、上記の GIT_ASKPASS を使う方法を推奨する。
#!/usr/bin/env bash
cd $(dirname $0)/../ || exit
if [ -z "${GITHUB_PAT}" ]; then
echo "環境変数 GITHUB_PAT が設定されていません。Github の Fine-grained トークンを再生成して、Amplify の環境変数 GITHUB_PAT に登録してください。"
echo "https://github.com/settings/tokens?type=beta"
echo "https://ap-northeast-1.console.aws.amazon.com/amplify/apps/"
exit 1
fi
git submodule set-url <my-submodule> "https://${GITHUB_PAT}@github.com/ytyng/<my-submodule>.git"
git submodule sync
git submodule update --init
4. Amplify でこのビルドスクリプトを使ってビルドするようにする
Amplify のページのホスティング → ビルドの設定 のページで、ブラウザで amplify.yml を修正するか、プロジェクトのルートディレクトリに amplify.yml を配置する。
preBuild.commands に sh/pre-build-for-amplify.sh を追加する。
version: 1
frontend:
phases:
preBuild:
commands:
- 'sh/pre-build-for-amplify.sh' # これを追加
- 'npm ci --cache .npm --prefer-offline'
build:
commands:
- 'npm run build'
artifacts:
baseDirectory: build
files:
- '**/*'
cache:
paths:
- '.npm/**/*'
開発相談をお待ちしています。