Amazon Simple Storage Service (Amazon S3) バケット内の特定のプレフィックスまたはオブジェクトにアクセスできません。バケット内の他のデータにはアクセスできます。
簡単な説明
プレフィックスまたはオブジェクトへのアクセスを拒否している設定がないか、次のアクセス許可を確認してください。
- プレフィックスまたはオブジェクトの所有
- バケットポリシーの制約
- AWS Identity and Access Management (IAM) ユーザーポリシーの制約
- AWS Key Management Service (AWS KMS) によって暗号化されたオブジェクトへのアクセス許可
また、以下のアクセス条件にも注意してください。
- オブジェクトを AWS KMS キーで暗号化した場合、オブジェクトを暗号化した AWS アカウントだけがそれを読み取ることができます。
- 許可の境界とセッションポリシーが定義されている場合、リクエスタの最大許可に影響する可能性があります。その結果、オブジェクトへのアクセスにも影響を与える可能性があります。
- 制限は VPC エンドポイントポリシーやサービスコントロールポリシー (SCP) などの他のポリシーで指定されている場合があります。そのため、これらのポリシーを確認し、必要に応じて更新してください。
- Amazon S3 オブジェクト所有権を使用して、アップロードされたオブジェクトの所有権を制御することもできます。オブジェクト所有権が BucketOwnerPreferred に設定されている場合、バケット所有者のフルコントロールの既定 ACL を持つ他のアカウントによって新しく書き込まれたオブジェクトは、バケット所有者に移行します。
解決策
プレフィックスまたはオブジェクトの所有
デフォルトでは、S3 オブジェクトの所有者はそれをアップロードした AWS アカウントになります。これは、バケットの所有者が他のアカウントである場合にも当てはまります。他のアカウントがバケットにアップロードできる場合は、次の手順に従って、アクセスできないオブジェクトまたはプレフィックスへのアクセス許可を取得します。
-
AWS アカウントの Amazon S3 正規 ID を取得するには、この AWS コマンドラインインターフェイス (AWS CLI) コマンドを実行します。
aws s3api list-buckets --query Owner.ID
-
アクセスできないオブジェクトを所有するアカウントの Amazon S3 正規 ID を取得します。
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
-
カノニカル ID が一致しない場合は、オブジェクトはバケット所有者の所有物ではありません。個々のオブジェクトの場合、オブジェクト所有者はこちらの put-object-acl コマンドを実行して、フルコントロールを与えることができます。
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
プレフィックス内のオブジェクトの場合、オブジェクト所有者はプレフィックスを再コピーして、操作の一部としてオブジェクトのフルコントロールをユーザーに付与する必要があります。たとえば、オブジェクト所有者は、--acl bucket-owner-full-control パラメータを使用してこの cp コマンドを実行できます。
aws s3 cp s3://DOC-EXAMPLE-BUCKET/abc/ s3://DOC-EXAMPLE-BUCKET/abc/ --acl bucket-owner-full-control --recursive --storage-class STANDARD
ヒント: バケットポリシーを使用して、他のアカウントがあなたのバケットにアップロードしたオブジェクトの所有権をあなたに付与することを要求できます。
バケットポリシーの制約
-
Amazon S3 コンソールを開きます。
-
バケットのリストから、確認したいポリシーでバケットを開きます。
-
[アクセス権限] タブを選択します。
-
[バケットポリシー] を選択します。
-
**"Effect": "Deny"**のあるステートメントを検索します。次に、アクセスできないプレフィックスまたはオブジェクトへの参照を、これらのステートメントを確認します。たとえば、このバケットポリシーは、DOC-EXAMPLE-BUCKET 内にある abc/* プレフィックスへのあらゆるユーザーによるアクセスを拒否します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StatementPrefixDeny",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/abc/*"
}
]
}
-
バケットポリシーを変更して、プレフィックスまたはオブジェクトへのアクセスを誤って拒否している "Effect": "Deny" ステートメントを編集または削除します。
IAM ユーザーポリシーの制約
-
IAM コンソールを開きます。
-
コンソールから使用している IAM ユーザーまたはロールを開き、プレフィックスまたはオブジェクトにアクセスします。
-
IAM ユーザーまたはロールの**[アクセス許可]** タブで各ポリシーを展開し、その JSON ポリシードキュメントを表示します。
-
JSON ポリシードキュメントで、Amazon S3 へのアクセスに関連するポリシーを検索します。次に、それらのポリシーを検索して、プレフィックスまたはオブジェクトへのアクセスをブロックしている "Effect": "Deny" ステートメントを探します。
たとえば、次の IAM ポリシーには "Effect": "Deny" ステートメントがあり、DOC-EXAMPLE-BUCKET 内にあるプレフィックス abc/* への IAM ID のアクセスをブロックします。そして、ポリシーには "Effect": "Allow" ステートメントも含まれ、これは DOC-EXAMPLE-BUCKET への許可を付与します。バケット全体に対する allow ステートメントがありますが、明示的な deny ステートメントは IAM ID がプレフィックス abc/* にアクセスすることを防ぎます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StatementPrefixDeny",
"Effect": "Deny",
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/abc/*"
]
},
{
"Sid": "StatementFullPermissionS3",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
]
}
]
}
-
バケットポリシーを変更して、プレフィックスまたはオブジェクトへのアクセスを誤って拒否している "Effect": "Deny" ステートメントを編集または削除します。
AWS KMS が暗号化したオブジェクトへのアクセス許可
オブジェクトが AWS KMS キーで暗号化されている場合、オブジェクトとキーの両方に対するアクセス許可が必要です。次の手順を実行し、AWS KMS キーへのアクセス許可が必要なためにオブジェクトにアクセスできないのかを確認します。
-
Amazon S3 コンソールを使用して、アクセスできないオブジェクトの 1 つのプロパティを表示します。オブジェクトの暗号化プロパティを確認します。
-
オブジェクトがカスタム AWS KMS キー (KMS キー) で暗号化されている場合は、KMS キーポリシーを見直します。キーポリシーで、IAM アイデンティティによる以下の KMS アクションの実行が許可されていることを確認してください。
"Action": ["kms:Decrypt"]
-
IAM ID にこれらのアクションのいずれかに対するアクセス許可がない場合、不足している許可を付与するようにキーポリシーを変更します。
**重要:**IAM アイデンティティと KMS キーが別のアカウントに属している場合は、適切な許可があることを確認してくださいIAM ポリシーとキーポリシーの両方で、必要な KMS アクションに対する許可を付与する必要があります。
関連情報
別の AWS アカウントから Amazon S3 バケットにアップロードされたオブジェクトにアクセスできないのはなぜですか?
Amazon S3 バケット内の特定のフォルダへのアクセス権をユーザーに付与する方法を教えてください。
Amazon S3 から KMS で暗号化されたオブジェクトをダウンロードする際に、AWS KMS キーを指定する必要がありますか?