AWS CloudFormation のアクセス許可エラーを解決したいです。
簡単な説明
スタックを起動すると、CloudFormation はスタックを起動したユーザーの認証情報を引き継いで API 呼び出しを行います。スタックにサービスロールが定義されている場合、CloudFormation がこのロールを引き継ぎます。引き受けたユーザーまたはサービスロールでは、CloudFormation が実行できる許可アクションが一部に限定される場合があります。ロールにリソースを作成、削除、または更新するためのアクセス許可がない場合、操作は失敗します。この問題により、次の種類のエラーメッセージが生成されます。
User: [IAM Role] is not authorized to perform: ec2:RunInstances on resource: [Resource Id] because no identity-based policy allows the ec2:RunInstances action
解決策
次のセクションでは、ID ベースおよびリソースベースのポリシーエラーをトラブルシューティングする方法について説明します。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
ID ベースのポリシーに関するエラー
呼び出しを行っているロールを特定する
CloudFormation では、ユーザーに代わってスタック内のリソースを呼び出すサービスロールを指定できます。サービスロールが指定されていない場合、CloudFormation はスタック操作を開始したユーザーの AWS Identity and Access Management (IAM) 認証情報を使用して呼び出しを行います。
AWS CloudFormation コンソールでサービスロールを検索します。
- AWS CloudFormation コンソールを開きます。
- [スタック] ページでスタックを選択します。すると、ページの [概要] セクションが開きます。
- [IAM ロール] の値を確認します。表示される値が、このスタックに設定されているサービスロールです。
値がない場合、サービスロールは設定されていません。代わりに、すべてのスタック操作は、スタック操作を開始したロールの認証情報を使用して実行されたことを示しています。
サービスロールを特定するには、AWS CLI コマンド describe-stacks を使用して RoleARN の値を見つけます。このフィールドが空の場合、サービスロールは定義されていません。CloudFormation はスタックの起動で使用したロールを使用します。
不足しているアクセス許可を追加する
CloudFormation から返されたエラーメッセージで、不足しているアクセス許可を正確に把握します。または、AWS CloudTrail でアクセス許可エラーを検索し、拒否された API アクションを確認します。エラーの生成と同時に発生したイベントを検索するのがベストプラクティスです。次に、このエラーを解決するために以下の手順を実行します。
- 不足しているアクセス許可を、ロールに関連付けられている IAM ポリシーに追加します。または、必要なアクセス許可を持つサービスロールを使用するように切り替えます。
- IAM ロールにアタッチされたポリシーに、アクションを追加します。または、新しいポリシーを作成します。
注: ロールに IAM ポリシーシミュレーターを使用すると、テンプレートに定義されているリソースを起動するためのアクセス許可があることを確認できます。
リソースベースのポリシーに関するエラー
ロールに ID ベースのアクセス許可があっても、アクセスされたリソースでは、そのロールがリソースベースのポリシーではアクセス許可を変更できない場合があります。AWS Key Management Service (AWS KMS) キーや Amazon Simple Storage (Amazon S3) バケットなどのリソースは、リソースベースのポリシーを使用します。結果的に、次に示すようなエラーが発生します。
User: [IAM Role] is not authorized to perform: ec2:RunInstances on resource: [Resource Id] because no resource-based policy allows the ec2:RunInstances action
このエラーを解決するには、以下の手順を実行します。
呼び出しを行っているロールを特定する
- AWS CloudFormation コンソールを開きます。
- [スタック] ページでスタックを選択する
- ページの [概要] セクションで、[IAM ロール] の値を確認します。IAM ロールの値が、このスタックに設定されているサービスロールです。
値がない場合、サービスロールは設定されていません。代わりに、すべてのスタック操作は、スタック操作を開始したエンティティの認証情報を使用して実行されたことを示しています。
サービスロールを特定するには、AWS CLI コマンド describe-stacks を使用して RoleARN の値を見つけます。このフィールドが空の場合、サービスロールは定義されていません。CloudFormation はスタックの起動で使用したロールを使用します。
リソースベースのポリシーを更新する
- エラーを確認して、アクセスできないリソースの Amazon リソースネーム (ARN) を取得します。エラーにリソースの ARN が表示されていない場合は、関連する CloudTrail イベントログを検索して、リクエストで渡されたリソースを確認します。
- 認証エラーを参考に、リソースの変更に必要なアクセス許可を判断します。
- リソースのポリシーを確認し、ポリシーに呼び出しロールを追加します。または、IAM ロールがリソースに対してアクションを実行できるようにするのに必要なステートメントを追加します。
たとえば、Decrypt KMS API を実行すると、次のエラーが表示される場合があります。
"User: arn:aws:sts::12345678910:assumed-role/AWSServiceRoleForConfig/LambdaDescribeHandlerSession is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:eu-west-1:12345678910:key/********-****-****-****-************ because no resource-based policy allows the kms:Decrypt action"
このエラーメッセージは、AWS KMS キーのポリシーでは、IAM ロール AWSServiceRoleForConfig が kms:Decrypt アクションにアクセスできないことを示しています。KMS ポリシーを更新し、IAM ロールにこのアクションへのアクセス許可を付与します。
関連情報
AWS Identity and Access Management によるアクセス制御