GitHubからAWS CodeCommitにリポジトリを複製してみた

2021.07.26

こんにちは、CX事業本部 IoT事業部の若槻です。

今回は、GitHubからAWS CodeCommitにGit Repositoryを複製する機会があったので、方法を書き残しておきます。

環境

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H15
% aws --version
aws-cli/2.0.28 Python/3.7.4 Darwin/19.6.0 botocore/2.0.0dev32
% git --version
git version 2.24.3 (Apple Git-128)

AWS CLIの認証は下記の方法により実施済み。

やってみた

ここではAWSがGitHubに公開している公開Repositoryを複製対象とします。

複製元のRepositoryの情報を定義

% GITHUB_ACCOUNT=awslabs
% REPO_NAME=aws-codedeploy-samples
% GITHUB_REPO_URL=https://github.com/${GITHUB_ACCOUNT}/${REPO_NAME}.git

CodeCommitに複製先となる空Repositoryを作成

% aws codecommit create-repository \
  --repository-name ${REPO_NAME}

GitHubから複製元のRepositoryをClone

% git clone --mirror ${GITHUB_REPO_URL} ${REPO_NAME}
% cd ${REPO_NAME}

補足として、mirrorを使用するとリモートのすべてのブランチがcloneされます。

% git branch
* master
  revert-35-protect_variables

またmirrorによりcloneしたRepositoryはワークツリーを使用した操作ができなくなっています。

% git checkout revert-35-protect_variables
fatal: this operation must be run in a work tree

複製先のRepositoryの情報を定義

% CODECOMMIT_REGION=ap-northeast-1
% CODECOMMIT_REPO_URL=https://git-codecommit.${CODECOMMIT_REGION}.amazonaws.com/v1/repos/${REPO_NAME}

認証情報ヘルパーの設定

% git config --global credential.helper '!aws codecommit credential-helper $@'
% git config --global credential.UseHttpPath true

確認のため下記コマンドを実行します。

% git config --global --edit

~/.gitconfigに次のように書き込まれていることを確認します。

[credential]
        helper = !aws codecommit credential-helper $@
        UseHttpPath = true

CodeCommit上のRepositoryにpush

下記コマンドを実行します。

% git push ${CODECOMMIT_REPO_URL} --all

pushの結果を確認してみます。AWS管理ダッシュボードで[デベロッパー用ツール > CodeCommit > Repository]を開き、pushしたRepositoryを選択します。

push結果がちゃんとRepositoryの内容に反映できていますね。

これでGitHubからCodeCommitにRepositoryを複製することができました。

注意点

macOSからHTTPSでCodeCommitRepositoryへの初回接続すると、その15分後から接続時に下記のような403エラーが出るようになります。

% git push ${CODECOMMIT_REPO_URL} --all
fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/aws-codedeploy-samples/': The requested URL returned error: 403

ドキュメントによると、これはMacのキーチェーン保存される古い認証情報が使われてしまうため、下記の対応が必要とのことです。

macOS を使用している場合は、HTTPS を使用して CodeCommit Repositoryに接続します。HTTPS を使用して CodeCommit Repositoryに初めて接続すると、約 15 分後に後続のアクセスが失敗します。macOS のデフォルトの Git バージョンは、Keychain Access ユーティリティを使用して認証情報を保存します。セキュリティ対策のために、CodeCommit Repositoryへのアクセス用に生成されるパスワードは一時的なものであり、約 15 分後にキーチェーンに保存されている認証情報は機能しなくなります。期限切れの認証情報が使用されないようにするには、これらのいずれかが必要になります。
- デフォルトでキーチェーンを使用しない Git バージョンをインストールします。
- CodeCommit Repositoryの認証情報を提供しないように Keychain Access ユーティリティを設定します。

ここでは後者のキーチェーンを設定する方法を行ってみます。

FinderでKeychain Accessで検索すると[アプリケーション > ユーティリティ]配下で「キーチェーンアクセス」を探して開きます。

git-codecommit.<リージョン>.amazonaws.comを探し、クリックして開きます。

[アクセス制御]タブでgit-credential-osxkeychainを選択し、マイナス記号を選択してリストから削除します。

[変更内容を保存]をクリックします。

再度CodeCommitに対する接続(pushコマンド)を行ってみます。

% git push ${CODECOMMIT_REPO_URL} --all

すると下記のようなダイアログが表示されるので[拒否]をクリックします。拒否することによりキーチェーン内の古い認証情報を使わず接続を行います。

するとpushコマンドが正常に完了しました。CodeCommitへの接続が正常に行えるようになっていますね。

さらに注意点

さらに注意点として、ここまで行った設定のみの場合、前述のダイアログは接続毎に毎回表示されるため、毎回[拒否]をクリックする必要があります。そうなるとCodeCommit上のRepositoryを使用して開発を行う場合は不便です。

毎回の表示を回避する方法としては、ドキュメントでは下記の2通りの方法が示されているので、必要に応じて実施してください。(今回はRepositoryの複製のみが目的であり一時的にCodeCommitに接続できれば良かったため省略しました)

  • HTTPS ではなく SSH を使用して CodeCommit に接続します。詳細については、「Linux、macOS、または Unix での SSH 接続の場合」を参照してください。
  • 詳細については、「Git for macOS: 認証情報ヘルパーは正常に設定できましたが、リポジトリへのアクセスが拒否されます (403)」を参照してください。

参考

以上