ایونٹ پر مبنی فن تعمیر استعمال شدہ وسائل کی لاگت کی کارکردگی کو بڑھاتا ہے کیونکہ وہ صرف اس وقت استعمال ہوتے ہیں جب ان کی ضرورت ہوتی ہے۔ اس کو لاگو کرنے اور ورکر ایپلی کیشنز کے طور پر اضافی کلاؤڈ اداروں کو نہ بنانے کے طریقے کے بارے میں بہت سارے اختیارات موجود ہیں۔ اور آج میں FaaS کے بارے میں نہیں بلکہ ویب ہکس کے بارے میں بات کروں گا۔ میں آبجیکٹ اسٹوریج ویب ہکس کا استعمال کرتے ہوئے واقعات کو سنبھالنے کی ایک سبق آموز مثال دکھاؤں گا۔
آبجیکٹ اسٹوریج اور ویب ہکس کے بارے میں چند الفاظ۔ آبجیکٹ اسٹوریج آپ کو کلاؤڈ میں کسی بھی ڈیٹا کو آبجیکٹ کی شکل میں ذخیرہ کرنے کی اجازت دیتا ہے، جو کہ S3 یا کسی اور API (عمل درآمد پر منحصر ہے) HTTP/HTTPS کے ذریعے قابل رسائی ہے۔ ویب ہکس عام طور پر حسب ضرورت HTTP کال بیکس ہوتے ہیں۔ وہ عام طور پر کسی ایونٹ سے متحرک ہوتے ہیں، جیسے کوڈ کو کسی ریپوزٹری میں دھکیل دیا جاتا ہے یا بلاگ پر کوئی تبصرہ پوسٹ کیا جاتا ہے۔ جب کوئی واقعہ پیش آتا ہے، تو اصل سائٹ ویب ہک کے لیے مخصوص کردہ URL پر ایک HTTP درخواست بھیجتی ہے۔ نتیجے کے طور پر، آپ ایک سائٹ پر ہونے والے واقعات کو دوسری سائٹ پر متحرک کر سکتے ہیں (وکیپیڈیا)۔ اس صورت میں جہاں ماخذ سائٹ ایک آبجیکٹ اسٹوریج ہے، واقعات اس کے مواد میں تبدیلی کے طور پر کام کرتے ہیں۔
سادہ معاملات کی مثالیں جب اس طرح کے آٹومیشن کو استعمال کیا جا سکتا ہے:
دوسرے کلاؤڈ اسٹوریج میں تمام اشیاء کی کاپیاں بنانا۔ جب بھی فائلیں شامل کی جائیں یا تبدیل کی جائیں تو کاپیاں فلائی پر بننا ضروری ہیں۔
گرافک فائلوں کے تھمب نیلز کی ایک سیریز کی خودکار تخلیق، تصاویر میں واٹر مارکس شامل کرنا، اور تصویر میں دیگر ترمیمات۔
نئی دستاویزات کی آمد کے بارے میں اطلاع (مثال کے طور پر، تقسیم شدہ اکاؤنٹنگ سروس کلاؤڈ پر رپورٹیں اپ لوڈ کرتی ہے، اور مالیاتی نگرانی نئی رپورٹس کے بارے میں اطلاعات موصول کرتی ہے، ان کی جانچ اور تجزیہ کرتی ہے)۔
قدرے زیادہ پیچیدہ معاملات میں شامل ہوتا ہے، مثال کے طور پر، Kubernetes کو ایک درخواست تیار کرنا، جو ضروری کنٹینرز کے ساتھ ایک پوڈ بناتا ہے، اسے ٹاسک پیرامیٹرز منتقل کرتا ہے، اور پروسیسنگ کے بعد کنٹینر کو گرا دیتا ہے۔
مثال کے طور پر، جب Mail.ru کلاؤڈ سولیوشنز (MCS) آبجیکٹ اسٹوریج بالٹی میں تبدیلیاں ویب ہکس کا استعمال کرتے ہوئے AWS آبجیکٹ اسٹوریج میں مطابقت پذیر ہوں گی تو ہم ٹاسک 1 کی ایک قسم بنائیں گے۔ ایک حقیقی بھری ہوئی صورت میں، ویب ہکس کو قطار میں رجسٹر کرکے غیر مطابقت پذیر کام فراہم کیا جانا چاہیے، لیکن تربیتی کام کے لیے ہم اس کے بغیر عمل درآمد کریں گے۔
اشاعت کی خدمت، جو 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) ...
ویب ہک وصول کرنے والے سرور کے ساتھ فولڈر کو کلون کریں:
اس بالٹی پر جائیں جس کے لیے ہم ویب ہکس ترتیب دیں گے اور گیئر پر کلک کریں:
ویب ہکس ٹیب پر جائیں اور شامل کریں پر کلک کریں:
کھیتوں کو بھریں:
ID — ویب ہک کا نام۔
واقعہ - کون سے واقعات کو منتقل کرنا ہے۔ ہم نے ان تمام واقعات کی ٹرانسمیشن ترتیب دی ہے جو فائلوں کے ساتھ کام کرتے وقت پیش آتے ہیں (شامل کرنا اور حذف کرنا)۔
یو آر ایل - سرور ایڈریس وصول کرنے والا ویب ہک۔
فلٹر کا سابقہ/ لاحقہ ایک فلٹر ہے جو آپ کو صرف ان اشیاء کے لیے ویب ہکس بنانے کی اجازت دیتا ہے جن کے نام کچھ اصولوں سے میل کھاتے ہیں۔ مثال کے طور پر، ویب ہک کو صرف .png ایکسٹینشن والی فائلوں کو متحرک کرنے کے لیے، میں فلٹر لاحقہ آپ کو "png" لکھنے کی ضرورت ہے۔
فی الحال، صرف 80 اور 443 بندرگاہیں ویب ہک وصول کرنے والے سرور تک رسائی کے لیے معاون ہیں۔
آئیے کلک کریں۔ ہک شامل کریں۔ اور ہم مندرجہ ذیل دیکھیں گے:
ہک نے مزید کہا۔
ویب ہک وصول کرنے والا سرور اپنے لاگز میں ہک رجسٹریشن کے عمل کی پیشرفت دکھاتا ہے:
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»
}
اس کے مطابق، درخواست پر منحصر ہے، آپ کو یہ سمجھنے کی ضرورت ہے کہ ڈیٹا پر کارروائی کیسے کی جائے۔ میں نے اندراج کو بطور اشارے منتخب کیا۔ "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:
آئیے دیکھتے ہیں کہ یہ کیسے کام کرتا ہے۔ کے ذریعے 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 بالٹی کے مواد کو چیک کریں:
اب، ویب انٹرفیس کے ذریعے، ہم فائل کو 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)، اور وہاں سے ان کو پارس کریں اور ان پر کارروائی کریں۔ کارکن کی درخواستوں کے ساتھ۔ دوسری صورت میں، جب ویب ہکس بڑے پیمانے پر پہنچتے ہیں، تو آپ کو کاموں کو مکمل کرنے کے لیے سرور کے وسائل کی کمی کا سامنا کرنا پڑ سکتا ہے۔ قطاروں کی موجودگی آپ کو سرور اور کارکنوں کو تقسیم کرنے کے ساتھ ساتھ ناکامی کی صورت میں کاموں کو دہرانے کے ساتھ مسائل کو حل کرنے کی اجازت دیتی ہے۔ لاگنگ کو مزید تفصیلی اور زیادہ معیاری میں تبدیل کرنے کا مشورہ بھی دیا جاتا ہے۔