S3 آبجیکٹ اسٹوریج Mail.ru Cloud Solutions میں ویب ہکس پر مبنی ایونٹ سے چلنے والی ایپلیکیشن کی ایک مثال

S3 آبجیکٹ اسٹوریج Mail.ru Cloud Solutions میں ویب ہکس پر مبنی ایونٹ سے چلنے والی ایپلیکیشن کی ایک مثال
روب گولڈ برگ کافی مشین

ایونٹ پر مبنی فن تعمیر استعمال شدہ وسائل کی لاگت کی کارکردگی کو بڑھاتا ہے کیونکہ وہ صرف اس وقت استعمال ہوتے ہیں جب ان کی ضرورت ہوتی ہے۔ اس کو لاگو کرنے اور ورکر ایپلی کیشنز کے طور پر اضافی کلاؤڈ اداروں کو نہ بنانے کے طریقے کے بارے میں بہت سارے اختیارات موجود ہیں۔ اور آج میں FaaS کے بارے میں نہیں بلکہ ویب ہکس کے بارے میں بات کروں گا۔ میں آبجیکٹ اسٹوریج ویب ہکس کا استعمال کرتے ہوئے واقعات کو سنبھالنے کی ایک سبق آموز مثال دکھاؤں گا۔

آبجیکٹ اسٹوریج اور ویب ہکس کے بارے میں چند الفاظ۔ آبجیکٹ اسٹوریج آپ کو کلاؤڈ میں کسی بھی ڈیٹا کو آبجیکٹ کی شکل میں ذخیرہ کرنے کی اجازت دیتا ہے، جو کہ S3 یا کسی اور API (عمل درآمد پر منحصر ہے) HTTP/HTTPS کے ذریعے قابل رسائی ہے۔ ویب ہکس عام طور پر حسب ضرورت HTTP کال بیکس ہوتے ہیں۔ وہ عام طور پر کسی ایونٹ سے متحرک ہوتے ہیں، جیسے کوڈ کو کسی ریپوزٹری میں دھکیل دیا جاتا ہے یا بلاگ پر کوئی تبصرہ پوسٹ کیا جاتا ہے۔ جب کوئی واقعہ پیش آتا ہے، تو اصل سائٹ ویب ہک کے لیے مخصوص کردہ URL پر ایک HTTP درخواست بھیجتی ہے۔ نتیجے کے طور پر، آپ ایک سائٹ پر ہونے والے واقعات کو دوسری سائٹ پر متحرک کر سکتے ہیں (وکیپیڈیا)۔ اس صورت میں جہاں ماخذ سائٹ ایک آبجیکٹ اسٹوریج ہے، واقعات اس کے مواد میں تبدیلی کے طور پر کام کرتے ہیں۔

سادہ معاملات کی مثالیں جب اس طرح کے آٹومیشن کو استعمال کیا جا سکتا ہے:

  1. دوسرے کلاؤڈ اسٹوریج میں تمام اشیاء کی کاپیاں بنانا۔ جب بھی فائلیں شامل کی جائیں یا تبدیل کی جائیں تو کاپیاں فلائی پر بننا ضروری ہیں۔
  2. گرافک فائلوں کے تھمب نیلز کی ایک سیریز کی خودکار تخلیق، تصاویر میں واٹر مارکس شامل کرنا، اور تصویر میں دیگر ترمیمات۔
  3. نئی دستاویزات کی آمد کے بارے میں اطلاع (مثال کے طور پر، تقسیم شدہ اکاؤنٹنگ سروس کلاؤڈ پر رپورٹیں اپ لوڈ کرتی ہے، اور مالیاتی نگرانی نئی رپورٹس کے بارے میں اطلاعات موصول کرتی ہے، ان کی جانچ اور تجزیہ کرتی ہے)۔
  4. قدرے زیادہ پیچیدہ معاملات میں شامل ہوتا ہے، مثال کے طور پر، Kubernetes کو ایک درخواست تیار کرنا، جو ضروری کنٹینرز کے ساتھ ایک پوڈ بناتا ہے، اسے ٹاسک پیرامیٹرز منتقل کرتا ہے، اور پروسیسنگ کے بعد کنٹینر کو گرا دیتا ہے۔

