CodeCommit上のリポジトリでmasterブランチへのプッシュを禁止してみる

どうも!大阪オフィスの西村祐二です。

ソースコードをGitで管理するとき、pull requestベースで運用することが多いのではないでしょうか。

そんなとき、リモートのmasterブランチには直接pushして欲しくないと思います。間違ってpushしたとしてもサーバ側で拒否してほしいですよね。

CodeCommitではIAMを使うことによって簡単に制限することができます。

今回はその方法について記載します。

どうやって制限するのか

IAMポリシーを使って制限します。

プッシュ以外にも、プルリクエストを制限したり、ファイルのアップデートを禁止させたいすることができます。 また、ポリシーで条件ステートメントを使用し、条件が満たされている場合にのみ Deny ステートメントを適用することができます。

AWS CodeCommit のアクセス権限のリファレンス

ブランチへのプッシュを制限するためのIAMポリシーを作成する

CodeCommit上のリポジトリでmasterブランチへのプッシュを禁止するために、IAMポリシーを使って制限します。

そのポリシーをマネージメントコンソールから作成します。

▼ポリシー作成をクリックします。

▼jsonタブをクリックします。

▼下記ポリシーを貼り付けて次へ

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "codecommit:GitPush"
      ],
      "Resource": "*",
      "Condition": {
        "StringEqualsIfExists": {
          "codecommit:References": [
            "refs/heads/master"
          ]
        },
        "Null": {
          "codecommit:References": false
        }
      }
    }
  ]
}
  • プッシュだけじゃなくプルリクエストのマージも禁止したいときは"codecommit:MergePullRequestByFastForward"をActionのところに追加すると制限することができます。

AWS CodeCommit のアクセス権限のリファレンス

  • あるリポジトリのみ制限したい場合はResourceにARN(arn:aws:codecommit:<region>:<account id>:<repo name>)を設定することで実現できます。

  • masterブランチだけじゃなく、prodブランチも禁止させたい場合は、masterブランチの下に"refs/heads/prod"を追加することで合わせて制限することができます。

▼名前を「deny-push-master-branch」としてポリシー作成します。

ポリシーの作成は完了です。

IAMポリシーを適用する

ブランチへのプッシュを制限するポリシーを作成しましたが、そのポリシーをIAMユーザー、グループ、またはロールに適用するまで効果がありません。

グループで管理する方法と、直接アタッチする方法の2つのパターンをご紹介します。どちらかの方法で設定してください。

パターン1:IAMグループを作成しIAMポリシーを紐づけ、ユーザを追加する

▼グループを作成します。

▼グループ名「codecommit」として作成します。

▼作成したポリシーを指定します。

▼グループにユーザを追加します。

▼masterブランチへのプッシュを禁止させたいユーザを選びます。

これで設定完了です。

パターン2:IAMユーザに直接IAMポリシーをアタッチする

▼ポリシーアクションから「アタッチ」を選択します。

▼masterブランチへのプッシュを禁止させたいユーザを選びます。

これで設定完了です。

動作確認

実際にmasterブランチにpushしてみましょう。

$ git push origin master --force
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 237 bytes | 237.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
 ! [remote rejected] master -> master (You don't have permission to push changes to this branch.)
error: failed to push some refs to 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test'

想定通り、rejectedされていることがわかります。

さいごに

いかがだったでしょうか。

IAMポリシーを使って、CodeCommit上のリポジトリでmasterブランチへのプッシュを禁止してみました。

Githubのように高機能ではないですが、必要最低限の機能は揃っていると思いますので、CodeCommitを使ってみてはいかがでしょうか。

誰かの参考になれば幸いです。