218 votes

Comment rendre publics par défaut tous les objets contenus dans le seau AWS S3 ?

J'utilise une bibliothèque PHP pour télécharger un fichier sur mon bucket. J'ai défini l'ACL à public-read-write et cela fonctionne bien, mais le fichier est toujours privé.

J'ai constaté que si je modifie le Du bénéficiaire à tout le monde il rend le fichier public. Ce que je veux savoir, c'est comment rendre le fichier Bénéficiaire par défaut pour tous les objets dans mon seau pour qu'il soit réglé 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 le suivant :

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

412voto

jaxxbo Points 339

Aller à http://awspolicygen.s3.amazonaws.com/policygen.html Complétez les détails tels que enter image description here Dans Action, sélectionnez "GetObject". Sélectionnez "Add Statement" (Ajouter une déclaration) Sélectionnez ensuite "Generate Policy" (Générer une politique)

Copiez l'exemple de texte :

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

Allez maintenant dans votre console AWS S3, au niveau du bucket, cliquez sur Propriétés, Développez Permissions, puis sélectionnez Ajouter une politique de bucket. Collez le code généré ci-dessus dans l'éditeur et cliquez sur save.

Tous les éléments du panier seront publics par défaut.

170voto

dcro Points 4491

Si vous souhaitez rendre tous les objets publics par défaut, la manière la plus simple est de le faire au moyen d'un fichier Politique des seaux au lieu des listes de contrôle d'accès (ACL) définies pour chaque objet individuel.

enter image description here

Vous pouvez utiliser le Générateur de politiques AWS pour générer une politique de seau pour votre seau.

Par exemple, la politique suivante permettra à n'importe qui de lire tous les objets de votre panier S3 (il suffit de remplacer <bucket-name> avec le nom de votre seau) :

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

La politique relative aux seaux contient une liste de Statements et chaque déclaration est assortie d'un Effect (soit Allow o Deny ) pour une liste de Actions qui sont effectuées par Principal (l'utilisateur) sur le site Resource (identifiée par un Amazon Resource Name o ARN ).

Les Id n'est qu'un identifiant de politique optionnel et le champ Sid est un identifiant unique facultatif de la déclaration.

Pour les politiques relatives aux seaux S3, les ARN de ressources se présentent sous la forme suivante :

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

L'exemple ci-dessus permet à ( Effect: Allow ) quiconque ( Principal: * ) à l'accès ( Action: s3:GetObject ) tout objet dans le seau ( Resource: arn:aws:s3:::<bucket-name>/* ).

36voto

Serhii Popov Points 1703

Mon problème était légèrement différent, mais comme cette question est en tête de recherche sur Google, je vais laisser ma solution, peut-être qu'elle aidera quelqu'un.

J'avais déjà eu un accès complet au seau S3 auparavant, mais un jour il a commencé à revenir Access Denied à tous mes fichiers. La solution était simple et directe.

  1. Aller à Services - S3
  2. Cliquez sur votre panier S3
  3. Passer à Permissions onglet, puis aller à Bucket Policy onglet
  4. Et cliquez sur le bouton Save bouton.

Il devrait réattribuer les autorisations sur tous vos fichiers.

enter image description here

Quoi qu'il en soit, voici le texte intégral bucket policy qui permet de rendre tous les objets publics

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

5voto

Le JSON ci-dessus n'a pas fonctionné pour moi, mais j'ai trouvé ceci qui fonctionne. Je l'ai testé sur de multiples buckets. Je peux écrire dans les buckets de manière programmatique et lire à partir d'eux en même temps.

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

3voto

Milind Points 1427

C'est simple... il suffit d'ajouter ceci à votre politique du seau... cela rendra votre seau accessible au public . J'ai procédé de la sorte car mon panier ne contenait que des images et des logos. Il est donc logique de le rendre public car il ne contient pas de données ou d'actifs sensibles ou spécifiques à l'utilisateur.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X