Amazon S3 バケットにオブジェクトを追加する許可を持つユーザーに、アクセス拒否エラーが発生します。なぜでしょうか?
AWS Identity and Access Management (IAM) ユーザーは、Amazon Simple Storage Service (Amazon S3) バケットの s3:PutObject アクションへのアクセス許可を持っています。しかし、オブジェクトをアップロードしようとすると、HTTP 403: Access Denied エラーが発生します。どうすれば解決できますか?
簡単な説明
IAM ユーザーがバケットにアップロードするための適切なアクセス許可を持っている場合は、アップロードを妨げている設定について次のポリシーを確認してください。
- s3:PutObjectAcl に対する IAM ユーザーのアクセス許可
- バケットポリシーの条件
- Amazon Virtual Private Cloud (Amazon VPC) エンドポイントポリシーが許可するアクセス
- AWS KMS 暗号化
解決方法
s3:PutObjectAcl に対する IAM ユーザーのアクセス許可
IAM ユーザーがアップロード中にオブジェクトのアクセスコントロールリスト (ACL) を更新する必要がある場合、ユーザーは IAM ポリシーで s3:PutObjectAcl のアクセス許可も持っている必要があります。ユーザーの IAM ポリシーを更新する方法については、IAM ユーザーのアクセス権限の変更をご参照ください。
バケットポリシーの条件
バケットへのアップロードを制限する次の条件の例について、バケットポリシーを確認してください。バケットポリシーに条件があり、その条件が有効な場合、IAM ユーザーはアップロードが機能するための条件を満たす必要があります。
重要: 条件を確認するときは、条件が Allow ステートメント ("Effect": "Allow")、または Deny ステートメント ("Effect": "Deny") に関連付けられていることを確認してください。アップロードを機能させるには、Allow ステートメントの条件に従うか、Deny ステートメントの条件を回避する必要があります。
次のように、特定の IP アドレスからのみアップロードを許可する条件を確認します。
"Condition": {
"IpAddress": {
"aws:SourceIp": "54.240.143.0/24"
}
}
バケットポリシーにこの条件がある場合、IAM ユーザーは許可された IP アドレスからバケットにアクセスする必要があります。
次のように、オブジェクトが特定のストレージクラスである場合にのみアップロードを許可する条件を確認します。
"Condition": {
"StringEquals": {
"s3:x-amz-storage-class": [
"STANDARD_IA"
]
}
ポリシーにこの条件がある場合、ユーザーは許可されたストレージクラスでオブジェクトをアップロードする必要があります例えば、前の条件ステートメントには STANDARD_IA ストレージクラスが必要です。これは、ユーザーが次のような AWS コマンドラインインターフェイス (AWS CLI) コマンドを使用して、オブジェクトをアップロードする必要があることを意味します。
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --storage-class STANDARD_IA
注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
次のように、オブジェクトに特定のアクセスコントロールリスト (ACL) が割り当てられている場合にのみアップロードを許可する条件を確認します。
"Condition": {
"StringEquals": {
"s3:x-amz-acl":["public-read"]
}
}
ポリシーにこの条件がある場合、ユーザーは許可された ACL でオブジェクトをアップロードする必要があります。たとえば、前の条件ではパブリック読み取り ACL が必要なため、ユーザーは次のようなコマンドを使用してオブジェクトをアップロードする必要があります。
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --acl public-read
次のように、アップロードによってバケット所有者(正規ユーザー ID)にオブジェクトの完全なコントロールを許可する必要がある条件を確認します。
"Condition": {
"StringEquals": {
"s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
}
}
ポリシーにこの条件がある場合、ユーザーは次のようなコマンドでオブジェクトをアップロードする必要があります。
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --grant-full-control id=CanonicalUserID
次のように、オブジェクトが AWS Key Management System (AWS KMS) キーによって暗号化されている場合にのみアップロードを許可する条件を確認します。
"Condition": {<br>"StringEquals": {<br>"s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd"<br>}<br>}
ポリシーにこの条件がある場合、ユーザーは次のようなコマンドでオブジェクトをアップロードする必要があります。
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption aws:kms --ssekms-key-id arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd
次のように、オブジェクトが特定の種類のサーバー側暗号化を使用している場合にのみアップロードを許可する条件を確認します。
"Condition": {
"StringEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
ポリシーにこの条件がある場合、ユーザーは次のようなコマンドでオブジェクトをアップロードする必要があります。
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption "AES256"
VPC エンドポイントポリシーで許可されているアクセス
IAM ユーザーが Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用して Amazon S3 にオブジェクトをアップロードしていて、そのインスタンスが VPC エンドポイントを使用して Amazon S3 にルーティングされている場合は、VPC エンドポイントポリシーを確認する必要があります。エンドポイントポリシーでバケットへのアップロードが許可されていることを確認してください。
例えば、次の VPC エンドポイントポリシーは、DOC-EXAMPLE-BUCKET へのアクセスのみを許可しています。バケットが許可されたリソースとしてリストされていない場合、ユーザーは VPC のインスタンスを使用してバケットにアップロードできません。
{
"Statement": [{
"Sid": "Access-to-specific-bucket-only",
"Principal": "*",
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}]
}
さらに、ユーザーが ACL を使用してオブジェクトをアップロードする場合、VPC エンドポイントポリシーは、次のように s3:PutObjectAcl アクションへのアクセスも許可する必要があります。
{
"Statement": [{
"Sid": "Access-to-specific-bucket-only",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}]
}
AWS KMS 暗号化
表示されたエラーメッセージに基づいて、IAM ユーザーまたはロールの AWS KMS アクセス許可を更新します。これらの Access Denied エラーを解決するには、「AWS KMS のデフォルトの暗号化を使用する Amazon S3 バケットにファイルをアップロードするときに Access Denied エラーが表示されるのはなぜですか?」、をご参照ください。
重要: AWS KMS キーと IAM ロールが別々の AWS アカウントに属している場合は、IAM ポリシーと KMS キーポリシーを更新する必要があります。KMS 許可は、IAM ポリシーと KMS キーポリシーの両方に追加するようにしてください。また、クロスアカウント IAM プリンシパルがオブジェクトをアップロードしている場合は、デフォルトバケットの暗号化に「aws/s3」エイリアスを持つ AWS KMS キーを使用することはできません。SSE-KMS の S3 バケットキーを使用するように設定されているオブジェクトのアップロード、コピー、またはバケットには、kms:Decrypt 許可へのアクセス権が必要です。AWS KMS キーとポリシー管理の詳細については、AWS マネージド KMS キーおよびカスタマーマネージドキーをご参照ください。
関連情報
Amazon S3 バケットのデフォルトのサーバー側暗号化動作の設定
関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 1年前lg...
- 質問済み 5年前lg...
- 質問済み 5年前lg...
- AWS公式更新しました 2年前