Ένα παράδειγμα μιας εφαρμογής που βασίζεται σε συμβάντα που βασίζεται σε webhook στην αποθήκευση αντικειμένων S3 Mail.ru Cloud Solutions

Ένα παράδειγμα μιας εφαρμογής που βασίζεται σε συμβάντα που βασίζεται σε webhook στην αποθήκευση αντικειμένων S3 Mail.ru Cloud Solutions
Καφετιέρα Rube Goldberg

Η αρχιτεκτονική με γνώμονα τα συμβάντα αυξάνει την αποδοτικότητα κόστους των πόρων που χρησιμοποιούνται επειδή χρησιμοποιούνται μόνο τη στιγμή που χρειάζονται. Υπάρχουν πολλές επιλογές για το πώς να το εφαρμόσετε και να μην δημιουργήσετε πρόσθετες οντότητες cloud ως εφαρμογές εργασίας. Και σήμερα δεν θα μιλήσω για FaaS, αλλά για webhooks. Θα δείξω ένα παράδειγμα εκμάθησης χειρισμού συμβάντων με χρήση webhook αποθήκευσης αντικειμένων.

Λίγα λόγια για την αποθήκευση αντικειμένων και τα webhook. Η αποθήκευση αντικειμένων σάς επιτρέπει να αποθηκεύετε οποιαδήποτε δεδομένα στο cloud με τη μορφή αντικειμένων, προσβάσιμα μέσω S3 ή άλλου API (ανάλογα με την υλοποίηση) μέσω HTTP/HTTPS. Τα webhook είναι γενικά προσαρμοσμένες επανακλήσεις HTTP. Συνήθως ενεργοποιούνται από ένα συμβάν, όπως η ώθηση κώδικα σε ένα αποθετήριο ή ένα σχόλιο που δημοσιεύεται σε ένα ιστολόγιο. Όταν συμβαίνει ένα συμβάν, ο ιστότοπος προέλευσης στέλνει ένα αίτημα HTTP στη διεύθυνση URL που έχει καθοριστεί για το webhook. Ως αποτέλεσμα, μπορείτε να κάνετε τα συμβάντα σε έναν ιστότοπο να ενεργοποιούν ενέργειες σε έναν άλλο (wiki). Στην περίπτωση που ο ιστότοπος προέλευσης είναι χώρος αποθήκευσης αντικειμένων, τα συμβάντα λειτουργούν ως αλλαγές στο περιεχόμενό του.

Παραδείγματα απλών περιπτώσεων κατά τις οποίες μπορεί να χρησιμοποιηθεί τέτοιος αυτοματισμός:

  1. Δημιουργία αντιγράφων όλων των αντικειμένων σε άλλο χώρο αποθήκευσης cloud. Αντίγραφα πρέπει να δημιουργούνται εν κινήσει κάθε φορά που προστίθενται ή αλλάζουν αρχεία.
  2. Αυτόματη δημιουργία μιας σειράς μικρογραφιών αρχείων γραφικών, προσθήκη υδατογραφημάτων σε φωτογραφίες και άλλες τροποποιήσεις εικόνας.
  3. Ειδοποίηση σχετικά με την άφιξη νέων εγγράφων (για παράδειγμα, μια κατανεμημένη λογιστική υπηρεσία μεταφορτώνει αναφορές στο cloud και η οικονομική παρακολούθηση λαμβάνει ειδοποιήσεις για νέες αναφορές, τις ελέγχει και τις αναλύει).
  4. Ελαφρώς πιο περίπλοκες περιπτώσεις περιλαμβάνουν, για παράδειγμα, τη δημιουργία ενός αιτήματος στο Kubernetes, το οποίο δημιουργεί ένα pod με τα απαραίτητα κοντέινερ, του μεταβιβάζει παραμέτρους εργασίας και μετά την επεξεργασία συμπτύσσει το κοντέινερ.