مثال کے طور پر، جب Mail.ru کلاؤڈ سولیوشنز (MCS) آبجیکٹ اسٹوریج بالٹی میں تبدیلیاں ویب ہکس کا استعمال کرتے ہوئے AWS آبجیکٹ اسٹوریج میں مطابقت پذیر ہوں گی تو ہم ٹاسک 1 کی ایک قسم بنائیں گے۔ ایک حقیقی بھری ہوئی صورت میں، ویب ہکس کو قطار میں رجسٹر کرکے غیر مطابقت پذیر کام فراہم کیا جانا چاہیے، لیکن تربیتی کام کے لیے ہم اس کے بغیر عمل درآمد کریں گے۔

ورک سکیم

تعامل پروٹوکول میں تفصیل سے بیان کیا گیا ہے۔ MCS پر S3 ویب ہکس کے لیے گائیڈ. کام کی اسکیم مندرجہ ذیل عناصر پر مشتمل ہے:

  • اشاعت کی خدمت، جو S3 اسٹوریج کی طرف ہے اور جب webnhook کو متحرک کیا جاتا ہے تو HTTP درخواستیں شائع کرتا ہے۔
  • ویب ہک وصول کرنے والا سرور، جو HTTP پبلشنگ سروس کی درخواستوں کو سنتا ہے اور مناسب کارروائیاں کرتا ہے۔ سرور کسی بھی زبان میں لکھا جا سکتا ہے؛ ہماری مثال میں، ہم سرور کو گو میں لکھیں گے۔

S3 API میں ویب ہکس کے نفاذ کی ایک خاص خصوصیت پبلشنگ سروس پر ویب ہک وصول کرنے والے سرور کی رجسٹریشن ہے۔ خاص طور پر، ویب ہک وصول کرنے والے سرور کو پبلشنگ سروس کے پیغامات کی سبسکرپشن کی تصدیق کرنی چاہیے (دیگر ویب ہک کے نفاذ میں، عام طور پر سبسکرپشن کی تصدیق کی ضرورت نہیں ہوتی ہے)۔

اس کے مطابق، ویب ہک وصول کرنے والے سرور کو دو اہم کارروائیوں کی حمایت کرنی چاہیے:

  • رجسٹریشن کی تصدیق کے لیے پبلشنگ سروس کی درخواست کا جواب دیں،
  • آنے والے واقعات پر کارروائی کریں۔

ویب ہک وصول کرنے والا سرور انسٹال کرنا

ویب ہک وصول کرنے والے سرور کو چلانے کے لیے، آپ کو لینکس سرور کی ضرورت ہے۔ اس مضمون میں، مثال کے طور پر، ہم ایک ورچوئل مثال استعمال کرتے ہیں جسے ہم MCS پر تعینات کرتے ہیں۔

آئیے ضروری سافٹ ویئر انسٹال کریں اور ویب ہک وصول کرنے والا سرور لانچ کریں۔

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) ...

ویب ہک وصول کرنے والے سرور کے ساتھ فولڈر کو کلون کریں:

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

پبلشنگ سروس کو سبسکرائب کریں۔

آپ API یا ویب انٹرفیس کے ذریعے اپنے ویب ہک وصول کرنے والے سرور کو رجسٹر کر سکتے ہیں۔ سادگی کے لیے، ہم ویب انٹرفیس کے ذریعے رجسٹر کریں گے:

  1. آئیے بالٹی سیکشن پر چلتے ہیں۔ کنٹرول روم میں
  2. اس بالٹی پر جائیں جس کے لیے ہم ویب ہکس ترتیب دیں گے اور گیئر پر کلک کریں:

S3 آبجیکٹ اسٹوریج Mail.ru Cloud Solutions میں ویب ہکس پر مبنی ایونٹ سے چلنے والی ایپلیکیشن کی ایک مثال

ویب ہکس ٹیب پر جائیں اور شامل کریں پر کلک کریں:

