x-motemen/ghq が AWS CodeCommit HTTPS (GRC) 方式をサポートしました
はじめに
ゴールデンウイーク最終日から取り組んでいた x-motemen/ghq で AWS CodeCommit の HTTPS (GRC) 方式をサポートする作業が無事に完了したことをご報告いたします。
AWS CodeCommit は、開発者がリポジトリにアクセスする方法として大きく 3 つの方式を提供しています。
HTTPS 方式、および SSH 方式は通常の git
でサポートされている方式と同様です。ただ、AWS CodeCommit 特有の問題点として、これらの方式は開発者ごとに IAM ユーザーを作成する必要がある、というものがありました。HTTPS 方式であれば 開発者ごとの IAM ユーザーで Git 認証情報 (専用のユーザー名/パスワード) の生成をする必要があります。また、SSH 方式であれば開発者ごとの IAM ユーザーに SSH の公開鍵の紐づけ行う必要がありました。いずれも、IDaaS などとの統合が難しくする要因になってしまいます。
そこで 3 つめの方式がサポートされていたのですが、現時点では 4 つめの HTTPS (GRC) 方式が推奨されている、という状況です。
ところが、この方式は下記のような独自スキーマの URL を採用することもあり、周辺ツールでのサポートが弱い状況です。
codecommit://reposiotry
codecommit://profile@reposiotry
codecommit::region://repository
codecommit::region://profile@repository
そこで、自分でも使っている x-motemen/ghq
で HTTPS (GRC) 方式をサポートさせることにしました。
実際の使い方
前提条件として、下記 2 点が必要です。
- 事前に AWS のプロファイルが済んでいること
-
git-remote-codecommit
の導入が済んでいること
AWS Single Sign-On (AWS SSO) を利用している場合、こちらの記事を参考に、aws-sso-util
を利用すると良いでしょう (宣伝)。その他、もちろん従来通りのアクセスキー/シークレットキーなどを利用した従来型の AWS プロファイルにも対応しています。
また、git-remote-codecommit
については導入方法がドキュメントに記載されています。
それでは、実際に AWS CodeCommit のリポジトリをクローンします。利用している AWS プロファイルのリージョンとリポジトリのリージョンが合致している場合、このように利用ができます。
$ export AWS_PROFILE=<AWSプロファイル>
$ ghq get codecommit://<リポジトリ名>
clone codecommit://<リポジトリ名> -> /home/xeres/repos/us-east-1/<リポジトリ名>
git clone --recursive codecommit://<リポジトリ名> /home/xeres/repos/us-east-1/<リポジトリ名>
Cloning into '/home/xeres/repos/us-east-1/<リポジトリ名>'...
warning: You appear to have cloned an empty repository.
HTTPS (GRC) 方式では codecommit::region://...
のようにリポジトリがあるリージョンを明示的に指定できます。実際には優先順位でリポジトリがあるリージョンを特定します。
- 明示的なリージョン指定
- 環境変数
$AWS_REGION
$AWS_DEFAULT_REGION
- AWS プロファイルで指定されたリージョン
クローン先は、リージョンを明示的にしているかどうかに関わらず $GHQ_ROOT/<AWSリージョン>/<リポジトリ名>
になります。これにより、同一アカウントで別リージョンに同名のリージョンがある場合にも、ユニークなクローン先になります。
利用している AWS プロファイルが異なる場合、つまり下記のようなケースでは、クローン元のリポジトリとクローン先の対応が必ずしも一致しません。
codecomit://<AWSプロファイル#1>@repository>
codecomit://<AWSプロファイル#2>@repository>
しかし、EC2 のインスタンスロールや一時的な認証情報[1]を利用しているケースでは必ずしも AWS プロファイル名は存在しません。そのため、クローン先に AWS プロファイルは含めない仕様としました。このようなケースは ghq.<base>.root
を設定して保存先を変えることを想定しています。
まさかの git config --get-urlmatch
が :
を含んだスキーマに対応していないということが発覚…。HTTPS (GRC) 形式は一律に ghq.<base>.root
を見ないように修正 PRを送付しました。従って、現時点ではこのようなケースは救済が難しいです。
この修正に至った背景は[2]にも追記してあります。なかなか…難しいねんな…。
最後に
Go 言語によるコントリビューションは初めてだったのですが、VS Code の Remote Containers 拡張を含め、いくつか新しい知見を得ることが出来て大変勉強になりました[2:1]。私のポジションは、仕事柄クローズドな環境での開発に携わることが多いのですが、今後はこういった OSS へのコントリビューションも増やせていけたらなと思っています。
また、メンテナとしてご協力いただいた Songmu さん、ありがとうございました。
-
$AWS_ACCESS_KEY_ID
,$AWS_SECRET_ACCESS_KEY
および$AWS_SESSION_TOKEN
を利用する方式。 ↩︎ -
作業履歴は ghq で CodeCommit HTTPS (GRC) 形式をサポートする改修作業 に記載してあります。 ↩︎ ↩︎
Discussion