AWS CodeCommit のブランチに対するプッシュとマージの制限 - AWS CodeCommit

AWS CodeCommit のブランチに対するプッシュとマージの制限

デフォルトでは、リポジトリにコードをプッシュするための十分な権限を持つ CodeCommit リポジトリユーザーは、そのリポジトリ内のブランチに貢献できます。これは、リポジトリにブランチをコンソール、コマンドライン、または Git を使用して追加した場合でも当てはまります。ただし、一部のリポジトリユーザーだけがそのブランチにコードをプッシュまたはマージできるように、ブランチを設定することもできます。たとえば、シニア開発者のサブセットのみが変更をそのブランチにプッシュまたはマージできるように、実動コードに使用されるブランチを設定することができます。他の開発者は、依然としてブランチから引き出し、独自のブランチを作成して、プルリクエストを作成できますが、そのブランチに変更をプッシュまたはマージすることはできません。IAM の 1 つ以上のブランチのコンテキストキーを使用する条件付きポリシーを作成して、このアクセスを設定できます。

注記

このトピックのいくつかの手順を完了するには、IAM ポリシーを設定して適用するのに十分なアクセス権限を持つ管理者ユーザーでサインインする必要があります。詳細については、「IAM 管理者のユーザーおよびグループの作成」を参照してください。

ブランチに対するプッシュとマージを制限するための IAM ポリシーの設定

IAM にポリシーを作成すると、ユーザーがブランチにコミットをプッシュしたり、プルリクエストをブランチにマージするなど、ブランチを更新できないようにすることができます。これを行うには、条件が満たされている場合にのみ Deny ステートメントの効果が適用されるように、ポリシーで条件ステートメントを使用します。Deny ステートメントに含める API によって、どのアクションが許可されないかが決まります。このポリシーは、リポジトリ内の 1 つのブランチ、リポジトリ内のいくつかのブランチ、および AWS アカウント内のすべてのリポジトリの基準に一致するすべてのブランチにのみ適用するように設定できます。

ブランチの条件付きポリシーを作成するには

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

  2. ナビゲーションペインで、[Policies] を選択します。

  3. [Create policy] を選択します。

  4. [JSON] を選択し、以下のポリシー例を貼り付けます。Resource の値を、アクセスを制限するブランチを含むリポジトリの ARN に置き換えます。codecommit:References の値を、アクセスを制限したいブランチへの参照に置き換えます。例えば、このポリシーは、コミットのプッシュ、ブランチのマージ、プルリクエストのマージ、および 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" } } } ] }

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

    ヒント

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

  5. [ポリシーの確認] を選択します。ポリシーステートメントのエラーを修正し、[ポリシーの作成] に進みます。

  6. JSON が検証されると、[ポリシーの作成] ページが表示されます。[概要] セクションに、このポリシーによってアクセス許可が付与されないことを示す警告が表示されます。これは通常の動作です。

    • [Name] (名前) に、このポリシーの名前 (例: DenyChangesToMain) を入力します。

    • [説明] に、ポリシーの目的の説明を入力します。これはオプションですが推奨されます。

    • [Create policy] を選択します。

IAM グループまたはロールに IAM ポリシーを適用する

ブランチへのプッシュとマージを制限するポリシーを作成しましたが、そのポリシーは IAM ユーザー、グループ、またはロールに適用するまで効果がありません。ベストプラクティスとして、IAM グループまたはロールにポリシーを適用することを検討してください。個々のユーザーと IAM ユーザーにポリシーを適用しても、うまくスケールされません。

条件付きポリシーをグループまたはロールに適用するには

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

  2. ポリシーを IAM グループに適用する場合は、ナビゲーションペインで [グループ] を選択し、ユーザーが引き受けるロールにこのポリシーを適用する場合は、[ロール] を選択します。グループまたはロールの名前を選択します。

  3. [Permissions] タブで [Attach Policy] を選択します。

  4. 作成した条件付きポリシーをポリシーのリストから選択し、[ポリシーのアタッチ] を選択します。

詳細については、「IAM ポリシーをアタッチおよびデタッチする」を参照してください。

ポリシーのテスト

グループまたはロールに適用したポリシーの効果をテストして、期待どおりに機能するようにする必要があります。その方法は数多くありますたとえば、上記のようなポリシーをテストするには、以下のようにします。

  • CodeCommit コンソールに、ポリシーが適用されている IAM グループのメンバーである IAM ユーザー、またはポリシーが適用されているロールを持つユーザーとしてサインインします。コンソールで、制限が適用されるブランチにファイルを追加します。そのブランチにファイルを保存またはアップロードしようとすると、エラーメッセージが表示されます。ファイルを別のブランチに追加します。これで、オペレーションが成功します。

  • CodeCommit コンソールに、ポリシーが適用されている IAM グループのメンバーである IAM ユーザー、またはポリシーが適用されているロールを持つユーザーとしてサインインします。制限が適用されるブランチにマージするプルリクエストを作成します。プルリクエストを作成できるはずですが、マージしようとするとエラーが発生します。

  • ターミナルまたはコマンドラインから、制限が適用されるブランチでコミットを作成し、そのコミットを CodeCommit リポジトリにプッシュします。エラーメッセージが表示されます。他のブランチからのコミットとプッシュはいつものように動作するはずです。