はじめに
CloudFormationについて、
- CodeDeployでデプロイするときは、CloudFormation用のロールを指定している
- 一方で、コンソールから直接実行したときは、ロールを指定しなくても各種リソースを作成できた
ということがあり、疑問に思いました。これって、どういう違いなんでしょうか?
この記事では、その「ロールが必要になるケースとならないケースの違い」を明確に整理します。
CloudFormationの権限使用パターンは2つある
CloudFormationがAWSリソースを作成・更新する際、2つの権限パターンがあります。
| ケース | ロール指定 | CloudFormationが使う権限な利用シーン |
|---|---|---|
| デフォルト(指定なし) | スタックを作成したIAMユーザーまたはAssumed Roleの権限 | コンソールやCLIから直接作成する場合 |
| サービスロールを使用(指定あり) | 指定したIAMロールの権限 | CodePipelineやCodeDeployなど、他サービス経由の場合 |
【デフォルト】コンソールやCLIでの動作:ユーザー権限を使用
CloudFormationをコンソールから直接作成した場合(コンソールでサービスロールを指定しなかった場合)、
実行ユーザーのIAM権限が代わりに使われます。
つまり:
ユーザーが、S3やEC2を作成できる権限を持っていればOK ということです。
- 参考:AWS公式ドキュメントより
If you don’t specify a service role, AWS CloudFormation uses the credentials of the user who is creating the stack.
【サービスロールを使用】 CodeDeploy経由での実行:サービスロールが必要
CodePipelineやCodeDeployのようなサービスからCloudFormationを呼び出す場合は話が変わります。
これらのサービスはCloudFormationがリソースを直接操作する権限を持たないためです。
このため、CloudFormationが自分でリソースを作成するための サービスロール を指定する必要があります。
↑ CodPpipeline作成時、ユーザーに代わってCloudFormationがリソースを作成するための許可の記載を求められる。
まとめ
-
CloudFormationは サービスロール を明示しない場合、呼び出し元のIAMユーザー権限を使う
-
しかしCodePipelineやCodeDeployなど、他サービスが代わりに実行する場合はCloudFormation専用のサービスロールが必須
