如何使所有对象在AWS S3桶公共默认?

我正在使用一个PHP库上传一个文件到我的桶。我已经将ACL设置为public-read-write,它工作正常,但文件仍然是私有的。

我发现如果我改变所有人的受赠人,它会使文件公开。我想知道的是如何使我的桶中的在所有对象上默认授予人设置为“;”。或者默认情况下是否有另一个解决方案公开文件 ?

我使用的代码如下:

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;
}
133807 次浏览

如果你想在默认情况下公开所有对象,最简单的方法是通过桶的政策而不是在每个单独的对象上定义的访问控制列表(acl)来实现。

enter image description here

你可以使用AWS策略生成器为你的桶生成一个桶策略。

例如,下面的策略将允许任何人读取S3存储桶中的每个对象(只需将<bucket-name>替换为存储桶的名称):

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

桶策略包含一个Statements列表,每个语句都有一个Effect (AllowDeny),用于一个Actions列表,由Principal(用户)在指定的Resource(由Amazon Resource NameARN标识)上执行。

Id只是一个可选的策略id,而Sid是一个可选的唯一语句id。

对于S3桶策略,资源arn的形式为:

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

上面的例子允许(Effect: Allow)任何人(Principal: *)访问(Action: s3:GetObject)桶(Resource: arn:aws:s3:::<bucket-name>/*)中的任何对象。

http://awspolicygen.s3.amazonaws.com/policygen.html 填写详细信息,如:enter image description here 在Action中选择GetObject 选择“添加语句” 然后选择“Generate Policy”

复制文本示例:

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

现在转到AWS S3控制台,在桶级别,单击“属性”,“展开权限”,然后选择“添加桶策略”。将上面生成的代码粘贴到编辑器中并点击保存。

默认情况下,桶中的所有项目都是公开的。

我的问题略有不同,但由于这个问题在谷歌搜索的顶部,我将留下我的解决方案,也许它会帮助到别人。

我之前已经完全访问了S3桶,但有一天它开始返回Access Denied到我所有的文件。解决办法很简单。

  1. 转到Services - S3
  2. 单击S3存储桶
  3. 切换到Permissions选项卡,然后转到Bucket Policy选项卡
  4. 并单击Save按钮。

它应该重新分配你所有文件的权限。

enter image description here

不管怎样,这里是完整的bucket policy,允许将所有对象设为公共对象

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
}
]
}

上面的JSON不适合我,但我发现这是工作的。我已经在多个桶上进行了测试。我可以通过编程的方式向存储桶写入数据,同时从存储桶中读取数据

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

它的简单…只要把这个添加到你的bucket policy..我这样做是因为我的桶只保存图像和徽标,所以将其公开是有意义的,因为没有敏感或特定于用户的数据/资产。

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

你可以复制并粘贴json到文档的这个部分:https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteAccessPermissionsReqd.html#bucket-policy-static-site

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


  1. 然后转到S3控制台。
  2. 打开你的桶。
  3. 单击Permissions选项卡
  4. 下拉到桶策略。单击编辑: 李bucket policy < / >
  5. 在下面的输入窗口中粘贴json:

enter image description here

  1. 复制输入窗口上方提供的ARN(见上图)来替换" Resource": ["<paste value>/*"]
这个视频帮助了我: https://www.youtube.com/watch?v=_FeAyvqPW74 < / p >