Git
AWS
SSH
CodeCommit

複数AWSアカウントのCodeCommitからgit cloneする際のsubmodule対応

前回の記事の続き。
前回は「複数AWSアカウントのCodeCommitからgit cloneする際のssh設定」について記載したが、今回はcloneするリポジトリがsubmoduleを含んでいた場合の対応について。

何もせずsubmodule updateした場合

  1. 前回の記事に記載した通り、複数AWSアカウントのssh設定を行う
  2. 設定した接続先aws1からリポジトリをcloneする
  3. cloneしてきたディレクトリに移動し、submoduleをチェックアウトする
git_submodule
cd  test_app            # 移動
git submodule init      # ローカルの設定ファイルを初期化
git submodule update    # プロジェクトからのデータを取得し、親プロジェクトで指定されている適切なコミットをチェックアウト

この時、こんな感じのエラーが吐き出されます。

Cloning into '/Users/speak-easy/Documents/workspace/test/test_lib'...
speak-easy@git-codecommit.ap-northeast-1.amazonaws.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test_lib' into submodule path '/Users/speak-easy/Documents/workspace/test/test_lib' failed
Failed to clone 'test_lib'. Retry scheduled

Cloning into '/Users/speak-easy/Documents/workspace/test/test_lib'...
speak-easy@git-codecommit.ap-northeast-1.amazonaws.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test_lib' into submodule path '/Users/speak-easy/Documents/workspace/test/test_lib' failed
Failed to clone 'test_lib' a second time, aborting

エラーは『ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test_lib』がsubmoduleとして登録されてるけど公開鍵間違ってるぞって意味ですね。
なんでそんなエラーが出るかというと、~/.ssh/configに接続名がgit-codecommit.ap-northeast-1.amazonaws.comの設定がないからです。

submoduleの接続先設定

なのでsubmoduleのURLの一部も、cloneする時と同じように設定した接続名aws1に置き換えればOK。
submoduleのURLの書き換え手順は下記の通り。

  1. git cloneしたディレクトリに移動し、.git/configを開く
  2. .git/configの中にsubmoduleのpathが書かれた行があるので、pathの一部を~/.ssh/configに設定した接続名に置き換える
.git/config
[submodule "test_lib"]
        active = true
      # url = ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test_lib
                        ↓
        url = ssh://aws1/v1/repos/test_lib

置き換えた後、改めてgit submodule updateすると無事submoduleがcloneされてきました。

参考サイト

下記サイトを参考にさせていただきました。

http://nobollel-tech.hatenablog.com/entry/2016/12/31/190000