Как сделать все объекты в объявлении AWS S3 общедоступными по умолчанию?
Я использую библиотеку PHP для загрузки файла в свой ковш. Я установил ACL в public-read-write, и он отлично работает, но файл по-прежнему остается конфиденциальным.
Я обнаружил, что если я изменил Грантополучатель на всех, он сделает файл общедоступным. Я хочу знать, как мне сделать Grantee по умолчанию для всех объектов в моем ковше для установки "Все" . Или есть другое решение для сделать файлы общедоступными по умолчанию?
Код, который я использую, приведен ниже:
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;
}
Ответы
Ответ 1
Перейдите в 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": [
"*"
]
}
}
]
}
Теперь перейдите на консоль AWS S3. На уровне ковша нажмите "Свойства", "Расширить разрешения", затем выберите "Добавить политику корзины". Вставьте указанный выше сгенерированный код в редактор и нажмите "Сохранить".
Все ваши элементы в ведре будут общедоступными по умолчанию.
Ответ 2
Если вы хотите, чтобы все объекты были общедоступными по умолчанию, самый простой способ - сделать это с помощью Bucket Policy вместо списков контроля доступа ( 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": [
"*"
]
}
}
]
}
Политика Bucket содержит список Statements
, и каждый оператор имеет Effect
(либо Allow
или Deny
) для списка Actions
, которые выполняются Principal
(пользователем) на указанный Resource
(обозначенный символом Amazon Resource Name
или ARN
).
Id
- это просто необязательный идентификатор политики, а Sid
- необязательный уникальный идентификатор оператора.
Для политик Buck S3, ARN-ресурсы ресурса принимают форму:
arn:aws:s3:::<bucket_name>/<key_name>
Вышеприведенный пример позволяет (Effect: Allow
) любому (Principal: *
) получить доступ (Action: s3:GetObject
) к любому объекту в ведре (Resource: arn:aws:s3:::<bucket-name>/*
).