Amazon S3 バケットの特定のフォルダまたはファイルにアクセスできないのはなぜですか?
最終更新日: 2021 年 7 月 9 日
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 アカウントになります。これは、バケットの所有者が他のアカウントである場合にも当てはまります。他のアカウントがバケットにアップロードできる場合は、次の手順に従って、アクセスできないオブジェクトまたはプレフィックスへのアクセス許可を取得します。
1. この AWS Command Line Interface (AWS CLI) コマンドを実行して、AWS アカウントの Amazon S3 正規 ID を取得します。
aws s3api list-buckets --query Owner.ID
注意: AWS CLI コマンドの実行時にエラーが発生する場合は、AWS CLI の最新バージョンを使用していることを確認してください。
2. このコマンドを実行して、アクセスできないオブジェクトを所有するアカウントの Amazon S3 カノニカル ID を取得します。
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
3. カノニカル 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
ヒント: バケットポリシーを使用して、他のアカウントがお客様のバケットにアップロードしたオブジェクトの所有権をご自分に付与することを要求できます。
バケットポリシーの制約
1. Amazon S3 コンソールを開きます。
2. バケットのリストから、確認したいポリシーでバケットを開きます。
3. [Permissions] (アクセス権限) タブを選択します。
4. [Bucket Policy] を選択します。
5. "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/*"
}
]
}
6. バケットポリシーを変更して、プレフィックスまたはオブジェクトへのアクセスを誤って拒否している "Effect": "Deny" ステートメントを編集または削除します。
IAM ユーザーポリシーの制約
1. IAM コンソールを開きます。
2. コンソールから使用している IAM ユーザーまたはロールを開き、プレフィックスまたはオブジェクトにアクセスします。
3. IAM ユーザーまたはロールの [Permissions] タブで各ポリシーを展開し、その JSON ポリシードキュメントを表示します。
4. 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/*"
]
}
]
}
5. ポリシーを変更して、プレフィックスまたはオブジェクトへのアクセスを誤って拒否している "Effect": "Deny" ステートメントを編集または削除します。
AWS KMS が暗号化したオブジェクトへのアクセス許可
オブジェクトが AWS KMS キーで暗号化されている場合、オブジェクトとキーの両方に対するアクセス許可が必要です。次の手順を実行し、AWS KMS キーへのアクセス許可が必要なためにオブジェクトにアクセスできないのかを確認します。
1. Amazon S3 コンソールを使用して、アクセスできないオブジェクトの 1 つのプロパティを表示します。オブジェクトの暗号化プロパティを確認します。
2. オブジェクトがカスタム AWS KMS キー (KMS キー) で暗号化されている場合は、KMS キーポリシーを見直します。キーポリシーで、IAM アイデンティティによる以下の KMS アクションの実行が許可されていることを確認してください。
"Action": ["kms:Decrypt"]
3. IAM ID にこれらのアクションのいずれかに対するアクセス許可がない場合、不足している許可を付与するようにキーポリシーを変更します。
重要: IAM アイデンティティと KMS キーが別のアカウントに属している場合は、適切な許可があることを確認してください。IAM ポリシーとキーポリシーの両方で、必要な KMS アクションに対する許可を付与する必要があります。