2013-10-04 44 views
102

我正在使用PHP庫將文件上傳到我的存儲桶。我已經將ACL設置爲public-read-write,它工作正常,但該文件仍然是私有的。如何在默認情況下將AWS S3存儲桶中的所有對象都設爲公共?

我發現如果我將受讓人更改爲所有人,它會公開該文件。我想知道的是,如何使默認受款人在我的存儲桶中的所有對象被設置爲「所有人」。或者是否有另一種解決方案使文件公開默認?我使用

代碼如下:

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; 
} 

回答

100

如果你想使所有默認對象公開,最簡單的方法是做它槽上的每個定義的Bucket Policy,而不是訪問控制列表(ACL)個人對象。

enter image description here

可以使用AWS Policy Generator來生成你的水桶桶政策。

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

遺願政策包含Statements每一個列表:

例如,下面的政策將允許任何人閱讀你的S3存儲桶中的每個對象(只是與你斗的名稱替換<bucket-name>)對於在指定的Resource(由Amazon Resource NameARN標識)上由Principal(用戶)執行的Actions列表,具有EffectAllowDeny)。

Id只是一個可選的策略ID,而Sid是一個可選的唯一語句ID。

對於S3剷鬥政策,資源ARNS採取以下形式:

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

上面的例子允許(Effect: Allow)任何人(Principal: *)訪問(Action: s3:GetObject)在桶中(Resource: arn:aws:s3:::<bucket-name>/*)的任何對象。

+0

沒有與控制面板的方式? – ianaz

+2

@ianaz您可以通過AWS控制檯(控制面板)將此存儲桶策略添加到存儲桶中 – dcro

+0

@ianaz請參閱下面的答案。 – jaxxbo

225

轉到細節如http://awspolicygen.s3.amazonaws.com/policygen.html 填充:enter image description here 在行動選擇「GetObject的」 選擇「添加語句」 然後選擇「生成策略」

複製文本示例:

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

現在轉到您的AWS S3控制檯,在存儲桶級別,單擊屬性,展開權限,然後選擇添加存儲桶策略。將上面生成的代碼粘貼到編輯器中並點擊保存。

默認情況下,存儲桶中的所有商品都將公開。

+7

這是正確的迴應。與之前的答案不同,這篇文章也教會了我如何制定政策以及他們的工作。讀完這些後,我可以手動編寫一個策略。 – liyicky

+2

我贊同這個答案出於同樣的原因@liyicky,詳細的說明是一個很好的介紹,而不是隻是交出答案。 – brendo

+0

同樣在這裏。 AWS往往是不透明的,可能有很好的理由。這種回答形式從零開始是有幫助的。 – Jerome

相關問題