Για παράδειγμα, θα κάνουμε μια παραλλαγή της εργασίας 1, όταν οι αλλαγές στον κάδο αποθήκευσης αντικειμένων Mail.ru Cloud Solutions (MCS) συγχρονίζονται στην αποθήκευση αντικειμένων AWS χρησιμοποιώντας webhook. Σε μια πραγματική φορτωμένη περίπτωση, η ασύγχρονη εργασία θα πρέπει να παρέχεται με την εγγραφή webhooks σε μια ουρά, αλλά για την εκπαιδευτική εργασία θα κάνουμε την υλοποίηση χωρίς αυτό.

Σχέδιο εργασίας

Το πρωτόκολλο αλληλεπίδρασης περιγράφεται λεπτομερώς στο Οδηγός για τα webhook S3 στο MCS. Το σχήμα εργασίας περιλαμβάνει τα ακόλουθα στοιχεία:

  • Εκδοτική υπηρεσία, το οποίο βρίσκεται στην πλευρά αποθήκευσης S3 και δημοσιεύει αιτήματα HTTP όταν ενεργοποιείται το webnhook.
  • Διακομιστής λήψης Webhook, το οποίο ακούει αιτήματα από την υπηρεσία δημοσίευσης HTTP και εκτελεί τις κατάλληλες ενέργειες. Ο διακομιστής μπορεί να γραφτεί σε οποιαδήποτε γλώσσα· στο παράδειγμά μας, θα γράψουμε τον διακομιστή στο Go.

Ένα ιδιαίτερο χαρακτηριστικό της υλοποίησης webhook στο S3 API είναι η εγγραφή του διακομιστή λήψης webhook στην υπηρεσία δημοσίευσης. Ειδικότερα, ο διακομιστής λήψης webhook πρέπει να επιβεβαιώσει τη συνδρομή σε μηνύματα από την υπηρεσία δημοσίευσης (σε άλλες εφαρμογές webhook, συνήθως δεν απαιτείται επιβεβαίωση συνδρομής).

Συνεπώς, ο διακομιστής λήψης webhook πρέπει να υποστηρίζει δύο κύριες λειτουργίες:

  • απαντήστε στο αίτημα της υπηρεσίας έκδοσης για επιβεβαίωση εγγραφής,
  • επεξεργασία εισερχόμενων συμβάντων.

Εγκατάσταση διακομιστή λήψης webhook

Για να εκτελέσετε τον διακομιστή λήψης webhook, χρειάζεστε έναν διακομιστή Linux. Σε αυτό το άρθρο, για παράδειγμα, χρησιμοποιούμε μια εικονική παρουσία που αναπτύσσουμε στο MCS.

Ας εγκαταστήσουμε το απαραίτητο λογισμικό και ας ξεκινήσουμε τον διακομιστή λήψης webhook.

ubuntu@ubuntu-basic-1-2-10gb:~$ sudo apt-get install git
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  bc dns-root-data dnsmasq-base ebtables landscape-common liblxc-common 
liblxc1 libuv1 lxcfs lxd lxd-client python3-attr python3-automat 
python3-click python3-constantly python3-hyperlink
  python3-incremental python3-pam python3-pyasn1-modules 
python3-service-identity python3-twisted python3-twisted-bin 
python3-zope.interface uidmap xdelta3
Use 'sudo apt autoremove' to remove them.
Suggested packages:
  git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui 
gitk gitweb git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
  git
0 upgraded, 1 newly installed, 0 to remove and 46 not upgraded.
Need to get 3915 kB of archives.
After this operation, 32.3 MB of additional disk space will be used.
Get:1 http://MS1.clouds.archive.ubuntu.com/ubuntu bionic-updates/main 
amd64 git amd64 1:2.17.1-1ubuntu0.7 [3915 kB]
Fetched 3915 kB in 1s (5639 kB/s)
Selecting previously unselected package git.
(Reading database ... 53932 files and directories currently installed.)
Preparing to unpack .../git_1%3a2.17.1-1ubuntu0.7_amd64.deb ...
Unpacking git (1:2.17.1-1ubuntu0.7) ...
Setting up git (1:2.17.1-1ubuntu0.7) ...

Κλωνοποιήστε το φάκελο με τον διακομιστή λήψης webhook:

