AWS コマンドラインインターフェイス (AWS CLI) を使用すると、Amazon Simple Storage Service (Amazon S3) リソースにアクセスできます。しかし、AWS SDK を使用すると、アクセス拒否エラーが発生します。どうすれば解決できますか?
解決方法
注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
AWS CLI と AWS SDK の認証情報を検証する
まず、使用している AWS CLI と AWS SDK に同じ認証情報が設定されていることを確認してください。そのためには、次のステップを実行します。
AWS CLI で設定されている認証情報を取得するには、次のコマンドを実行します。
aws iam list-access-keys
AWS CLI に関連付けられた AWS Identity and Access Management (IAM) ロールを使用している場合は、このコマンドを実行してロールを取得します。
aws sts get-caller-identity
使用している AWS SDK で設定されている認証情報を取得するには、AWS Security Token Service (AWS STS) クライアントを使用して GetCallerIdentity 呼び出しを実行します。例えば、AWS SDK for Python (Boto3) を使用している場合は、get_caller_identity を実行します。
AWS CLI と AWS SDK が異なる認証情報を使用している場合は、AWS CLI に保存されている認証情報で AWS SDK を使用してください。
Amazon S3 への AWS CLI および SDK リクエストのトラブルシューティング
CLI と AWS SDK で使用される認証情報が同じ場合は、次の質問をしてトラブルシューティングを続けます。
- S3 への CLI と SDK のリクエストは同じソースから来ていますか? つまり、リクエストが同じ Amazon Elastic Compute Cloud (Amazon EC2) インスタンスからのものであるかどうかを確認します。
- リクエストが同じソースから来ている場合、SDK は意図した認証情報を使用していますか? 例えば、AWS SDK for Python (Boto3) を使用する場合、SDK では、複数の方法を使用して認証情報を設定できます。つまり、Boto3 は、複数の場所において、特定の順序で認証情報を検索します。間違った認証情報が早期に指定された場合、これらの認証情報が使用されます。Boto3 が認証情報を検索する際に従う順序の詳細については、Boto3 SDK ウェブサイトの「認証情報」をご参照ください。
VPC エンドポイントが S3 へのリクエストを許可していることを確認します
リクエストが異なるソースから送信される場合は、SDK を使用するソースが VPC エンドポイント経由でリクエストを送信しているかどうかを確認します。その後、VPC エンドポイントで、Amazon S3 に送信しようとしているリクエストが許可されていることを確認してください。
この例の VPC エンドポイントポリシーでは、DOC-EXAMPLE-BUCKET のダウンロードおよびアップロードのアクセスを許可しています。この VPC エンドポイントを使用している場合は、他のバケットへのアクセスが拒否されます。
{
"Statement": [
{
"Sid": "Access-to-specific-bucket-only",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
]
}
]
}
認証情報またはソースに問題がない場合は、アクセス拒否エラーが S3 によって返される理由のいくつかを確認してください。詳細については、「Amazon S3 からの 403 Access Denied エラーをトラブルシューティングするにはどうすればよいですか?」を参照してください。
関連情報
Amazon S3 での Identity and Access Management