web-dev-qa-db-ja.com

S3バケットを公開するにはどうすればよいですか(Amazonサンプルポリシーは機能しません)?

Amazonは、匿名ユーザーにアクセス許可を付与するの例を次のように提供しています( Amazon S3バケットポリシーの例 を参照)。

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket/*"
        }
    ]
}

ポリシー内で、「arn:aws:s3 ::: bucket /」の「bucket」を「my-bucket」に変更しました。

ただし、そのバケットのフォルダー内の画像にアクセスしようとすると、次のアクセス拒否エラーが発生します。

このXMLファイルには、スタイル情報が関連付けられていないようです。ドキュメントツリーを以下に示します。

(その画像のプロパティを明示的にpublicに変更してから、そのURLを再読み込みすると、画像は完全に読み込まれます)

私は何が間違っているのですか?


更新#1:どうやらそれは私がアクセスを許可したサードパーティのサイトと関係があるようです。メインユーザー(私)と同じすべてのアクセス許可があり、そのオブジェクトは同じフォルダーにあり、まったく同じアクセス許可がありますが、それでもパブリックに表示することはできません。理由はわかりません。

更新#2:バケットポリシーは、バケット内にある場合でも、他のユーザーが「所有」しているオブジェクトには適用されません。 私の回答を参照) 詳細については。

19
GoodGets

更新

GoodGetsのコメントによると、本当の問題はバケットポリシーが、バケット内にある場合でも、他の誰かが「所有」しているオブジェクトに適用されないことです。-を参照してください。 GoodGets自身の回答 詳細(+1)。


これは新しいバケット/オブジェクトの設定ですか、それとも既存の設定にバケットポリシーを追加しようとしていますか?

後者の場合、利用可能な3つの異なるS3アクセス制御メカニズム間の相互作用が原因で、関連する落とし穴に遭遇した可能性があります。これは、実際にはかなり混乱する可能性があります。これは、例えばin ACLとバケットポリシーを一緒に使用

ACLとバケットポリシーがバケットに割り当てられている場合、Amazon S3は、Amazon S3リソースへのアカウントのアクセス許可を決定するときに、既存のAmazon S3ACLとバケットポリシーを評価します。アカウントがACLまたはポリシーで指定されたリソースにアクセスできる場合、アカウントは要求されたリソースにアクセスできます。

これは簡単に聞こえますが、ACLとポリシーの間の微妙に異なるデフォルトが原因で、意図しない干渉が発生する可能性があります。

既存のAmazonS3 ACLでは、許可は常にバケットまたはオブジェクトへのアクセスを提供します。ポリシーを使用する場合、拒否は常に許可をオーバーライドします。 [強調鉱山]

これは、ACL許可を追加すると常にアクセスが保証される理由を説明していますが、これはポリシー許可の追加には適用されません。これは、セットアップの他の場所で提供された明示的なポリシー拒否が引き続き適用されるためです。 IAMとバケットポリシーを一緒に および 評価ロジック

したがって、本番シナリオに適用する前に、新しいバケット/オブジェクトのセットアップから開始して目的の構成をテストすることをお勧めします(もちろん干渉する可能性がありますが、場合によっては違いの特定/デバッグが容易になります)。

幸運を!

20
Steffen Opel

バケットポリシーは、他の所有者のファイルを適用しません。したがって、サードパーティへの書き込みアクセス権を付与しましたが、所有権はサードパーティのままであり、バケットポリシーはそれらのオブジェクトには適用されません。

8
GoodGets

私はこれに何時間も無駄にしました、根本的な原因は愚かでした、そしてここで言及された解決策は役に立ちませんでした(私はそれらをすべて試しました)、そしてAWSs3パーミッションドキュメントはこの点を強調しませんでした。

Requester Pays設定をオンにしている場合、匿名アクセスを有効にすることはできません(バケットポリシーまたはACL'Everyone 'のいずれかによる)。ポリシーとACLを記述して適用し、コンソールを使用してファイルを明示的にパブリックに設定することもできますが、requester pays設定のチェックを外すまで、署名されていないURLはそのファイルに対して100%の確率で403アクセスが拒否されます。バケット全体のコンソール(バケットが選択されている場合は[プロパティ]タブ)。または、API REST呼び出しを介して。

Requester Paysのチェックを外し、リファラー制限などで匿名アクセスが機能するようになりました。公平を期すために、AWSコンソールは次のことを教えてくれます。

リクエスターペイが有効になっている間、このバケットへの匿名アクセスは無効になります。

3
Jinn

Zencoderのアップロードでこの問題が発生した場合は、次のページを確認してください: https://app.zencoder.com/docs/api/encoding/s3-settings/public

0
Cbas

次のポリシーは、バケット全体を公開します。

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"]
    }
  ]
}

バケットポリシーを使用してそのバケットの下の特定のフォルダーを公開する場合は、そのフォルダー/プレフィックスを明示的に公開してから、次のようにバケットポリシーを適用する必要があります。

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/images/*"]
    }
  ]
}

上記のポリシーでは、画像の下にあるすべてのオブジェクトへのパブリック読み取りが許可されますが、バケット内の他のオブジェクトにアクセスすることはできません。

問題はあなたのアクションにありますarray形式である必要があります

これを試して:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"]
    }
  ]
}

バケット名前を'リソース'に渡します

0
Ashish Yadav