git push で CodeCommit にもプッシュする

Posted on

AWS CodeCommit

去年の re:Invent で発表されて今か今かと待ちわびていた AWS CodeCommit がついにリリースされました!

CodeCommit は AWS がホスティングする Git リポジトリでフルマネージドのサービスです。リポジトリのサイズに制限はなく、高可用性が謳われています(おそらく、データは S3 に置かれてると思います)。

また IAM でユーザーを管理するので、すでに AWS を使っていれば簡単に始められます。 CloudTrail も近いうちにサポートするようなので、Git リポジトリに対する操作ログも取れます。

GitHub / BitBucket と比べると機能が劣る

Git リポジトリのホスティングといえば GitHub や BitBucket がありますが、機能面では比べるまでもなく CodeCommit が劣っています。

ブラウザでソースコードを見ることはできませんし、Git フックもまだ使えないので CI と連携することもできません。いずれ機能は増えてくると思いますが、現時点では Git リポジトリの箱としか使えません

とはいえ、無料枠(5 アクティブユーザ、50 GB のストレージ、10,000 Git リクエスト)は太っ腹ですし、他の AWS サービスとの連携も考えると魅力的です。

そこで、いま使っているリポジトリはそのままで、git push したときに CodeCommit にもプッシュするようにしてみました。こうしておけば、いつでも移行できます。

リポジトリを作る

US East リージョンに切り替えてリポジトリを作ります(特に迷うところはないので手順は省略)。

リポジトリ名は S3 と同じように他と被らないようにする必要があります。リポジトリを作ると URL が発行されます。

ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/kindle_alert

今回は個人で運営してる Kindle Alert のリポジトリを作ってみました(使ったことがない人はこの機会にぜひ!)。

IAM ユーザに公開鍵を追加する

冒頭で紹介した公式ブログでは HTTPS 経由での手順が紹介されていますが SSH も当然使えます。 Mac や Linux なら ssh-agent を使っているでしょうし HTTPS を選ぶ理由はありません(Windows だと事情が違うのかもしれませんが)。

IAM ユーザの詳細ページを開くと CodeCommit の公開鍵を追加できるようになっているので、普段使っている公開鍵を登録します。 aws iam upload-ssh-public-key でもアップロードできます。

SSH keys for AWS CodeCommit

SSH Key ID というのが SSH のユーザ名になります(上の画像は一部マスクしてます)。 GitHub や BitBucket は全員が git ユーザを使いますが、CodeCommit は個別のユーザが割り当てられます。

IAM ユーザに権限を付ける

CodeCommit のポリシーが用意されているので、IAM ユーザに権限を付けます。

  • AWSCodeCommitFullAccess
  • AWSCodeCommitPowerUser
  • AWSCodeCommitReadOnly

自分でポリシーを書けばリポジトリ単位など柔軟に権限管理できますが、今回は AWSCodeCommitFullAccess を付けました。

正しく設定できていれば SSH が通ります(ssh-agent を使ってない場合は -i で秘密鍵を指定してください)。

$ ssh APKAJ6JXXXXXXXXXXXXX@git-codecommit.us-east-1.amazonaws.com
You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.Connection to git-codecommit.us-east-1.amazonaws.com closed by remote host.
Connection to git-codecommit.us-east-1.amazonaws.com closed.

リモートリポジトリを追加する

ここまで来れば、あとは Git の設定だけです。現在のリモートリポジトリは BitBucket になっています。

$ git remote -v
origin    git@bitbucket.org:manabusakai/kindle_alert.git (fetch)
origin    git@bitbucket.org:manabusakai/kindle_alert.git (push)

origin に CodeCommit の URL を追加します。 URL は ssh:// から始める必要があります。

$ git remote set-url --add origin ssh://APKAJ6JXXXXXXXXXXXXX@git-codecommit.us-east-1.amazonaws.com/v1/repos/kindle_alert

$ git remote -v
origin    git@bitbucket.org:manabusakai/kindle_alert.git (fetch)
origin    git@bitbucket.org:manabusakai/kindle_alert.git (push)
origin    ssh://APKAJ6JXXXXXXXXXXXXX@git-codecommit.us-east-1.amazonaws.com/v1/repos/kindle_alert (push)

あとは、いつも通り git push origin master とすれば BitBucket と CodeCommit にプッシュされます。

まとめ

US East リージョンなのでレイテンシが気になってましたが、GitHub や BitBucket も海外にあるので差は感じませんでした。一度設定してしまえば何も意識することなくプッシュできるので、まずは試してみてはいかがでしょうか。