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 が割り当てられたオブジェクトをアップロードする必要があります。たとえば、上記の条件は public-read 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": {
"StringEquals": {
"s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd"
}
}
ポリシーにこの条件が含まれる場合、ユーザーがオブジェクトをアップロードするには、次の例に類似したコマンドを実行する必要があります。
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 キーでサーバー側暗号化を使用する (SSE-KMS)」を参照してください。
関連情報
条件キーを使用するバケットポリシーの例
Amazon S3 バケットのデフォルトのサーバー側暗号化動作を設定する