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 :
$ 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
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é.
https://github.com/boto/botocore/issues/291 était déjà fermé le 23 juin : "La fonctionnalité est actuellement disponible dans botocore."
:+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 :
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
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 :
--expires
pour définir la date et l'heure d'expiration de l'url ou --expires-in
pourJ'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.
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é.
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
)
$ 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
Le python ci-dessus génère une URL comme : 'https://
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-
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
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