ตัวอย่างของแอปพลิเคชันที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งอิงตาม webhooks ใน Mail.ru Cloud Solutions ของพื้นที่จัดเก็บอ็อบเจ็กต์ S3

ตัวอย่างของแอปพลิเคชันที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งอิงตาม webhooks ใน Mail.ru Cloud Solutions ของพื้นที่จัดเก็บอ็อบเจ็กต์ S3
เครื่องชงกาแฟ Rube Goldberg

สถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์จะช่วยเพิ่มประสิทธิภาพด้านต้นทุนของทรัพยากรที่ใช้ เนื่องจากมีการใช้ในช่วงเวลาที่จำเป็นเท่านั้น มีตัวเลือกมากมายเกี่ยวกับวิธีการใช้งานและไม่สร้างเอนทิตีระบบคลาวด์เพิ่มเติมเป็นแอปพลิเคชันของผู้ปฏิบัติงาน และวันนี้ฉันจะไม่พูดเกี่ยวกับ FaaS แต่เกี่ยวกับ webhooks ฉันจะแสดงตัวอย่างบทช่วยสอนเกี่ยวกับการจัดการเหตุการณ์โดยใช้ webhooks ของพื้นที่เก็บข้อมูลอ็อบเจ็กต์

คำไม่กี่คำเกี่ยวกับการจัดเก็บอ็อบเจ็กต์และ webhooks พื้นที่จัดเก็บออบเจ็กต์ช่วยให้คุณสามารถจัดเก็บข้อมูลใดๆ ในระบบคลาวด์ในรูปแบบของออบเจ็กต์ ซึ่งสามารถเข้าถึงได้ผ่าน S3 หรือ API อื่น (ขึ้นอยู่กับการใช้งาน) ผ่าน HTTP/HTTPS โดยทั่วไปแล้ว Webhooks คือการเรียกกลับ HTTP แบบกำหนดเอง โดยทั่วไปจะถูกกระตุ้นโดยเหตุการณ์ เช่น โค้ดถูกส่งไปยังพื้นที่เก็บข้อมูล หรือการโพสต์ความคิดเห็นในบล็อก เมื่อมีเหตุการณ์เกิดขึ้น ไซต์ต้นทางจะส่งคำขอ HTTP ไปยัง URL ที่ระบุสำหรับเว็บฮุค ด้วยเหตุนี้ คุณสามารถทำให้เหตุการณ์ในไซต์หนึ่งทริกเกอร์การดำเนินการกับอีกไซต์หนึ่งได้ (วิกิพีเดีย). ในกรณีที่ไซต์ต้นทางเป็นที่เก็บข้อมูลออบเจ็กต์ เหตุการณ์จะทำหน้าที่เป็นการเปลี่ยนแปลงเนื้อหา

ตัวอย่างกรณีง่ายๆ ที่สามารถใช้ระบบอัตโนมัติดังกล่าวได้:

  1. การสร้างสำเนาของวัตถุทั้งหมดในที่เก็บข้อมูลบนคลาวด์อื่น ต้องสร้างสำเนาทันทีทุกครั้งที่มีการเพิ่มหรือเปลี่ยนแปลงไฟล์
  2. การสร้างชุดภาพขนาดย่อของไฟล์กราฟิก การเพิ่มลายน้ำให้กับภาพถ่าย และการปรับแต่งภาพอื่นๆ โดยอัตโนมัติ
  3. การแจ้งเตือนเกี่ยวกับการมาถึงของเอกสารใหม่ (เช่น บริการบัญชีแบบกระจายอัปโหลดรายงานไปยังคลาวด์ และการตรวจสอบทางการเงินจะได้รับการแจ้งเตือนเกี่ยวกับรายงานใหม่ การตรวจสอบและการวิเคราะห์)
  4. กรณีที่ซับซ้อนกว่าเล็กน้อยเกี่ยวข้องกับ เช่น การสร้างคำขอไปยัง Kubernetes ซึ่งสร้างพ็อดที่มีคอนเทนเนอร์ที่จำเป็น ส่งพารามิเตอร์งานไปให้ และหลังจากการประมวลผลจะยุบคอนเทนเนอร์

