CodeBuildプロジェクトをコード化する時のServiceRoleのハマりポイント
CodeBuild
の小ネタです。普段は Terraform を使って、インフラのコード化を行っています。
今回、 CodeBuild
をコード化するに当たって発生した困ったことの共有をします。
複数のCodeBuildプロジェクトでService Roleを共有したい
これが、そもそものモチベーションでした。目的は、下図のような CodeBuild
プロジェクトたちの Terraform を使ったプロビジョニングです。
複数の CodeBuild
プロジェクトを作成するにあたり、 ServiceRole
を個別に作成するのが面倒なので、共有してしまおう、
と考えたのです。
Service Roleのポリシーが勝手に増えている?
CodeBuild
プロジェクトたちをプロビジョニングした後、コンソールから CodeBuild
の設定を確認していた、その時です。
Cannot exceed quota for PoliciesPerRole: 10
エラーメッセージが表示されました。
CodeBuild
に適用している ServiceRole
を確認してみると、
自分が Terraform で指定していない多くのポリシーがアタッチされていることがわかりました。
実は、 CodeBuildプロジェクト作成時に CodeBuildが自動でポリシーを生成し、ServiceRoleに対してアタッチしている のです。
ServiceRole
を共有化していたことによって、作成されたCodeBuildプロジェクトの数ぶんのポリシーがアタッチされ、上限に達した というのです。
解決策
案1:CodeBuild作成時にロールの編集を許可しない
1つ目は CodeBuild
生成時にAWS側から CodeBuild
の ServiceRole
の編集を許可しない設定を行うことです。
AWSコンソール上から、「Allow AWS CodeBuild to modify this service role so it can be used with this build project」 の チェックを外すことで、不要なポリシーのアタッチを防ぐことができます。
しかし、これは CodeBuild
プロジェクトを手動で新規作成した場合にのみ設定可能なオプションなのです(2018/10現在) 。つまり、 Terraformでのプロビジョニングを諦める ことを意味します。
案2: アタッチ可能なポリシーの上限数を増やす
2つ目は、アタッチ可能なポリシー数の上限緩和申請をAWSのサポートセンターから行うことです。
[IAM Group and Users] から [Policies per Role] を選ぶことで上限緩和申請ができます。
根本的な解決策ではありませんが、現実的な落とし所だと思います。
まとめ
Terraform で CodeBuild
プロジェクトをプロビジョニングするときには、
ServiceRole
に対して、自動生成されたポリシーがアタッチされることに注意が必要です。
ポリシー適用の上限エラーを回避するためには、
ServiceRole
への編集許可を与えずに、AWSコンソール上からCodeBuild
プロジェクトを 手動で新規作成する- ポリシーが自動適用されても問題ないくらいの
Policies per Role
を、サポートセンターにて上限緩和申請する
という感じです。