AWS
IAM
CodeBuild

awsで "The policy is attached to 0 entities but it must be attached to a single role" エラーが出た場合の対処法

はじめに

awsのCodeBuildでビルドプロジェクトを作成しようとしたときに、以下のエラーが出てプロジェクトが作成できないという現象に遭遇しました。
"The policy is attached to 0 entities but it must be attached to a single role"

スクリーンショット 2019-01-08 13.46.47.png

本エラーの発生手順と解決策について以下にまとめます。

結論

本エラーはCodebuild(awsサービス)が自動的に作成し、指定したIAMロールにアタッチしようとしているポリシーA(CodeBuildBasePolicy-プロジェクト名-リージョン名)と同一のポリシーA'が既に存在*しており、かつ、当該IAMロールからポリシーA'がデタッチされていると発生します。

* 過去に同一のプロジェクト名でCodeBuildプロジェクトを作成している場合に存在する

ポリシーA'(CodeBuildBasePolicy-プロジェクト名-リージョン名)を削除すれば、エラーは発生しなくなります。

エラーが出る時

以下の手順で本エラーが発生します(2019/01/08現在)。

1. Codebuildでプロジェクトを作成する(例としてプロジェクト名を"testproject"とする)

※「AWS CodeBuild にこのサービスロールの編集を許可し、このビルドプロジェクトでの使用を可能にする」にチェックを入れて作成する

スクリーンショット 2019-01-08 14.04.34.png

2. 作成したtestprojectを削除する
3. testproject作成時に指定したロール(ここではRoleForCodeBuild)から、testproject作成時にCodeBuildが自動的に作成・アタッチしたポリシーをデタッチする

スクリーンショット 2019-01-08 13.45.52.png

4.CodeBuildプロジェクト作成画面を開きさきほどと同じ名前(testproject)を入力して、作成しようとする (「AWS CodeBuild にこのサービスロールの編集を許可し、このビルドプロジェクトでの使用を可能にする」にチェックを入れる)

「ビルドプロジェクトを作成する」を押すと本エラーが発生します。

エラーの原因

CodeBuildが自動的に作成して、ユーザが指定したロールにアタッチしようとしているポリシーが既に存在し、かつ、それが指定したロールからデタッチされているため、です。

以下のようなケースで起こりうると思います。

CodeBuildプロジェクトを削除しても、その時にCodeBuildが自動的に作成したポリシーは残ります。既存のロールに既に不要なポリシーが残っている(アタッチされている)のは気持ち悪いためロールの管理画面で×ボタンを押してデタッチします。その後、忘れた頃にまたCodeBuildでプロジェクト作るときに、たまたま以前と同じ名前でプロジェクトを作成すると、本エラーが発生します。

エラーの解決策

CodeBuildが自動的に作成したポリシーを削除する。

スクリーンショット 2019-01-08 13.53.04.png

CodeBuildが自動的に作成したポリシーであり、かつ、プロジェクトごとに作成されるポリシーのため、以前に作成されたCodeBuildBasePolicy-xxxポリシーは削除して問題ない。

まとめ

"The policy is attached to 0 entities but it must be attached to a single role"エラーが発生する条件とその解決方法をまとめました。