Come rendere pubblici tutti gli oggetti nel bucket AWS S3 per impostazione predefinita?


151

Sto usando una libreria PHP per caricare un file nel mio bucket. Ho impostato l'ACL su public-read-write e funziona benissimo ma il file è ancora privato.

Ho scoperto che se cambio il Grantee in Everyone rende il file pubblico. Quello che voglio sapere è come impostare il Grantee predefinito su tutti gli oggetti nel mio bucket per essere impostato su "Tutti" . Oppure esiste un'altra soluzione per rendere pubblici i file per impostazione predefinita?

Il codice che sto usando è di seguito:

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

Risposte:


300

Vai a http://awspolicygen.s3.amazonaws.com/policygen.html Compila i dettagli come: inserisci qui la descrizione dell'immagine In Azione seleziona "GetObject" Seleziona "Aggiungi dichiarazione" Quindi seleziona "Genera politica"

Copia l'esempio di testo:

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

Ora vai alla tua console AWS S3, a livello di bucket, fai clic su Proprietà, Espandi autorizzazioni, quindi seleziona Aggiungi criterio bucket. Incolla il codice sopra generato nell'editor e premi Salva.

Tutti i tuoi oggetti nel bucket saranno pubblici per impostazione predefinita.


8
Questa è la risposta corretta A differenza della risposta precedente, questo post mi ha anche insegnato come creare politiche e cosa fanno. Dopo aver letto questo posso scrivere una politica manualmente.
Jason Cheladyn,

2
Ho votato a favore di questa risposta per lo stesso motivo di @liyicky, le istruzioni dettagliate sono state una bella introduzione invece di ricevere solo la risposta.
brendo,

Anch'io. AWS tende a essere opaco a volte e probabilmente per un'ottima ragione. Questa forma di risposta è utile da ground zero.
Jerome,

Questo funziona quando aggiungi nuovi file a bucket ma devo modificare i file già esistenti in bucket per essere pubblici.
Radenko Zec,

137

Se si desidera rendere pubblici tutti gli oggetti per impostazione predefinita, il modo più semplice è farlo tramite un criterio bucket anziché gli elenchi di controllo di accesso (ACL) definiti su ogni singolo oggetto.

inserisci qui la descrizione dell'immagine

Puoi utilizzare AWS Policy Generator per generare un criterio bucket per il tuo bucket.

Ad esempio, la seguente politica consentirà a chiunque di leggere ogni oggetto nel tuo bucket S3 (basta sostituirlo <bucket-name>con il nome del tuo bucket):

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

La Bucket Policy contiene un elenco di Statementse ogni istruzione ha un Effect(uno Allowo Deny) per un elenco di Actionsquello che viene eseguito Principal(dall'utente) sul specificato Resource(identificato da un Amazon Resource Nameo ARN).

Il Idè solo una politica id opzionale e il Sidè un optional unico dichiarazione id.

Per i criteri bucket S3, gli ARN delle risorse assumono la forma:

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

L'esempio precedente consente a ( Effect: Allow) anyone ( Principal: *) di accedere a ( Action: s3:GetObject) qualsiasi oggetto nel bucket ( Resource: arn:aws:s3:::<bucket-name>/*).


Non c'è un modo con il pannello di controllo?
ianaz,

2
@ianaz Puoi aggiungere questo criterio bucket a un bucket tramite la console AWS (pannello di controllo)
dcro

@ianaz vedi la mia risposta qui sotto.
jaxxbo,

Si noti inoltre che esiste un collegamento "esempio di politiche" nel collegamento sopra che fornisce le informazioni esatte necessarie per tagliare e incollare nel generatore di politiche. Poiché le API degli aggiornamenti di aws hanno maggiori probabilità di rimanere corrette. Ha funzionato come un incantesimo per me questa mattina.
keithpjolley

Principal: *mi ha aiutato molto. Grazie!
iedmrc,

2

Il mio problema era leggermente diverso, ma poiché questa domanda è in cima alla ricerca di Google lascerò la mia soluzione, forse aiuterà qualcuno.

Avevo già avuto pieno accesso al bucket S3 prima, ma un giorno ha appena iniziato a tornare Access Denieda tutti i miei file. La soluzione era semplice.

  1. Vai a Services-S3
  2. Fai clic sul tuo bucket S3
  3. Passa alla Permissionsscheda, quindi vai alla Bucket Policyscheda
  4. E fai clic sul Savepulsante.

Dovrebbe riassegnare l'autorizzazione a tutti i tuoi file.

inserisci qui la descrizione dell'immagine

Comunque, qui è pieno bucket policyche consente di rendere pubblico tutto l'oggetto

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.