J'utilise une bibliothèque PHP pour télécharger un fichier dans mon compartiment. J'ai défini l'ACL sur public-read-write et cela fonctionne bien, mais le fichier est toujours privé.
J'ai trouvé que si je change le Bénéficiaire à Tout le monde, cela rend le fichier public. Ce que je veux savoir, c'est comment faire en sorte que le bénéficiaire par défaut sur tous les objets dans mon compartiment soit défini sur "Tout le monde". Ou existe-t-il une autre solution pour rendre les fichiers publics par défaut?
Le code que j'utilise est ci-dessous:
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;
}
Allez à http://awspolicygen.s3.amazonaws.com/policygen.html Remplissez les détails tels que: Dans Action, sélectionnez "GetObject". Sélectionnez "Ajouter une instruction", puis sélectionnez "Générer la stratégie".
Copiez l'exemple de texte:
{
"Id": "Policy1397632521960",
"Statement": [
{
"Sid": "Stmt1397633323327",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucketnm/*",
"Principal": {
"AWS": [
"*"
]
}
}
]
}
Accédez maintenant à votre console AWS S3. Au niveau du compartiment, cliquez sur Propriétés, développez les autorisations, puis sélectionnez Ajouter une stratégie de compartiment. Collez le code généré ci-dessus dans l'éditeur et cliquez sur Enregistrer.
Tous vos articles dans le panier seront publics par défaut.
Si vous souhaitez rendre tous les objets publics par défaut, la méthode la plus simple consiste à utiliser une stratégie de compartiment à la place des listes de contrôle d'accès définies dans chaque objet.
Vous pouvez utiliser AWS Policy Generator pour générer une stratégie de compartiment pour votre compartiment.
Par exemple, la politique suivante permet à quiconque de lire chaque objet de votre compartiment S3 (il suffit de remplacer <bucket-name>
par le nom de votre compartiment):
{
"Id": "Policy1380877762691",
"Statement": [
{
"Sid": "Stmt1380877761162",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::<bucket-name>/*",
"Principal": {
"AWS": [
"*"
]
}
}
]
}
La stratégie de compartiment contient une liste de Statements
et chaque instruction comporte un Effect
(soit Allow
ou Deny
) pour obtenir une liste de Actions
exécutée par Principal
(l'utilisateur) sur le Resource
spécifié (identifié par un Amazon Resource Name
ou ARN
).
La Id
n'est qu'un identifiant de politique facultatif et le Sid
est un identifiant d'instruction unique facultatif.
Pour les règles de compartiment S3, les ARN de ressources se présentent comme suit:
arn:aws:s3:::<bucket_name>/<key_name>
L'exemple ci-dessus permet à (Effect: Allow
) n'importe qui (Principal: *
) d'accéder à (Action: s3:GetObject
) de tout objet du compartiment (Resource: arn:aws:s3:::<bucket-name>/*
).