So machen Sie 10.000 Dateien in S3 öffentlich

92

Ich habe einen Ordner in einem Eimer mit 10.000 Dateien. Es scheint keine Möglichkeit zu geben, sie hochzuladen und sofort öffentlich zu machen. Also habe ich sie alle hochgeladen, sie sind privat und ich muss sie alle öffentlich machen.

Ich habe die aws-Konsole ausprobiert, sie gibt nur einen Fehler aus (funktioniert gut mit Ordnern mit weniger Dateien).

Ich habe versucht, S3 in Firefox zu organisieren.

Gibt es eine Software oder ein Skript, das ich ausführen kann, um all diese öffentlich zu machen?

PeterV
quelle
4
Jedes Tool, das ich ausprobiert habe, stürzte ab, und so schrieb ich ein PHP-Skript, das einige Stunden dauerte. Ich durchlief einfach jedes Objekt im Bucket und machte es öffentlich.
PeterV

Antworten:

119

Sie können eine Bucket-Richtlinie generieren (siehe Beispiel unten), die den Zugriff auf alle Dateien im Bucket ermöglicht. Die Bucket-Richtlinie kann über die AWS-Konsole zu einem Bucket hinzugefügt werden.

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

Schauen Sie sich auch das folgende von Amazon bereitgestellte Tool zur Richtliniengenerierung an.

http://awspolicygen.s3.amazonaws.com/policygen.html

