197

PHP ライブラリを使用してファイルをバケットにアップロードしています。ACL をpublic-read-writeに設定しましたが、正常に動作しますが、ファイルはまだプライベートです。

Grantee を Everyoneに変更すると、ファイルが公開されることがわかりました。私が知りたいのは、バケット内のすべてのオブジェクトのデフォルトの Granteeを"Everyone"に設定する方法です。または、デフォルトでファイルを公開する別の解決策はありますか?

私が使用しているコードは以下のとおりです。

public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array()) {
    if ($input === false) return false;
    $rest = new S3Request('PUT', $bucket, $uri);

    if (is_string($input)) $input = array(
        'data' => $input, 'size' => strlen($input),
        'md5sum' => base64_encode(md5($input, true))
    );

    // Data
    if (isset($input['fp']))
        $rest->fp =& $input['fp'];
    elseif (isset($input['file']))
        $rest->fp = @fopen($input['file'], 'rb');
    elseif (isset($input['data']))
        $rest->data = $input['data'];

    // Content-Length (required)
    if (isset($input['size']) && $input['size'] >= 0)
        $rest->size = $input['size'];
    else {
        if (isset($input['file']))
            $rest->size = filesize($input['file']);
        elseif (isset($input['data']))
            $rest->size = strlen($input['data']);
    }

    // Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
    if (is_array($requestHeaders))
        foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v);
    elseif (is_string($requestHeaders)) // Support for legacy contentType parameter
        $input['type'] = $requestHeaders;

    // Content-Type
    if (!isset($input['type'])) {
        if (isset($requestHeaders['Content-Type']))
            $input['type'] =& $requestHeaders['Content-Type'];
        elseif (isset($input['file']))
            $input['type'] = self::__getMimeType($input['file']);
        else
            $input['type'] = 'application/octet-stream';
    }

    // We need to post with Content-Length and Content-Type, MD5 is optional
    if ($rest->size >= 0 && ($rest->fp !== false || $rest->data !== false)) {
        $rest->setHeader('Content-Type', $input['type']);
        if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']);

        $rest->setAmzHeader('x-amz-acl', $acl);
        foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
        $rest->getResponse();
    } else
        $rest->response->error = array('code' => 0, 'message' => 'Missing input parameters');

    if ($rest->response->error === false && $rest->response->code !== 200)
        $rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
    if ($rest->response->error !== false) {
        trigger_error(sprintf("S3::putObject(): [%s] %s", $rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
        return false;
    }
    return true;
}
4

5 に答える 5

384

http://awspolicygen.s3.amazonaws.com/policygen.htmlに移動します 。次のような詳細を入力しここに画像の説明を入力 ます。 [アクション] で [GetObject] を選択し、[ステートメントの追加] を選択してから、[ポリシーの生成] を選択します。

テキストの例をコピーします。

{
  "Id": "Policy1397632521960",
  "Statement": [
    {
      "Sid": "Stmt1397633323327",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketnm/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

Now go to your AWS S3 console, At the bucket level, click on Properties, Expand Permissions, then Select Add bucket policy. Paste the above generated code into the editor and hit save.

All your items in the bucket will be public by default.

于 2014-04-16T07:18:13.267 に答える
163

デフォルトですべてのオブジェクトを公開したい場合、最も簡単な方法は、個々のオブジェクトごとに定義されたアクセス制御リスト (ACL) ではなく、バケット ポリシーを使用することです。

ここに画像の説明を入力

AWS Policy Generatorを使用して、バケットのバケット ポリシーを生成できます。

たとえば、次のポリシーでは、誰でも S3 バケット内のすべてのオブジェクトを読み取ることができます (バケット<bucket-name>の名前に置き換えるだけです)。

{
  "Id": "Policy1380877762691",
  "Statement": [
    {
      "Sid": "Stmt1380877761162",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket-name>/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

バケット ポリシーには のリストが含まれておりStatements、各ステートメントには、指定された (またはで識別される) で (ユーザー)によって実行されるリストの(または のEffectいずれAllowか) があります。DenyActionsPrincipalResourceAmazon Resource NameARN

Id単なるオプションのポリシー ID であり、Sidはオプションの一意のステートメント ID です。

S3 バケット ポリシーの場合、リソース ARN は次の形式を取ります。

arn:aws:s3:::<bucket_name>/<key_name>

上記の例では、( Effect: Allow) 誰でも ( )バケット ( ) 内の任意のオブジェクトにPrincipal: *アクセス ( ) できます。Action: s3:GetObjectResource: arn:aws:s3:::<bucket-name>/*

于 2013-10-04T09:11:39.460 に答える