Amazon S3 バケットの特定のフォルダまたはファイルにアクセスできないのはなぜですか?

最終更新日: 2020 年 10 月 20 日

Amazon Simple Storage Service (Amazon S3) バケット内の特定のプレフィックスまたはオブジェクトにアクセスできません。バケット内の他のデータにはアクセスできます。どうすれば解決できますか?

簡単な説明

プレフィックスまたはオブジェクトへのアクセスを拒否している設定については、次のアクセス許可を確認してください。

  • プレフィックスまたはオブジェクトの所有者
  • バケットポリシーの制約
  • AWS Identity and Access Management (IAM) ユーザーポリシーの成約
  • AWS Key Management Service (AWS KMS) が暗号化したオブジェクトへのアクセス許可

解決方法

プレフィックスまたはオブジェクトの所有者

デフォルトでは、S3 オブジェクトの所有者はそれをアップロードした AWS アカウントになります。これは、バケットの所有者が他のアカウントである場合にも当てはまります。他のアカウントがバケットにアップロードできる場合は、次の手順に従って、アクセスできないオブジェクトまたはプレフィックスへのアクセス許可を取得します。

1.    この 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.    [ ] タブを選択します。

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 カスタマーマスターキー (CMK) で暗号化されている場合は、CMK のポリシーをご確認ください。キーポリシーで IAM ID が次の KMS アクションを実行できることを確認してください。

"Action": [
    "kms:Decrypt",
    "kms:ReEncrypt",
    "kms:GenerateDataKey"
],

3.    IAM ID にこれらのアクションのいずれかに対するアクセス許可がない場合、不足しているアクセス許可を付与するようにキーポリシーを変更します。

重要: IAM ID と KMS キーが異なるアカウントに属している場合は、IAM ポリシーとキーポリシーの両方が必要な KMS アクションに対するアクセス許可を付与する必要があります。