Ja, ich denke, das wäre ein tolles Feature. Ich denke, das wäre ein neuer s3-Unterbefehl? Ich habe an einigen internen Änderungen am s3-Befehlscode gearbeitet, um das Hinzufügen von Unterbefehlen zu erleichtern. Ich habe dies verwendet, um den Befehl ls
umzugestalten, um mehrere der gemeldeten Probleme mit ls
zu beheben.
Noch nicht ganz fertig, aber das habe ich bisher:
https://github.com/jamesls/aws-cli/compare/s3-ls-permissions#diff -b88a66f4bd148577a9390cb980d7eeb9R321
Ja, das habe ich gesucht. Bitte erlauben Sie, den Ablauf nicht nur nach Dauer, sondern auch nach einem bestimmten Datum und Uhrzeit anzugeben. Benötigt man UTC-Zeitzone, ISO-Format, volle Sekunden, erscheint mir der String mit der Endung "Z" gut brauchbar (zB "2014-05-30T00:00:00Z").
Für den Fall, dass Sie wirklich tmpurl von der Befehlszeile aus generieren müssen, kann ich mein Befehlszeilentool s3tmpgen empfehlen
Jedenfalls würde ich solche Funktionen wirklich in AWS CLI einladen, die zu einem wertvollen Werkzeug für meine tägliche Arbeit mit AWS S3 wurden.
+1
+1
Ich möchte S3 verwenden, um Codepakete zu hosten, die in Heroku bereitgestellt werden sollen, und dies wäre eine großartige Funktion :)
https://blog.heroku.com/archives/2014/5/22/introducing_the_app_json_application_manifest
+1
+1 wäre toll, dies in AWS CLI . zu haben
Nur eine Anmerkung für jeden, der hier landet, Sie können dies trivial selbst tun, indem Sie in die boto
Bibliothek greifen: https://boto.readthedocs.org/en/latest/ref/s3.html#boto .s3.key.Key.generate_url
Danke für die Rückmeldung. Ich werde mir das ansehen, ich stimme zu, dass dies eine großartige Funktion wäre, die der AWS CLI hinzugefügt werden kann.
Danke, @johnboxall. Boto ist sicherlich eine Option, aber für Leute, die die cli-Binärdatei ohne native Python-Bereitstellungen bereitstellen (denken Sie an Windows-Benutzer), ist dieser Weg genauso viel Arbeit wie das Herunterziehen des PowerShell-SDK und das Ausführen von Dingen über das .NET-SDK. Würde diesen nativen immer noch gerne in der CLI sehen. :Grinsen:
Nur für alle, die Boto vorerst direkt verwenden möchten, bis dies zu aws-cli hinzugefügt wird, dachte ich, ich würde eine kurze Beispielanweisung hinzufügen. Ich habe jetzt ein paar Mal danach gesucht und hätte es lieber zusammen mit diesem Ticket und @johnboxall- Kommentar. Dies mag für einige extrem offensichtlich sein, aber nicht für Nicht-Python-Entwickler
Auf einer Box, auf der bereits Python installiert ist
$ python --version
Python 2.7.6
$ sudo pip install boto
$ python
>>> import boto
>>> s3 = boto.connect_s3()
>>> bucket = s3.get_bucket('your-bucket-name')
>>> key = bucket.get_key('the-prefix/the-name-of-the-object.mp4')
>>> key.generate_url(3600)
'https://your-bucket-name.s3.amazonaws.com/the-prefix/the-name-of-the-object.mp4?Signature=CgDfFa45DBXFiMfASxSTpiSuHKM%3D&Expires=1415913273&AWSAccessKeyId=ABCDEDKSY344ACVDG'
Aufbauend auf dem Beispiel von @isleshocky77 ... Hinzufügen von Argumenten und kleiner Fehlerprüfung:
$ cat boto-get-signed-url.py
#!/usr/bin/python
import boto
import argparse
parser = argparse.ArgumentParser(description='Generate an S3 signed URL')
parser.add_argument('-b', '--bucket', help='bucket name')
parser.add_argument('-k', '--key', help='prefix/key')
parser.add_argument('-s', '--seconds', type=int, help='time in seconds until the URL will expire')
args = parser.parse_args()
s3 = boto.connect_s3()
bucket = s3.get_bucket(args.bucket)
key = bucket.get_key(args.key)
if bucket.get_key(args.key):
print key.generate_url(args.seconds)
else:
print 's3://' + args.bucket + '/' + args.key + ' does not exist'
$ ./boto-get-signed-url.py -b superbucket -k "test" -s 60
https://superbucket.s3.amazonaws.com/test?Signature=n6cO8RH%2FbNwQhuZVNNazo3q04x0%3D&Expires=1416695021&AWSAccessKeyId=AKIEXAMPLEKEYNOTREAL
$ boto-get-signed-url.py --help
usage: boto-get-signed-url.py [-h] [-b BUCKET] [-k KEY] [-s SECONDS]
Generate an S3 signed URL
optional arguments:
-h, --help show this help message and exit
-b BUCKET, --bucket BUCKET
bucket name
-k KEY, --key KEY prefix/key
-s SECONDS, --seconds SECONDS
time in seconds until the URL will expire
Hallo zusammen
Nach einer weiteren Überprüfung des Status dieses Problems habe ich das Python-Paket ttr.aws.utils.s3 aktualisiert und das Tool s3tmpgen bereitgestellt . Das Update ermöglicht es, die URL nicht nur über https zu generieren, sondern (mit Option an -http
) auch über http.
Ich freue mich immer noch darauf, dies durch die awscli-Lösung zu ersetzen.
:+1:
+1 für s3-signierte URL, um Teil von cli . zu sein
:+1:
+1
Ich denke, ich verstehe, warum es so lange dauert: Die Dinge müssen der Reihe nach passieren und das Gute ist, es sieht so aus, als ob es auf der Roadmap steht.
Da AWS CLI auf botocore
basiert, soll es dort zuerst aufgelöst werden. boto/botocore#291 fragt danach.
Pull Request boto/botocore#504 wurde bereits in Branch clients-only
und die Roadmap (erwähnt in README unter https://github.com/boto/botocore ) behauptet, botocore ist derzeit nur ein Schritt vor der Zusammenführung des Branch clients-only
in die Entwicklung ein (dann haben Beta, GA und AWS CLI ein "natives" Tool, um uns Funktionen bereitzustellen).
@vlcinsky
Ja, sobald der Nur-Client-Zweig mit botocore zusammengeführt wird, können wir die Generierung von signierten URLs in der CLI übernehmen. Dann besteht der Hauptarbeitsaufwand auf der CLI-Seite darin, eine gute API zu erstellen, die die Funktion verfügbar macht.
https://github.com/boto/botocore/issues/291 wurde bereits am 23. Juni geschlossen: "Das Feature ist derzeit in botocore verfügbar."
:+1: wäre in der Tat ein praktisches Feature
+1
Wie @kyleknap anmerkte, besteht eine der
Ich sehe folgende Anwendungsfälle:
Das "tmpGET" ist wirklich einfach, da die einzige Ausgabe die URL ist und die einzige Eingabe Bucket/Schlüssel und Ablaufdatum ist
Datum (Ablaufzeit).
Der "tmpPOST" ist viel komplexer, da man eine Richtlinie zum Posten definieren muss.
Eine zu klärende Frage ist, wo diese Aktionen platziert werden sollen. Es scheint zwei Alternativen zu geben:
aws s3
aws s3api
Ich werde mich heute nicht mit dem komplexeren "tmpPOST" beschäftigen und mich auf das einfachere "tmpGET" konzentrieren
aws s3 tmpurl
hinzufügenEine solche Lösung wäre relativ einfach zu implementieren, würde in 80% der realen Fälle helfen
Nutzungssituationen (veröffentlichen Sie ein Objekt in AWS S3 und geben Sie eine temporäre URL zum Teilen an
mit jemandem).
Das Konzept würde auf bestehenden aws s3 ls
mit folgenden Unterschieden aufbauen:
--expires
, um das Datum und die Uhrzeit zu definieren, zu der die URL abläuft, oder --expires-in
zuIch fürchte, es gibt derzeit keine einfache Möglichkeit, eine tmp-URL für den genauen Zeitpunkt zu erstellen, also initial
Version würde nur die Option --expires-in
mit dem Standardwert von 3600 Sekunden anbieten.
Es ist sehr einfach, eine Reihe von tmp-URLs für eine Reihe vorhandener Objekte in AWS S3 zu erstellen. Es spart die
Hürde beim Abrufen genauer Bucket-/Schlüsselnamenwerte.
Der Nachteil dieses aws s3 ls
basierten Ansatzes ist, dass man keine tmp-URL für ein Objekt erstellen kann, was
existiert noch nicht.
Wie auch immer, dies könnte später durch aws s3api
Lösung gelöst werden.
Sehr schön dort hingestellt. Während ein Post mit ziemlicher Sicherheit um eine serverseitige Verarbeitung der geposteten Daten herum aufgebaut ist, sind die Anwendungsfälle der Get-Methode normalerweise viel einfacher. Wenn Sie sagen, dass dies die meisten Anwendungsfälle abdecken würde, stimme ich Ihnen voll und ganz zu.
Ich wollte jedoch hinzufügen, dass die temporäre URL meiner Meinung nach nichts mit dem Auffinden der Dateien auf s3 zu tun haben sollte. Wenn jemand ganze Sätze von signierten URLs generieren möchte, muss die cli logischerweise nicht mehr tun, um zu umbrechen. Das tmpurl-Primitive ist meiner Meinung nach das Minimum Viable Product.
Ich habe eine (nicht vollständig) vorsginierte URL für s3-Objekte in meinem lokalen Zweig implementiert.
https://github.com/quiver/aws-cli/tree/s3-presigned-url
Dies ist ein dünner Wrapper für botocore.generate_presigned_url
, und er ist noch nicht produktionsreif. Wie @vlcinsky bemerkte, brauchen wir ein gutes API-Design als AWSCLI
. Sobald das behoben ist, kann ich das implementieren.
Eine Sache, die mir auffällt, ist, dass generate_presigned_url
Parameter client_method
generate_presigned_url
erfordert, der die S3-API (zB get_object
) zum Signieren angibt. In meiner aktuellen Implementierung ist es für den Benutzer sichtbar, aber es wäre besser, benutzerfreundlich zu sein, wie die Bereitstellung verschiedene Unterbefehle ( aws s3 geturl
, aws s3 uploadurl
) oder Switch - Optionen ( --type upload
)
$ echo hello world > test.txt
$ aws s3 url s3://BUCKET/test.txt --client-method put_object --expires-in 180
https://BUCKET.s3.amazonaws.com/test.txt?AWSAccessKeyId=AKIAIXXXXXXXXXXXXXXX&Expires=1451449621&Signature=KgwO9lBx942fFvln0JW0NX7mKS0%3D
$ URL=`aws s3 url s3://BUCKET/test.txt --client-method put_object --expires-in 180`
$ curl -D - -X PUT --upload-file test.txt $URL
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
x-amz-id-2: /90B1axPysBg3P8kv8BlR8RoqdO1JfajCN5BM5/TxIT3VjGphKmyGX8EgCQEtCXYhuNkVne5+GM=
x-amz-request-id: 685F03CA6C84FAC0
Date: Wed, 30 Dec 2015 05:18:38 GMT
ETag: "6f5902ac237024bdd0c176cb93063dc4"
Content-Length: 0
Server: AmazonS3
$ aws s3 cp s3://BUCKET/test.txt -
hello world
$ URL=`aws s3 url s3://BUCKET/test.txt --client-method get_object --expires-in 180`
$ curl -D - -X GET $URL
HTTP/1.1 200 OK
x-amz-id-2: WuRokcBm9wnDMaRkD8kNeGijuKEzVp3eagi7JbpPXmmchEljsiP4wZX5w1TaeuK94n2526FGKMI=
x-amz-request-id: 1EBCAA7A691A577D
Date: Wed, 30 Dec 2015 05:20:14 GMT
Last-Modified: Wed, 30 Dec 2015 05:19:15 GMT
ETag: "6f5902ac237024bdd0c176cb93063dc4"
Accept-Ranges: bytes
Content-Type: binary/octet-stream
Content-Length: 12
Server: AmazonS3
hello world
Das obige Python generiert eine URL wie: 'https://
Wenn ich versuche, die Datei zu kräuseln, erhalte ich ein Problem mit dem SSL-Zertifikat: Ungültige Zertifikatskette
Wenn ich mit Option -k curle, kann ich das überstehen , aber ich weiß auch, dass wenn die URL so aussieht: '
Das Zertifikat ist gültig, gibt es eine Möglichkeit, die URL zu ändern oder einen anderen Fix?
Vielen Dank,
Garry
zB: ' https://s3-us-west-1.amazonaws.com/bucket/dir/dir/file '
Update, mit boto3 konnte die korrekt signierte URL generiert werden.
+1
Beeindruckend - in 3 Jahren hat das offizielle CLI-Tool keine Unterstützung für signierte URLs erhalten, obwohl es in boto und s3cmd existiert
1+
+1
+1
Gibt es hierzu Neuigkeiten? Überrascht, dass dies noch nicht verfügbar ist.
+1
Ich habe einen als Workaround geschrieben und funktioniert wie erwartet: https://github.com/gdbtek/aws-tools
Hallo zusammen, danke für die Rückmeldung. Dies ist etwas, das in unserem Rückstand ist. Ich habe noch keine genauen Daten, aber ich werde auf dieses Problem verlinken, sobald wir eine Pull-Anfrage haben.
Groß! Danke!
Ist es möglich, eine vorsignierte URL für einen gesamten s3-Ordner zu erhalten? Inklusive Webinterface zum Navigieren durch den Ordner?
@tommeda Nicht möglich. Eine vorsignierte URL bezieht sich immer auf ein einzelnes gespeichertes Objekt. Worüber Sie sprechen, ähnelt einer statischen Website, aber um den Zugriff darauf zu kontrollieren (wenn sie auf AWS S3 basiert), muss man einen Proxy schreiben. Es gibt bereits wenige Versuche, keiner schien mir (vor ca. einem Jahr recherchiert) leicht zu handhaben.
Sie können jederzeit eine Webseite generieren, die eine Schnittstelle zu jedem Objekt bereitstellt und vorsignierte URLs für jedes Objekt enthält, und dann die Schnittstelle in s3 einfügen und eine vorsignierte URL an die Schnittstelle zurückgeben. Nicht gerade easy peasy, und die Benutzeroberfläche wäre gerne nutzungsspezifisch
Hilfreichster Kommentar
Beeindruckend - in 3 Jahren hat das offizielle CLI-Tool keine Unterstützung für signierte URLs erhalten, obwohl es in boto und s3cmd existiert