ตามตัวอย่าง เราจะสร้างงานที่ 1 ที่แตกต่างออกไป เมื่อการเปลี่ยนแปลงในบัคเก็ตพื้นที่จัดเก็บออบเจ็กต์ Mail.ru Cloud Solutions (MCS) ได้รับการซิงโครไนซ์ในพื้นที่จัดเก็บออบเจ็กต์ AWS โดยใช้ webhooks ในกรณีที่มีการโหลดจริง ควรจัดเตรียมงานแบบอะซิงโครนัสโดยการลงทะเบียน webhooks ในคิว แต่สำหรับงานการฝึกอบรม เราจะดำเนินการโดยไม่มีการดำเนินการนี้

รูปแบบการทำงาน

โปรโตคอลการโต้ตอบมีการอธิบายโดยละเอียดใน คำแนะนำเกี่ยวกับ S3 webhooks บน MCS. แผนงานประกอบด้วยองค์ประกอบดังต่อไปนี้:

  • บริการจัดพิมพ์ซึ่งอยู่ในฝั่งพื้นที่จัดเก็บ S3 และเผยแพร่คำขอ HTTP เมื่อ webnhook ถูกทริกเกอร์
  • เซิร์ฟเวอร์รับ Webhookซึ่งรับฟังคำขอจากบริการเผยแพร่ HTTP และดำเนินการตามความเหมาะสม เซิร์ฟเวอร์สามารถเขียนเป็นภาษาใดก็ได้ ในตัวอย่างของเรา เราจะเขียนเซิร์ฟเวอร์เป็นภาษา Go

คุณสมบัติพิเศษของการใช้งาน Webhooks ใน S3 API คือการลงทะเบียนเซิร์ฟเวอร์รับ Webhook บนบริการเผยแพร่ โดยเฉพาะอย่างยิ่ง เซิร์ฟเวอร์ที่รับเว็บฮุคจะต้องยืนยันการสมัครรับข้อความจากบริการเผยแพร่ (ในการใช้งานเว็บฮุคอื่นๆ โดยทั่วไปไม่จำเป็นต้องยืนยันการสมัครรับข้อมูล)

ดังนั้น เซิร์ฟเวอร์รับ webhook จะต้องรองรับการดำเนินการหลัก XNUMX ประการ:

  • ตอบสนองต่อคำขอของผู้ให้บริการสิ่งพิมพ์เพื่อยืนยันการลงทะเบียน
  • ประมวลผลเหตุการณ์ที่เข้ามา

การติดตั้งเซิร์ฟเวอร์รับ 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. ไปที่บัคเก็ตที่เราจะกำหนดค่า webhooks และคลิกที่เฟือง:

ตัวอย่างของแอปพลิเคชันที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งอิงตาม webhooks ใน Mail.ru Cloud Solutions ของพื้นที่จัดเก็บอ็อบเจ็กต์ S3

ไปที่แท็บ Webhooks แล้วคลิกเพิ่ม:

ตัวอย่างของแอปพลิเคชันที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งอิงตาม webhooks ใน Mail.ru Cloud Solutions ของพื้นที่จัดเก็บอ็อบเจ็กต์ S3
กรอกข้อมูลในฟิลด์:

ตัวอย่างของแอปพลิเคชันที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งอิงตาม webhooks ใน Mail.ru Cloud Solutions ของพื้นที่จัดเก็บอ็อบเจ็กต์ S3

ID — ชื่อของเว็บฮุค

เหตุการณ์ - เหตุการณ์ที่จะส่ง เราได้ตั้งค่าการส่งเหตุการณ์ทั้งหมดที่เกิดขึ้นเมื่อทำงานกับไฟล์ (การเพิ่มและการลบ)

URL — ที่อยู่เซิร์ฟเวอร์รับ webhook

คำนำหน้า/คำต่อท้ายตัวกรองเป็นตัวกรองที่ช่วยให้คุณสามารถสร้าง webhooks สำหรับออบเจ็กต์ที่มีชื่อตรงกับกฎบางอย่างเท่านั้น ตัวอย่างเช่น เพื่อให้ webhook ทริกเกอร์เฉพาะไฟล์ที่มีนามสกุล .png เท่านั้น คำต่อท้ายตัวกรอง คุณต้องเขียน "png"

