Wie mache ich alle Objekte im AWS S3-Bucket standardmäßig öffentlich?


151

Ich verwende eine PHP-Bibliothek, um eine Datei in meinen Bucket hochzuladen. Ich habe die ACL auf public-read-write gesetzt und sie funktioniert einwandfrei, aber die Datei ist immer noch privat.

Ich habe festgestellt, dass die Datei veröffentlicht wird , wenn ich den Berechtigten in "Jeder" ändere . Ich möchte wissen, wie ich den Standardberechtigten für alle Objekte in meinem Bucket auf "Jeder" setze . Oder gibt es eine andere Lösung, um Dateien standardmäßig öffentlich zu machen ?

Der von mir verwendete Code ist unten:

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

Antworten:


299

Gehen Sie zu http://awspolicygen.s3.amazonaws.com/policygen.html.Geben Sie hier die Bildbeschreibung ein Geben Sie folgende Details ein: Wählen Sie in Aktion "GetObject" aus. Wählen Sie "Anweisung hinzufügen" und dann "Richtlinie generieren".

Kopieren Sie das Textbeispiel:

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

Wechseln Sie nun zu Ihrer AWS S3-Konsole. Klicken Sie auf Bucket-Ebene auf Eigenschaften, Berechtigungen erweitern und wählen Sie Bucket-Richtlinie hinzufügen. Fügen Sie den oben generierten Code in den Editor ein und klicken Sie auf Speichern.

Alle Ihre Artikel im Eimer sind standardmäßig öffentlich.


8
Dies ist die richtige Antwort. Im Gegensatz zur vorherigen Antwort hat mir dieser Beitrag auch beigebracht, wie Richtlinien erstellt werden und was sie tun. Nachdem ich dies gelesen habe, kann ich eine Richtlinie manuell schreiben.
Jason Cheladyn

2
Ich habe diese Antwort aus dem gleichen Grund wie @liyicky positiv bewertet. Die detaillierten Anweisungen waren eine nette Einführung, anstatt nur die Antwort zu erhalten.
Brendo

Hier gilt das gleiche. AWS ist manchmal und wahrscheinlich aus sehr guten Gründen undurchsichtig. Diese Form der Antwort ist ab Null hilfreich.
Jerome

Dies funktioniert, wenn Sie neue Dateien zum Bucket hinzufügen, aber ich muss ändern, dass bereits im Bucket vorhandene Dateien vorhanden sind, um öffentlich zu sein.
Radenko Zec

137

Wenn Sie standardmäßig alle Objekte öffentlich machen möchten, können Sie dies am einfachsten über eine Bucket-Richtlinie anstelle von Zugriffssteuerungslisten (Access Control Lists, ACLs) tun, die für jedes einzelne Objekt definiert sind.

Geben Sie hier die Bildbeschreibung ein

Mit dem AWS Policy Generator können Sie eine Bucket-Richtlinie für Ihren Bucket generieren.

Mit der folgenden Richtlinie kann beispielsweise jeder jedes Objekt in Ihrem S3-Bucket lesen (ersetzen Sie es einfach durch <bucket-name>den Namen Ihres Buckets):

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

Die Bucket-Richtlinie enthält eine Liste von Statements und jede Anweisung hat ein Effect(entweder Allowoder Deny) für eine Liste von denen Actions, die von Principal(dem Benutzer) für das angegebene Resource(durch ein Amazon Resource Nameoder gekennzeichnete ARN) ausgeführt werden.

Dies Idist nur eine optionale Richtlinien-ID und Sideine optionale eindeutige Anweisungs-ID.

Für S3-Bucket-Richtlinien haben die Ressourcen-ARNs die folgende Form:

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

Das obige Beispiel ermöglicht ( Effect: Allow) jedem ( Principal: *) den Zugriff auf ( Action: s3:GetObject) jedes Objekt im Bucket ()Resource: arn:aws:s3:::<bucket-name>/* ) ).


Gibt es keinen Weg mit dem Bedienfeld?
Ianaz

2
@ianaz Sie können diese Bucket-Richtlinie über die AWS-Konsole (
Systemsteuerung

@ianaz siehe meine Antwort unten.
Jaxxbo

Beachten Sie auch, dass der obige Link einen Link "Beispielrichtlinien" enthält, der die genauen Informationen enthält, die zum Ausschneiden und Einfügen in den Richtliniengenerator erforderlich sind. Wenn aws APIs aktualisiert, bleibt dies mit größerer Wahrscheinlichkeit korrekt. Hat heute Morgen wie ein Zauber für mich funktioniert.
Keithpjolley

Principal: *Hat mir viel geholfen. Vielen Dank!
iedmrc

2

Mein Problem war etwas anders, aber da diese Frage ganz oben in der Google-Suche steht, lasse ich meine Lösung, vielleicht hilft sie jemandem.

Ich hatte bereits zuvor vollen Zugriff auf den S3-Bucket, aber eines Tages kehrte er gerade Access Deniedzu allen meinen Dateien zurück. Die Lösung war einfach und unkompliziert.

  1. Gehe zu Services-S3
  2. Klicken Sie auf Ihren S3-Bucket
  3. Wechseln Sie zur PermissionsRegisterkarte und dann zur Bucket PolicyRegisterkarte
  4. Und klicken Sie auf die SaveSchaltfläche.

Es sollte die Berechtigung für alle Ihre Dateien neu zuweisen.

Geben Sie hier die Bildbeschreibung ein

Wie auch immer, hier ist voll bucket policy, was erlaubt, alle Objekte öffentlich zu machen

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.