🚀

x-motemen/ghq が AWS CodeCommit HTTPS (GRC) 方式をサポートしました

2021/05/23に公開

はじめに

ゴールデンウイーク最終日から取り組んでいた x-motemen/ghq で AWS CodeCommit の HTTPS (GRC) 方式をサポートする作業が無事に完了したことをご報告いたします。

AWS CodeCommit は、開発者がリポジトリにアクセスする方法として大きく 3 つの方式を提供しています。

  1. HTTPS 方式
  2. SSH 方式
  3. HTTPS 方式 (credential-helper)
  4. HTTPS (GRC) 方式

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 点が必要です。

  1. 事前に AWS のプロファイルが済んでいること
  2. 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://... のようにリポジトリがあるリージョンを明示的に指定できます。実際には優先順位でリポジトリがあるリージョンを特定します。

  1. 明示的なリージョン指定
  2. 環境変数
    1. $AWS_REGION
    2. $AWS_DEFAULT_REGION
  3. 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 さん、ありがとうございました。

脚注
  1. $AWS_ACCESS_KEY_ID, $AWS_SECRET_ACCESS_KEY および $AWS_SESSION_TOKEN を利用する方式。 ↩︎

  2. 作業履歴は ghq で CodeCommit HTTPS (GRC) 形式をサポートする改修作業 に記載してあります。 ↩︎ ↩︎

Discussion