はじめに
awsのCodeBuildでビルドプロジェクトを作成しようとしたときに、以下のエラーが出てプロジェクトが作成できないという現象に遭遇しました。
"The policy is attached to 0 entities but it must be attached to a single role"
本エラーの発生手順と解決策について以下にまとめます。
結論
本エラーはCodebuild(awsサービス)が自動的に作成し、指定したIAMロールにアタッチしようとしているポリシーA(CodeBuildBasePolicy-プロジェクト名-リージョン名)と同一のポリシーA'が既に存在*しており、かつ、当該IAMロールからポリシーA'がデタッチされていると発生します。
* 過去に同一のプロジェクト名でCodeBuildプロジェクトを作成している場合に存在する
ポリシーA'(CodeBuildBasePolicy-プロジェクト名-リージョン名)を削除すれば、エラーは発生しなくなります。
エラーが出る時
以下の手順で本エラーが発生します(2019/01/08現在)。
1. Codebuildでプロジェクトを作成する(例としてプロジェクト名を"testproject"とする)
※「AWS CodeBuild にこのサービスロールの編集を許可し、このビルドプロジェクトでの使用を可能にする」にチェックを入れて作成する
2. 作成したtestprojectを削除する
3. testproject作成時に指定したロール(ここではRoleForCodeBuild)から、testproject作成時にCodeBuildが自動的に作成・アタッチしたポリシーをデタッチする
4.CodeBuildプロジェクト作成画面を開きさきほどと同じ名前(testproject)を入力して、作成しようとする (「AWS CodeBuild にこのサービスロールの編集を許可し、このビルドプロジェクトでの使用を可能にする」にチェックを入れる)
「ビルドプロジェクトを作成する」を押すと本エラーが発生します。
エラーの原因
CodeBuildが自動的に作成して、ユーザが指定したロールにアタッチしようとしているポリシーが既に存在し、かつ、それが指定したロールからデタッチされているため、です。
以下のようなケースで起こりうると思います。
CodeBuildプロジェクトを削除しても、その時にCodeBuildが自動的に作成したポリシーは残ります。既存のロールに既に不要なポリシーが残っている(アタッチされている)のは気持ち悪いためロールの管理画面で×ボタンを押してデタッチします。その後、忘れた頃にまたCodeBuildでプロジェクト作るときに、たまたま以前と同じ名前でプロジェクトを作成すると、本エラーが発生します。
エラーの解決策
CodeBuildが自動的に作成したポリシーを削除する。
CodeBuildが自動的に作成したポリシーであり、かつ、プロジェクトごとに作成されるポリシーのため、以前に作成されたCodeBuildBasePolicy-xxxポリシーは削除して問題ない。
まとめ
"The policy is attached to 0 entities but it must be attached to a single role"エラーが発生する条件とその解決方法をまとめました。