AWS CodeCommitの超詳細解説

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではCodeCommitとはどういうサービスで何ができるのかを超詳細にまとめています。

具体的には以下流れで説明します。
- AWS CodeCommitとは
- AWS CodeCommitとGitHubの比較
- AWS CodeCommitにおけるセキュリティ
- AWS CodeCommitにおけるプルリクエスト承認ルール
- AWS CodeCommit起点のイベント駆動

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- CodeCommitがどういうサービスか説明できるようになりたい人
- CodeCommitをプロジェクトで採用する際に実装できるセキュリティ対策を説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# AWS CodeCommitとは
AWS CodeCommitは一言でいうとバージョン管理ツールです。

CodeCommitはGitHubやGitLab、BitBucketといったサードパーティー製品と比較して相対的に安く利用できる可能性が高く、実際GitLabは月額29$/USERですがCodeCommitは月額1$/USERです。

もちろん、利用するストレージサイズによって料金が多少上下するので導入前に[AWS料金計算ツール](https://calculator.aws/#/)で見積もりをお願いします。

そのほかの特徴としては以下3点があげられます。
1. リポジトリサイズがシームレスに拡張可能でサイズ制限なし
2. フルマネージドで高可用性
3. AWS CodeBuildなどのAWS製品以外にもJenkinsやサードパーティーのCIツールとも統合可能

シームレス、フルマネージド、高可用性の3拍子がいかにもクラウドですね。

ここまでCodeCommitの概要をまとめたので次はGitHubと比較して、CodeCommitの特徴をより掘り下げてみましょう。

# AWS CodeCommitとGitHubの比較
先ほどはAWS CodeCommitとサードパーティーツールの比較を料金面でだけ記載しましたがここではサードパーティーツールの中から特にGitHubを取り上げてCodeCommitと比較していきます。

ますは以下の表をご覧ください。
| 比較軸 | AWS CodeCommit | GitHub |
| ---- | ---- | ---- |
| コードレビューのサポート(プルリクエスト) | 可能 | 可能 |
| AWS CodeBuildとの統合 | 可能 | 可能 |
| 認証(SSH/HTTPS) | 可能 | 可能 |
| UI | 必要最小限 | 洗練された機能 |
| 料金 | 相対的に安い | 相対的に高い |

簡単にまとめるとCodeCommitはGitリポジトリとして使う最低限の機能が実装されており、相対的に安い、というのが結論です。

最低限の機能、というのはブランチ作成やプルリクエストなどGitとしてバージョン管理に必要な機能、という意味で書いています。

例えば、Gitを利用したプロジェクトでよく利用するIssueの作成やリリース管理の機能はCodeCommitに具備されていません。

そのため、実プロジェクトではEC2やECS上に展開したプライベートなGitLabでバージョン管理を行い、CI/CDパイプラインを動かすためにGitLabからCodeCommitにミラーリングする、という構成がよくとられます。

![](https://storage.googleapis.com/zenn-user-upload/1a08336603d7-20231103.png)

# AWS CodeCommitにおけるセキュリティ
ここでは、CodeCommitのセキュリティを4つの観点でまとめます。

## 認証
認証はSSHかHTTPSで行います。

SSHの場合、IAMコンソールでSSHキーを払い出し利用します。

HTTPSの場合にはAWS CLIの認証情報ヘルパーを利用した設定、あるいはIAMユーザのGitクレデンシャルをIAMコンソールで払い出し利用します。

## 認可
認可はIAMユーザあるいはIAMロールに付与されたIAMポリシーで制御します。
この制御はブランチレベルでアクション単位の制御が可能なので、例えばこのIAMユーザにはブランチを削除させない、といった細かい制限が可能です。

例えばこんな感じのIAMポリシーだとprodブランチにGitPush、PutFile、MergePullRequestByFastForwardだけができるように制限できます。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codecommit:GitPush",
                "codecommit:PutFile",
                "codecommit:MergePullRequestByFastForward"
            ],
            "Resource": "arn:aws:codecommit:REGION:ACCOUNT-ID:REPOSITORY-NAME",
            "Condition": {
                "StringEqualsIfExists": {
                    "codecommit:References": ["refs/heads/prod"]
                }
            }
        }
    ]
}
```

ただし、プルリクエストを承認できる人や承認に必要な人数を指定したいときには別途、プルリクエスト承認ルールを作成する必要があることに注意が必要です。
これは別途、プルリクエストの承認のところで詳しく説明します。

## 暗号化
リポジトリはAWS KMSを利用して自動で暗号化されます。
AWS Certified DevOps Engineer Professionalの試験でCodeCommitの暗号化をするためにどうしたらよいか、が聞かれることがあるので自動で暗号化される、と覚えておくとよいでしょう。

また、転送中の暗号化はHTTPSあるいはSSHを用いて実現されます。

## クロスアカウントアクセス
AWS CodeCommitにクロスアカウントでアクセスさせる際にはIAMロールとAWS STSのAssumeRoleAPIを用いたスイッチロールで実現するのがベストプラクティスです。

これはAWS CodeCommitに限った話ではありませんがSSHキーやクレデンシャルなどの認証情報を共有してのクロスアカウントアクセスはアンチパターンです。

試験でもよく聞かれるのでおさえておきましょう。

# AWS CodeCommitにおけるプルリクエスト承認ルール
認可はIAMユーザあるいはIAMロールにアタッチしたIAMポリシーで行う、とすでに書きましたがプルリクエストを承認できる条件はプルリクエスト承認ルールで別途設定が必要です。

ここで設定できるのは、だれが何人承認したらプルリクエストを承認とするかです。
また、プルリクエスト承認ルールはリポジトリ毎、ブランチ毎に作成できるためあるリポジトリのStagingブランチは誰でも承認可能だがProdブランチは管理職のみ承認可能、といったルールを作成可能です。

# AWS CodeCommit起点のイベント駆動
AWS CodeCommitで発生したイベントはEventBridgeを用いて準リアルタイムの検知が可能です。

コミットされたときやされたときを検知可能なので、イベント駆動でチャットへの通知を行いChatOpsを実現したり、CodePipelineを動作させることが可能です。

![](https://storage.googleapis.com/zenn-user-upload/0e8c02b48a9a-20231103.png)

# まとめ
今回は以下の流れでCodeCommitとはどういうサービスで何ができるのかを超詳細にまとめました。

- AWS CodeCommitとは
- AWS CodeCommitとGitHubの比較
- AWS CodeCommitにおけるセキュリティ
- AWS CodeCommitのプルリクエスト承認ルール
- AWS CodeCommit起点のイベント駆動

次回はCodePipelineについて超詳細解説を行います。