ubuntu@ubuntu-basic-1-2-10gb:~$ git clone
https://github.com/RomanenkoDenys/s3-webhook.git
Cloning into 's3-webhook'...
remote: Enumerating objects: 48, done.
remote: Counting objects: 100% (48/48), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 114 (delta 20), reused 45 (delta 18), pack-reused 66
Receiving objects: 100% (114/114), 23.77 MiB | 20.25 MiB/s, done.
Resolving deltas: 100% (49/49), done.

Ας ξεκινήσουμε τον διακομιστή:

ubuntu@ubuntu-basic-1-2-10gb:~$ cd s3-webhook/
ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80

Εγγραφείτε στην υπηρεσία δημοσίευσης

Μπορείτε να καταχωρήσετε τον διακομιστή λήψης του webhook μέσω του API ή της διεπαφής ιστού. Για απλότητα, θα εγγραφούμε μέσω της διεπαφής ιστού:

  1. Ας πάμε στην ενότητα των κουβάδων στην αίθουσα ελέγχου.
  2. Μεταβείτε στον κάδο για τον οποίο θα διαμορφώσουμε τα webhook και κάντε κλικ στο γρανάζι:

Ένα παράδειγμα μιας εφαρμογής που βασίζεται σε συμβάντα που βασίζεται σε webhook στην αποθήκευση αντικειμένων S3 Mail.ru Cloud Solutions

Μεταβείτε στην καρτέλα Webhooks και κάντε κλικ στην Προσθήκη:

Ένα παράδειγμα μιας εφαρμογής που βασίζεται σε συμβάντα που βασίζεται σε webhook στην αποθήκευση αντικειμένων S3 Mail.ru Cloud Solutions
Συμπληρώστε τα πεδία:

Ένα παράδειγμα μιας εφαρμογής που βασίζεται σε συμβάντα που βασίζεται σε webhook στην αποθήκευση αντικειμένων S3 Mail.ru Cloud Solutions

ID — το όνομα του webhook.

Συμβάν - ποια γεγονότα να μεταδοθούν. Έχουμε ορίσει τη μετάδοση όλων των συμβάντων που συμβαίνουν κατά την εργασία με αρχεία (προσθήκη και διαγραφή).

URL — διεύθυνση διακομιστή λήψης webhook.

Το πρόθεμα/το επίθημα φίλτρου είναι ένα φίλτρο που σας επιτρέπει να δημιουργείτε webhook μόνο για αντικείμενα των οποίων τα ονόματα ταιριάζουν με ορισμένους κανόνες. Για παράδειγμα, για να ενεργοποιεί το webhook μόνο αρχεία με επέκταση .png, in Επίθημα φίλτρου πρέπει να γράψετε "png".

Προς το παρόν, υποστηρίζονται μόνο οι θύρες 80 και 443 για πρόσβαση στον διακομιστή λήψης webhook.

Ας κάνουμε κλικ Προσθέστε γάντζο και θα δούμε τα εξής:

Ένα παράδειγμα μιας εφαρμογής που βασίζεται σε συμβάντα που βασίζεται σε webhook στην αποθήκευση αντικειμένων S3 Mail.ru Cloud Solutions
Ο Χουκ προστέθηκε.

Ο διακομιστής λήψης webhook εμφανίζει στα αρχεία καταγραφής του την πρόοδο της διαδικασίας εγγραφής του άγκιστρου:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80
2020/06/15 12:01:14 [POST] incoming HTTP request from 
95.163.216.92:42530
2020/06/15 12:01:14 Got timestamp: 2020-06-15T15:01:13+03:00 TopicArn: 
mcs5259999770|myfiles-ash|s3:ObjectCreated:*,s3:ObjectRemoved:* Token: 
E2itMqAMUVVZc51pUhFWSp13DoxezvRxkUh5P7LEuk1dEe9y URL: 
http://89.208.199.220/webhook
2020/06/15 12:01:14 Generate responce signature: 
3754ce36636f80dfd606c5254d64ecb2fd8d555c27962b70b4f759f32c76b66d

Η εγγραφή ολοκληρώθηκε. Στην επόμενη ενότητα, θα ρίξουμε μια πιο προσεκτική ματιά στον αλγόριθμο λειτουργίας του διακομιστή λήψης webhook.

Περιγραφή του διακομιστή λήψης webhook

