2010-10-27 7 views
5

Afin d'éviter la liaison à chaud, la sangle de bande passante S3, etc Je voudrais rendre mon seau privé et servir les fichiers via une application Rails. Concept en général semble très facile, mais je ne suis pas tout à fait sûr quelle approche serait la meilleure pour la situation. J'utilise un trombone pour la gestion générale des biens. Y a-t-il un moyen intégré de réaliser ce type de proxy?Comment proxy des fichiers à partir de S3 via l'application rails pour éviter le sang?

En général, je peux facilement analyser les URL du trombone et les renvoyer à mon propre contrôleur. Que devrait-il se passer à partir de ce point? Dois-je simplement utiliser Net :: HTTP pour télécharger l'image, puis la servir avec send_data? Entre les deux je veux enregistrer le referer et définir les en-têtes Control-Cache appropriés, puisque j'ai un reverse-proxy en face de l'application. Est-ce que Net :: HTTP + send_data est resonable dans ce cas?

Peut-être que toutes les idées sont vraiment mauvaises pour certaines raisons que je ne suis pas au courant en ce moment? Je général Je crois que les liens S3 délectant directs au seau public est dangereux et le rendement dans certains problèmes graves en cas de sangsues/chaud reliant ...

Mise à jour:

Si vous avez d'autres idées qui peuvent Réduire la facture S3 et éviter les sangsues hot-link de toute façon s'il vous plaît partager, même si elles ne sont pas directement liées à Rails.

+0

Avez-vous actuellement un problème avec le sang? Je serais réticent à faire quelque chose qui ralentira considérablement ma demande, juste pour résoudre un problème que je pourrais avoir à l'avenir. – mikerobi

+0

Il ne s'agit pas seulement de résoudre un problème potentiel. Je ne veux juste pas me réveiller un jour avec une facture S3 écrasante, que je ne peux pas me permettre de payer ... Je ne suis pas sûr, si cela va ralentir l'application "de façon spectaculaire", quand les actifs resteront en memcache/reverse Procuration. – mdrozdziel

Répondre

1

J'éviterais probablement de faire ceci - au moins jusqu'à ce que je n'aurais aucun autre choix.

Vous devez également tenir compte du fait que vous ajouterez probablement à la facture de bande passante si vous téléchargez l'image à chaque fois. De plus, en traitant chaque image à travers un script, vous aurez besoin de plus de CPU et de RAM pour cela. Pas la plus grande perspective - IMHO.

Je voudrais probablement enable the access logs pour Amazon S3 et écrire un outil de petite taille pour analyser l'utilisation et modifier les autorisations sur le compartiment/l'objet au cas où l'utilisation irait sur le toit. Exécutez ceci comme un cronjob toutes les 10 minutes et vous devriez être sauvé?

Vous pouvez également utiliser s3stat. Ils offrent également un plan gratuit. Selon ma recommandation pour Vernis, j'ajoute un lien vers a blog entry about preventing hotlinking using Varnish.

+1

Je connais les inconvénients bien sûr, c'est pourquoi je demande une idée de solution. En général, ce n'est pas si grave. Gardez à l'esprit que les images peuvent être largement encaissées dans la plupart des cas. Tout en faisant quelques recherches, je suis arrivé à une conclusion, que le moyen le plus efficace serait un reverse-proxy en face de l'application S3 à la place des rails. Je peux tout faire là aussi - vérifier le referer, faire une analyse approfondie du journal. Un tel front redessinerait dramatiquement la facture S3 et la performance ne devrait pas être moindre à la fin. – mdrozdziel

+0

Ouais, ça sonne bien - je recommande le vernis. :) Gardez juste à l'esprit que même si les images sont mises en cache, vous pouvez également exécuter une configuration plus compliquée en ajoutant un autre service. Et peut-être aussi exiger plus de puissance de traitement (par exemple une instance ou au moins des ressources) pour le mandataire. – Till

4

Utilisez (un compartiment privé | fichiers privés) et utilisez des URL signées pour les fichiers stockés sur S3. La signature comprend un temps d'expiration (par exemple, 10 minutes à partir de maintenant, quel que soit le type que vous souhaitez définir), ainsi qu'un hachage cryptographique. S3 refusera de servir les fichiers si la signature n'est pas valide ou si l'heure d'expiration est dépassée. Ceci est utile parce que vous seul pouvez créer des URL valides à vos fichiers privés dans S3, et vous pouvez contrôler combien de temps les URL restent valides. Cela évite les sangsues, car les leechers ne peuvent pas signer leurs propres URL et, s'ils reçoivent une URL que vous avez signée, cette URL expirera très prochainement et ne pourra plus être utilisée par la suite.

5

Puisqu'il n'y avait pas une réponse de boulons et écrous ci-dessus, voici un petit échantillon de code de la façon de diffuser un fichier qui est stocké sur S3.

render :text => proc { |response, output| 
    AWS::S3::S3Object.stream(path, bucket) do |segment| 
    output.write segment 
    output.flush # not sure if this is needed 
    end 
} 

En fonction de votre serveur Web cela peut (bâtarde) ou ne peut pas (webrick) le travail, donc ne soyez pas trop frustré si elle ne flux pas dans le développement.

1

Fournir temporaires URL pré-signé:

def show 
     redirect_to Aws::S3::Presigner.new.presigned_url(
     :get_object, 
     bucket: 'mybucket', 
     key: '/folder/file.pdf' 
     expires_in: 60) 
    end 

S3 distribue toujours le contenu afin que vous débarquez le travail de Rails (ce qui est très lent à elle), gère la mise en cache HTTP, les opérations HEAD, et utilise Amazon CDN .

Questions connexes