ปัจจุบัน รองรับเฉพาะพอร์ต 80 และ 443 ในการเข้าถึงเซิร์ฟเวอร์รับเว็บฮุค

คลิกกันได้เลย เพิ่มตะขอ และเราจะเห็นสิ่งต่อไปนี้:

ตัวอย่างของแอปพลิเคชันที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งอิงตาม webhooks ใน Mail.ru Cloud Solutions ของพื้นที่จัดเก็บอ็อบเจ็กต์ S3
เพิ่มตะขอแล้ว

เซิร์ฟเวอร์รับ webhook จะแสดงความคืบหน้าของกระบวนการลงทะเบียน hook ในบันทึก:

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

ในตัวอย่างของเรา เซิร์ฟเวอร์เขียนเป็นภาษา 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 ที่ง่ายที่สุด
  • Webhook() - เส้นทางหลัก, ตัวจัดการ URL/webhook:
    • ยืนยันการลงทะเบียนในบริการเผยแพร่ (ไปที่ฟังก์ชัน SubscriptionConfirmation)
    • ประมวลผล webhooks ขาเข้า (ฟังก์ชัน Gorecords)
  • ฟังก์ชัน HmacSha256 และ HmacSha256hex เป็นการนำอัลกอริธึมการเข้ารหัส HMAC-SHA256 และ HMAC-SHA256 มาใช้ โดยมีเอาต์พุตเป็นสตริงตัวเลขฐานสิบหกสำหรับการคำนวณลายเซ็น
  • main เป็นฟังก์ชันหลัก ประมวลผลพารามิเตอร์บรรทัดคำสั่ง และลงทะเบียนตัวจัดการ URL

พารามิเตอร์บรรทัดคำสั่งที่เซิร์ฟเวอร์ยอมรับ:

  • -port คือพอร์ตที่เซิร์ฟเวอร์จะรับฟัง
  • -address - ที่อยู่ IP ที่เซิร์ฟเวอร์จะรับฟัง
  • -script เป็นโปรแกรมภายนอกที่ถูกเรียกใช้สำหรับ hook ขาเข้าแต่ละตัว

มาดูฟังก์ชันบางอย่างให้ละเอียดยิ่งขึ้น:

//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)
    }

}

ฟังก์ชันนี้กำหนดว่าคำขอเพื่อยืนยันการลงทะเบียนหรือเว็บฮุคมาถึงแล้วหรือไม่ ดังต่อไปนี้จาก เอกสารหากการลงทะเบียนได้รับการยืนยัน โครงสร้าง 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)))

หากเว็บฮุคมาถึง โครงสร้างของคำขอโพสต์จะมีลักษณะดังนี้:

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"เนื่องจากมีอยู่ในคำขอยืนยันการสมัครและไม่มีอยู่ในเว็บฮุค จากการมีอยู่/ไม่มีรายการนี้ในคำขอ POST การดำเนินการเพิ่มเติมของโปรแกรมจะไปที่ฟังก์ชันใดฟังก์ชันหนึ่ง SubscriptionConfirmationหรือเข้าไปในฟังก์ชัน GotRecords.

เราจะไม่พิจารณาฟังก์ชัน SubscriptionConfirmation โดยละเอียด แต่จะนำไปใช้ตามหลักการที่กำหนดไว้ใน เอกสาร. คุณสามารถดูซอร์สโค้ดสำหรับฟังก์ชันนี้ได้ที่ ที่เก็บ git ของโครงการ.

ฟังก์ชัน GotRecords แยกวิเคราะห์คำขอขาเข้า และสำหรับแต่ละอ็อบเจ็กต์ Record จะเรียกสคริปต์ภายนอก (ซึ่งมีการส่งชื่อในพารามิเตอร์ -script) พร้อมด้วยพารามิเตอร์:

  • ชื่อถัง
  • รหัสวัตถุ
  • หนังบู๊:
    • คัดลอก - หากอยู่ในคำขอเดิม EventName = ObjectCreated | ใส่วัตถุ | ใส่ObjectCopy
    • ลบ - หากอยู่ในคำขอเดิม EventName = ObjectRemoved | ลบObject