Στο παράδειγμά μας, ο διακομιστής είναι γραμμένος στο Go. Ας δούμε τις βασικές αρχές λειτουργίας του.

package main

// Generate hmac_sha256_hex
func HmacSha256hex(message string, secret string) string {
}

// Generate hmac_sha256
func HmacSha256(message string, secret string) string {
}

// Send subscription confirmation
func SubscriptionConfirmation(w http.ResponseWriter, req *http.Request, body []byte) {
}

// Send subscription confirmation
func GotRecords(w http.ResponseWriter, req *http.Request, body []byte) {
}

// Liveness probe
func Ping(w http.ResponseWriter, req *http.Request) {
    // log request
    log.Printf("[%s] incoming HTTP Ping request from %sn", req.Method, req.RemoteAddr)
    fmt.Fprintf(w, "Pongn")
}

//Webhook
func Webhook(w http.ResponseWriter, req *http.Request) {
}

func main() {

    // get command line args
    bindPort := flag.Int("port", 80, "number between 1-65535")
    bindAddr := flag.String("address", "", "ip address in dot format")
    flag.StringVar(&actionScript, "script", "", "external script to execute")
    flag.Parse()

    http.HandleFunc("/ping", Ping)
    http.HandleFunc("/webhook", Webhook)

log.Fatal(http.ListenAndServe(*bindAddr+":"+strconv.Itoa(*bindPort), nil))
}

Εξετάστε τις κύριες λειτουργίες:

  • Ping() - μια διαδρομή που ανταποκρίνεται μέσω URL/ping, την απλούστερη υλοποίηση ενός liveness probe.
  • Webhook() - κύρια διαδρομή, διεύθυνση URL/webhook:
    • επιβεβαιώνει την εγγραφή στην υπηρεσία δημοσίευσης (μεταβείτε στη συνάρτηση Επιβεβαίωση Συνδρομής),
    • επεξεργάζεται τα εισερχόμενα webhook (συνάρτηση Gorecords).
  • Οι συναρτήσεις HmacSha256 και HmacSha256hex είναι υλοποιήσεις των αλγορίθμων κρυπτογράφησης HMAC-SHA256 και HMAC-SHA256 με έξοδο ως συμβολοσειρά δεκαεξαδικών αριθμών για τον υπολογισμό της υπογραφής.
  • main είναι η κύρια συνάρτηση, επεξεργάζεται τις παραμέτρους της γραμμής εντολών και καταχωρεί τους χειριστές URL.

Παράμετροι γραμμής εντολών αποδεκτές από τον διακομιστή:

  • -port είναι η θύρα στην οποία θα ακούσει ο διακομιστής.
  • -διεύθυνση - διεύθυνση IP που θα ακούσει ο διακομιστής.
  • -Το script είναι ένα εξωτερικό πρόγραμμα που καλείται για κάθε εισερχόμενο άγκιστρο.

Ας ρίξουμε μια πιο προσεκτική ματιά σε μερικές από τις λειτουργίες:

//Webhook
func Webhook(w http.ResponseWriter, req *http.Request) {

    // Read body
    body, err := ioutil.ReadAll(req.Body)
    defer req.Body.Close()
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    // log request
    log.Printf("[%s] incoming HTTP request from %sn", req.Method, req.RemoteAddr)
    // check if we got subscription confirmation request
    if strings.Contains(string(body), 
""Type":"SubscriptionConfirmation"") {
        SubscriptionConfirmation(w, req, body)
    } else {
        GotRecords(w, req, body)
    }

}

Αυτή η λειτουργία καθορίζει εάν έχει φτάσει ένα αίτημα για επιβεβαίωση εγγραφής ή ένα webhook. Όπως προκύπτει από τεκμηρίωση, εάν επιβεβαιωθεί η εγγραφή, λαμβάνεται η ακόλουθη δομή Json στο αίτημα Post:

POST http://test.com HTTP/1.1
x-amz-sns-messages-type: SubscriptionConfirmation
content-type: application/json

{
    "Timestamp":"2019-12-26T19:29:12+03:00",
    "Type":"SubscriptionConfirmation",
    "Message":"You have chosen to subscribe to the topic $topic. To confirm the subscription you need to response with calculated signature",
    "TopicArn":"mcs2883541269|bucketA|s3:ObjectCreated:Put",
    "SignatureVersion":1,
    "Token":«RPE5UuG94rGgBH6kHXN9FUPugFxj1hs2aUQc99btJp3E49tA»
}

