---
slug: "how-to-deploy-private-git-submodule-included-app-to-aws-amplify"
title: "プライベートな Git サブモジュールがあるプロジェクトを AWS Amplify にデプロイする方法"
description: "Gitのプライベートリポジトリをサブモジュールにしているアプリを、AWS Amplify にデプロイする方法を書いています。"
url: "https://www.ytyng.com/blog/how-to-deploy-private-git-submodule-included-app-to-aws-amplify"
publish_date: "2024-07-20T10:55:19Z"
created: "2024-07-20T10:55:19Z"
updated: "2026-04-12T07:47:00.779Z"
categories: ["AWS"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20250609/53157db76a034b13aacbac0bc11f1e48.png.webp?width=768"
has_video: true
has_music: true
video_urls: ["https://media.ytyng.net/ytyng-blog/312/featured-video-1.mp4", "https://media.ytyng.net/ytyng-blog/312/featured-video-2.mp4", "https://media.ytyng.net/ytyng-blog/312/featured-video-3.mp4"]
music_urls: ["https://media.ytyng.net/ytyng-blog/312/featured-music-312-3.mp3", "https://media.ytyng.net/ytyng-blog/312/featured-music-312-4.mp3"]
lang: "ja"
---

# プライベートな Git サブモジュールがあるプロジェクトを AWS Amplify にデプロイする方法

以前書いた [プライベートな Git サブモジュールがあるプロジェクトを Vercel にデプロイする方法](https://www.ytyng.com/blog/how-to-deploy-project-to-vercel-includes-private-submodules/) の AWS Amplify 版。やっていることはほとんど同じです。

# 1. Fine-grained personal access token を作る

https://github.com/settings/tokens?type=beta

上記ページから、 Generate new token をクリック。

![画像](https://media.ytyng.com/20240526/0a228df2565f4ac1817d0929eec86427.png)

Repository access は、 Only select repositories を選択し、必要最低限のリポジトリを選択する。

Repository permissions は Contents の Read-only のみ付与する。

![画像](https://media.ytyng.com/20240526/6693893421ac4859b01d28814dbfd622.png)

Generate token ボタンを押して生成する。


# 2. Amplify の環境変数に登録する

左メニューの「ホスティング」から「環境変数」を選択し、「変数を管理」を選択。

![画像](https://media.ytyng.com/20240720/eece8cd2135c423eafb9ff6fb54414fa.png)


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


![画像](https://media.ytyng.com/20240720/78b40a1fc87e461d976470a325f77730.png)


# 3. ビルドスクリプトを作る

`sh/pre-build-for-amplify.sh` という名前で作成する。

### 推奨: GIT_ASKPASS を使う方法

URL にトークンを直接埋め込む方法はセキュリティリスクがあるため、`GIT_ASKPASS` を使う方法を推奨する。

`GIT_ASKPASS` は、git が認証情報を必要とするときに自動実行されるスクリプトを指定する環境変数。
トークンが URL や git config に残らないため安全。

```shell
#!/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 を使う方法を推奨する。

```shell
#!/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` を追加する。


```yaml
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/**/*'
```