ดังนั้นหาก hook มาถึงพร้อมกับคำขอ Post ตามที่อธิบายไว้ เหนือและพารามิเตอร์ -script=script.sh จากนั้นสคริปต์จะถูกเรียกดังต่อไปนี้:

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

ควรเข้าใจว่าเซิร์ฟเวอร์รับ Webhook นี้ไม่ใช่โซลูชันที่ใช้งานจริงที่สมบูรณ์ แต่เป็นตัวอย่างที่เรียบง่ายของการใช้งานที่เป็นไปได้

ตัวอย่างงาน

มาซิงโครไนซ์ไฟล์จากบัคเก็ตหลักใน MCS กับบัคเก็ตสำรองใน AWS กันดีกว่า บัคเก็ตหลักเรียกว่า myfiles-ash ส่วนการสำรองข้อมูลเรียกว่า myfiles-backup (การกำหนดค่าบัคเก็ตใน AWS อยู่นอกเหนือขอบเขตของบทความนี้) ดังนั้นเมื่อไฟล์ถูกวางในที่เก็บข้อมูลหลัก สำเนาของไฟล์ควรปรากฏในไฟล์สำรอง และเมื่อถูกลบออกจากไฟล์หลัก ก็ควรลบไฟล์นั้นในไฟล์สำรอง

เราจะทำงานกับบัคเก็ตโดยใช้ยูทิลิตี้ awscli ซึ่งเข้ากันได้กับทั้งพื้นที่เก็บข้อมูลบนคลาวด์ MCS และพื้นที่เก็บข้อมูลบนคลาวด์ 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]:

มากำหนดค่าการเข้าถึง AWS S3 API กัน:

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

เข้าถึงแล้ว

ตอนนี้เรามาเขียนสคริปต์สำหรับการประมวลผล hook ที่เข้ามา เรียกมันว่า 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-backup ใน 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

ตอนนี้ เราจะลบไฟล์ออกจากที่เก็บข้อมูล 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:~$

ไฟล์ถูกลบ ปัญหาได้รับการแก้ไขแล้ว

บทสรุปและสิ่งที่ต้องทำ

รหัสทั้งหมดที่ใช้ในบทความนี้คือ ในที่เก็บของฉัน. นอกจากนี้ยังมีตัวอย่างสคริปต์และตัวอย่างการนับลายเซ็นสำหรับการลงทะเบียน webhooks

โค้ดนี้เป็นเพียงตัวอย่างวิธีที่คุณสามารถใช้ S3 webhooks ในกิจกรรมของคุณได้ อย่างที่ฉันบอกไปตอนต้น หากคุณวางแผนที่จะใช้เซิร์ฟเวอร์ดังกล่าวในการใช้งานจริง อย่างน้อยคุณต้องเขียนเซิร์ฟเวอร์ใหม่สำหรับงานอะซิงโครนัส: ลงทะเบียน webhooks ขาเข้าในคิว (RabbitMQ หรือ NATS) จากนั้นแยกวิเคราะห์และประมวลผลพวกมัน พร้อมใบสมัครพนักงาน มิฉะนั้น เมื่อ webhooks เข้ามาอย่างหนาแน่น คุณอาจพบว่ามีทรัพยากรเซิร์ฟเวอร์ไม่เพียงพอในการทำงานให้เสร็จสิ้น การมีคิวช่วยให้คุณสามารถกระจายเซิร์ฟเวอร์และพนักงานได้ตลอดจนแก้ไขปัญหาการทำงานซ้ำในกรณีที่เกิดความล้มเหลว ขอแนะนำให้เปลี่ยนการบันทึกให้มีรายละเอียดและเป็นมาตรฐานมากขึ้น

โชคดี!

อ่านเพิ่มเติมในหัวข้อ:

ที่มา: will.com

เพิ่มความคิดเห็น