Αυτό το ερώτημα πρέπει να απαντηθεί:

content-type: application/json

{"signature":«ea3fce4bb15c6de4fec365d36bcebbc34ccddf54616d5ca12e1972f82b6d37af»}

Όπου η υπογραφή υπολογίζεται ως:

signature = hmac_sha256(url, hmac_sha256(TopicArn, 
hmac_sha256(Timestamp, Token)))

Εάν φτάσει ένα webhook, η δομή του αιτήματος Post μοιάζει με αυτό:

POST <url> HTTP/1.1
x-amz-sns-messages-type: SubscriptionConfirmation

{ "Records":
    [
        {
            "s3": {
                "object": {
                    "eTag":"aed563ecafb4bcc5654c597a421547b2",
                    "sequencer":1577453615,
                    "key":"some-file-to-bucket",
                    "size":100
                },
            "configurationId":"1",
            "bucket": {
                "name": "bucketA",
                "ownerIdentity": {
                    "principalId":"mcs2883541269"}
                },
                "s3SchemaVersion":"1.0"
            },
            "eventVersion":"1.0",
            "requestParameters":{
                "sourceIPAddress":"185.6.245.156"
            },
            "userIdentity": {
                "principalId":"2407013e-cbc1-415f-9102-16fb9bd6946b"
            },
            "eventName":"s3:ObjectCreated:Put",
            "awsRegion":"ru-msk",
            "eventSource":"aws:s3",
            "responseElements": {
                "x-amz-request-id":"VGJR5rtJ"
            }
        }
    ]
}

Αντίστοιχα, ανάλογα με το αίτημα, πρέπει να κατανοήσετε τον τρόπο επεξεργασίας των δεδομένων. Επέλεξα την καταχώρηση ως δείκτη "Type":"SubscriptionConfirmation", αφού υπάρχει στο αίτημα επιβεβαίωσης συνδρομής και δεν υπάρχει στο webhook. Με βάση την παρουσία/απουσία αυτής της καταχώρησης στο αίτημα POST, η περαιτέρω εκτέλεση του προγράμματος πηγαίνει είτε στη συνάρτηση SubscriptionConfirmation, ή στη συνάρτηση GotRecords.

Δεν θα εξετάσουμε λεπτομερώς τη λειτουργία SubscriptionConfirmation· εφαρμόζεται σύμφωνα με τις αρχές που ορίζονται στο τεκμηρίωση. Μπορείτε να δείτε τον πηγαίο κώδικα για αυτήν τη λειτουργία στη διεύθυνση αποθετήρια project git.

Η συνάρτηση GotRecords αναλύει ένα εισερχόμενο αίτημα και για κάθε αντικείμενο Εγγραφής καλεί ένα εξωτερικό σενάριο (το όνομα του οποίου μεταβιβάστηκε στην παράμετρο -script) με τις παραμέτρους:

  • όνομα κάδου
  • κλειδί αντικειμένου
  • δράση:
    • αντίγραφο - εάν στο αρχικό αίτημα Όνομα συμβάντος = ObjectCreated | PutObject | PutObjectCopy
    • διαγραφή - εάν στο αρχικό αίτημα EventName = ObjectRemoved | Διαγραφή αντικειμένου

Έτσι, εάν φτάσει ένα άγκιστρο με αίτημα Post, όπως περιγράφεται πάνω από, και την παράμετρο -script=script.sh τότε το σενάριο θα καλείται ως εξής:

script.sh  bucketA some-file-to-bucket copy

Πρέπει να γίνει κατανοητό ότι αυτός ο διακομιστής λήψης webhook δεν είναι μια ολοκληρωμένη λύση παραγωγής, αλλά ένα απλοποιημένο παράδειγμα μιας πιθανής υλοποίησης.

Παράδειγμα εργασίας

