2013-04-10 6 views
3

J'écris un petit script pour localiser un fichier spécifique dans un compartiment sur aws et créer une URL temporairement authentifiée à envoyer à mes collègues. (Idéalement, cela créerait un résultat similaire à un clic droit sur un fichier dans un compartiment de la console et en copiant l'adresse du lien).Comment générer une URL sécurisée pour télécharger un fichier à partir de s3 en utilisant Ruby aws/s3 Gem

J'ai regardé dans un trombone, qui ne semble pas répondre à ce critère, mais je ne pouvais tout simplement pas être conscient de ses capacités complètes.

J'ai essayé les éléments suivants:

def authenticated_url(file_name, bucket) 
    AWS::S3::S3Object.url_for(file_name, bucket, :secure => true, :expires => 20*60) 
end 

qui a produit ce type de résultat:

...-1.amazonaws.com/file_path/file.zip.AWSAccessKeyId={key}Expires=1200&Signature={...}

Y at-il un moyen de créer une URL sécurisée plus similaire au scénario décrit ci-dessus qui pourrait être simplement envoyé en tant que lien? Sinon, toute alternative sécurisée serait la bienvenue.

Répondre

6

Ce dont vous avez besoin est appelé "lien symbolisé". Heureusement, il est intégré dans la gemme aws-sdk que vous utilisez.

Voici une question précédente qu'une solution, vous pouvez utiliser:

How to store data in S3 and allow user access in a secure way with rails API/iOS client?

Cependant, c'est une solution Rails qui a la fantaisie Rails auxiliaires de temps comme 20.minutes.from_now. Vous pouvez soit définir la date d'expiration à une date spécifique en ajoutant un nombre spécifique de secondes à l'heure actuelle comme Time.now.to_i + (20 * 60), ou inclure les helpers de temps ActiveSupport dans votre script ruby ​​avec require 'active_support/core_ext/numeric/time'. Cela permettra aux choses 20.minutes.from_now de fonctionner.

De plus, vous aurez besoin de toute la gemme aws-sdk, et pas seulement de la pièce S3.

+0

Merci pour la direction, mais j'obtiens "NoMethodError: méthode indéfinie' minutes 'pour 20: Fixnum "quand j'exécute cette solution, et par la suite" NoMethodError: méthode non définie 'url_for'" quand j'enlève minutes.from_now. Est-ce parce que j'utilise "require 'aws/s3'" et "require 'aws-sdk'"? (Je m'excuse si c'est une question novice, je suis encore très novice, j'apprécie votre patience) – LFoos24

+0

Ah, j'ai manqué où c'était un script, et non Rails. Laissez-moi essayer certaines choses et je mettrai à jour ma réponse. – messick

Questions connexes