🍉

Github DeployKey を利用して AmplifyHosting のデプロイ時にプライベートリポジトリをインストールする方法

2022/08/12に公開

はじめに

やっとこデプロイまでこぎつけたのに、AmplifyHosting のビルドに苦戦。次に活かせたらと思いエラーと解決策を残しておくことにしました。

状況

Next.js(SSR)のアプリをAmplifyでホスティングする際にパッケージにGitのプライベートリポジトリが含まれているとyarn installするときにエラーが出てインストールに失敗してしまう。

package.json
{
  "name": "sample-app",
  "dependencies": {
    "sample-ui": "git+ssh://git@github.com:sample-inc/sample-ui.git#01f438b14879376fca3949fad67a2641c4f1dbcc"
  }
}

発生事象

エラーその1

なにも考えずに初期のデフォルトの設定でビルド。キーも何も設定していないのに突然プライベートリポジトリをインストールしているからそりゃ権限ないって怒られる。

amplifyビルドyamlファイル
varsion: 1
frontend:
  phases:
    preBuild:
      commands:
        - yarn install
~~ 以下省略 ~~
エラー
yarn install v1.22.0
info No lockfile found.
[1/4] Resolving packages...
error Command failed.
Exit code: 128
Command: git
Arguments: ls-remote --tags --heads git@github.com:sample-inc/sample-ui.git
Directory: /app
Output:
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

エラーその2

気をとりなおしてしっかりデプロイキーを設定。するも再びエラー。sshの設定であるStrictHostKeyCheckingによる厳格なホスト鍵のチェックに失敗している模様。

amplifyビルドyamlファイル
varsion: 1
frontend:
  phases:
    preBuild:
      commands:
        - eval "$(ssh-agent -s)"
	- ssh-add <(echo "$DEPLOY_KEY" | base64 -d)
        - yarn install
~~ 以下省略 ~~
yarn install v1.22.0
info No lockfile found.
[1/4] Resolving packages...
error Command failed.
Exit code: 128
Command: git
Arguments: ls-remote --tags --heads git@github.com:sample-inc/sample-ui.git
Directory: /app
Output:
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

エラーその3(たまに発生)

StrictHostKeyChecking行わない設定を追加。満を辞して際デプロイを行うが今度はエラーも出ないでビルドに失敗。

amplifyビルドyamlファイル
varsion: 1
frontend:
  phases:
    preBuild:
      commands:
        - eval "$(ssh-agent -s)"
	- ssh-add <(echo "$DEPLOY_KEY" | base64 -d)
        - mkdir ~/.ssh
        - touch ~/.ssh/config
        - 'echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
	- yarn install
~~ 以下省略 ~~
error https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz: Extracting tar content of undefined failed, the file appears to be corrupt: "ENOENT: no such file or directory, chmod '/home/runner/.cache/yarn/v6/npm-p-locate-4.1.0-a3428bb7088b3a60292f66919278b7c297ad4f07-integrity/node_modules/p-locate/index.d.ts'"
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

解決方法

1. デプロイキーとして利用する鍵を作成

ssh-keygen -t ed25519 -f sample_id

2. 公開鍵をプライベートリポジトリのDeploy keysに登録

作成したキーペアのうち公開鍵(sample_id.pub)の方をGithubの設定画面よりデプロイキーに登録する。タイトルはわかりやすい名前ならなんでもOK。

3. Amplifyの環境変数にデプロイキーの秘密鍵を登録

4. Amplifyのビルド設定を書き換えて再ビルド

これで全て解決🎉

amplifyビルドyamlファイル
varsion: 1
frontend:
  phases:
    preBuild:
      commands:
        - eval "$(ssh-agent -s)"
	- ssh-add <(echo "$DEPLOY_KEY" | base64 -d)
        - mkdir ~/.ssh
        - touch ~/.ssh/config
        - 'echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
	- yarn install
~~ 以下省略 ~~

5. (おまけ)エラーその3について

Amplify側でもローカルでもときたま突然発生して困っていたエラーでissueを漁っても色々でてくるも実際の原因が掴めず、、、回避方法は参考までに。

amplifyビルドyamlファイル
varsion: 1
frontend:
  phases:
    preBuild:
      commands:
        - eval "$(ssh-agent -s)"
	- ssh-add <(echo "$DEPLOY_KEY" | base64 -d)
        - mkdir ~/.ssh
        - touch ~/.ssh/config
        - 'echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
        - yarn cache clean
        - yarn install --network-concurrency 1
~~ 以下省略 ~~

参考

そもそもAmplifyのデフォルトビルドイメージは何者???という疑問。opensshやgitはちゃんと入っているのだ↓
https://github.com/aws-amplify/amplify-hosting/blob/main/images/latest/Dockerfile
opensshのコマンド詳細はこちら↓
https://www.openssh.com/manual.html
githubのデプロイキーの設定について↓
https://docs.github.com/ja/developers/overview/managing-deploy-keys#deploy-keys
StrictHostKeyCheckingについていちばんしっくりきた↓
https://penpen-dev.com/blog/userknownhostsfile-stricthostkeychecking/

Discussion