ืืขืฉืขืขื ืืฉ-ืืขืืจืืื ืึทืจืงืึทืืขืงืืฉืขืจ ืื ืงืจืืกืื ืื ืคึผืจืืึทื ืขืคืขืงืืืืืงืืึทื ืคืื ืื ืจืขืกืืจืกื ืืขื ืืฆื ืืืืึทื ืืื ืืขื ืขื ืืขื ืืฆื ืืืืื ืืื ืืขื ืืึธืืขื ื ืืืขื ืืื ืืขื ืขื ืืืจืฃ. ืขืก ืืขื ืขื ืคืืืข ืึธืคึผืฆืืขืก ืืื ืฆื ืื ืกืืจืืืขื ื ืืขื ืืื ื ืืฉื ืฉืึทืคึฟื ื ืึธื ืืืึธืืงื ืขื ืืืืื ืืื ืึทืจืืขื ืึทืคึผืืึทืงืืืฉืึทื ื. ืืื ืืืึทื ื ืืื ืืืขื ืจืขืื ื ืืฉื ืืืขืื FaaS, ืึธืืขืจ ืืืขืื ืืืขืืืึธืึธืงืก. ืืื ืืืขื ืืืืึทืื ืึท ืืืืึธืจืืึทื ืืืืฉืคืืื ืคืื ืืึทื ืืืื ื ืืขืฉืขืขื ืืฉื ืืื ืืืขืืืึธืึธืงืก ืคึฟืึทืจ ืึทืืืืฉืขืงืฅ ืกืืึธืจืืืืฉ.
ืขืืืขืืข ืืืขืจืืขืจ ืืืขืื ืึทืืืืฉืขืงืฅ ืกืืึธืจืืืืฉ ืืื ืืืขืืืึธืึธืงืก. ืึธืืืืฉืขืงื ืกืืึธืจืืืืฉ ืึทืืึทืื ืืืจ ืฆื ืงืจืึธื ืงืืื ืืึทืื ืืื ืื ืืืึธืืงื ืืื ืื ืคืึธืจืขื ืคืื ืึทืืืืฉืขืงืฅ, ืฆืืืจืืืืขื ืืืจื S3 ืึธืืขืจ ืื ืื ืืขืจ ืึทืคึผื (ืืืคึผืขื ืืื ื ืืืืฃ ืืืคึผืืึทืืขื ืืืืฉืึทื) ืืืจื ืืืืคึผ / ืืืืคึผืก. ืืืขืืืึธืึธืงืก ืืขื ืขื ืืืื ืื ืื ืืืืคึผ ืงืึทืืืืึทืงืงืก. ืืื ืืขื ืขื ืืืคึผืืงืื ืืจืืืขืจื ืืืจื ืึท ืืขืฉืขืขื ืืฉ, ืึทืืึท ืืื ืงืึธื ืคึผืืฉื ืฆื ืึท ืจืืคึผืึทืืึทืืึธืจื ืึธืืขืจ ืึท ืืึทืืขืจืงืื ื ืืื ืึทืจืืึทื ืืขืฉืืงื ืืืืฃ ืึท ืืืึธื. ืืืขื ืึท ืืขืฉืขืขื ืืฉ ืึทืงืขืจื, ืื ืึธื ืืืื ืคึผืืึทืฅ ืกืขื ืื ืึท HTTP ืืขืื ืฆื ืื URL ืกืคึผืขืกืืคืืขื ืคึฟืึทืจ ืื ืืืขืืืึธืึธืง. ืืื ืึท ืจืขืืืืืึทื, ืืืจ ืงืขื ืขื ืืึทืื ืืขืฉืขืขื ืืฉื ืืืืฃ ืืืื ืคึผืืึทืฅ ืฆืื ืื ืึทืงืฉืึทื ื ืืืืฃ ืื ืืขืจื (
ืืืืฉืคืืื ืคืื ืคึผืฉืื ืงืึทืกืขืก ืืืขื ืึทืืึท ืึธืืึทืืืืฉืึทื ืงืขื ืขื ืืืื ืืขืืืืื ื:
- ืงืจืืืืืื ื ืงืืคืืขืก ืคืื ืึทืืข ืึทืืืืฉืขืงืฅ ืืื ืื ืื ืืขืจ ืืืึธืืงื ืกืืึธืจืืืืฉ. ืงืืคืืขืก ืืืื ืืืื ืืืฉืืคื ืืืืฃ ืื ืคืืืขื ืืืขื ืืขืงืขืก ืืขื ืขื ืืืกืืฃ ืึธืืขืจ ืืฉืืื ืืืฉื.
- ืึธืืึทืืึทืืืง ืฉืึทืคืื ื ืคืื ืึท ืกืขืจืืข ืคืื โโโโืืืืืื ืึทืืืก ืคืื ืืจืึทืคืืง ืืขืงืขืก, ืึทืืื ื ืืืึธืืขืจืืึทืจืงืก ืฆื ืคืึธืืืึทืืจืึทืคืก ืืื ืื ืืขืจืข ืืืื ืืึธืืืคืืงืึทืืืึธื ืก.
- ืึธื ืืึธื ืืืขืื ืืขื ืึธื ืงืืืขื ืคืื ื ืืึทืข ืืึธืงืืืขื ืื (ืืืฉื, ืึท ืคืื ืื ืืขืจืืขืืืืื ืึทืงืึทืื ืืื ื ืืื ืกื ืืคึผืืึธืึทืืก ืจืืคึผืึธืจืฅ ืฆื ืื ืืืึธืืงื, ืืื ืคืื ืึทื ืฆืืขื ืืึธื ืืืึธืจืื ื ื ืขืื ื ืึธืืืึทืคืึทืงืืืฉืึทื ื ืืืขืื ื ืืึทืข ืจืืคึผืึธืจืฅ, ืืฉืขืงืก ืืื ืึทื ืึทืืืืขืก ืืื).
- ืึท ืืืกื ืืขืจ ืงืึธืืคึผืืืฆืืจื ืงืึทืกืขืก ืึทืจืืึทื ื ืขืืขื, ืืืฉื, ืืืฉืขื ืขืจืืืืื ื ืึท ืืงืฉื ืฆื Kubernetes, ืืืึธืก ืงืจืืืืฅ ืึท ืคึผืึธื ืืื ืื ื ืืืืืง ืงืึทื ืืืื ืขืจื, ืคึผืึทืกืื ืึทืจืืขื ืคึผืึทืจืึทืืขืืขืจืก ืฆื ืขืก, ืืื ื ืึธื ืคึผืจืึทืกืขืกืื ื ืงืึทืืึทืคึผืกืื ืื ืงืึทื ืืืื ืขืจ.
ืืื ืึท ืืืืฉืคึผืื, ืืืจ ืืืขืื ืืึทืื ืึท ืืืึทืจืืึทื ื ืคืื ืึทืจืืขื 1, ืืืขื ืขื ืืขืจืื ืืขื ืืื ืื Mail.ru ืงืืึธืื ืกืึทืืืฉืึทื ื (MCS) ืึทืืืืฉืขืงื ืกืืึธืจืืืืฉ ืขืืขืจ ืืขื ืขื ืกืื ืืงืจืึทื ืืืื ืืื AWS ืืืืคืขืฅ ืกืืึธืจืืืืฉ ืืื ืืืขืืืึธืึธืงืก. ืืื ืึท ืคืึทืงืืืฉ ืืึธืืืื ืคืึทื, ืืืกืื ืืงืจืึทื ืึทืก ืึทืจืืขื ืืึธื ืืืื ืฆืืืขืฉืืขืื ืืืจื ืจืขืืืฉืืกืืขืจืื ื ืืืขืืืึธืึธืงืก ืืื ืึท ืจืื, ืึธืืขืจ ืคึฟืึทืจ ืื ืืจืืื ืื ื ืึทืจืืขื ืืืจ ืืืขืื ืืึธื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืึธื ืืขื.
ืึทืจืืขื ืกืืขืืข
ืื ืื ืืขืจืึทืงืฉืึทื ืคึผืจืึธืืึธืงืึธื ืืื ืืืกืงืจืืืื ืืื ืืขืืึทื ืืื
- ืคึผืืืืืฉืื ื ืืื ืกื, ืืืึธืก ืืื ืืืืฃ ืื S3 ืกืืึธืจืืืืฉ ืืืึทื ืืื ืคึผืึทืืืืฉืึทื ืืืืคึผ ืจืืงืืืขืก ืืืขื ืื ืืืขืื ืืึธืึธืง ืืื ืืจืืืขืจื.
- ืืืขืืืึธืึธืง ืจืืกืืืืื ื ืกืขืจืืืขืจ, ืืืึธืก ืืืกืึทื ื ืฆื ืจืืงืืืขืก ืคืื ืื HTTP ืืจืืืกืืขืื ืืื ืกื ืืื ืคึผืขืจืคืึธืจืื ืฆืื ืขืืขื ืึทืงืฉืึทื ื. ืืขืจ ืกืขืจืืืขืจ ืงืขื ืขื ืืืื ืืขืฉืจืืื ืืื ืงืืื ืฉืคึผืจืึทื; ืืื ืืื ืืืขืจ ืืืึทืฉืคึผืื, ืืืจ ืืืขืื ืฉืจืืึทืื ืืขื ืกืขืจืืืขืจ ืืื Go.
ื ืกืคึผืขืฆืืขื ืฉืืจืื ืคืื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืืืขืืืึธืึธืงืก ืืื ืื 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
ืึทืืึธื ืืจื ืฆื ืืจืืืกืืขืื ืืื ืกื
ืืืจ ืงืขื ืขื ืจืขืืืกืืจืืจื ืืืื ืืืขืืืึธืึธืง ืจืืกืืืืื ื ืกืขืจืืืขืจ ืืืจื ืื ืึทืคึผื ืึธืืขืจ ืืืขื ืฆืืืื ื. ืคึฟืึทืจ ืคึผืึทืฉืืขืก, ืืืจ ืืืขืื ืคืึทืจืฉืจืืึทืื ืืืจื ืื ืืืขื ืฆืืืื ื:
ืืื ืก ืืืื ืฆื ืื ืขืืขืจ ืึธืคึผืืืืืื ื ืืื ืื ืงืึธื ืืจืึธื ืฆืืืขืจ.- ืืืื ืฆื ืื ืขืืขืจ ืคึฟืึทืจ ืืืึธืก ืืืจ ืืืขืื ืงืึทื ืคืืืืขืจ ืืืขืืืึธืึธืงืก ืืื ืืื ืืืืฃ ืื ืืึทื ื:
ืืืื ืฆื ืื ืืืขืืืึธืึธืงืก ืงืืืืื ืืื ืืื ืืืื:
ืคึผืืึธืืืืจื ืืื ืื ืคืขืืืขืจ:
ID - ืืขืจ ื ืึธืืขื ืคืื ืื ืืืขืืืึธืึธืง.
ืืขืฉืขืขื ืืฉ - ืืืึธืก ืืขืฉืขืขื ืืฉื ืฆื ืึทืจืืืขืจืคืืจื. ืืืจ ืืึธืื ืืึทืฉืืืื ืื ืืจืึทื ืกืืืกืืข ืคืื โโืึทืืข ืืขืฉืขืขื ืืฉื ืืืึธืก ืคืึทืื ืืืขื ืืืจ ืึทืจืืขื ืืื ืืขืงืขืก (ืึทืืื ื ืืื ืืืกืืขืงื).
URL - ืืืขืืืึธืึธืง ืจืืกืืืืื ื ืกืขืจืืืขืจ ืึทืืจืขืก.
ืคืืืืขืจ ืคึผืจืขืคืืงืก / ืกืึทืคืืงืก ืืื ืึท ืคืืืืขืจ ืืืึธืก ืึทืืึทืื ืืืจ ืฆื ืืืฉืขื ืขืจืืื ืืืขืืืึธืึธืงืก ืืืืื ืคึฟืึทืจ ืึทืืืืฉืขืงืฅ ืืืขืืขื ืก ื ืขืืขื ืืืืึทืื ืืืืขืจ ืึผืืืื. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืื ืกืืจ ืคึฟืึทืจ ืื ืืืขืืืึธืึธืง ืฆื ืฆืื ืื ืืืืื ืืขืงืขืก ืืื ืื .ืคึผื ื ืืขืฉืคึผืจืืื, ืืื ืคืืืืขืจ ืกืึทืคืืงืก ืืืจ ืืึทืจืคึฟื ืฆื ืฉืจืืึทืื "ืคึผื ื".
ืืขืจืืืืึทื, ืืืืื ืคึผืึธืจืฅ 80 ืืื 443 ืืขื ืขื ืืขืฉืืืฆื ืคึฟืึทืจ ืึทืงืกืขืก ืื ืืืขืืืึธืึธืง ืจืืกืืืืื ื ืกืขืจืืืขืจ.
ืืืืืจ ืงืืืงื ืืืื ืงืจืืง ืืื ืืืจ ืืืขืื ืืขื ืื ืคืืืืขื ืืข:
ืืืง ืฆืืืขืืขืื.
ืืขืจ ืืืขืืืึธืึธืง ืจืืกืืืืื ื ืกืขืจืืืขืจ ืืืืืื ืืื ืืืื ืืึธืืก ืื ืคึผืจืึธืืจืขืก ืคืื ืื ืคืึทืจืืฉืขืคึผืขื ืจืขืืืกืืจืึทืฆืืข ืคึผืจืึธืฆืขืก:
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
ืจืขืืืกืืจืึทืฆืืข ืืื ืืขืขื ืืืงื. ืืื ืืขืจ ืืืืึทืืขืจ ืึธืคึผืืืืืื ื, ืืืจ ืืืขืื ื ืขืืขื ืึท ื ืขืขื ืืขืจ ืงืืง ืืื ืื ืึทืืืขืจืืืึทื ืคืื ืึธืคึผืขืจืึทืฆืืข ืคืื โโืื ืืืขืืืึธืึธืง ืจืืกืืืืื ื ืกืขืจืืืขืจ.
ืืึทืฉืจืืึทืืื ื ืคืื ืื ืืืขืืืึธืึธืง ืจืืกืืืืื ื ืกืขืจืืืขืจ
ืืื ืืื ืืืขืจ ืืืึทืฉืคึผืื, ืืขืจ ืกืขืจืืืขืจ ืืื ืืขืฉืจืืื ืืื 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))
}
ืืื ืก ืงืืง ืืื ืื ืืืืคึผื ืคืึทื ืืงืฉืึทื ื:
- ืคึผืื ื () - ืึท ืืึทืจืฉืจืื ืืืึธืก ืจืืกืคึผืึทื ืื ืืืจื URL / ืคึผืื ื, ืื ืกืืืคึผืืึทืกื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืึท ืืขืื ืืึธื ื.
- ืืืขืืืึธืึธืง () - ืืืืคึผื ืืึทืจืฉืจืื, URL / ืืืขืืืึธืึธืง ืืึทื ืืืขืจ:
- ืงืึทื ืคืขืจืื ืจืขืืืกืืจืึทืฆืืข ืืืืฃ ืื ืืจืืืกืืขืื ืืื ืกื (ืืืื ืฆื ืื SubscriptionConfirmation ืคืื ืงืฆืืข),
- ืคึผืจืึทืกืขืกืึทื ืื ืงืึทืืื ื ืืืขืืืึธืึธืงืก (ืืึธืจืขืงืึธืจืืก ืคึฟืื ืงืฆืืข).
- ืคืึทื ืืงืฉืึทื ื HmacSha256 ืืื HmacSha256hex ืืขื ืขื ืืืคึผืืึทืืึทื ืฅ ืคืื ืื HMAC-SHA256 ืืื HMAC-SHA256 ืขื ืงืจืืคึผืฉืึทื ืึทืืืขืจืืืึทืื ืืื ืจืขืืืืืึทื ืืื ืึท ืฉืืจืืงื ืคืื ืืขืงืกืึทืืขืกืืืึทื ื ืืืขืจื ืคึฟืึทืจ ืงืึทืืงืืึทืืืืืื ื ืื ืืกืืืข.
- ืืืืคึผื ืืื ืื ืืืืคึผื ืคึฟืื ืงืฆืืข, ืคึผืจืึทืกืขืกืึทื ืืึทืคึฟืขืื ืฉืืจื ืคึผืึทืจืึทืืขืืขืจืก ืืื ืจืขืืืฉืืกืืขืจื URL ืืึทื ืืืขืจืก.
ืืึทืคึฟืขืื ืฉืืจื ืคึผืึทืจืึทืืขืืขืจืก ืื ืืขื ืืืขื ืืืจื ืื ืกืขืจืืืขืจ:
- -ืคึผืึธืจื ืืื ืืขืจ ืคึผืึธืจื ืืืืฃ ืืืึธืก ืืขืจ ืกืขืจืืืขืจ ืืืขื ืืขืจื.
- -ืึทืืจืขืกืก - 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)
}
}
ืื ืคึฟืื ืงืฆืืข ืืึทืฉืืืื ืฆื ืึท ืืงืฉื ืฆื ืืึทืฉืืขืืืงื ืจืขืืืกืืจืึทืฆืืข ืึธืืขืจ ืึท ืืืขืืืึธืึธืง ืืื ืื ืืขืงืืืขื. ืืื ืืืื ืคืื
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 ืคึฟืื ืงืฆืืข ืคึผืึทืจืกืขืก ืึทื ืื ืงืึทืืื ื ืืขืื ืืื ืคึฟืึทืจ ืืขืืขืจ ืจืขืงืึธืจื ืืืืคืขืฅ ืจืืคื ืึท ืคืื ืืจืืืกื ืืืง ืฉืจืืคื (ืืืขืืขื ืก ื ืึธืืขื ืืื ืืืจืืืขืืื ืืขื ืืื ืื -ืกืงืจืืคึผื ืคึผืึทืจืึทืืขืืขืจ) ืืื ืื ืคึผืึทืจืึทืืขืืขืจืก:
- ืขืืขืจ ื ืึธืืขื
- ืืืืคืขืฅ ืฉืืืกื
- ืงืึทืืฃ:
- ืงืึธืคึผืืข - ืืืื ืืื ืืขืจ ืึธืจืืืื ืขื ืืขืื EventName = ObjectCreated | PutObject | PutObjectCopy
- ืืืกืืขืงื - ืืืื ืืื ืืขืจ ืึธืจืืืื ืขื ืืขืื EventName = ObjectRemoved | DeleteObject
ืืืื, ืืืื ืึท ืงืจืืง ืงืืื ืืื ืึท ืคึผืึธืกื ืืขืื, ืืื ืืืกืงืจืืืื
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
ืืื ืก ืืขื ืืื ืขืก ืึทืจืืขื. ืืืจื
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:~$
ืืขืจ ืืขืงืข ืืื ืืืืกืืขืืขืงื, ืื ืคึผืจืึธืืืขื ืืื ืกืึทืืืื.
ืืกืงื ื ืืื ืืึธืืึธ
ืื ืงืึธื ืืขื ืืฆื ืืื ืืขื ืึทืจืืืงื ืืื
ืืขืจ ืงืึธื ืืื ืืึธืจื ืืฉื ืืขืจ ืืื ืึท ืืืืฉืคึผืื ืคืื ืืื ืืืจ ืงืขื ืขื ื ืืฆื S3 ืืืขืืืึธืึธืงืก ืืื ืืืื ืึทืงืืืืืืืขืื. ืืื ืืื ืืขืืืื ืืื ืื ืึธื ืืืื, ืืืื ืืืจ ืคึผืืึทื ืฆื ื ืืฆื ืึทืืึท ืึท ืกืขืจืืืขืจ ืืื ืคึผืจืึธืืืงืฆืืข, ืืืจ ืืึทืจืคึฟื ืฆื ืืืึท ืืื ืืกืืขืจ ืจืืจืืื ืื ืกืขืจืืืขืจ ืคึฟืึทืจ ืืืกืื ืืงืจืึทื ืึทืก ืึทืจืืขื: ืคืึทืจืฉืจืืึทืื ืื ืงืึทืืื ื ืืืขืืืึธืึธืงืก ืืื ืึท ืจืื (RabbitMQ ืึธืืขืจ NATS), ืืื ืคึฟืื ืืึธืจื ืคึผืึทืจืก ืืื ืืื ืคึผืจืึทืกืขืกื ืืื. ืืื ืึทืจืืขืืขืจ ืึทืคึผืืึทืงืืืฉืึทื ื. ืึทื ืืขืจืฉ, ืืืขื ืืืขืืืึธืึธืงืก ืึธื ืงืืืขื ืืึทืกืืืืื, ืืืจ ืงืขื ืืจืขืคื ืึท ืคืขืื ืคืื ืกืขืจืืืขืจ ืจืขืกืืจืกื ืฆื ืคืึทืจืขื ืืืงื ืืึทืกืงืก. ืื ืืืึทืืืึทื ืคืื ืงืืื ืึทืืึทืื ืืืจ ืฆื ืคืึทืจืฉืคึผืจืืืื ืื ืกืขืจืืืขืจ ืืื ืืืขืจืก, ืืื ืืขืืื ื ืืื ืกืึธืืืืข ืคึผืจืึธืืืขืืก ืืื ืจืืคึผืืืื ื ืืึทืกืงืก ืืื ืคืึทื ืคืื ืคืืืืืขืจื. ืขืก ืืื ืืืื ืงืขืืืึทืืง ืฆื ืืืืฉื ืื ืืึธืืื ื ืฆื ืึท ืืขืจ ืืืืืืื ืืื ืืขืจ ืกืืึทื ืืขืจืืืืื.
ืืื ืืืืง!
ืืขืจ ืืืืขื ืขื ืืืขืื ืืขื ืืขืืข:
ืืจืืขืื ืืื Mail.ru Cloud Solutions S3 ืึทืืืืฉืขืงืฅ ืกืืึธืจืืืืฉ ืืื ืึท ืืขืงืข ืกืืกืืขื. ืืื ืึธืืืืฉืขืงื ืกืืึธืจืืืืฉ ืืื ืืขื ืืฆื ืฆื ืฉืืึธืื ืื ืคืึทืจืืขืกื.
ืืงืืจ: www.habr.com