Rajiv
quelle
5
Das hat bei mir nicht funktioniert. Einige Objekte geben auch bei aktivierter Bucket-Richtlinie die Antwort "Zugriff verweigert" zurück. Es wird von oben kopiert, wobei nur der Bucket-Name geändert wird. Ich denke, es ist Zeit, ein Skript zu schreiben, um alle 1,3 Millionen Objekte zu durchlaufen ... irgendwie irritierend
Blake Miller
Sie müssen "Eimer" in den Namen Ihres Eimers
ändern
11
Ich lehne es ab, es so machen zu müssen. Das ist ein hässlicher JSON.
Superluminary
6
Nur eine Anmerkung: Es mag offensichtlich erscheinen, aber Sie können auch den Zugriff auf bestimmte Ordner beschränken : bucket/avatars/*. (Vergessen Sie das *am Ende nicht. Ich habe es getan und bin eine Weile im Kreis
herumgelaufen
2
@Benjamin Was für Sie "grundlegende" Konfiguration ist, ist für andere ungeeignet, da die Sicherheitsanforderungen aller unterschiedlich sind. AWS bietet eine einheitliche Möglichkeit zum Anpassen dieser Richtlinien. Daher muss man sich die Zeit nehmen, um die Sicherheitsrichtlinien richtig zu lernen und sich nicht vor ein paar einfachen Zeilen von JSON zu scheuen.
Afilina
68

Wenn Sie zum ersten Mal hochladen, können Sie festlegen, dass die Dateien beim Hochladen in der Befehlszeile öffentlich sind:

aws s3 sync . s3://my-bucket/path --acl public-read

Wie unter Verwenden von s3-Befehlen auf hoher Ebene mit der AWS-Befehlszeilenschnittstelle dokumentiert

Leider wird die ACL nur angewendet, wenn die Dateien hochgeladen werden. Die ACL wird (in meinen Tests) nicht auf bereits hochgeladene Dateien angewendet.

Wenn Sie vorhandene Objekte aktualisieren möchten, konnten Sie den Bucket früher mit sich selbst synchronisieren, dies scheint jedoch nicht mehr zu funktionieren.

[Funktioniert nicht mehr] Dies kann über die Befehlszeile erfolgen:

aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read

(Dies beantwortet also nicht mehr die Frage, sondern lässt die Antwort als Referenz, wie es früher funktioniert hat.)

David Roussel
quelle
Wird dieser Befehl für Dateien ausgeführt, die bereits hochgeladen, aber noch nicht öffentlich gelesen wurden?
Alston
10
Als ich es getestet habe, scheint es die ACL nur neu synchronisierten Dateien hinzuzufügen.
David Roussel
Vielen Dank für die Wiederholung, ich habe es auch getestet. Gibt es Möglichkeiten, die Berechtigung hochgeladener Dateien stapelweise zu ändern?
Alston
Oh, kein Wunder. Das hat mich verwirrt. Wirklich geschätzt, dass Sie klarstellen.
Sridhar Sarnobat
Die Antwort wurde aktualisiert und enthält nun Informationen zum Ändern vorhandener Dateien.
David Roussel
34

Ich musste mehrere hunderttausend Objekte wechseln. Ich habe eine EC2-Instanz gestartet, um dies auszuführen, wodurch alles schneller geht. Sie möchten aws-sdkzuerst den Edelstein installieren .

Hier ist der Code:

require 'rubygems'
require 'aws-sdk'


# Change this stuff.
AWS.config({
    :access_key_id => 'YOURS_HERE',
    :secret_access_key => 'YOURS_HERE',
})
bucket_name = 'YOUR_BUCKET_NAME'


s3 = AWS::S3.new()
bucket = s3.buckets[bucket_name]
bucket.objects.each do |object|
    puts object.key
    object.acl = :public_read
end
Daniel Von Fange
quelle
1
Die einfache Möglichkeit besteht darin, sie mit dem zuerst gesetzten Flag public_read hochzuladen. Andernfalls ist dies eine gute Option.
Superluminary
Dieser Code ist veraltet, siehe meine Antwort
ksarunas
26

Ich hatte das gleiche Problem, die Lösung von @DanielVonFange ist veraltet, da die neue Version des SDK nicht mehr verfügbar ist.

Hinzufügen eines Code-Snippets, das derzeit für mich mit AWS Ruby SDK funktioniert:

require 'aws-sdk'

Aws.config.update({
  region: 'REGION_CODE_HERE',
  credentials: Aws::Credentials.new(
    'ACCESS_KEY_ID_HERE',
    'SECRET_ACCESS_KEY_HERE'
  )
})
bucket_name = 'BUCKET_NAME_HERE'

s3 = Aws::S3::Resource.new
s3.bucket(bucket_name).objects.each do |object|
  puts object.key
  object.acl.put({ acl: 'public-read' })
end
ksarunas
quelle
1
Fantastische Antwort - genau das Drehbuch, das ich auf engstem Raum brauchte
Phantomwal
@ksarunas In meinem Fall muss ich die öffentlichen in private Berechtigungen ändern. Ersetzen Sie also public-read durch private, und der Zugriff wurde geändert. Kann ich trotzdem auf die URL zugreifen?
Rahul
19

Ich wollte nur hinzufügen, dass Sie mit der neuen S3-Konsole Ihre Ordner auswählen und auswählen können Make public, um alle Dateien in den Ordnern öffentlich zu machen. Es funktioniert als Hintergrundaufgabe und sollte daher eine beliebige Anzahl von Dateien verarbeiten.

Veröffentlichen

Selcuk
quelle
5
Leider dauert es lange und Sie können den Browser nicht schließen, während der Befehl ausgeführt wird. Ihr Browser sendet 2 Anfragen für jede Datei, in meinem Fall dauerten die beiden Anfragen 500 ms. Wenn Sie viele Dateien haben, wird es lange dauern = (
Herlon Aguiar
2
Und es gibt noch ein anderes Problem: Dies wird vollständig öffentlich gemacht. Wenn Sie nur öffentlich lesbaren Zugriff wünschen, ist dies ein Problem.
Marcelo Agimóvel
SEHR BEWUSSTSEIN - Ich habe dies öffentlich gemacht und der "Fortschrittsbalken", der auftaucht, ist so subtil, dass ich dachte, es wäre getan. Ich habe nachgesehen und wahrscheinlich eine Stunde daran gearbeitet, bevor mir klar wurde, dass Sie auf "Öffentlich machen" klicken und ein kleiner subtiler "Fortschrittsbalken wird angezeigt" ... grrr ... da ich das Browserfenster ungefähr 10 Mal geschlossen habe, gehe ich davon aus, dass es jedes Mal getötet wurde . Ich lasse es jetzt laufen - es ist ziemlich schnell - vielleicht 20 Minuten für 120.000 Bilder
Scott
11

Verwenden der cli:

aws s3 ls s3://bucket-name --recursive > all_files.txt && grep .jpg all_files.txt > files.txt && cat files.txt | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'

Alexander Vitanov
quelle
3
Könnten Sie nicht einfach eine Pipe zum Grepen verwenden, anstatt mit allen files.txt auf die Festplatte zu schreiben? Dies kann seinaws s3 ls s3://bucket-name --recursive | grep .jpg | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'
Sakurashinken
2

Werfen Sie einen Blick auf BucketExplorer es Bulk - Operationen sehr gut verwaltet und ist ein solides S3 - Client.

willbt
quelle
3
Es ist jetzt auch möglich, Berechtigungen in Cyberduck (kostenlos) über die Info-Palette zu ändern.
Taylor Edmiston
BucketExplorer ist nur nützlich, wenn Sie die Berechtigung haben, alle Buckets aufzulisten. Es ist viel besser, die CLI oder ein SDK für diesen Vorgang zu verwenden und Ihren Benutzern eingeschränkte Berechtigungen zu überlassen.
Perilandmishap
2

Hatte das ich selbst gebraucht, aber die Anzahl der Dateien macht es viel zu langsam, um seriell zu tun. Also habe ich ein Skript geschrieben , das dies im IronWorker - Dienst von iron.io tut . Die 500 kostenlosen Rechenstunden pro Monat reichen aus, um auch große Eimer zu bewältigen (und wenn Sie diese überschreiten, ist der Preis angemessen). Da es parallel ausgeführt wird, ist es für die 32.000 Objekte, die ich hatte, in weniger als einer Minute abgeschlossen. Ich glaube auch, dass ihre Server auf EC2 laufen, so dass die Kommunikation zwischen dem Job und S3 schnell ist.

Jeder kann mein Skript für seine eigenen Bedürfnisse verwenden.

Eric Anderson
quelle
0

Sie würden denken, sie würden das Standardverhalten öffentlich lesen lassen, nicht wahr? :) Ich habe Ihre Frustration beim Erstellen einer benutzerdefinierten API für die Schnittstelle mit S3 aus einer C # -Lösung geteilt. Hier ist das Snippet, mit dem ein S3-Objekt hochgeladen und standardmäßig auf öffentlich lesbaren Zugriff gesetzt wird:

public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) {
     string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower());
     DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes);
     msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType;
     msg.Headers[DreamHeaders.EXPECT] = "100-continue";
     msg.Headers[AWS_ACL_HEADER] = ToACLString(acl);
     try {
        Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader);
        s3Client.At(id).Put(msg);
     } catch (Exception ex) {
        throw new ApplicationException(String.Format("S3 upload error: {0}", ex.Message));
     }
}

Die ToACLString (acl) -Funktion gibt public-read zurück , BASE_SERVICE_URL ist s3.amazonaws.com und die AWS_ACL_HEADER-Konstante ist x-amz-acl . Das Plug- und DreamMessage-Material wird für Sie wahrscheinlich seltsam aussehen, da wir das Dream-Framework verwenden, um unsere http-Kommunikation zu optimieren. Im Wesentlichen führen wir einen http-PUT mit den angegebenen Headern und einer speziellen Headersignatur gemäß aws-Spezifikationen durch (siehe diese Seite in den aws-Dokumenten Beispiele zum Erstellen des Autorisierungsheaders finden ).

Um vorhandene 1000 Objekt-ACLs zu ändern, können Sie ein Skript schreiben, aber es ist wahrscheinlich einfacher, ein GUI-Tool zu verwenden, um das unmittelbare Problem zu beheben. Das Beste, was ich bisher verwendet habe, stammt von einer Firma namens Cloudberry für S3. Es sieht so aus, als hätten sie eine kostenlose 15-Tage-Testversion für mindestens eines ihrer Produkte. Ich habe gerade überprüft, dass Sie damit mehrere Objekte gleichzeitig auswählen und ihre ACL über das Kontextmenü auf öffentlich setzen können. Genieße die Wolke!

Tahbaza
quelle