Το Amazon S3 είναι μια εξαιρετικά ισχυρή υπηρεσία στον πυρήνα των Amazon Web Services. Ωστόσο, εκτός του περιβάλλοντος παραγωγής, η S3 μπορεί να είναι δύσκολη στη χρήση. Περιλαμβάνει τη μεταβίβαση κλειδιών πρόσβασης, την παροχή λογαριασμών χρηστών και τη διατήρηση μιας αξιόπιστης σύνδεσης δικτύου - για να μην αναφέρουμε ότι κοστίζει χρήματα. ευτυχώς, υπάρχει ένα εργαλείο που βοηθά στην επίλυση αυτού του προβλήματος. Το FakeS3 είναι ένας ελαφρύς διακομιστής που προσομοιώνει τη συμπεριφορά του πραγματικού S3. Ανταποκρίνεται στις ίδιες κλήσεις στις οποίες ανταποκρίνεται το Amazon S3 και αποθηκεύει τα ανεβασμένα αρχεία στο τοπικό σας σύστημα αρχείων - δεν γίνονται αιτήσεις στην υπηρεσία της Amazon. Παρόλο που το gem δεν υποστηρίζει το πλήρες σύνολο των εντολών του S3, το API που έχει υλοποιηθεί είναι επαρκές για τις περισσότερες περιπτώσεις χρήσης εφαρμογών.

Σε αυτό το άρθρο θα παρουσιάσω την προσέγγιση της ενσωμάτωσης των AWS και FakeS3 με Paperclip - δημοφιλής βιβλιοθήκη επισύναψης αρχείων για την Active Record. Το Paperclip και το S3 σε συνδυασμό παρέχουν αποτελεσματικό σύστημα αποθήκευσης αρχείων που συνδυάζει τα χρήσιμα βασικά χαρακτηριστικά του Paperclip (όπως η διαχείριση επικυρώσεων και οι μετασχηματισμοί εικόνων) με τα πλεονεκτήματα της online αποθήκευσης. Παρόλο που η διαμόρφωση αυτών των εργαλείων δεν είναι προφανής και απαιτεί το σκάψιμο στη λεπτομερή τεκμηρίωση καθώς και την επίλυση πολλών ειδικών για το gem ζητημάτων, αξίζει να αφιερώσετε λίγο χρόνο για να κάνετε την ανάπτυξη ταχύτερη και αποτελεσματικότερη.

Ποιος είναι ο στόχος μας;

Η ενσωμάτωση των περιγραφόμενων εργαλείων απαιτεί τρία βήματα:

  1. Εκκίνηση του S3 fakeserver που παρέχεται από το πολύτιμο λίθο FakeS3 στο παρασκήνιο.
  2. Ρύθμιση του πελάτη AWS S3 ώστε να αναθέτει όλα τα αιτήματα στον δρομολογημένο fakeserver.
  3. Ρύθμιση του Paperclip για τη χρήση ψεύτικου τελικού σημείου S3 στις διευθύνσεις URL των ενσωματωμένων πόρων.

Εγκατάσταση

Ας ξεκινήσουμε με την εγκατάσταση των απαιτούμενων πολύτιμων λίθων:

# Gemfile

gem "paperclip"
gem "aws-sdk", "~> 1.6"

gem "fakes3", group: [:development, :test]

Βεβαιωθείτε ότι έχετε εγκαταστήσει την έκδοση 1.6 του aws-sdk. Το Paperclip που χρησιμοποιεί το SKD για τη διαχείριση του αποθηκευτικού χώρου στην υπηρεσία της Amazon δεν λειτουργεί καλά με υψηλότερες εκδόσεις αυτού του πολύτιμου λίθου. Αυτό οφείλεται σε σημαντικές αλλαγές στο API του SDK που επέφερε η έκδοση 2.0.

Θυμηθείτε επίσης ότι ο κύριος στόχος του FakeS3 είναι η ελαχιστοποίηση των εξαρτήσεων κατά το χρόνο εκτέλεσης. Είναι περισσότερο ένα εργαλείο ανάπτυξης για να δοκιμάζετε τις κλήσεις S3 στο κωδικός παρά σε έναν διακομιστή παραγωγής που επιθυμεί να αντιγράψει τη λειτουργικότητα του S3. Επομένως, θα πρέπει να συμπεριλάβετε το gem μόνο στην ομάδα ανάπτυξης και δοκιμών.

Διαμόρφωση AWS

Το AWS SDK παρέχει μια ειδική βοηθητική μέθοδο που είναι υπεύθυνη για τη φόρτωση των ρυθμίσεων. Από προεπιλογή θα φορτώσει τη διαμόρφωση από την config/aws.yml, εξάγει τις παραμέτρους του για το τρέχον περιβάλλον και τις μεταβιβάζει στον πελάτη AWS. Πρώτον, καλέστε την ακόλουθη μέθοδο σε έναν αρχικοποιητή:

# config/initializers/aws.rb

AWS::Rails.load_yaml_config

Τώρα, καθώς έχουμε φορτώσει σωστά το αρχείο ρυθμίσεων, μπορούμε να προχωρήσουμε στον καθορισμό του περιεχομένου του:

