AWS CodeCommitを試してみたメモ(2023.1時点)

# １．本記事の内容
業務の都合で資材管理用のリポジトリが欲しくなったので以前から一度使ってみたいと思っていたAWS CodeCommit を使ってみようということで、調査をかねて実際に使ってみた手順のメモです。ローカル環境のGitクライアントからCodeCommit上のリポジトリへ接続を行います。

# ２．想定読者
以下のような読者を想定しています。

* AWSのアカウントのつくり方などは知っている。あるいはすでに持っている。
* AWS IAM の使い方、概念などはある程度分かっている(IAMユーザやグループ、管理ポリシーとは何なのかがわかる程度でOK）。
* Gitの使い方自体はだいたい知っている

これらについては既知のものとして、今回記事ではくわしく説明しませんので、ご了承下さい。
また、AWS Codeシリーズを使ったCI/CDの話も今回記事では触れません。


# ３．AWS CodeCommitとは
簡単に言うと、AWSで提供されているフルマネージドなGitリポジトリサービスです。いわゆる PaaS に該当します。GitHubのAWS版みたいなものと考えても良いでしょう。

・AWS上でリポジトリとブランチ、コミットの状況を確認できる。
・プルリクエスト機能あり。
・Amazon CodeGuru という機械学習によるコードレビュー機能と連動して動作します。

下記は公式ドキュメントです。

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/welcome.html

# ４．AWS CodeCommitの気になるポイント
使う前に気になった点について調べたことを以下(1)～(4)にまとめました。
　
## (1) 接続/認証プロトコル
CodeCommitに接続するためのプロトコルは以下のいずれかが使えます。
* HTTPS
* SSH

ユーザ認証プロトコルとしては以下が使えるようです。
* IAMユーザのパスワード
* SSHキー
* セッショントークン
* SAML 2.0

セッショントークンというのがなんのことやらかもしれませんが、これは[AWS STS (Security Token Service)](https://docs.aws.amazon.com/ja_jp/STS/latest/APIReference/welcome.html) を使用して発行される一時的なアクセスキーやシークレットアクセスキー、またはアップロード用のセッショントークンのことです。

## (2) 認証方法
以下のような様々な認証方法が使えます。ちょっと多すぎてわけが分からないのでここは今回はあまり突っ込みません。
1. ユーザID/パスワード による認証(HTTPS)
2. SSHキーによる認証(SSH)
3. git-remote-codecommit というgitクライアント用のプラグインによる認証(HTTPS)
4. AWS CLI認証情報ヘルパーを使った認証(HTTPS)
5. 一時的なセッショントークンによる認証(HTTPS)
6. AWS SSOによる認証(HTTPS/SAML)
7. AWS Identity Federation for SAML 2.0 による認証(SAML)

今回は一番簡単そうな HTTPS ＋ ユーザ/パスワード認証を使います。
　
## (3) AWSの外から使えるの？
使えます。CodeCommit のサーバはAZごとに立てられていて、グローバルなIPとURLが振られるようです。もちろんAWSの中(VPC内)からも使えます。
CodeCommit上のリモートリポジトリとローカルマシン上のローカルリポジトリとの間で接続が可能です。今回はこれをやってみたという記事になります。

## (4) AWS上でCodeCommit用のVPCを用意する必要があるの？
ありません。CodeCommitはEC2やRDSのようにVPC上に配置するものではありません[^1]。CodeCommitのサーバはグローバルIPになっており、CodeCommit上にリポジトリを作成したらすぐに使えます。
ただしVPC内にあるEC2インスタンスからCodeCommitへ接続して使いたいという場合は、それも可能です。EC2からCodeCommitへ接続するには方法が2通りあり、NATゲートウェイを使っていったんAWSの外へ出てグローバルなネットワーク経由でつなぐ方法と、VPCエンドポイント経由で(AWSから出ないで）接続する方法があります。セキュリティ的には後者の方がより安全と言えます。

[^1]: 厳密に言うと、RDSは必ずしもVPC内に配置する必要はありません。グローバルIPアドレスを振ってVPC外に配置する（ちょうど今回のCodeCommitと同じような）使い方も可能です。ただしAWS としてはセキュリティ的な観点からVPC内への配置を推奨しています。


# ５．費用および使用条件
* 無料枠として５ユーザーまでは無料となります。契約後最初の無償期間（１年）を経過してもこれは継続されます。
* 6ユーザー目からは固有の AWS Identity ごとにアクティブユーザーとしてカウントされ、アクティブユーザー 1 人につき 1 USD/月課金されます。
* アクティブユーザとしてカウントされる基準ですが、単にコミットしたりgitで接続したAWSユーザの人数というわけではないようです。
　下記の記事を見るとCodeCommit の詳細画面を見ただけでアクティブユーザとしてカウントされ、ロールを使用した場合も一人としてカウントされるようです。

https://dev.classmethod.jp/articles/tsnote-codecommit-count-active-users-01/


* １アカウントあたり最大 1000 リポジトリ作成可能とのこと。そんなに作ることはまずないのではと思いますが。

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/limits.html

* １リポジトリに格納できる総データ容量については、１ユーザにつき10GB。
* １ユーザにつき2,000 回の Git リクエスト/月まで無料

https://aws.amazon.com/jp/codecommit/pricing/


# ６．初期設定手順
では、使い始めるためにまず初期設定をしてみます。

## (1) AWSユーザにCodeCommitの使用権限を付与する。
AWS CodeCommit を使い始めるには、まずそのリポジトリを使用する IAMユーザを用意し、適切な権限を付与する必要があります。

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/security-iam-awsmanpol.html

CodeCommitを使用するための管理ポリシーには以下の３種類があります。

|AWS 管理ポリシー|説明|
|---|---|
|[ AWSCodeCommitFullAccess](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/security-iam-awsmanpol.html#managed-policies-full)|CodeCommit に関するフルアクセス権限がある。管理者向け。|
|[AWSCodeCommitPowerUser](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/security-iam-awsmanpol.html#managed-policies-poweruser)|ほとんどの権限があるが、リポジトリ削除などはできない。通常ユーザ向け。|
|[AWSCodeCommitReadOnly](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/security-iam-awsmanpol.html#managed-policies-read)|閲覧専用。閲覧ユーザ向け。|

ということなので、利用したいユーザ（ひとまず自分のユーザ）にはポリシーとして AWSCodeCommitPowerUser を割り当てることにします。
具体的には、CodeCommit を利用するユーザのグループを作成し、そのグループに AWSCodeCommitPowerUser ポリシーを割当て、自分のユーザをそのグループへ所属させました。[^2]　リポジトリのユーザが増えたらこのグループへ追加していく、という考え方です。

[^2]: AWSで１つのIAMグループに割当られる管理ポリシーは10個までという制限があります。それだと１ユーザに10個以上の管理ポリシーを付与したいときに困るのではないかと思うかもしれませんが、１ユーザを複数のグループに紐づけることができ1ユーザに紐づけられるグループの数は特に制限がないので、複数のグループを経由して10個以上の管理ポリシーを１ユーザに付与することが可能になります。


## (2) CodeCommitにリポジトリを作成する。

まずはCodeCommit の画面からリポジトリ一覧へ遷移します。当然ながら最初は何もありません。

![Pasted image 20230124151900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/a55d9665-8b24-368b-5102-7f7f3a024e40.png)

CodeCommitの画面から「リポジトリを作成」を押下します。すると作成画面へ遷移します。

![Pasted image 20230125164526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/f5086a89-8a1a-bbed-ef85-ed86fb677b53.png)


ここでは試しにとりあえずリポジトリ名を「ZACUTIL」としました。これは私がこのリポジトリで管理したいツールの名前なのですが、今回記事ではそこにはあまり意味はないのでとりあえずの仮の名称とお考え下さい。
また、[Amazon CodeGuru Reviewer for Java and Python](https://docs.aws.amazon.com/ja_jp/codeguru/latest/reviewer-ug/welcome.html) を有効にしています。これは機械学習によるコードレビューサービスで、プルリクエストをするとAIが自動的にレビューしてくれるという機能です。せっかくなので後で使ってみたいと思います。[^3]

[^3]: 別途記事を書いています。https://qiita.com/smats-rd/items/865a611b425ced13b038

![Pasted image 20230125164046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/2b9298f5-077a-320c-a687-1f42ed81e63d.png)

リポジトリが作成されました。
![Pasted image 20230125171648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/4b8e87ca-d3a4-690f-f923-804a82a2afa5.png)


## (3) ユーザにGit認証用の情報を付与する
IAMの画面から該当ユーザの画面へ遷移します。
![Pasted image 20230125161030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/ef939bf1-b58b-7ed6-1ff3-ce6e55abceb7.png)

「セキュリティ認証情報」タブへ移動します。

そのタブの下の方に「AWS CodeCommit の HTTPS Git 認証情報」というブロックがあるので、「認証情報を生成」を押下します。
![Pasted image 20230125161430.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/4742082d-53eb-55a6-1f61-1f9bdcba2dc9.png)

すると、Gitクライアント用のユーザー名とパスワードが自動的に生成され、表示されます。
![Pasted image 20230125162008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/7520f9e6-5485-32c7-fc93-2c06b2e3a3f7.png)
「認証情報をダウンロード」を押下して、ユーザ名とパスワードの情報をCSVとしてダウンロードしておきます。メッセージに表示されている通り、ここでダウンロードしておかないと、後からパスワード表示はできなくなるので、必ずこのタイミングでダウンロードしておく必要があります。もしダウンロードし忘れて閉じてしまったら、認証情報自体を一回削除して再生成します。
生成すると、ユーザ画面にGit認証用のユーザ名が表示されます。
![Pasted image 20230125163857.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/0f346771-398c-930e-e191-9a9b429e1e5d.png)


## (4) Gitクライアントから接続する

作成したGit認証情報を使って、GitクライアントからGitサーバへ接続します。
リポジトリを作成したときに、右側に「URLのクローン」という項目が３つ並んでいました。ここから接続先のURLの情報を取得できます。
HTTPS、SSH、HTTPS(GRC)の３つの選択肢があります。
![Pasted image 20230126135602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/ef1bff43-ee3d-e3f0-24f4-40078d8a1736.png)
![Pasted image 20230126135841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/672458f8-db64-7c8c-469b-6f969a0d7d0f.png)
今回はHTTPSを選択しました。ここでコピーしたURLをGitクライアントに接続先として設定します。

 ### 【付記】HTTPS(GRC)とは？
 
ところで、ここでHTTPSとSSHはわかるのですが、HTTPS(GRC)というのは何でしょうか？

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-gc.html

AWSのドキュメントによると、ローカルコンピュータでgit-remote-codecommit(GRC)を使用している場合に選択すべきものとのことです。
GRCはAWSが用意しており、IAMユーザーの権限のみでCodeCommitにアクセスできるgitクライアント用のプラグインです。  
GRCを利用すると下記のようなメリットがあります。

-   IAMユーザーの権限設定のみで利用可能
-   IAMユーザーのGit認証情報の設定が不要
-   複数のアカウントを持っているときにスイッチロールしやすい

一方で、AWS CLIを導入する必要があるようで、そこは少々面倒です（※普段からCLIを使っている人にはデメリットになりません）。

【 参考ドキュメント】

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-git-remote-codecommit.html

https://dev.classmethod.jp/articles/git-remote-codecommit-setting/



## (5) Git Shell から git clone する

ローカルマシンのGit Shellから以下のような感じでコマンドを実行します。（この時点でGitクライアントは別途インストールしておく必要があります）

``` : git bash
$ git clone https://<上でコピーしたHTTPSのURL> <local repository名>
```
すると下記のようにユーザ名とパスワードの入力を促されますので、さきほど(3)で保管しておいたユーザ名とパスワードを入力します。

![Pasted image 20230126182059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/5e764bf0-11f0-9464-5e38-2c42360679fc.png)

これで、問題なければ CodeCommit のgitサーバに接続され、ローカルマシン上にローカルリポジトリのフォルダが出来ます。この時点では、リポジトリに何も入れていませんので、空のディレクトリとなります。そこに開発用の資材、ソースなどを格納し、必要に応じて .gitignore を書いたりしておきます。
後は通常の git を使うときと同じように git add . → git commit → git push とコマンドを入力すれば、ソースがCodeCommit 上で管理されます。
（AWSのマネジメントコンソール上からファイルをリポジトリにアップロードすることもできるので、それを git pull するという方法も考えられます。git clone する前にファイルを格納しておけば、clone の時点でファイルがダウンロードされるわけです。
初回のファイル登録をどうやるかはお好みで決めればよいと思います。）

## (6) コミット結果の確認

push した後に、AWS上でCodeCommit のリポジトリをのぞいてみると、ソースがアップロードされているのがわかります（ディレクトリ名は伏せました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/2369bca5-1251-de8c-c590-8e2e70bbefae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/96cd8c2a-8092-cd68-2a19-a780e40e34de.png)

以降は普通に git サーバとして使うことができます。




# ７．リポジトリごとのアクセス制御は可能か？
複数のリポジトリを作った場合に、ユーザとリポジトリとの紐づけ管理はどうなるのか気になるかもしれません。あるユーザには特定のリポジトリだけ参照できるようにしたいというような制御をしたい場合です。
結論を言うと、ポリシーを編集することでそのような制御も可能なようです。

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/auth-and-access-control.html

https://www.fnifni.net/codecommit-restriction/

https://www.capybara-engineer.com/entry/2020/07/02/234038

ひとまず今回はそこまではしていません。


# ８．まとめ
簡単にまとめると、AWS CodeCommit を使う手順は以下となります。

1. AWS マネジメントコンソールから、使いたいリポジトリを追加する。
1. AWS IAM で、CodeCommitを使わせたいユーザに CodeCommit 用の管理ポリシーを与える。
1. AWS IAM で、CodeCommitを使わせたいユーザごとにCodeCommitのGit用認証情報を生成し、該当のユーザに連携する。
1. 認証情報を貰ったユーザはローカルのGitクライアントにその情報を設定してCodeCommitをGitサーバとして使う。

このように非常に簡単に使えるので、みんな使ってみると良いと思います。無料枠は５ユーザまでですが、6人目以降も一人一月１ドルで使えて、1人で1000リポジトリも作れて、１リポジトリ最大10ギガも使えるので、容量としては十分だと思います。
プルリクエストとCodeGuru に関する調査内容は別途記事としてUPしたいと思います。

※こちらがその記事になります。

https://qiita.com/smats-rd/items/865a611b425ced13b038

以上、どなたかのご参考になれば幸いです。