Event-driven Architecture ááẠáááºážááá¯á·ááᯠááá¯á¡ááºááá·áºá¡áá»áááºááœááºáᬠá¡áá¯á¶ážááŒá¯áá±á¬ááŒá±á¬áá·áº á¡áá¯á¶ážááŒá¯áá¬ážáá±á¬á¡áááºážá¡ááŒá
áºáá»á¬ážá áá¯ááºáá»á
ááááºáááá±á¬ááºááŸá¯ááᯠááá¯ážá
á±áááºá áááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáááºážááŸáá·áº áá¯ááºáá¬ážá¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááŒá
Ạáá±á¬ááºááẠcloud entities áá»á¬ážááᯠááááºáá®ážááŒááºážá¡ááœáẠááœá±ážáá»ááºá
áá¬áá»á¬ážá
áœá¬ááŸááááºá áá®áá±á· áá»áœááºáá±á¬áº FaaS á¡ááŒá±á¬ááºážááá¯ááºáá² webhooks á¡ááŒá±á¬ááºáž ááŒá±á¬áá«áááºá á¡áá¬ááá¹áá¯ááá¯ááŸá±á¬ááºááŸá¯ áááºáá»áááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á á¡ááŒá
áºá¡áá»ááºáá»á¬ážááᯠááá¯ááºááœááºááŒááºážááá¯ááºáᬠáááºáááºážá
ᬠááá°áá¬ááᯠááŒáá«áááºá
á¡áá¬ááá¹áá¯ááá¯ááŸá±á¬ááºááŸá¯ááŸáá·áº webhooks áá»á¬ážá¡ááŒá±á¬ááºáž á
áá¬ážá¡áááºážáááºá Object storage ááẠááá·áºá¡á¬áž HTTP/HTTPS ááŸáá
áºááá·áº S3 ááá¯á·ááá¯áẠá¡ááŒá¬ážáá±á¬ API (á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á¡áá±á«áº áá°áááºá) á¡áá¯á¶ážááŒá¯ááá¯ááºáá±á¬ á¡áá¬ááá¹áá¯áá¯á¶á
á¶ááŒáá·áº cloud á¡ááœááºážááŸá áááºááá·áºáá±áá¬ááá¯áááᯠááááºážáááºážááá¯ááºá
á±áá«áááºá Webhooks áá»á¬ážááẠáá±áá°áá»á¡á¬ážááŒáá·áº á
áááºááŒáá¯áẠHTTP callbacks áá»á¬ážááŒá
áºáááºá áá¯ááºááᯠááá¯ááŸá±á¬ááºáááºážááá¯á· ááœááºážááá¯á·ááŒááºáž ááá¯á·ááá¯áẠááá±á¬á·ááºáá
áºáá¯ááœáẠááŸááºáá»ááºáá
áºáá¯áááºááŒááºážáá²á·ááá¯á·áá±á¬ ááŒá
áºáááºáá
áºáá¯ááŒá±á¬áá·áº áááºážááá¯á·ááᯠáá±áá¯áá»á¡á¬ážááŒáá·áº á¡á
áá»áá¯ážáááºá ááŒá
áºáááºáá
áºáá¯ááŒá
áºááœá¬ážááá·áºá¡áá« áá°áááºážááá¯ááºááẠwebhook á¡ááœáẠáááºááŸááºáá¬ážáá±á¬ URL ááá¯á· HTTP áá±á¬ááºážááá¯áá»ááºáá
áºáᯠáá±ážááá¯á·áááºá ááááºá¡áá±ááŒáá·áºá áááºááẠáááºááá¯ááºáá
áºáá¯ááŸá á¡ááŒá
áºá¡áá»ááºáá»á¬ážááᯠá¡ááŒá¬ážáá
áºáá¯ááœáẠááŒá
áºáá±á«áºá
á±ááá¯ááºááẠ(
ááá¯ááá¯á·áá±á¬ á¡ááá¯á¡áá»á±á¬ááºá áá áºááᯠá¡áá¯á¶ážááŒá¯ááá·áºá¡áá« ááá¯ážááŸááºážáá±á¬ááá á¹á áá»á¬ážááœáẠá¥ááá¬áá»á¬áž-
- á¡ááŒá¬áž cloud ááá¯ááŸá±á¬ááºááŸá¯ááœáẠá¡áá¬ááá¹áá¯á¡á¬ážáá¯á¶ážááᯠáááá¹áá°áááºáá®ážááŒááºážá ááá¯ááºáá»á¬ážááá·áºááá·áºá¡áá«ááá¯ááºáž ááá¯á·ááá¯áẠááŒá±á¬ááºážáá²ááá·áºá¡áá«ááá¯ááºážááœáẠáááá¹áá°áá»á¬áž áááºáá®ážááá«áááºá
- áá¬ááºáá¯á¶áá»á¬ážááœáẠáá±á á¬ááá·áºááŒááºážá ááŸáá·áº á¡ááŒá¬ážáá¯á¶ááœááºážáá¶ááŸá¯áá»á¬ážááœáẠááááºáá áºááá¯ááºáá»á¬ážá áá¯á¶áááºáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºáááºáá®ážááŒááºážá
- á á¬ááœááºá á¬áááºážá¡áá áºáá»á¬áž áá±á¬ááºááŸááá¬ááŒááºážá¡ááŒá±á¬ááºáž á¡ááŒá±á¬ááºážááŒá¬ážáá»áẠ(á¥ááá¬á ááŒáá·áºáá±áá¬ážáá±á¬ á á¬áááºážááá¯ááºáááºáá±á¬ááºááŸá¯áá áºáá¯ááẠá¡á á®áááºáá¶á á¬áá»á¬ážááᯠcloud ááá¯á· á¡ááºáá¯ááºáá¯ááºáááºá ááŸáá·áº ááœá±ááŒá±ážááá¯ááºáᬠá á±á¬áá·áºááŒáá·áºá á áºáá±ážááŸá¯áá»á¬ážááẠá¡á á®áááºáá¶á á¬á¡áá áºáá»á¬ážá á á áºáá±ážááŸá¯áá»á¬ážááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŸá¯áá»á¬ážá¡ááŒá±á¬ááºáž á¡ááŒá±á¬ááºážááŒá¬ážáá»ááºáá»á¬ážááᯠáááºáá¶áááŸááááº)á
- á¡áááºážáááºááá¯ááŸá¯ááºááœá±ážáá±á¬ááá á¹á áá»á¬ážááœááºá á¥ááá¬á¡á¬ážááŒáá·áºá ááá¯á¡ááºáá±á¬ááœááºááááºáá¬áá»á¬ážááŸáá·áºá¡áá° pod áá áºáá¯ááá¯áááºáá®ážáá±ážááá·áº Kubernetes áᶠáá±á¬ááºážááá¯áá»ááºáá áºáá¯áá¯ááºáá±ážáááºá áááºážáá¶ááá¯á· áá¯ááºáá±á¬ááºá áá¬áá±á¬ááºáá»á¬ážááá¯ááŒááºáááºážáᬠáá¯ááºáá±á¬ááºááŒá®ážáá±á¬áẠááœááºááááºáá¬ááᯠááŒáá¯áá»á á±áááºá
á¥ááá¬á¡áá±ááŒáá·áºá Mail.ru Cloud Solutions (MCS) object storage bucket ááœáẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠwebhooks áá¯á¶ážááŒá®áž AWS object ááá¯ááŸá±á¬ááºááŸá¯ááœáẠáááºáá°ááŒá¯áá±á¬á¡áá«ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡áá¯áẠ1 á áá°ááœá²áá áºáá¯ááᯠááŒá¯áá¯ááºáá«áááºá á¡ááŸááºáááẠloaded ááá á¹á ááœááºá áááºážá á®áá áºáá¯ááœáẠwebhooks ááŸááºáá¯á¶áááºááŒááºážááŒáá·áº á¡ááŒáá¯ááºá¡ááá¯ááºáá¯ááºáá±á¬ááºááŒááºážááᯠáá¶á·ááá¯ážáá±ážááá·áºáááºá ááá¯á·áá±á¬áº áá±á·áá»áá·áºáá±ážáá¬áááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáááºážááá«áá² á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááᯠáá¯ááºáá±á¬ááºáá«áááºá
á¡áá¯ááºáá¡á á®á¡á ááº
á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ áááá¯ááá¯áá±á¬ááᯠááœáẠá¡áá±ážá
áááºáá±á¬áºááŒáá¬ážáááºá
- áá¯ááºáá±ááŒááºážáááºáá±á¬ááºááŸá¯S3 ááá¯ááŸá±á¬ááºááŸá¯áááºááœááºááŸááá±á¬á webnhook ááá¯á áááºáá±á¬á¡áá« HTTP áá±á¬ááºážááá¯áá»ááºáá»á¬ážááá¯áá¯ááºáá±áááºá
- Webhook áááºáá¶áá¬áá¬HTTP áá¯ááºáá±ááŒááºáž áááºáá±á¬ááºááŸá¯ áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠáá¬ážáá±á¬ááºááŒá®áž ááá·áºáá»á±á¬áºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºá áá¬áá¬ááᯠáááºááá·áºáá¬áá¬á áá¬ážááŒáá·áº áá±ážáá¬ážááá¯ááºáááºá áá»áœááºá¯ááºááá¯á·á á¥ááá¬ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá¬áá¬ááᯠGo ááœáẠáá±ážáá¬ážáá«áááºá
S3 API ááŸá webhooks áá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá á¡áá°ážá¡ááºá¹áá«áááºááŸá¬ áá¯ááºáá±ááŒááºážáááºáá±á¬ááºááŸá¯ááœáẠwebhook áááºáá¶áá¬áá¬á ááŸááºáá¯á¶áááºááŒááºážááŒá áºáá«áááºá á¡áá°ážáááŒáá·áºá webhook áááºáá¶áááŸáááá·áºáá¬áá¬ááẠáá¯ááºáá±ááŒááºážáááºáá±á¬ááºááŸá¯á០áááºáá±á·áá»áºáá»á¬ážááá¯á· á á¬áááºážááœááºážááŒááºážááᯠá¡áááºááŒá¯ááá«ááẠ(á¡ááŒá¬áž webhook á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážááœááºá á á¬áááºážááœááºážááŒááºážáá¡áááºááŒá¯áá»ááºááᯠá¡áá»á¬ážá¡á¬ážááŒáá·áº áááá¯á¡ááºáá«)á
ááá¯á·ááŒá±á¬áá·áºá webhook áááºáá¶ááŒááºážáá¬áá¬ááẠá¡ááááá¯ááºáá±á¬ááºááŸá¯ááŸá áºáá¯ááᯠáá¶á·ááá¯ážáá±ážááááº-
- ááŸááºáá¯á¶áááºááŒááºážááᯠá¡áááºááŒá¯ááẠáá¯ááºáá±ááŒááºážáááºáá±á¬ááºááŸá¯á áá±á¬ááºážááá¯áá»ááºááᯠáá¯á¶á·ááŒááºááŒááºážá
- áááºáá¬ááá·áºááŒá áºáááºáá»á¬ážááᯠá á®áá¶áá±á¬ááºááœááºáá«á
webhook áááºáá¶ááŒááºážáá¬áá¬ááᯠááá·áºááœááºážááŒááºážá
webhook áááºáá¶ááŒááºážáá¬áá¬ááá¯áááºáááºáááºá áááºááẠLinux áá¬áá¬áá áºáᯠááá¯á¡ááºáááºá á€áá±á¬ááºážáá«ážááœááºá á¥ááá¬á¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠMCS ááœáẠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯ááá·áº virtual instance áá áºáá¯ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
ááá¯á¡ááºáá±á¬áá±á¬á·ááºáá²ááºááá¯ááá·áºááœááºážááŒá®áž 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
áá¯ááºáá±ááŒááºážáááºáá±á¬ááºááŸá¯ááá¯á· á á¬áááºážááœááºážáá«á
API ááá¯á·ááá¯áẠáááºá¡ááºáá¬áá±á·á áºááŸáááá·áº áááºá webhook áááºáá¶áá¬áá¬ááᯠááŸááºáá¯á¶áááºááá¯ááºáááºá ááá¯ážááŸááºážá á±áááºá áá»áœááºá¯ááºááá¯á·ááẠáááºá¡ááºáá¬áá±á·á áºááŸáá áºááá·áº ááŸááºáá¯á¶áááºáá«áááºá
áá¯á¶ážá¡ááá¯ááºážááᯠááœá¬ážááŒáá·áºáá¡á±á¬áẠááááºážáá»á¯ááºáááºážáá²ááŸá¬á- webhooks ááᯠconfigure áá¯ááºááá·áº bucket ááá¯á·ááœá¬ážá gear ááá¯ááŸáááºáá«á
Webhooks tab ááá¯ááœá¬ážááŒá®áž Add ááá¯ááŸáááºáá«á
á¡ááœááºáá»á¬ážááá¯ááŒáá·áºáá«
ID - webhook áá¡áááºá
á¡ááŒá áºá¡áá»áẠ- áááºá¡ááŒá áºá¡áá»ááºááœá±ááᯠáá¯ááºááœáŸáá·áºááá²á ááá¯ááºáá»á¬áž (áá±á«ááºážááá·áºááŒááºážááŸáá·áº áá»ááºááŒááºáž) ááŒáá·áº áá¯ááºáá±á¬ááºááá·áºá¡áá« ááŒá áºáá±á«áºáá¬ááá·áº á¡ááŒá áºá¡áá»ááºá¡á¬ážáá¯á¶ážááᯠáá¯ááºááœáŸáá·áºááŒááºážááᯠáá»áœááºá¯ááºááá¯á· áááºááŸááºáá¬ážáá«áááºá
URL â webhook áááºáá¶áááŸáááá·áº áá¬áá¬ááááºá á¬á
Filter prefix/suffix ááẠá¡áá»áá¯á·áá±á¬ á ááºážáá»ááºážáá»á¬ážááŸáá·áº ááá¯ááºáá®ááá·áº á¡áá¬áá»á¬ážá¡ááœááºáᬠwebhooks ááᯠáááºáá®ážááá¯ááºá á±ááá·áº filter áá áºáá¯ááŒá áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá webhook ááẠ.png ááá¯ážáá»á²á·ááŸá¯ááŒáá·áº ááá¯ááºáá»á¬ážááá¯áᬠá¡á áá»áá¯ážááá¯ááºá á±áááºá ááá¬áá±á¬ááºááẠ"png" ááá¯á·áá±ážááá«áááºá
áááºááŸáááœááºá ááááºáááºáž 80 ááŸáá·áº 443 ááá¯áᬠwebhook áááºáá¶ááŒááºážáá¬áá¬ááᯠáááºáá±á¬ááºá¡áá¯á¶ážááŒá¯ááẠáá¶á·ááá¯ážáá¬ážáááºá
ááŸáááºááŒáá·áºáá¡á±á¬áẠáá»áááºááá·áºáá«á ááŸáá·áºáá»áœááºá¯ááºááá¯á·áááºá¡á±á¬ááºáá«á¡ááá¯ááºážááŒááºááááá·áºáááºá
áá»áááºááá·áºáááºá
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 áááºáá¶áá¬áá¬á áááºáááºááŸá¯ algorithm ááᯠá¡áá®ážáááºááŒáá·áºááŸá¯áá«áááºá
webhook áááºáá¶ááŒááºáž server á ááŸááºážáááºážáá»ááº
áá»áœááºá¯ááºááá¯á·áá¥ááá¬ááœááºá áá¬áá¬ááᯠ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 ááŸáá áºááá·áº áá¯á¶á·ááŒááºááá·áºáááºážááŒá±á¬ááºážá
- Webhook() - áááºááááºážááŒá±á¬ááºážá URL/webhook ááá¯ááºááœááºáá°-
- ááŒáá·áºáá»ááá±ážáááºáá±á¬ááºááŸá¯ááœáẠááŸááºáá¯á¶áááºááŒááºážááᯠá¡áááºááŒá¯ááẠ(SubscriptionConfirmation function ááá¯ááœá¬ážáá«)á
- áááºáá¬áá±á¬ webhooks (Gorecords áá¯ááºáá±á¬ááºáá»ááº) ááᯠáá¯ááºáá±á¬ááºáááºá
- áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠHmacSha256 ááŸáá·áº HmacSha256hex ááá¯á·ááẠáááºááŸááºááá¯ááœááºáá»ááºáááºá¡ááœáẠhexadecimal áá¶áá«ááºáá»á¬ážáá«áá±á¬ ááá¯ááºážáá áºáá¯á¡áá±ááŒáá·áº á¡ááœááºááŸáá·áºá¡áá° HMAC-SHA256 ááŸáá·áº HMAC-SHA256 áá¯ááºááŸááºááŒááºážááá¯ááºáᬠá¡ááºáááá¯áá®áááºáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážááŒá áºáááºá
- main ááẠáááºááá¯ááºáá±á¬ááºáá»ááºááŒá áºááŒá®ážá command line parameters áá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒá®áž URL handlers áá»á¬ážááᯠá á¬áááºážááœááºážáááºá
áá¬áá¬á០áááºáá¶áá¬ážáá±á¬ Command line áá±á¬ááºáá»á¬áž-
- -port ááẠserver á០áá¬ážáá±á¬ááºááá·áº port ááŒá áºáááºá
- -address - áá¬áá¬á០áá¬ážáá±á¬ááºááá·áº IP ááááºá á¬á
- -script ááẠincoming 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)
}
}
á€áá¯ááºáá±á¬ááºáá»ááºááẠááŸááºáá¯á¶áááºááŒááºáž á¡áááºááŒá¯ááẠáá±á¬ááºážááá¯áá»áẠááá¯á·ááá¯áẠwebhook áá
áºáá¯áá±á¬ááºááŸáááŒááºážááŸááááŸá áá¯á¶ážááŒááºáá±ážáááºá á០á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá
áºáááºá
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"
á
á¬áááºážááœááºážááŸá¯á¡áááºááŒá¯áá»ááºáá±á¬ááºážááá¯áá»ááºááœááºáá«áááºááŒá®áž webhook ááœááºááá«áááºáá±á¬ááŒá±á¬áá·áºá POST áá±á¬ááºážááá¯áá»ááºááœáẠá€ááá·áºááœááºážááŸá¯ááŸááá±ááŒááºáž/áááŸáááŒááºážá¡áá±á«áº á¡ááŒá±áá¶á áááá¯ááááºááá±á¬ááºáááºáá¯ááºáá±á¬ááºááŸá¯ááẠáá¯ááºáá±á¬ááºáá»ááºááá¯á·ááœá¬ážááẠSubscriptionConfirmation
áá«ááŸááá¯áẠfunction áá²ááá¯áááºáá«á GotRecords
.
á
á¬áááºážááœááºážááŒááºážá¡áááºááŒá¯ááŒááºážáá¯ááºáá±á¬ááºáá»ááºááᯠáá»áœááºá¯ááºááá¯á· á¡áá±ážá
áááºááá·áºááœááºážá
ááºážá
á¬ážáááºááá¯ááºáá«á áááºážááá¯áá±á¬áºááŒáá¬ážááá·áºá¡ááŒá±áá¶áá°áá»á¬ážá¡ááá¯ááºáž á¡áá±á¬ááºá¡áááºáá±á¬áºáá±á¬ááºááœááºáá«áááºá
GotRecords áá¯ááºáá±á¬ááºáá»ááºááẠá¡áááºáá±á¬ááºážááá¯ááŸá¯ááᯠááœá²ááŒááºážá áááºááŒá¬ááŒá®áž ááŸááºáááºážá¡áá¬ááá¹áá¯áá áºáá¯á á®á¡ááœáẠááá·áºáááºáá±á¬ááºáá»á¬ážááŸáá·áºá¡áá° ááŒááºá script áá áºáᯠ(á¡áááº-script áá±á¬ááºááœáẠááŒááºáááºážáá²á·áááº) ááᯠáá±á«áºáááº-
- áá¯á¶ážá¡áááº
- á¡áá¬ááá¹áá¯áá±á¬á·
- áá¯ááºáá±á¬ááºáá»ááº-
- copy - á¡áááºá áá°áááºážáá±á¬ááºážááá¯áá»áẠEventName = ObjectCreated | PutObject | PutObjectCopy
- - á¡áááºá áá°áááºážáá±á¬ááºážááá¯áá»áẠEventName = ObjectRemoved | DeleteObject
ááá¯á·ááŒá±á¬áá·áº á¡áá»áááºá¡áááºáááá¬áá«á Post áá
áºáá¯ááŸáá·áº áá
áºáá¯áá±á¬ááºážááá¯ááŸá¯á¡á¬áž áá±á¬áºááŒáá«ááŸááááºá
script.sh bucketA some-file-to-bucket copy
ဠwebhook áááºáá¶ááŒááºážáá¬áá¬ááẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áá¯ááºáá¯ááºááŸá¯ááŒá±ááŸááºážáá»ááºááá¯ááºáá±á¬áºáááºáž ááŒá áºááá¯ááºáá»á±ááŸááá±á¬ á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á ááá¯ážááŸááºážáá±á¬á¥ááá¬áá áºáá¯ááŒá áºááŒá±á¬ááºáž áá¬ážáááºáá¬ážááá·áºáááºá
á¡áá¯ááºá¥ááá¬
MCS ááŸá áááºááá¯á¶ážá០ááá¯ááºáá»á¬ážááᯠAWS ááŸá á¡áááºáá¯á¶ážááá¯á· áá áºááŒáá¯ááºáááºáž áá¯ááºááŒáá«á áá¯á·á áááºááá¯á¶ážááᯠmyfiles-ash áá¯áá±á«áºáááºá á¡áááºááá¯ááºááᯠmyfiles-backup áá¯áá±á«áºááẠ(AWS ááœáẠáá¯á¶ážáá¯á¶ážááœá²á·á ááºážáá¯á¶ááẠá€áá±á¬ááºážáá«ážáá¡ááá¯ááºážá¡áá¬áááºáá»á±á¬áºááœááºáááº)á ááá¯á·ááŒá±á¬áá·áºá ááá¯ááºáá áºááá¯ááºááᯠáááºááá¯á¶ážááœáẠáá¬ážááŸáááá·áºá¡áá«á áááºážááááá¹áá°ááẠá¡áááºááá¯ááºááœáẠáá±á«áºáá¬áááºááŒá áºááŒá®áž áááºážááᯠáááºáááá¯ááºá០áá»ááºááá¯ááºááá·áºá¡áá«á áááºážááᯠá¡áááºááá¯ááºááœáẠáá»ááºáá áºááá·áºáááºá
MCS cloud ááá¯ááŸá±á¬ááºááŸá¯ááŸáá·áº AWS cloud ááá¯ááŸá±á¬ááºááŸá¯ááŸá áºáá¯áá¯á¶ážááŸáá·áº ááœá²áááºá¡áá¯á¶ážááŒá¯ááá¯ááºááá·áº awscli utility ááᯠá¡áá¯á¶ážááŒá¯á áá¯á¶ážáá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºáá«áááºá
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 á¡ááœááºá command ááᯠrun áá±á¬á¡áá«ááœáẠâ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
áááºáá±á¬ááºáá²á·áááºá
á¡áá¯áááºáá¬áá²á·áá»áááºááá¯áá¯ááºáá±á¬ááºááá¯á·á¡ááœáẠscript áá áºáá¯áá±ážááá¯ááºáá¡á±á¬ááºá á¡á²áá«ááᯠ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
áááºááá¯á¡áá¯ááºáá¯ááºáá² ááŒáá·áºáá¡á±á¬ááºá ááŸá±á¬ááº
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 bucket á á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠá á áºáá±ážááŒáá«á áá¯á·á
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:~$
ááá¯ááºááá¯áá»ááºááá¯ááºá ááŒá¿áá¬ááŒá±ááŸááºážááŒá®ážáá«ááŒá®á
áááá¯á¶ážááŸáá·áº áá¯ááºá áá¬áá»á¬áž
á€áá±á¬ááºážáá«ážááœááºáá¯á¶ážáá±á¬áá¯ááºá¡á¬ážáá¯á¶ážáááº
á€áá¯ááºááẠááá·áºááŸá¯ááºááŸá¬ážááŸá¯áá»á¬ážááœáẠS3 webhooks ááᯠáááºá¡áá¯á¶ážááŒá¯áá¯á¶á¥ááá¬áá áºáá¯áá»áŸáá¬ááŒá áºáááºá á¡á ááœááºáá»áœááºáá±á¬áºááŒá±á¬áá²á·ááá·áºá¡ááá¯ááºážá áááºáááºááá¯áá²á·ááá¯á·áá±á¬áá¬áá¬ááá¯áá¯ááºáá¯ááºááŸá¯ááœááºá¡áá¯á¶ážááŒá¯áááºá á®á ááºáá¬ážáá«áá áááºáááºá¡áááºážáá¯á¶ážáá áºááŒáá¯ááºáááºáá¯ááºáá±á¬ááºááŸá¯á¡ááœááºáá¬áá¬ááá¯á¡áááºážáá¯á¶ážááŒááºáááºáá±ážáá¬ážáááºááá¯á¡ááºáááº- áááºážá á®áá áºáá¯ááœááºáááºáá¬áá±á¬ webhooks áá»á¬ážááá¯á á¬áááºážááœááºážáá« (RabbitMQ ááá¯á·ááá¯áẠNATS) ááŸáááºážááá¯á·ááá¯ááœá²ááŒááºážá áááºááŒá¬ááŒá®ážáá¯ááºáá±á¬ááºáá«á á¡áá¯ááºááá¬ážáá»áŸá±á¬ááºááœáŸá¬áá»á¬ážááŸáá·áºá ááá¯ááºáá«áá webhooks áá»á¬áž á¡áá»á¬ážá¡ááŒá¬ážáá±á¬ááºááŸááá¬áá±á¬á¡áá«á á¡áá¯ááºáá»á¬ážááá¯ááŒá®ážááŒá±á¬ááºááẠáá¬áá¬áááºážááŒá áºáá»á¬áž áááºážáá«ážáá±ááŸá¯ááᯠáááºááŒá¯á¶ááœá±á·áááá¯ááºáááºá á á®áááºážáá»á¬ážááŸááá±ááŒááºážááẠááá·áºá¡á¬áž áá¬áá¬ááŸáá·áº á¡áá¯ááºááá¬ážáá»á¬ážá¡á¬áž ááŒáá·áºáá±áá±ážááá¯ááºááá·áºá¡ááŒáẠáá»ááºááœááºááŸá¯áá»á¬ážááœáẠáááºáá«ááá²áá² áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá·áº ááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážááá¯ááºá á±áá«áááºá áá áºáá¯ááºááŒááºážááᯠááá¯ááá¯á¡áá±ážá áááºááŸáá·áº ááá¯ááá¯á á¶ááŸá¯ááºážáááºááŸááºáá¬ážáá±á¬ áá¯á¶á á¶ááá¯á· ááŒá±á¬ááºážáááºáááºáž á¡ááŒá¶ááŒá¯ááá¯áá«áááºá
áá¶áá±á¬ááºážáá«á á±!
áá±á«ááºážá ááºá¡áá±á«áº áá±á¬ááºáááºáááºááŸá¯áááº-
Mail.ru Cloud Solutions S3 ááá¯ááºá áá áºá¡ááŒá Ạá¡áá¬ááá¹áá¯ááá¯ááŸá±á¬ááºááŸá¯ááŒáá·áº áá¯ááºáá±á¬ááºááŒááºážá ááŒáá¯ááºááá¯ááºááŸá¯ááᯠá¡ááá¯ááºáá°ááẠá¡áá¬ááá¹áá¯ááá¯ááŸá±á¬ááºááŸá¯ááᯠáááºááá¯á·á¡áá¯á¶ážááŒá¯ááááºážá
source: www.habr.com