# config/aws.yml

ανάπτυξη: &development
    access_key_id: "abc"
    secret_access_key: "abc"
    s3_endpoint: "localhost"
    s3_port: 10001
    s3_force_path_style: true
    use_ssl: false

test: *development

Ας συζητήσουμε όλες τις παραμέτρους μία προς μία:

Η διαμόρφωση για το περιβάλλον παραγωγής είναι αρκετά απλή:

# config/aws.yml

παραγωγή: &production
    access_key_id:     
    secret_access_key: 

staging: *production

Αυτή τη φορά, όμως, έχουμε να κάνουμε με την πραγματική υπηρεσία S3, επομένως πρέπει να δώσετε αυθεντικά διαπιστευτήρια AWS.

Λόγω πιθανών κινδύνων ασφαλείας, είναι καλή πρακτική να κρατάτε μυστικές τιμές όπως τα κλειδιά πρόσβασης εκτός του συστήματος ελέγχου εκδόσεων, π.χ. χρησιμοποιώντας μεταβλητές περιβάλλοντος. Θα χρησιμοποιήσουμε το ERB για να εισάγουμε τις τιμές του στο αρχείο ρυθμίσεων.

Διαμόρφωση με συνδετήρα

Τώρα ήρθε η ώρα να αντιμετωπίσετε το Paperclip και να το αναγκάσετε να συνεργαστεί με τον ήδη ρυθμισμένο πελάτη S3. Ο κύριος στόχος της διαμόρφωσης του Paperclip είναι να αποκτήσει τη διαδρομή αποθήκευσης που θα εντοπίσει τους πόρους που φιλοξενούνται από τον fakeserver:

localhost:10001/:bucket_name/:path

Και πάλι, ας ξεκινήσουμε με το περιβάλλον ανάπτυξης:

# config/paperclip.yml

ανάπτυξη: &development
    αποθήκευση: :s3
    bucket: "development"
    s3_host_name: "localhost"
    url: ":s3_alias_url"
    path: : ":class/:attachment/:id_partition/:style/:filename.:extension"
    s3_host_alias: "localhost:10001/development"

test: *development
# config/paperclip.yml

παραγωγή: &production
    αποθήκευση: :s3
    bucket:  
    url:     ":s3_domain_url"
    path:    ":class/:attachment/:id_partition/:style/:filename.:extension"

staging: *production

Ομοίως με τα διαπιστευτήρια AWS, το όνομα κάδου θεωρείται επίσης μια μυστική τιμή η οποία θα πρέπει να αποθηκεύεται εκτός της βάσης του κώδικά σας. Συνιστώ την αποθήκευση του ονόματός του σε μεταβλητή περιβάλλοντος.

Τέλος, συγχωνεύστε τη διαμόρφωση στις προεπιλεγμένες επιλογές του Paperclip σε έναν αρχικοποιητή:

# config/initializers/paperclip.rb

paperclip_defaults = Rails.application.config_for :paperclip
paperclip_defaults.symbolize_keys!

Paperclip::Attachment.default_options.merge! paperclip_defaults

Εκτέλεση fakes3

Και οι δύο διαμορφώσεις του AWS και του Paperclip περιέχουν μια αναφορά στον τοπικό S3 fakeserver που αναμένεται να εκτελείται κάτω από το όνομα localhost:10001. Πριν ξεκινήσετε την ανάπτυξη, θα πρέπει να εκκινήσετε τον διακομιστή με την ακόλουθη εντολή (παρέχεται από το FakeS3 gem):

fakes3 -r public/system -p 10001

Οι μεταβιβαζόμενες παράμετροι είναι:

Αν χρησιμοποιείτε το Foreman για τη διαχείριση διεργασιών στην εφαρμογή σας, μπορεί να είναι βολικό να προσθέσετε την ακόλουθη καταχώρηση στο Procfile:

# Αρχείο Procfile

fakes3: fakes3 -r ${FAKES3_STORAGE_PATH:-public/system} -p ${FAKES3_PORT:-10001}

Αυτό θα σας εξοικονομήσει χρόνο που χάνετε για την εκκίνηση του fakeserver κάθε φορά που θα χρειαστεί να αναπτύξετε κάποια χαρακτηριστικά που σχετίζονται με το S3.

Συμπέρασμα

Διαμορφώσαμε τον πελάτη AWS να αναθέτει όλες τις αιτήσεις στον τοπικό ψεύτικο διακομιστή, ρυθμίσαμε το Paperclip να χρησιμοποιεί το ψεύτικο S3 endpoint στις διευθύνσεις URL των πόρων και ξεκινήσαμε τον ψεύτικο διακομιστή που παρέχεται από το Fake S3 gem αποθηκεύοντας όλα τα αρχεία στο τοπικό σύστημα αρχείων.

Ως αποτέλεσμα, ανεξαρτητοποιηθήκαμε από τη σύνδεση στο Διαδίκτυο και εξοικονομήσαμε χρήματα κάνοντας την ανάπτυξή μας ταχύτερη και πιο αξιόπιστη.

elGreek