Aws-cli: Unterstützung der Generierung signierter URLs für den S3-Zugriff

Erstellt am 2. Nov. 2013  ·  40Kommentare  ·  Quelle: aws/aws-cli

feature-request

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

Alle 40 Kommentare

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:

Skript

$ 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'

Anwendungsbeispiel und Hilfe

$ ./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.

:+1: wäre in der Tat ein praktisches Feature

+1

Wie @kyleknap anmerkte, besteht eine der

Ich sehe folgende Anwendungsfälle:

  • "tmpGET": tmpurl für GET-Anfrage erstellen
  • "tmpPOST": tmpurl für POST-Anfrage erstellen
  • "tmp???": Gibt es eine weitere Methode zur Unterstützung? Ist mir nicht bekannt (und habe noch nie etwas anderes verwendet als
    GET und POST)

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

Schnelle Lösung: aws s3 tmpurl hinzufügen

Eine 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:

  • Fügen Sie eine Option --expires , um das Datum und die Uhrzeit zu definieren, zu der die URL abläuft, oder --expires-in zu
    Geben Sie die Anzahl der Sekunden bis zum Ablauf an
  • würde nur tmpurls ausgeben, eine Zeile pro aufgelistetem Objekt

Ich 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.

Vor-und Nachteile

Vorteile

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.

Nachteile

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 )

Verwendungszweck

Objekte auf S3 hochladen

$ 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

Hole Objekte von S3

$ 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://.s3.amazonaws.com/dir/dir/file

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: ' .amazonaws.com//dir/dir/datei'
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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen