Aws-cli: Prise en charge de la génération d'URL signées pour l'accès S3

Créé le 2 nov. 2013  ·  40Commentaires  ·  Source: aws/aws-cli

feature-request

Commentaire le plus utile

Impressionnant - en 3 ans, l'outil CLI officiel n'a pas été pris en charge par l'URL signée, bien qu'il existe dans boto et s3cmd

Tous les 40 commentaires

Oui, je pense que ce serait une excellente fonctionnalité. Je pense que ce serait une nouvelle sous-commande s3 ? J'ai travaillé sur des modifications internes du code de commande s3 pour faciliter l'ajout de sous-commandes. J'ai utilisé cela pour commencer à refactoriser la commande ls pour résoudre plusieurs des problèmes signalés avec ls .

Pas encore tout à fait terminé, mais voici ce que j'ai pour l'instant :
https://github.com/jamesls/aws-cli/compare/s3-ls-permissions#diff -b88a66f4bd148577a9390cb980d7eeb9R321

Oui, c'est ce que je cherchais. S'il vous plaît, permettez de spécifier l'expiration non seulement par durée, mais également par une date-heure spécifique. Nécessitant fuseau horaire UTC, format ISO, secondes entières, la chaîne se terminant par "Z" me semble bien exploitable (ex "2014-05-30T00:00:00Z").

Au cas où vous auriez vraiment besoin de générer tmpurl à partir de la ligne de commande, je pourrais recommander mon outil de ligne de commande s3tmpgen

Quoi qu'il en soit, j'inviterais vraiment une telle fonctionnalité dans l'AWS CLI, qui est devenue un outil précieux pour mon travail quotidien avec AWS S3.

+1

+1

Je cherche à utiliser S3 pour héberger des bundles de code à déployer sur Heroku et ce serait une fonctionnalité géniale :)

https://blog.heroku.com/archives/2014/5/22/introducing_the_app_json_application_manifest

+1

+1 serait formidable d'avoir cela dans AWS CLI

Juste une note pour tous ceux qui se retrouvent ici, vous pouvez le faire vous-même de manière triviale en accédant à la bibliothèque boto : https://boto.readthedocs.org/en/latest/ref/s3.html#boto .s3.key.Key.generate_url

Merci pour les commentaires. Je vais y jeter un œil, je suis d'accord que ce serait une excellente fonctionnalité à ajouter à l'AWS CLI.

Merci, @johnboxall. Boto est certainement une option, bien que pour les personnes déployant le binaire cli sans déploiements Python natifs (pensez aux utilisateurs de Windows), suivre cette voie est tout autant de travail que de retirer le SDK PowerShell et de faire des choses via le SDK .NET. Voudrais toujours voir ce natif dans la CLI. :sourire:

Juste pour tous ceux qui cherchent à utiliser boto directement pour l'instant jusqu'à ce que cela soit ajouté à aws-cli, j'ai pensé que j'ajouterais un exemple d'instruction rapide. Je suis maintenant allé le chercher plusieurs fois et je préférerais l'avoir avec ce billet et le commentaire de @johnboxall . Cela peut être extrêmement évident pour certains, mais pas pour les développeurs non python

Sur une box sur laquelle python est déjà installé

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

S'appuyant sur l'exemple de @isleshocky77 ... en ajoutant des arguments et en vérifiant les erreurs mineures :

Scénario

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

Exemple d'utilisation et d'aide

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

