如何将AWS S3存储桶中的所有对象默认为公共?
我正在使用PHP库将file upload到我的存储桶。 我已经将ACL设置为公共读写 ,并且工作正常,但文件仍然是私有的。
我发现,如果我将“ 受让人”更改为“每个人”,则会将该文件公开。 我想知道的是如何让我的存储桶中的所有对象的默认授予者设置为“每个人” 。 还是有另一个解决scheme, 使默认的文件公开 ?
我正在使用的代码如下:
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; }
转到http://awspolicygen.s3.amazonaws.com/policygen.html填写详细信息,如:; 在Action中select“GetObject”select“Add Statement”然后select“Generate Policy”
复制文本示例:
{ "Id": "Policy1397632521960", "Statement": [ { "Sid": "Stmt1397633323327", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::bucketnm/*", "Principal": { "AWS": [ "*" ] } } ] }
现在转到您的AWS S3控制台,在存储桶级别,单击属性,展开权限,然后select添加存储桶策略。 将上面生成的代码粘贴到编辑器中,并保存。
您的所有物品都会默认公开。
如果要默认公开所有对象,最简单的方法是通过桶策略而不是每个单独对象上定义的访问控制列表(ACL)。
您可以使用AWS Policy Generator为您的存储桶生成存储桶策略。
例如,以下策略将允许任何人读取S3存储桶中的每个对象(只需将<bucket-name>
replace为<bucket-name>
):
{ "Id": "Policy1380877762691", "Statement": [ { "Sid": "Stmt1380877761162", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::<bucket-name>/*", "Principal": { "AWS": [ "*" ] } } ] }
桶策略包含一个Statements
列表,每个语句对Principal
(用户)对指定Resource
(由Amazon Resource Name
或ARN
标识)执行的Actions
列表Deny
( Allow
或Deny
)。
Id
只是一个可选的策略ID, Sid
是可选的唯一语句ID。
对于S3桶策略,资源ARN采取以下forms:
arn:aws:s3:::<bucket_name>/<key_name>
上面的例子允许( Effect: Allow
)任何人( Principal: *
)访问( Action: s3:GetObject
)桶中的任何对象( Resource: arn:aws:s3:::<bucket-name>/*
)。