S3 آبجیکٹ اسٹوریج Mail.ru Cloud Solutions میں ویب ہکس پر مبنی ایونٹ سے چلنے والی ایپلیکیشن کی ایک مثال
کھیتوں کو بھریں:

S3 آبجیکٹ اسٹوریج Mail.ru Cloud Solutions میں ویب ہکس پر مبنی ایونٹ سے چلنے والی ایپلیکیشن کی ایک مثال

ID — ویب ہک کا نام۔

واقعہ - کون سے واقعات کو منتقل کرنا ہے۔ ہم نے ان تمام واقعات کی ٹرانسمیشن ترتیب دی ہے جو فائلوں کے ساتھ کام کرتے وقت پیش آتے ہیں (شامل کرنا اور حذف کرنا)۔

یو آر ایل - سرور ایڈریس وصول کرنے والا ویب ہک۔

فلٹر کا سابقہ/ لاحقہ ایک فلٹر ہے جو آپ کو صرف ان اشیاء کے لیے ویب ہکس بنانے کی اجازت دیتا ہے جن کے نام کچھ اصولوں سے میل کھاتے ہیں۔ مثال کے طور پر، ویب ہک کو صرف .png ایکسٹینشن والی فائلوں کو متحرک کرنے کے لیے، میں فلٹر لاحقہ آپ کو "png" لکھنے کی ضرورت ہے۔

فی الحال، صرف 80 اور 443 بندرگاہیں ویب ہک وصول کرنے والے سرور تک رسائی کے لیے معاون ہیں۔

آئیے کلک کریں۔ ہک شامل کریں۔ اور ہم مندرجہ ذیل دیکھیں گے:

S3 آبجیکٹ اسٹوریج Mail.ru Cloud Solutions میں ویب ہکس پر مبنی ایونٹ سے چلنے والی ایپلیکیشن کی ایک مثال
ہک نے مزید کہا۔

ویب ہک وصول کرنے والا سرور اپنے لاگز میں ہک رجسٹریشن کے عمل کی پیشرفت دکھاتا ہے:

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

رجسٹریشن مکمل ہو گئی ہے۔ اگلے حصے میں، ہم ویب ہک وصول کرنے والے سرور کے آپریشن کے الگورتھم پر گہری نظر ڈالیں گے۔

ویب ہک وصول کرنے والے سرور کی تفصیل

ہماری مثال میں، سرور گو میں لکھا گیا ہے۔ آئیے اس کے آپریشن کے بنیادی اصولوں کو دیکھیں۔

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 کے ذریعے جواب دیتا ہے، جو کہ لائیونس پروب کا آسان ترین نفاذ ہے۔
  • Webhook() - مرکزی راستہ، URL/webhook ہینڈلر:
    • پبلشنگ سروس پر رجسٹریشن کی تصدیق کرتا ہے (سبسکرپشن کنفرمیشن فنکشن پر جائیں)،
    • آنے والے ویب ہکس (گوریکارڈز فنکشن) پر کارروائی کرتا ہے۔
  • فنکشنز HmacSha256 اور HmacSha256hex HMAC-SHA256 اور HMAC-SHA256 انکرپشن الگورتھم کے نفاذ ہیں جس میں دستخط کا حساب لگانے کے لیے ہیکساڈیسیمل نمبرز کی ایک تار کے طور پر آؤٹ پٹ ہے۔
  • main مین فنکشن ہے، کمانڈ لائن پیرامیٹرز پر کارروائی کرتا ہے اور URL ہینڈلرز کو رجسٹر کرتا ہے۔

سرور کے ذریعہ قبول کردہ کمانڈ لائن پیرامیٹرز:

  • -پورٹ وہ بندرگاہ ہے جس پر سرور سنے گا۔
  • -address - IP ایڈریس جسے سرور سنے گا۔
  • سکرپٹ ایک بیرونی پروگرام ہے جسے ہر آنے والے ہک کے لیے کہا جاتا ہے۔

آئیے کچھ افعال کو قریب سے دیکھتے ہیں:

//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 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.

