2011-10-07 5 views
3

J'ai quelques fichiers dans mon compartiment S3. Est-il possible de les partager avec des utilisateurs sélectionnés. Ces personnes n'ont peut-être pas de compte Amazon S3. Je sais que si je le rendais public, tout le monde pourrait télécharger les fichiers en utilisant l'URL.Est-il possible de partager des fichiers pour des utilisateurs sélectifs utilisant Amazon S3?

Je veux quelque chose comme une URL cryptée ou une URL qui demande un nom d'utilisateur et mot de passe immédiatement quand il a été frappé.

Et aussi je ne veux pas installer de nouveaux logiciels/tierce partie à installer par tout le monde.

Merci

Répondre

6

Absolument.

Vous pouvez créer vos fichiers private, puis générer time expiring signed urls à vos fichiers.

Les URLs signés sont générés à l'aide de votre clé publique et de votre clé secrète et sont définis pour expirer à une heure spécifiée dans le futur.

Selon la technologie que vous utilisez, il est probablement plus facile de générer les URL en utilisant l'un des AWS SDKS.

urls signés ressemblent à:

http://[bucket].s3.amazonaws.com/[key]?AWSAccessKeyId=[AWS_Public_Key]&Expires=1294766482&Signature=[generated_hash] 

J'explique un peu plus sur ces urls dans this answer.

0

Voici un exemple de code ruby ​​pour générer des URL signées pour un emplacement particulier dans votre compartiment.

Installer aws-sdk:

gem install aws-sdk 

Créer un nouveau fichier, nommez-le comme vous voulez, je choisis shareS3files.rb voir sur gist.github.com:

#!/usr/bin/env ruby 

require 'aws-sdk' 
require 'json' 

#loading credentials 
creds = JSON.load(File.read('secrets.json')) 
creds = Aws::Credentials.new(creds['AccessKeyId'], creds['SecretAccessKey']) 

#loading config 
conf = JSON.load(File.read('config.json')) 

# Create a new S3 object 
s3 = Aws::S3::Client.new(credentials: creds, region: conf['Region']) 

# Create a resource object, simpler to use 
resource = Aws::S3::Resource.new(client: s3) 
bucket = resource.bucket(conf['Bucket']) 

# enumerate every object in a bucket, and create a pre signed url with a 5 days expiration limit 
bucket.objects(prefix: 'conf['Location']').each do |obj| 
    puts "#{obj.key} => #{obj.object.presigned_url(:get, expires_in: 5 * 24 * 60 * 60)}" 
end 

Maintenant, créez deux fichiers d'informations d'identification et de configuration:

secrets.json:

{ 
    "AccessKeyId": "TOCHANGE", 
    "SecretAccessKey": "TOCHANGE" 
} 

config.json:

{ 
    "Region": "TOCHANGE", 
    "Bucket": "tochange", 
    "Location": "to/change/" 
} 

D'autres aws et doc rubis:

Questions connexes