はじめに
mainブランチへの誤ったpush対策としてpre-pushファイルを使用した対策を行っていました。
GitのリポジトリをCodeCommitで運用することになり、同じような対策をIAMポリシーを使用し行ったので、その設定方法を記事にしたいと思います。
本記事でやったこと
IAMポリシーを使用しCodeCommitに下記、制限を設定する。
- mainブランチへpushを禁止。
- mainブランチへのマージをプルリクエストからに制限。
手順
※AWS CodeCommit のブランチに対するプッシュとマージの制限を参考に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 ポリシーを適用
こちらを参考にIAMユーザーへ設定を反映させる。
設定内容
アクセス制限の設定
"Action"
キーにアクセスを制限したい操作を記載することで、アクセス拒否の設定ができます。
今回、プルリクエストは許可したかったので関連する値を除外しました。
※設定できる項目についてはCodeCommit アクセス許可リファレンスから確認できます。
"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を拒否できました。
プルリクエストからのマージ
AWSコンソールのプルリクエストの作成から、mainへのマージができました。
おわりに
pre-pushファイルを使用した対策と比べて、他ユーザーへの反映が簡単にできるので便利だなと思いました。
まだCodeCommitを使用した運用の経験が浅いので、もっと良い方法があれ取り入れて、カスタマイズしていけたらなと思います。
参考資料
・AWS CodeCommit のブランチに対するプッシュとマージの制限 - AWS CodeCommit(最終閲覧日:2022年1月18日)
・CodeCommit アクセス許可リファレンス - AWS CodeCommit(最終閲覧日:2022年1月18日)