CodeCommitで「ブランチの条件付きポリシー」を設定し適用範囲を確認しました

2020.12.14

いわさです。

CodeCommitを使ってGitHubのブランチ保護相当の設定を行うシーンがありましたので手順・確認結果を記します。
masterブランチ・developブランチでのプッシュと削除を制限し、プルリクエストでのみ更新する運用を想定しています。

CodeCommitでは、これを「ブランチの条件付きポリシー」を設定することで実現します。

リポジトリの作成

マネジメントコンソール、CodeCommit内のメニューから「リポジトリを作成」を押下しリポジトリを作成します。
その後任意のファイルをアップロードし、ブランチメニューからdevelopブランチを作成します。

デフォルト管理ポリシーの挙動確認

ローカルgitクライアントでプルを行うため、認証用のユーザーを作成します。
この記事内では、masOS + gitクライアントを使い、HTTPS通信で使用します。

IAMユーザー作成

マネジメントコンソール、IAMより任意のユーザーを作成して、管理ポリシー「AWSCodeCommitPowerUser」をアタッチします。

直接プッシュ

今回はgitクライアントからHTTPSで接続します。
IAMの "ユーザー" -> "認証情報タブ" -> "AWS CodeCommit の HTTPS Git 認証情報" より 認証情報を生成します。

マネジメントコンソールのリポジトリ設定より HTTPS用の接続先を取得します。

git clone <HTTPS接続先>
git checkout develop

クローン後、ファイルを編集し、変更のコミット&プッシュをします。

git add .
git commit -m "add develop branch."
git push

マネジメントコンソール上に反映されていることを確認しました。
この時点ではdevelopブランチへの直接プッシュが可能です。

条件付きポリシーの設定・動作確認

リモートブランチへの操作の制限を行います。

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

今回はビジュアルエディターで設定してみました。

設定項目
サービス CodeCommit
モード 拒否モード
アクション GitPush, DeleteBranch
リポジトリARN 作成したリポジトリのもの

リポジトリARNはCodeCommitの各リポジトリの設定画面で確認できます。

ひとつ注意点があって、以下を参考にNullステートメントを追加してください。

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-conditional-branch.html

Git のブランチは、ヘッドコミットの SHA-1 値へのポインタ (リファレンス) です。そのため、条件では References が使用されます。効果が Deny で、GitPush がアクションの 1 つであるポリシーでは、Null ステートメントが必要です。これは、ローカルリポジトリから CodeCommit に変更をプッシュするときに、Git と git-receive-pack がどのように動作するかによって必要となります。

Nullステートメントがない場合、プッシュ時に全てのブランチで認証エラーが起きるようになります。

iwasa.takahito@HL00780 repo_iwasa % git push
fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa/': The requested URL returned error: 403

ポリシーを作成後、IAMユーザー(orグループ)へアタッチします。

リモートブランチを削除してみます。

削除に失敗することが確認出来ました。

次に、gitクライアントからdevelopブランチへプッシュしてみます。

iwasa.takahito@HL00780 repo_iwasa % git push
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 532 bytes | 532.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa
 ! [remote rejected] develop -> develop (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/repo_iwasa'

直接プッシュに失敗することが確認出来ました。

featureブランチのプッシュと、プルリクエストの動作確認

リモートブランチの直接更新・削除が出来ないことが確認できたので、featureブランチからプルリクエストで更新出来ることを確認します。

まず、リモートブランチを作成します。

ローカルでチェックアウトします。

iwasa.takahito@HL00780 repo_iwasa % git fetch --prune
From https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa
 * [new branch]      feature/add_readme -> origin/feature/add_readme
iwasa.takahito@HL00780 repo_iwasa % git branch -r
   origin/develop
   origin/feature/add_readme
   origin/master
iwasa.takahito@HL00780 repo_iwasa % git checkout feature/add_readme
Branch 'feature/add_readme' set up to track remote branch 'feature/add_readme' from 'origin'.
Switched to a new branch 'feature/add_readme'

編集してプッシュすると成功します。 featureブランチではリモートプッシュできることを確認出来ました。

iwasa.takahito@HL00780 repo_iwasa % vi README.md
iwasa.takahito@HL00780 repo_iwasa % git add .
iwasa.takahito@HL00780 repo_iwasa % git commit -m "push feature branch"
[feature/add_readme bc92621] push feature branch
 1 file changed, 1 insertion(+)
iwasa.takahito@HL00780 repo_iwasa % git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 283 bytes | 283.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa
    2a8d334..bc92621  feature/add_readme -> feature/add_readme

featureブランチからdevelopブランチへのプルリクエストを作成し、マージしてみます。

マージに成功しました。

developブランチからmasterブランチへのプルリクエストを作成し、マージしてみます。

マージ後のブランチ自動削除オプションを有効した場合、失敗します。

削除オプションを無効化すると今度は成功しました。

これで期待どおり、featureでの変更内容がmasterまで反映されました。

タグ作成の確認

ブランチの直接プッシュは出来ませんでした。
最後に、タグ付けが出来るか確認してみます。

iwasa.takahito@HL00780 repo_iwasa % git checkout develop
iwasa.takahito@HL00780 repo_iwasa % git tag hoge-tag
iwasa.takahito@HL00780 repo_iwasa % git push origin --tags
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 532 bytes | 532.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/repo_iwasa
 * [new tag]         hoge-tag -> hoge-tag

タグ作成が出来ていることを確認しました。

最後に

他にも様々な項目の制御が可能です。
以下のリファレンスを参照してください。

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/auth-and-access-control-permissions-reference.html