salut tout le monde
Après une autre vérification de l'état de ce problème, j'ai mis à jour le package Python ttr.aws.utils.s3 en fournissant l'outil s3tmpgen . La mise à jour permet de générer l'url non seulement en https, mais (avec l'option -http ) également en http.

J'ai toujours hâte de remplacer cela par la solution awscli.

:+1:

+1 pour que l'URL signée s3 fasse partie de cli

:+1:

+1

Je pense, je comprends, pourquoi cela prend autant de temps : les choses doivent se passer dans l'ordre et heureusement, on dirait qu'on est sur la feuille de route.

Comme l'AWS CLI est basé sur botocore , il doit d'abord y être résolu. boto/botocore#291 le demande.

La demande de tirage boto/botocore#504 a déjà été fusionnée dans la branche clients-only et la feuille de route (mentionnée sur README à https://github.com/boto/botocore ), botocore n'est actuellement qu'une étape avant de fusionner la branche clients-only en développement (alors beta, GA et AWS CLI ont un outil "natif" pour nous fournir des fonctionnalités).

@vlcinsky

Oui, une fois que la branche réservée aux clients sera fusionnée dans botocore, nous pourrons récupérer la génération d'URL signées dans la CLI. Ensuite, la principale quantité de travail qui devrait être effectuée du côté de la CLI consiste à créer une bonne API qui expose la fonctionnalité.

:+1: serait une fonctionnalité pratique en effet

+1

Comme @kyleknap l'a noté, l'une des choses à faire est de concevoir une bonne API pour cette fonctionnalité.

Je vois les cas d'utilisation suivants :

  • "tmpGET" : créer tmpurl pour la requête GET
  • "tmpPOST" : créer tmpurl pour la requête POST
  • "tmp???": existe-t-il une autre méthode à prendre en charge ? Je ne connais pas (et n'ai jamais utilisé d'autre
    GET et POST)

Le "tmpGET" est vraiment facile car la seule sortie est l'URL et la seule entrée est bucket/key et expiration
date (heure d'expiration).

Le "tmpPOST" est beaucoup plus complexe car il faut définir une politique de publication.

Une question à résoudre est, où mettre ces actions, il semble y avoir deux alternatives :

  • aws s3
  • aws s3api

Je ne traiterai pas aujourd'hui du "tmpPOST" plus complexe et me concentrerai sur le "tmpGET" plus simple

Solution rapide : ajoutez aws s3 tmpurl

Une telle solution serait assez simple à mettre en œuvre, aiderait dans 80% des cas réels
situations d'utilisation (publier un objet sur AWS S3 et fournir une URL temporaire à partager
avec quelqu'un).

Le concept s'appuierait sur les aws s3 ls existants avec les différences suivantes :

  • ajouter une option --expires pour définir la date et l'heure d'expiration de l'url ou --expires-in pour
    spécifier le nombre de secondes jusqu'à l'expiration
  • ne produirait que des tmpurls, une ligne par objet répertorié

J'ai bien peur qu'il n'y ait actuellement aucun moyen facile de créer une URL tmp pour un moment précis, donc initial
La version n'offrirait que l'option --expires-in avec une valeur par défaut de 3600 secondes.

Avantages et inconvénients

Avantages

Il est très facile de créer un ensemble d'URL tmp pour le nombre d'objets existants sur AWS S3. Il sauve le
obstacle à l'obtention des valeurs exactes des noms de compartiment/clé.

Les inconvénients

L'inconvénient de cette approche basée sur aws s3 ls est qu'on ne peut pas créer d'url tmp pour un objet, ce qui
n'existe pas encore.

Quoi qu'il en soit, cela pourrait être résolu plus tard par la solution aws s3api .

Très joliment mis là. Alors qu'un message est quelque chose qui serait presque certainement construit autour d'une certaine gestion côté serveur des données publiées, les cas d'utilisation de la méthode get sont généralement beaucoup plus faciles. Quand vous dites que cela couvrirait la plupart des cas d'utilisation, je suis tout à fait d'accord.

Je voulais ajouter cependant, je ne pense pas que l'URL temporaire devrait avoir quoi que ce soit à voir avec la localisation des fichiers sur s3. Si quelqu'un veut générer des ensembles entiers d'URL signées, c'est logique que le cli n'a pas besoin d'en faire plus pour encapsuler. La primitive tmpurl est le produit minimum viable dans mon esprit.

J'ai implémenté (pas entièrement) une URL prédéfinie pour les objets s3 dans ma branche locale.

https://github.com/quiver/aws-cli/tree/s3-presigned-url

Il s'agit d'une enveloppe mince pour botocore.generate_presigned_url , et elle n'est pas encore prête pour la production. Comme @vlcinsky l'a noté, nous avons besoin d'une bonne conception d'API en tant que AWSCLI . Une fois que c'est corrigé, je peux l'implémenter.

Une chose que je note est que generate_presigned_url nécessite le paramètre client_method , qui spécifie l'API S3 (par exemple get_object ) pour laquelle signer. Dans mon implémentation actuelle, il est exposé à l'utilisateur, mais il serait préférable d'être convivial, comme fournir différentes sous-commandes( aws s3 geturl , aws s3 uploadurl ) ou changer d'option( --type upload )

Usage

télécharger des objets sur S3

$ 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

obtenir des objets de 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

Le python ci-dessus génère une URL comme : 'https://.s3.amazonaws.com/dir/dir/file

Lorsque j'essaie de boucler le fichier, j'obtiens un problème de certificat SSL : chaîne de certificat invalide
Si je boucle avec l'option -k, je peux passer outre, mais je sais aussi que si l'url ressemble à : ' https://s3-.amazonaws.com//rép/rép/fichier'
le certificat est valide, existe-t-il un moyen de modifier l'URL ou un autre correctif?
Merci,
Garry

par exemple : ' https://s3-us-west-1.amazonaws.com/bucket/dir/dir/file '

Mise à jour, l'utilisation de boto3 a permis de générer l'url correctement signée.

+1

Impressionnant - en 3 ans, l'outil CLI officiel n'a pas été pris en charge par l'URL signée, bien qu'il existe dans boto et s3cmd

1+

+1

+1

Une mise à jour pour ceci? Surpris que ce ne soit pas encore disponible.

+1

J'en ai écrit une comme solution de contournement et fonctionne comme prévu : https://github.com/gdbtek/aws-tools

Salut à tous, merci pour le retour. C'est quelque chose qui est dans notre arriéré. Je n'ai pas encore de dates exactes, mais je ferai un lien vers ce problème une fois que nous aurons une demande d'extraction.

Super! Merci !

Est-il possible d'obtenir une URL présignée vers un dossier s3 entier ? Y compris une interface Web pour naviguer dans le dossier ?

@tommeda Pas possible. l'url pré-signée est toujours liée à un seul objet stocké. Ce dont vous parlez est similaire à un site Web statique, mais pour en contrôler l'accès (s'il est basé sur AWS S3), il faut écrire un proxy. Peu de tentatives existent déjà, aucune ne m'a semblé (recherchée il y a environ un an) facile à faire.

Vous pouvez toujours générer une page Web fournissant une interface et des URL pré-signées pour chaque objet, puis mettre l'interface dans s3 et renvoyer une URL pré-signée à l'interface. Pas vraiment facile, et l'interface aimerait être spécifique à l'utilisation

Cette page vous a été utile?
0 / 5 - 0 notes