ہم سبسکرپشن کنفرمیشن فنکشن پر تفصیل سے غور نہیں کریں گے؛ اس کا نفاذ اس میں بیان کردہ اصولوں کے مطابق کیا جاتا ہے۔ دستاویزات. آپ اس فنکشن کا سورس کوڈ پر دیکھ سکتے ہیں۔ پروجیکٹ گٹ ریپوزٹریز.

GotRecords فنکشن آنے والی درخواست کو پارس کرتا ہے اور ہر ریکارڈ آبجیکٹ کے لیے ایک بیرونی اسکرپٹ (جس کا نام -script پیرامیٹر میں پاس کیا گیا تھا) کو پیرامیٹرز کے ساتھ کال کرتا ہے:

  • بالٹی کا نام
  • آبجیکٹ کی کلید
  • عمل:
    • کاپی - اگر اصل درخواست میں ہے EventName = ObjectCreated | پٹ آبجیکٹ | پٹ آبجیکٹ کاپی
    • حذف کریں - اگر اصل درخواست میں EventName = ObjectRemoved | آبجیکٹ کو حذف کریں۔

اس طرح، اگر کوئی ہک پوسٹ کی درخواست کے ساتھ آتا ہے، جیسا کہ بیان کیا گیا ہے۔ اوپر، اور پیرامیٹر -script=script.sh پھر اسکرپٹ کو اس طرح کہا جائے گا:

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

یہ سمجھنا چاہیے کہ یہ ویب ہک وصول کرنے والا سرور ایک مکمل پروڈکشن حل نہیں ہے، بلکہ ممکنہ نفاذ کی ایک آسان مثال ہے۔

کام کی مثال

آئیے فائلوں کو 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

رسائی حاصل کی۔

اب آئیے آنے والے ہک پر کارروائی کے لیے ایک اسکرپٹ لکھتے ہیں، آئیے اسے کہتے ہیں 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 بالٹی میں شامل کریں۔ کنسول لاگز سے پتہ چلتا ہے کہ ویب ہک سرور سے درخواست کی گئی تھی:

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

آئیے AWS میں myfiles-backup بالٹی کے مواد کو چیک کریں:

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 bucket سے حذف کر دیں گے۔

سرور لاگز:

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:~$

فائل ڈیلیٹ ہو گئی، مسئلہ حل ہو گیا۔

نتیجہ اور ٹوڈو

اس مضمون میں استعمال ہونے والے تمام کوڈ ہیں۔ میرے ذخیرے میں. اسکرپٹ کی مثالیں اور ویب ہکس کو رجسٹر کرنے کے لیے دستخطوں کی گنتی کی مثالیں بھی موجود ہیں۔

یہ کوڈ اس سے زیادہ کچھ نہیں ہے کہ آپ اپنی سرگرمیوں میں S3 ویب ہکس کو کس طرح استعمال کر سکتے ہیں۔ جیسا کہ میں نے شروع میں کہا، اگر آپ اس طرح کے سرور کو پروڈکشن میں استعمال کرنے کا ارادہ رکھتے ہیں، تو آپ کو کم از کم غیر مطابقت پذیر کام کے لیے سرور کو دوبارہ لکھنے کی ضرورت ہے: آنے والے ویب ہکس کو قطار میں رجسٹر کریں (RabbitMQ یا NATS)، اور وہاں سے ان کو پارس کریں اور ان پر کارروائی کریں۔ کارکن کی درخواستوں کے ساتھ۔ دوسری صورت میں، جب ویب ہکس بڑے پیمانے پر پہنچتے ہیں، تو آپ کو کاموں کو مکمل کرنے کے لیے سرور کے وسائل کی کمی کا سامنا کرنا پڑ سکتا ہے۔ قطاروں کی موجودگی آپ کو سرور اور کارکنوں کو تقسیم کرنے کے ساتھ ساتھ ناکامی کی صورت میں کاموں کو دہرانے کے ساتھ مسائل کو حل کرنے کی اجازت دیتی ہے۔ لاگنگ کو مزید تفصیلی اور زیادہ معیاری میں تبدیل کرنے کا مشورہ بھی دیا جاتا ہے۔

گڈ لک!

موضوع پر مزید پڑھنا:

ماخذ: www.habr.com

نیا تبصرہ شامل کریں