IAM ポリシーで、アクセス拒否または操作が許可されていないことを示すエラーをトラブルシューティングする方法を教えてください。
AWS リソースでアクションを実行しようとすると、「アクセスが拒否されました」または「操作が許可されていません」というエラーが表示されます。
簡単な説明
AWS ID と Identity and Access Management (IAM) ポリシーの問題をトラブルシューティングするには:
- API 呼び出し元を特定する
- IAM ポリシーのアクセス許可を確認する
- サービスコントロールポリシー (SCP) を評価する
- アイデンティティベースのポリシーとリソースベースのポリシーを見直す
- アクセス許可の境界をチェックする
- セッションポリシーを評価する
- ポリシー内の条件キーが API でサポートされていることを確認する
- IAM ポリシーのエラーとトラブルシューティングの例を確認する
解決策
API 呼び出し元を特定し、エラーメッセージの内容を理解する
重要:
- 始める前に、AWS コマンドラインインターフェイス (AWS CLI) がインストールされ、設定されていることを確認してください。
- AWS CLI コマンドの実行時にエラーが発生した場合は、使用している AWS CLI が最新バージョンであることを確認してください。
IAM ポリシーを見直す前に、正しい IAM エンティティに代わって API コールが行われていることを確認してください。エラーメッセージに呼び出し元情報が含まれていない場合は、次の手順に従って API 呼び出し元を特定してください:
- AWS マネジメントコンソールを開きます。
- ページの右上隅で、アカウント情報の横にある矢印を選択します。
- IAM ロールとしてサインインしている場合、引き受けるロールの名前には「現在アクティブ」、アカウント ID には「アカウント ID」を参照してください。
- フェデレーションユーザーとしてサインインしている場合は、フェデレーションロール名とロールセッション名について「フェデレーションユーザー」を参照してください。
または、
AWS CLI コマンド get-caller-identity で API 呼び出し元を特定します。--debug フラグを指定して AWS CLI コマンドを実行すると、以下のような出力情報を基に、認証情報の送信元を特定することもできます。
2018-03-13 16:23:57,570 - MainThread - botocore.credentials - INFO - Found credentials in shared credentials file: ~/.aws/credentials
IAM ポリシーのアクセス許可を確認する
関連付けられている IAM ポリシーをチェックして、必要なアクセス許可が API 呼び出し元に認められているかどうかを確認します。詳細については、「アカウント内でのリクエストの許可または拒否の決定」を参照してください。
AWS Organizations の SCP を評価する
AWS アカウントが AWS Organizations の一部である場合、階層レベルで SCP を適用してアクションを許可または拒否できます。SCP のアクセス許可は、AWS アカウントのすべての IAM エンティティに継承されます。その API 呼び出し元が SCP で明示的に拒否されていないことを確認してください。
呼び出されている API が、呼び出し元に影響する組織 SCP ポリシーで明示的に拒否されていないことを確認してください。
アイデンティティベースのポリシーと、リソースベースのポリシーを見直す
その API 呼び出し元の IAM エンティティのアイデンティティベースのポリシーに、明示的な許可ステートメントがあることを確認してください。次に、API がリソースレベルのアクセス許可をサポートしていることを確認します。API 呼び出し元がリソースレベルのアクセス許可をサポートしていない場合、IAM ポリシーステートメントのリソース要素にワイルドカード "*" が指定されていることを確認してください。
リソースベースのポリシーを AWS サービス内のリソースに関連付けるとアクセスを提供できます。詳細については、「アイデンティティベースおよびリソースベースのポリシー」を参照してください。
IAM ポリシーの概要を表示するには:
- IAM コンソールを開きます。
- ナビゲーションペインで、[ポリシー] を選択します。
- ポリシー名の横にある矢印を選択して、ポリシー詳細ビューを展開します。
次の例では、すべての Amazon Elastic Compute Cloud (Amazon EC2) API アクションがリソースレベルのアクセス許可をサポートしているわけではないため、このポリシーは機能しません。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "SorryThisIsNotGoingToWorkAsExpected", "Effect": "Allow", "Action": ["ec2:*"], "Resource": "arn:aws:ec2:us-east-1:accountid:instance/*" } ] }
run-instances AWS CLI コマンドを使用して us-east-1 リージョンで Amazon EC2 インスタンスを起動しようとした IAM ユーザーには、次のようなエラーメッセージが表示されます。
"An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message:…"
これを解決するには、リソースをワイルドカード "*" に変更します。これは、Amazon EC2 が部分的なリソースレベルのアクセス許可しかサポートしていないためです。
認証失敗メッセージをデコードして、この失敗の原因の詳細を確認するには、次のような DecodeAuthorizationMessage API アクションを使用します。
$ aws sts decode-authorization-message --encoded-message <encoded-message-from-the-error>
アクセス許可の境界をチェックする
IAM エンティティにアクセス許可の境界が関連付けられている場合、エンティティに与えられる最大のアクセス許可はその境界によって設定されます。
セッションポリシーを評価する
API 呼び出し元が IAM ロールまたはフェデレーションユーザーの場合、そのセッションの間、セッションポリシーが渡されます。セッションのアクセス許可は、セッションの作成に使用される IAM エンティティのアイデンティティベースのポリシーとセッションポリシーの共通部分です。API コールが IAM ポリシーとエンティティにあることを確認してください。
ポリシー内の条件キーが API でサポートされていることを確認する
AWS 条件キーでは、AWS に送信された API リクエストの要素を IAM ポリシーで指定されたキー値と比較できます。条件キーには、グローバル条件キーまたは、AWS サービスによって定義されたものを使用します。AWS のサービス固有の条件キーは、そのサービス内でのみ使用できます (EC2 API アクションの EC2 条件など)。詳細については、「AWS のサービスのアクション、リソース、条件コンテキストキー」を参照してください。
条件要素には複数の条件を含めることができ、各条件ブロック内には複数の key-value ペアを含めることができます。詳細については、「複数のコンテキストキーまたは値による条件」を参照してください。
このポリシー例では、IAM API リクエストが IAM ユーザー admin によって呼び出され、送信元 IP アドレスが 1.1.1.0/24 または 2.2.2.0/24 の場合に、条件要素が一致します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:*", "Resource": "*", "Condition": { "StringEquals": { "aws:username": "admin" }, "IpAddress": { "aws:SourceIp": [ "1.1.1.0/24", "2.2.2.0/24" ] } } } ] }
IAM ポリシーエラーとトラブルシューティング例
次の例で、エラーメッセージ、API 呼び出し元、API、および呼び出されているリソースを確認してください。
エラーメッセージの例 | API 呼び出し元 | API | リソース | いつ |
A: 「An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.」 | 不明 | DescribeInstances | 不明 | エラーの発生時刻 |
B:「An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::123456789012:user/test is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/EC2-FullAccess」 | arn:aws:iam::123456789012:user/test | AssumeRole | arn:aws:iam::123456789012:role/EC2-FullAccess | エラーの発生時刻 |
C:「An error occurred (AccessDenied) when calling the GetSessionToken operation: Cannot call GetSessionToken with session credentials」 | 不明 | GetSessionToken | 不明 | エラーの発生時刻 |
D: 「An error occurred (UnauthorizedOperation) when calling the AssociateIamInstanceProfile operation: You are not authorized to perform this operation.Encoded authorization failure message: ....」 | 不明 | AssociateIamInstanceProfile | 不明 | エラーの発生時刻 |
この評価方法では、さまざまな AWS サービスの権限の問題で発生するエラーメッセージの原因を特定できます。詳細については、以下のエラーメッセージとトラブルシューティングの手順を参照してください。
エラーメッセージ A の例:
このエラーメッセージは、DescribeInstances API を呼び出す権限がないことを示しています。
このエラーを解決するには、以下の手順を実行します。
- API 呼び出し元を特定します。
- ec2:DescribeInstances API アクションがどの拒否ステートメントにも含まれていないことを確認します。
- ec2:DescribeInstances API アクションが許可ステートメントに含まれていることを確認します。
- この API アクションにリソースが指定されていないことを確認します。注: この API アクションはリソースレベルの権限をサポートしていません。
- 許可ステートメント内で指定したすべての IAM 条件が、DescribeInstances アクションによりサポートされていること、また、条件が一致していることを確認します。
詳細については、「DescribeInstanceStatus」を参照してください。
エラーメッセージ B の例:
このエラーメッセージには、API 名、API 呼び出し元、およびターゲットリソースが含まれます。API を呼び出した IAM ID に、リソースに対する正しいアクセス権があることを確認します。以前の評価方法を使用して IAM ポリシーを確認します。
このエラーを解決するには、次の手順に従って IAM ロールの信頼ポリシーを確認します。 EC2-FullAccess:
- arn:aws:iam::123456789012:user/test、または、arn:aws:iam::123456789012:root が、信頼ポリシーのいかなる拒否ステートメントにも含まれていないことを確認します。
- arn:aws:iam::123456789012:user/test または arn:aws:iam::123456789012:root が信頼ポリシーの許可ステートメントに含まれていることを確認します。
- 許可ステートメント内で指定されたすべての IAM 条件が、sts:AssumeRole API アクションでサポートされており、条件が一致していることを確認します。
以下の手順に従って、API 呼び出し元に関連付けられている IAM ポリシーを確認します (arn:aws:iam::123456789012:user/test)。
- sts:AssumeRole API アクションを含むどの拒否ステートメントにも、arn:aws:iam::123456789012:role/EC2-FullAccess が含まれていないことを確認します。
- arn:aws:iam::123456789012:root が信頼ポリシーの許可ステートメントに含まれる場合は、sts:AssumeRole API アクションを含む IAM ポリシーの許可ステートメントに arn:aws:iam::123456789012:role/EC2-FullAccess が含まれていることを確認します。
- 許可ステートメント内で指定されたすべての IAM 条件が、sts:AssumeRole API アクションでサポートされており、条件が一致していることを確認します。
エラーメッセージ C の例:
このエラーメッセージは、get-session-token が一時的認証情報でサポートされていないことを示しています。詳細については、「AWS STS API オペレーションの比較」を参照してください。
エラーメッセージ D の例:
このエラーメッセージは、認証エラーの詳細を示すエンコードされたメッセージを返しています。エラーメッセージをデコードしてアクセス許可のエラーに関する詳細を確認するには、DecodeAuthorizationMessage を参照してください。エラーメッセージをデコードした後、API 呼び出し元を特定し、リソースレベルのアクセス許可と条件を確認します。
このエラーを解決するには、次の手順に従って IAM ポリシーの許可を確認します。
- エラーメッセージに API が明示的に拒否されたことが示されている場合は、一致したステートメントから ec2:AssociateIamInstanceProfile API アクションまたは iam:PassRole API アクションを削除します。
- ec2:AssociateIamInstanceProfile と iam:PassRole が、サポートされた正しいリソースのターゲットとともに、許可ステートメント内にあることを確認します。例えば、ec2:AssociateIamInstanceProfile API アクションのリソースターゲットが EC2 インスタンスで、iam:PassRole のリソースターゲットが IAM ロールであることを確認します。
- ec2: AssociateIamInstanceProfile と IAM: PassRole API アクションが同じ許可ステートメント内にある場合は、すべての条件が ec2:AssociateIamInstanceProfile と IAM: PassRole API アクションでサポートされ、条件が一致していることを確認します。
- ec2:AssociateIamInstanceProfile API アクションと iam:PassRole API アクションが、別の許可ステートメント内にある場合は、それぞれの許可ステートメント内で、すべての条件がそのアクションによりサポートされていることと、条件が一致していることを確認します。
詳細については「ポリシー評価論理」および「アカウント内でのリクエストの許可または拒否の決定」を参照してください。
関連情報
クロスアカウント IAM ロールを引き受けようとしたときの「AccessDenied」または「無効な情報」エラーを解決する方法を教えてください

関連するコンテンツ
- AWS公式更新しました 8ヶ月前
- AWS公式更新しました 2年前