2020/10/19

AWS CodeCommit+IAMカスタムポリシーでGitのmasterブランチpushを制限する

この記事ではCodeCommitでIAMカスタムポリシーを使用して該当するIAMユーザーがmasterブランチへのpushを制限する方法を解説していきます。普段はGithub等の別のバージョン管理サービスを使用しているけど、AWS上でGit管理したいという方、Gitでmasterブランチへのpush制限を簡単に実施する方法を探している方、AWS認定試験を受けようとしている方必見です!

CodeCommitを使用した経験がないという方やCodeCommit上にまだリポジトリを作成していないという方はこちらの記事もご覧ください!

masterブランチは本番へデプロイする時のみ使用するブランチとして使用し、普段は別ブランチを切って、実装・テスト後にmasterブランチにマージするという手段を取っている人は多いと思います。場合によってはmasterブランチがprodブランチになったり、、、などなど。とにかく本番環境にリリースするブランチに直接pushして開発を進めるということは避けたいはず!

CodeCommitならCodeCommitを使用するIAMにカスタムポリシーをアタッチすることで、簡単にmasterブランチへのpushが制限できます。

開発者用IAMグループを作成する

まずはカスタムポリシーを作成する前に開発者用のIAMグループを作成します。IAMのコンソール画面にいき、サブメニューから「グループ」を選択し、「新しいグループの作成」ボタンをクリックします。

新しいIAMグループの作成

任意のIAMグループ名を入力します。今回は「developer」とします。入力したら「次のステップ」ボタンをクリックします。

IAMグループ名入力

ポリシーのアタッチ画面が表示されるのですが、一旦何も設定は必要ないので、「次のステップ」ボタンをクリックします。

ポリシーアタッチ

確認画面に遷移するので、内容を確認して問題なさそうなら「グループの作成」ボタンをクリックします。

IAMグループ作成

「developer」IAMグループができました。

IAMグループにカスタムポリシーを追加

IAMグループにカスタムポリシーを追加します。

IAMグループ一覧画面から、先ほど作成した「developer」を選択し、各IAMグループの詳細に関して表示します。

IAMグループ詳細

「アクセス許可」タブをクリックしてアクティブにしましょう。インラインポリシーのプルダウンメニューを開き、「作成するには、ここをクリックしてください。」と記載されている部分のリンクをクリックします。

IAMグループ アクセス許可

アクセス許可の設定方法が表示されるので、「カスタムポリシー」を選択した状態で、「選択」ボタンをクリックします。

カスタムポリシー選択

カスタムポリシーを設定する画面が現れました。まずポリシー名を任意の値で入力してください。今回は「CannotPushToMasterInCodeCommit」とします。

カスタムポリシー設定画面

次にポリシードキュメントを入力していきます。

AWS CodeCommitのユーザーガイドに設定例が記載されているので、その例を参考に記載していきます(ほぼそのままです)。

ユーザーガイドにはResourceが以下のように特定リポジトリに指定されていますが、

"Resource": "`arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo`",

今回は全てのリポジトリのmasterブランチpushを制限しようと思います。

AWS アカウントのすべてのリポジトリ内の master という名前のすべてのブランチに適用されるポリシーを作成するには、Resource の値をリポジトリ ARN からアスタリスク (*) に変更します。

参照 : AWS CodeCommitのブランチへのプッシュとマージを制限

ユーザーガイド内にアスタリスク(*)を使用してResourceを記載してねとあるので、以下のように記載していきます。

"Resource": "arn:aws:codecommit:*:*:*",

また、「codecommit:References」はmasterへのGit push制限対象のブランチです。今回「prod」ブランチは作成していないので削除します。

 "StringEqualsIfExists": {
      "codecommit:References": [
          "refs/heads/master", 
       ]
  }

最終的に自分は以下のように設定しました。

{
    "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:*:*:*",
            "Condition": {
                "StringEqualsIfExists": {
                    "codecommit:References": [
                        "refs/heads/master"
                     ]
                },
                "Null": {
                    "codecommit:References": false
                }
            }
        }
    ]
}

ポリシードキュメントのテキストエリアに上記コードを貼り付け、「ポリシーの適用」ボタンをクリックしてください。

ポリシー適用完了後、再度IAMグループ一覧から、developerグループを選択し、「アクセス許可」タブをアクティブにすると、インラインポリシーに先ほど追加したカスタムポリシーが追加されていることが分かります。

ポリシー適用完了

IAMユーザーを作成したグループに割り当てる

IAMユーザーを作成したIAMグループに割り当て、該当のIAMユーザーでmasterブランチにむけたpushができないようにします。

IAMユーザー一覧から該当のユーザーを選択します。

該当のユーザーの詳細画面に遷移後、「グループ」タブをアクティブにし、「ユーザーをグループに追加」ボタンをクリックしてください。

IAMユーザーグループ割り当て

先ほどカスタムポリシーを設定したグループ(今回はdeveloper)を選択し、「グループに追加」ボタンをクリックします。

ユーザーをグループに追加

無事追加されました。

IAMグループ追加完了

動作確認

masterブランチへのpushを制限されたIAMユーザーを使用してmasterブランチ上でgit pushしてみましょう。

「rejected」とエラーが表示され、pushができませんでした。

うまく設定できていますね!

git push失敗

別ブランチ(今回はnew-featureブランチ)を作成してそこでpushしてみます。

new-featureブランチ

pushが成功しましたね!!!

new-featureブランチ 成功

CodeCommitコンソール画面でも「new-feature」ブランチが確認できました。

CodeCommitコンソール

まとめ

いかがでしたでしょうか?

IAMカスタムポリシーを設定すれば簡単にmasterブランチ(本番環境で使用するブランチ)へのpushを防ぐことができます。普段は開発用のブランチを使用して開発を実施し、本番環境にリリースする時に開発用ブランチを本番用ブランチにマージすれば事故も防げそうですね。

IAMで設定できるので、開発者用に他のAWSサービスの操作と合わせてカスタムポリシーを設定することもできそうなので、クラウドでAWSを使用している人はいっそのことバージョン管理ツールもCodeCommitに移行してAWSで統一してしまうことも一つの手かもしれません。