Ας συγχρονίσουμε τα αρχεία από τον κύριο κάδο στο MCS στον κάδο αντιγράφων ασφαλείας στο AWS. Ο κύριος κάδος ονομάζεται myfiles-ash, ο αντίγραφος ασφαλείας ονομάζεται myfiles-backup (η διαμόρφωση του κάδου στο AWS είναι πέρα ​​από το πεδίο εφαρμογής αυτού του άρθρου). Αντίστοιχα, όταν ένα αρχείο τοποθετείται στον κύριο κάδο, το αντίγραφό του θα πρέπει να εμφανίζεται στον εφεδρικό και όταν διαγράφεται από τον κύριο κάδο, θα πρέπει να διαγράφεται στον εφεδρικό.

Θα εργαστούμε με κουβάδες χρησιμοποιώντας το βοηθητικό πρόγραμμα awscli, το οποίο είναι συμβατό τόσο με την αποθήκευση cloud MCS όσο και με την αποθήκευση cloud AWS.

ubuntu@ubuntu-basic-1-2-10gb:~$ sudo apt-get install awscli
Reading package lists... Done
Building dependency tree
Reading state information... Done
After this operation, 34.4 MB of additional disk space will be used.
Unpacking awscli (1.14.44-1ubuntu1) ...
Setting up awscli (1.14.44-1ubuntu1) ...

Ας διαμορφώσουμε την πρόσβαση στο S3 MCS API:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws configure --profile mcs
AWS Access Key ID [None]: hdywEPtuuJTExxxxxxxxxxxxxx
AWS Secret Access Key [None]: hDz3SgxKwXoxxxxxxxxxxxxxxxxxx
Default region name [None]:
Default output format [None]:

Ας διαμορφώσουμε την πρόσβαση στο API AWS S3:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws configure --profile aws
AWS Access Key ID [None]: AKIAJXXXXXXXXXXXX
AWS Secret Access Key [None]: dfuerphOLQwu0CreP5Z8l5fuXXXXXXXXXXXXXXXX
Default region name [None]:
Default output format [None]:

Ας ελέγξουμε τις προσβάσεις:

Προς AWS:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile aws
2020-07-06 08:44:11 myfiles-backup

Για το MCS, κατά την εκτέλεση της εντολής πρέπει να προσθέσετε —endpoint-url:

ubuntu@ubuntu-basic-1-2-10gb:~$ aws s3 ls --profile mcs --endpoint-url 
https://hb.bizmrg.com
2020-02-04 06:38:05 databasebackups-0cdaaa6402d4424e9676c75a720afa85
2020-05-27 10:08:33 myfiles-ash

Πρόσβαση.

Τώρα ας γράψουμε ένα σενάριο για την επεξεργασία του εισερχόμενου άγκιστρου, ας το ονομάσουμε s3_backup_mcs_aws.sh

#!/bin/bash
# Require aws cli
# if file added — copy it to backup bucket
# if file removed — remove it from backup bucket
# Variables
ENDPOINT_MCS="https://hb.bizmrg.com"
AWSCLI_MCS=`which aws`" --endpoint-url ${ENDPOINT_MCS} --profile mcs s3"
AWSCLI_AWS=`which aws`" --profile aws s3"
BACKUP_BUCKET="myfiles-backup"

SOURCE_BUCKET=""
SOURCE_FILE=""
ACTION=""

SOURCE="s3://${SOURCE_BUCKET}/${SOURCE_FILE}"
TARGET="s3://${BACKUP_BUCKET}/${SOURCE_FILE}"
TEMP="/tmp/${SOURCE_BUCKET}/${SOURCE_FILE}"

case ${ACTION} in
    "copy")
    ${AWSCLI_MCS} cp "${SOURCE}" "${TEMP}"
    ${AWSCLI_AWS} cp "${TEMP}" "${TARGET}"
    rm ${TEMP}
    ;;

    "delete")
    ${AWSCLI_AWS} rm ${TARGET}
    ;;

    *)
    echo "Usage: 
