แแแแแแแแแแ แแ แแแแขแแ แแแฃแแ แแ แฅแแขแแฅแขแฃแ แ แแ แแแก แแแแแงแแแแแฃแแ แ แแกแฃแ แกแแแแก แฎแแ แฏแแแแก แแคแแฅแขแฃแ แแแแก, แ แแแแแ แแกแแแ แแแแแแงแแแแแ แแฎแแแแ แแ แแแแแแขแจแ, แ แแชแ แกแแญแแ แแ. แแ แกแแแแแก แแ แแแแแ แแแ แแแแขแ, แแฃ แ แแแแ แฃแแแ แแแแฎแแ แชแแแแแแก แแก แแ แแ แจแแฅแแแแ แแแแแขแแแแแ แฆแ แฃแแแแแแแ แแ แแแฃแแแแ, แ แแแแ แช แแฃแจแ แแแแแแแชแแแแ. แแ แแฆแแก แแ แแแกแแฃแแ แแ แแ แ FaaS-แแ, แแ แแแแ แแแแฐแฃแแแแแ. แแ แแแฉแแแแแแ แแแแแแแแแแก แแแ แแแแก แแแแแแแแก แแแแแฅแขแแแแก แจแแแแฎแแแก แแแ-แแแฃแฅแแแแก แแแแแงแแแแแแ.
แ แแแแแแแแ แกแแขแงแแ แแแแแฅแขแแแแก แจแแแแฎแแแกแ แแ แแแแฐแฃแแแแแก แจแแกแแฎแแ. แแแแแฅแขแแแแก แจแแแแฎแแ แกแแจแฃแแแแแแก แแแซแแแแ แจแแแแแฎแแ แแแแแกแแแแ แ แแแแแชแแแ แฆแ แฃแแแแจแ แแแแแฅแขแแแแก แกแแฎแแ, แฎแแแแแกแแฌแแแแแ S3-แแ แแ แกแฎแแ API-แแ (แแแแแแแแแแฃแแแ แแแแฎแแ แชแแแแแแแแ) HTTP/HTTPS-แแก แกแแจแฃแแแแแแ. Webhooks แแแแแแแ แแ แแก แแแ แแแแฃแแ HTTP แแแแแซแแฎแแแ. แแกแแแ, แ แแแแ แช แฌแแกแ, แแแแแฌแแแฃแแแ แแแแแแแแ, แ แแแแ แแชแแ แแแแแก แแแแแขแแแ แกแแชแแแจแ แแ แแแแแแขแแ แแก แแแแแฅแแแงแแแแ แแแแแแ. แ แแแแกแแช แฎแแแแ แแแแแแแ, แกแแฌแงแแกแ แกแแแขแ แแแแแแแแก HTTP แแแแฎแแแแแก webhook-แแกแแแแก แแแแแแแแฃแ URL-แแ. แจแแแแแแ, แแฅแแแ แจแแแแซแแแแ แแแแฌแงแแ แแแแแแแแแ แแ แ แกแแแขแแ, แแแแฅแแแแแแก แแแแ แแแ (
แแแ แขแแแ แจแแแแฎแแแแแแแก แแแแแแแแแแ, แ แแแแกแแช แแกแแแ แแแขแแแแขแแแแชแแแก แแแแแงแแแแแ แจแแกแแซแแแแแแแ:
- แงแแแแ แแแแแฅแขแแก แแกแแแแแก แจแแฅแแแ แกแฎแแ แฆแ แฃแแแแแแ แกแแชแแแจแ. แแกแแแแ แฃแแแ แแฅแแแแแ แแแฃแงแแแแแแแแ, แ แแแแกแแช แคแแแแแแ แแแแแแขแแแ แแ แแชแแแแแ.
- แแ แแคแแแฃแแ แคแแแแแแแก แแกแแแแแแแก แกแแ แแแก แแแขแแแแขแฃแ แ แจแแฅแแแ, แคแแขแแแแแ แฌแงแแแก แแแจแแแแแก แแแแแขแแแ แแ แแแแแกแแฎแฃแแแแแก แกแฎแแ แชแแแแแแแแแ.
- แจแแขแงแแแแแแแ แแฎแแแ แแแแฃแแแแขแแแแก แฉแแแแกแแแแก แจแแกแแฎแแ (แแแแแแแแแ, แแแแแฌแแแแแฃแแ แกแแแฃแฆแแแขแ แ แกแแ แแแกแ แแขแแแ แแแแก แแแแแ แแจแแแก แฆแ แฃแแแแจแ แแ แคแแแแแกแฃแ แ แแแแแขแแ แแแแ แแฆแแแก แจแแขแงแแแแแแแแแก แแฎแแแ แแแแแ แแจแแแแก แจแแกแแฎแแ, แแแแฌแแแแก แแ แแแแแแแแแแก แแแ).
- แแแแแ แฃแคแ แ แ แแฃแแ แจแแแแฎแแแแแแ แแแแชแแแก, แแแแแแแแแ, แแแแฎแแแแแก แแแแแ แแ แแแแก Kubernetes-แแกแแแแก, แ แแแแแแช แฅแแแแก แแแแก แกแแญแแ แ แแแแขแแแแแ แแแแ, แแแแแกแชแแแก แแแก แแแแชแแแแก แแแ แแแแขแ แแแก แแ แแแแฃแจแแแแแแก แจแแแแแ แแจแแแแ แแแแขแแแแแ แ.
แแแแแแแแแ, แฉแแแ แแแแแแแแแแ แแแแแแแแแก 1 แแแ แแแแขแก, แ แแแแกแแช Mail.ru Cloud Solutions (MCS) แแแแแฅแขแแแแก แจแแแแฎแแแก แแแแแฃแแจแ แชแแแแแแแแแ แกแแแฅแ แแแแแแแแ AWS แแแแแฅแขแแแแก แกแแชแแแจแ แแแแฐแฃแแแแแก แแแแแงแแแแแแ. แ แแแแฃแ แแแขแแแ แแฃแ แจแแแแฎแแแแแจแ, แแกแแแฅแ แแแฃแแ แกแแแฃแจแแ แฃแแแ แแงแแก แฃแแ แฃแแแแแงแแคแแแ แแแ-แฐแฃแแแแแก แ แแแจแ แแแ แแแแกแขแ แแ แแแแ, แแแแ แแ แกแแกแฌแแแแ แแแแแแแแแก แจแแกแ แฃแแแแแก แแแแก แแแ แแจแ แแแแแแแแแแ.
แกแแแฃแจแแ แกแฅแแแ
แฃแ แแแแ แแฅแแแแแแแก แแ แแขแแแแแ แแแขแแแฃแ แแ แแ แแก แแฆแฌแแ แแแ
- แกแแแแแแแชแแแแ แกแแ แแแกแ, แ แแแแแแช แแ แแก S3 แจแแแแฎแแแก แแฎแแ แแก แแ แแฅแแแงแแแแก HTTP แแแแฎแแแแแแก, แ แแแแกแแช webnhook แแแแฅแแแแแแแ.
- Webhook แแแแฆแแแ แกแแ แแแ แ, แ แแแแแแช แฃแกแแแแก HTTP แกแแแแแแแชแแแแ แกแแ แแแกแแก แแฎแแแแแแก แแ แแกแ แฃแแแแก แจแแกแแแแแแก แแแฅแแแแแแแแก. แกแแ แแแ แ แจแแแซแแแแ แแแแฌแแ แแก แแแแแกแแแแ แแแแแ; แฉแแแแก แแแแแแแแจแ แฉแแแ แแแแฌแแ แ แกแแ แแแ แก Go-แจแ.
S3 API-แจแ แแแแฐแฃแแแแแก แแแแแ แแแแก แแแแกแแแฃแแ แแแฃแแ แแแฎแแกแแแแแแแแแ แแแแฐแฃแแแก แแแแฆแแแ แกแแ แแแ แแก แ แแแแกแขแ แแชแแ แแแแแฅแแแงแแแแแก แกแแ แแแกแแ. แแแ แซแแ, แแแแฐแฃแแแก แแแแฆแแแแ แกแแ แแแ แแ แฃแแแ แแแแแแกแขแฃแ แแก แแแแแฅแแแงแแแแแก แกแแ แแแกแแก แจแแขแงแแแแแแแแแแก แฎแแแแแฌแแ แ (แแแแฐแฃแแแก แกแฎแแ แแแแแ แแแแจแ, แ แแแแ แช แฌแแกแ, แแแแแฌแแ แแก แแแแแกแขแฃแ แแแ แแ แแ แแก แกแแญแแ แ).
แจแแกแแแแแแกแแ, 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) ...
แกแแฅแแฆแแแแแก แแแแแแ แแแ แแแแฐแฃแแแก แแแแฆแแแ แกแแ แแแ แแ:
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-แก แแ แแแ แแแขแแ แคแแแกแแก แแแจแแแแแแ. แกแแแแ แขแแแแกแแแแก, แฉแแแ แแแแ แแแแกแขแ แแ แแแแแ แแแ แแแขแแ แคแแแกแแก แกแแจแฃแแแแแแ:
แแแแแ แแแแแแแแแ แแแแแฃแแแแแก แแแแงแแคแแแแแแจแ แกแแแแแขแ แแแ แแแแฎแจแ.- แแแแแแแ แแแแแฃแแแ, แ แแแแแกแแแแกแแช แฉแแแ แแแแแแแแคแแแฃแ แแ แแแ แแแแฐแฃแแแแก แแ แแแแฌแแแแฃแแแ แแแแแชแแแแแ แแแแแคแแ:
แแแแแแแ Webhooks แฉแแแแ แแแ แแ แแแแฌแแแแฃแแแ แแแแแขแแแ:
แจแแแแกแแ แแแแแแ:
ID - แแแแฐแฃแแแก แกแแฎแแแ.
แแแแแแแ - แ แแแแแ แแแแแแแแแแก แแแแแชแแแ. แฉแแแ แแแแแงแแแแ แงแแแแ แแแแแแแแก แแแแแชแแแ, แ แแแแแแช แฎแแแแ แคแแแแแแแแ แแฃแจแแแแแกแแก (แแแแแขแแแ แแ แฌแแจแแ).
URL โ แแแแฐแฃแแแก แแแแฆแแแ แกแแ แแแ แแก แแแกแแแแ แแ.
แคแแแขแ แแก แแ แแคแแฅแกแ/แกแฃแคแแฅแกแ แแ แแก แคแแแขแ แ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แจแแฅแแแแ แแแ-แฐแฃแแแแ แแฎแแแแ แแ แแแแแฅแขแแแแกแแแแก, แ แแแแแแ แกแแฎแแแแแ แแแแฎแแแแ แแแ แแแแฃแ แฌแแกแแแก. แแแแแแแแแ, แแแแกแแแแแก, แ แแ webhook-แแ แแแแฅแแแแแแก แแฎแแแแ แคแแแแแแ .png แแแคแแ แแแแแแ, in แคแแแขแ แแก แกแฃแคแแฅแกแ แแฅแแแ แฃแแแ แแแฌแแ แแ "png".
แแแแแแแ, แแฎแแแแ 80 แแ 443 แแแ แขแแแแ แแฎแแ แแแญแแ แแแ แแแแฐแฃแแแก แแแแฆแแ แกแแ แแแ แแ แฌแแแแแแกแแแแก.
แแแแแ แแแแแญแแ แแ แแแแแแขแแ แแแแแแ แแ แฉแแแ แแแแฎแแแ แจแแแแแแก:
แฐแฃแแแ แแแแแแขแ.
แแแแฐแฃแแแก แแแแฆแแแ แกแแ แแแ แ แแแแแก แแฃแ แแแแแแจแ แแฉแแแแแแก 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/แแแแแแก แกแแจแฃแแแแแแ, แชแแชแฎแแแ แแแแแแก แฃแแแ แขแแแแกแ แแแแฎแแ แชแแแแแแ.
- Webhook() - แแแแแแ แ แแแ แจแ แฃแขแ, URL/แแแแฐแฃแแแก แแแแแฃแจแแแแแแแ:
- แแแแกแขแฃแ แแแก แ แแแแกแขแ แแชแแแก แแแแแฅแแแงแแแแแก แกแแ แแแกแแ (แแแแแแแ SubscriptionConfirmation แคแฃแแฅแชแแแแ),
- แแแฃแจแแแแแก แจแแแแแแแแ แแแแฐแฃแแแแก (Gorecords แคแฃแแฅแชแแ).
- แคแฃแแฅแชแแแแ 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)
}
}
แแก แคแฃแแฅแชแแ แแแแกแแแฆแแ แแแก แแแแแแ แแฃ แแ แ แ แแแแกแขแ แแชแแแก แแแแแกแขแฃแ แแแแก แแแแฎแแแแ แแ แแแ-แฐแฃแแ. แ แแแแ แช แแ แแแแแ
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 แคแฃแแฅแชแแแก แแแขแแแฃแ แแ; แแก แแแแฎแแ แชแแแแแแฃแแแ แแแแแแฆแแแจแแฃแแ แแ แแแชแแแแแแก แจแแกแแแแแแกแแ.
GotRecords แคแฃแแฅแชแแ แแแแแแแแแแก แจแแแแแแแแ แแแแฎแแแแแก แแ แแแแแแฃแแ แฉแแแแฌแแ แแก แแแแแฅแขแแกแแแแก แแซแแฎแแแก แแแ แ แกแแ แแแขแก (แ แแแแแก แกแแฎแแแแช แแแแแแชแ -script แแแ แแแแขแ แจแ) แแแ แแแแขแ แแแแ:
- แแแแแฃแแแก แกแแฎแแแ
- แแแแแฅแขแแก แแแกแแฆแแแ
- แแแฅแแแแแแ:
- แแแแแ แแแ - แแฃ แแแแแแแแ แแแ แแแแฎแแแแแจแ EventName = ObjectCreated | PutObject | PutObjectCopy
- แฌแแจแแ - แแฃ แแแแแแแแ แแแ แแแแฎแแแแแจแ EventName = ObjectRemoved | DeleteObject
แแแ แแแแ, แแฃ แฐแฃแแ แฉแแแแแ Post-แแก แแแแฎแแแแแ, แ แแแแ แช แแฆแฌแแ แแแแ
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
แฌแแแแแ.
แแฎแแ แแแแแ แแแแฌแแ แแ แกแแ แแแขแ แจแแแแแแแแแ แฐแฃแแแก แแแกแแแฃแจแแแแแแแ, แแแแแ แฅแแแ แแแก 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-แก แกแแ แแแแ แแ แแแแแฃแแแก แจแแแแแ แกแ 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 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) แแ แแฅแแแแ แแแแแแแแแแแ แแ แแแแแฃแจแแแแ แแกแแแ. แแฃแจแแแ แแแแแแแชแแแแแ. แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ, แ แแแแกแแช webhooks แแแกแแฃแ แแ แฉแแแแแแก, แจแแแซแแแแ แจแแแฎแแแแ แกแแ แแแ แแก แ แแกแฃแ แกแแแแก แแแแแแแแแ แแแแชแแแแแแก แจแแกแแกแ แฃแแแแแแ. แ แแแแแแก แแ แกแแแแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแแแแฌแแแแ แกแแ แแแ แ แแ แแฃแจแแแ, แแกแแแ แแแแแแแ แแ แแ แแแแแแแแ แแแแแแแ แแแแ แแแแแแแแแแแก แจแแแแฎแแแแแจแ แฌแแ แฃแแแขแแแแแแแก แจแแแแฎแแแแแจแ. แแกแแแ แแแแแแจแแฌแแแแแแ แจแแชแแแแแ แฎแแแแ แฃแคแ แ แแแขแแแฃแ แแ แฃแคแ แ แกแขแแแแแ แขแแแแแฃแแแ.
แแแกแฃแ แแแแ แฌแแ แแแขแแแแแก!
แแแขแ แฌแแแแแฎแแ แแแแแแ:
แแฃแจแแแแ Mail.ru Cloud Solutions S3 แแแแแฅแขแแแแก แจแแกแแแแฎแแ, แ แแแแ แช แคแแแแฃแ แ แกแแกแขแแแ. แ แแแแ แแแแแแงแแแแแ แแแแแฅแขแแแแก แจแแแแฎแแ แแแแแฃแ แแแชแแแก แแแกแแแแ แชแฎแแแแแ.
แฌแงแแ แ: www.habr.com