CodeCommitのmainブランチへのプッシュとマージを制限

### はじめに
　mainブランチへの誤ったpush対策として[pre-pushファイルを使用した対策](https://qiita.com/january108/items/05ab9e2f1d713f6efae3)を行っていました。
　GitのリポジトリをCodeCommitで運用することになり、同じような対策をIAMポリシーを使用し行ったので、その設定方法を記事にしたいと思います。

### 本記事でやったこと
IAMポリシーを使用しCodeCommitに下記、制限を設定する。

 + mainブランチへpushを禁止。
 + mainブランチへのマージをプルリクエストからに制限。

### 手順
※[AWS CodeCommit のブランチに対するプッシュとマージの制限](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-conditional-branch.html)を参考にIAMポリシーを作成しました。
1.AWSのIAM コンソール (https://console.aws.amazon.com/iam/) を開く。
2.[ポリシー] ⇒ [ポリシーの作成] ⇒ [JSON] を選択 ⇒ jsonを編集。

##### 参考にしたIAMポリシーのjson
下記、参考にしたIAMポリシーのjsonです。
リポジトリ名が「MyDemoRepo」のmainブランチとprodブランチに対し、プッシュ、削除、ファイルの追加、マージを拒否する設定です。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "codecommit:GitPush",
                "codecommit:DeleteBranch",
                "codecommit:PutFile",
                "codecommit:MergeBranchesByFastForward",
                "codecommit:MergeBranchesBySquash",
                "codecommit:MergeBranchesByThreeWay",
                "codecommit:MergePullRequestByFastForward",
                "codecommit:MergePullRequestBySquash",
                "codecommit:MergePullRequestByThreeWay"
            ],
            "Resource": "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo",
            "Condition": {
                "StringEqualsIfExists": {
                    "codecommit:References": [
                        "refs/heads/main", 
                        "refs/heads/prod"
                     ]
                },
                "Null": {
                    "codecommit:References": "false"
                }
            }
        }
    ]
}
```

##### 作成したIAMポリシーのjson
下記、作成したIAMポリシーのjsonです。
全リポジトリのmainブランチに対し、プッシュ、削除、ファイルの追加、マージ(プルリクエストは許可)を拒否する設定です。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "codecommit:GitPush",
                "codecommit:DeleteBranch",
                "codecommit:PutFile",
                "codecommit:MergeBranchesByFastForward",
                "codecommit:MergeBranchesBySquash",
                "codecommit:MergeBranchesByThreeWay"
            ],
            "Resource": "*",
            "Condition": {
                "StringEqualsIfExists": {
                    "codecommit:References": [
                        "refs/heads/main"
                    ]
                },
                "Null": {
                    "codecommit:References": "false"
                }
            }
        }
    ]
}
```
3.IAM ポリシーを適用
[こちら](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-conditional-branch.html#how-to-conditional-branch-apply-policy)を参考にIAMユーザーへ設定を反映させる。

### 設定内容

##### アクセス制限の設定
`"Action"`キーにアクセスを制限したい操作を記載することで、アクセス拒否の設定ができます。
今回、プルリクエストは許可したかったので関連する値を除外しました。
※設定できる項目については[CodeCommit アクセス許可リファレンス](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/auth-and-access-control-permissions-reference.html)から確認できます。

```
"Action": [
    "codecommit:GitPush",
    "codecommit:DeleteBranch",
    "codecommit:PutFile",
    "codecommit:MergeBranchesByFastForward",
    "codecommit:MergeBranchesBySquash",
    "codecommit:MergeBranchesByThreeWay"
],
```
##### 対象のリポジトリ
`"Resource"`キーは対象のリポジトリのARNを記載する箇所ですが、`"*"`を記載し全リポジトリを対象にしました。

```
"Resource": "*",
```

##### 対象のブランチ
`"refs/heads/main"`と記載し、mainブランチを対象にしています。

```
"StringEqualsIfExists": {
    "codecommit:References": [
        "refs/heads/main", 
     ]
},
```
### 動作確認
##### mainへpush
ツールはphpstormを使用しmainにpushしたところ、ログにパーミッションのエラーが出力されpushを拒否できました。
![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2472237/3ad5a375-c438-ad30-7109-785687d539ab.jpeg)

##### プルリクエストからのマージ
AWSコンソールのプルリクエストの作成から、mainへのマージができました。
![WS000009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2472237/4a9ffb5b-d155-d72c-1167-f08a217e1e39.jpeg)

### おわりに
　[pre-pushファイルを使用した対策](https://qiita.com/january108/items/05ab9e2f1d713f6efae3)と比べて、他ユーザーへの反映が簡単にできるので便利だなと思いました。
　まだCodeCommitを使用した運用の経験が浅いので、もっと良い方法があれ取り入れて、カスタマイズしていけたらなと思います。
　

### 参考資料
　・[AWS CodeCommit のブランチに対するプッシュとマージの制限 - AWS CodeCommit](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-conditional-branch.html)（最終閲覧日：2022年1月18日）
　・[CodeCommit アクセス許可リファレンス - AWS CodeCommit](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/auth-and-access-control-permissions-reference.html)（最終閲覧日：2022年1月18日）