#!/bin/bash
# Require aws cli
# if file added — copy it to backup bucket
# if file removed — remove it from backup bucket
# Variables
ENDPOINT_MCS="https://hb.bizmrg.com"
AWSCLI_MCS=`which aws`" --endpoint-url ${ENDPOINT_MCS} --profile mcs s3"
AWSCLI_AWS=`which aws`" --profile aws s3"
BACKUP_BUCKET="myfiles-backup"
SOURCE_BUCKET="${1}"
SOURCE_FILE="${2}"
ACTION="${3}"
SOURCE="s3://${SOURCE_BUCKET}/${SOURCE_FILE}"
TARGET="s3://${BACKUP_BUCKET}/${SOURCE_FILE}"
TEMP="/tmp/${SOURCE_BUCKET}/${SOURCE_FILE}"
case ${ACTION} in
"copy")
${AWSCLI_MCS} cp "${SOURCE}" "${TEMP}"
${AWSCLI_AWS} cp "${TEMP}" "${TARGET}"
rm ${TEMP}
;;
"delete")
${AWSCLI_AWS} rm ${TARGET}
;;
*)
echo "Usage: ${0} sourcebucket sourcefile copy/delete"
exit 1
;;
esac
sourcebucket sourcefile copy/delete" exit 1 ;; esac

Ας ξεκινήσουμε τον διακομιστή:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80 -
script scripts/s3_backup_mcs_aws.sh

Ας δούμε πώς λειτουργεί. Διά μέσου Διεπαφή ιστού MCS προσθέστε το αρχείο test.txt στον κάδο myfiles-ash. Τα αρχεία καταγραφής της κονσόλας δείχνουν ότι υποβλήθηκε ένα αίτημα στον διακομιστή webhook:

2020/07/06 09:43:08 [POST] incoming HTTP request from 
95.163.216.92:56612
download: s3://myfiles-ash/test.txt to ../../../tmp/myfiles-ash/test.txt
upload: ../../../tmp/myfiles-ash/test.txt to 
s3://myfiles-backup/test.txt

Ας ελέγξουμε τα περιεχόμενα του κάδου δημιουργίας αντιγράφων ασφαλείας myfiles στο AWS:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls 
myfiles-backup
2020-07-06 09:43:10       1104 test.txt

Τώρα, μέσω της διεπαφής web, θα διαγράψουμε το αρχείο από τον κάδο myfiles-ash.

Αρχεία καταγραφής διακομιστή:

2020/07/06 09:44:46 [POST] incoming HTTP request from 
95.163.216.92:58224
delete: s3://myfiles-backup/test.txt

Περιεχόμενα κάδου:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls 
myfiles-backup
ubuntu@ubuntu-basic-1-2-10gb:~$

Το αρχείο διαγράφεται, το πρόβλημα έχει λυθεί.

Συμπέρασμα και εργασίες

Όλος ο κώδικας που χρησιμοποιείται σε αυτό το άρθρο είναι στο αποθετήριο μου. Υπάρχουν επίσης παραδείγματα σεναρίων και παραδείγματα καταμέτρησης υπογραφών για την καταχώρηση webhook.

Αυτός ο κώδικας δεν είναι τίποτα άλλο από ένα παράδειγμα του πώς μπορείτε να χρησιμοποιήσετε τα webhook S3 στις δραστηριότητές σας. Όπως είπα στην αρχή, εάν σκοπεύετε να χρησιμοποιήσετε έναν τέτοιο διακομιστή στην παραγωγή, πρέπει τουλάχιστον να ξαναγράψετε τον διακομιστή για ασύγχρονη εργασία: να καταχωρήσετε τα εισερχόμενα webhook σε μια ουρά (RabbitMQ ή NATS) και από εκεί να τα αναλύσετε και να τα επεξεργαστείτε με αιτήσεις εργαζομένων. Διαφορετικά, όταν τα webhook φτάνουν μαζικά, μπορεί να αντιμετωπίσετε έλλειψη πόρων διακομιστή για την ολοκλήρωση εργασιών. Η παρουσία ουρών σάς επιτρέπει να διανέμετε τον διακομιστή και τους εργαζόμενους, καθώς και να επιλύετε προβλήματα με την επανάληψη εργασιών σε περίπτωση αποτυχίας. Συνιστάται επίσης να αλλάξετε την καταγραφή σε πιο λεπτομερή και πιο τυποποιημένη.

Καλή τύχη!

Περισσότερα για το θέμα:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο