ã€ãã³ãé§ååã¢ãŒããã¯ãã£ã§ã¯ããªãœãŒã¹ã¯å¿
èŠãªãšãã«ã®ã¿äœ¿çšãããããã䜿çšããããªãœãŒã¹ã®ã³ã¹ãå¹çãåäžããŸãã ãããå®è£
ããã¯ãŒã«ãŒ ã¢ããªã±ãŒã·ã§ã³ãšããŠè¿œå ã®ã¯ã©ãŠã ãšã³ãã£ãã£ãäœæããªãæ¹æ³ã«ã€ããŠã¯ãå€ãã®ãªãã·ã§ã³ããããŸãã ãããŠä»æ¥ã¯ FaaS ã«ã€ããŠã§ã¯ãªããWebhook ã«ã€ããŠè©±ããŸãã ãªããžã§ã¯ã ã¹ãã¬ãŒãž Webhook ã䜿çšããŠã€ãã³ããåŠçãããã¥ãŒããªã¢ã«ã®äŸã瀺ããŸãã
ãªããžã§ã¯ã ã¹ãã¬ãŒãžãš Webhook ã«ã€ããŠå°ã説æããŸãã ãªããžã§ã¯ã ã¹ãã¬ãŒãžã䜿çšãããšãããããããŒã¿ããªããžã§ã¯ãã®åœ¢åŒã§ã¯ã©ãŠãã«ä¿åã§ããS3 ãŸãã¯å¥ã® API (å®è£
ã«å¿ããŠ) HTTP/HTTPS çµç±ã§ã¢ã¯ã»ã¹ã§ããŸãã Webhook ã¯éåžžãã«ã¹ã¿ã HTTP ã³ãŒã«ããã¯ã§ãã ãããã¯éåžžããªããžããªã«ããã·ã¥ãããã³ãŒããããã°ã«æçš¿ãããã³ã¡ã³ããªã©ã®ã€ãã³ãã«ãã£ãŠããªã¬ãŒãããŸãã ã€ãã³ããçºçãããšãçºä¿¡å
ãµã€ã㯠Webhook ã«æå®ããã URL ã« HTTP ãªã¯ãšã¹ããéä¿¡ããŸãã ãã®çµæããããµã€ãã§ã®ã€ãã³ããå¥ã®ãµã€ãã§ã®ã¢ã¯ã·ã§ã³ãããªã¬ãŒããããšãã§ããŸã (
ãã®ãããªèªååã䜿çšã§ããåçŽãªã±ãŒã¹ã®äŸ:
- å¥ã®ã¯ã©ãŠã ã¹ãã¬ãŒãžã«ãã¹ãŠã®ãªããžã§ã¯ãã®ã³ããŒãäœæããŸãã ãã¡ã€ã«ãè¿œå ãŸãã¯å€æŽããããã³ã«ããã®å Žã§ã³ããŒãäœæããå¿ èŠããããŸãã
- ã°ã©ãã£ã㯠ãã¡ã€ã«ã®äžé£ã®ãµã ãã€ã«ã®èªåäœæãåçãžã®éããã®è¿œå ããã®ä»ã®ç»åã®å€æŽã
- æ°ããããã¥ã¡ã³ãã®å°çã«é¢ããéç¥ (ããšãã°ãåæ£äŒèšãµãŒãã¹ã¯ã¬ããŒããã¯ã©ãŠãã«ã¢ããããŒããã財åç£èŠã¯æ°ããã¬ããŒãã«é¢ããéç¥ãåä¿¡ãããããã確èªããŠåæããŸã)ã
- ããå°ãè€éãªã±ãŒã¹ã«ã¯ãããšãã°ãKubernetes ãžã®ãªã¯ãšã¹ãã®çæãå«ãŸããŸããããã«ãããå¿ èŠãªã³ã³ãããŒãå«ãããããäœæãããããã«ã¿ã¹ã¯ ãã©ã¡ãŒã¿ãŒãæž¡ãããåŠçåŸã«ã³ã³ãããŒãæããããŸããŸãã
äŸãšããŠãMail.ru ã¯ã©ãŠã ãœãªã¥ãŒã·ã§ã³ (MCS) ãªããžã§ã¯ã ã¹ãã¬ãŒãž ãã±ããã®å€æŽã Webhook ã䜿çšã㊠AWS ãªããžã§ã¯ã ã¹ãã¬ãŒãžã§åæãããã¿ã¹ã¯ 1 ã®å€åœ¢äŸãäœæããŸãã å®éã«ããŒãããã±ãŒã¹ã§ã¯ãWebhookããã¥ãŒã«ç»é²ããããšã§éåæäœæ¥ãæäŸããå¿ èŠããããŸããããã¬ãŒãã³ã°ã¿ã¹ã¯ã§ã¯ãããè¡ããã«å®è£ ããŸãã
äœæ¥ã¹ããŒã
ã€ã³ã¿ã©ã¯ã·ã§ã³ãããã³ã«ã«ã€ããŠã¯ã以äžã§è©³ãã説æãããŠããŸãã
- åºçãµãŒãã¹ãã㯠S3 ã¹ãã¬ãŒãžåŽã«ãããwebnhook ãããªã¬ãŒããããšãã« HTTP ãªã¯ãšã¹ããçºè¡ããŸãã
- Webhookåä¿¡ãµãŒããŒãHTTP å ¬éãµãŒãã¹ããã®ãªã¯ãšã¹ãããªãã¹ã³ããé©åãªã¢ã¯ã·ã§ã³ãå®è¡ããŸãã ãµãŒããŒã¯ä»»æã®èšèªã§äœæã§ããŸãããã®äŸã§ã¯ãGo ã§ãµãŒããŒãäœæããŸãã
S3 API ã§ã® Webhook å®è£ ã®ç¹å¥ãªæ©èœã¯ãå ¬éãµãŒãã¹ãžã® Webhook åä¿¡ãµãŒããŒã®ç»é²ã§ãã ç¹ã«ãWebhook åä¿¡ãµãŒããŒã¯ãå ¬éãµãŒãã¹ããã®ã¡ãã»ãŒãžãžã®ãµãã¹ã¯ãªãã·ã§ã³ã確èªããå¿ èŠããããŸã (ä»ã® Webhook å®è£ ã§ã¯ãéåžžããµãã¹ã¯ãªãã·ã§ã³ã®ç¢ºèªã¯å¿ èŠãããŸãã)ã
ãããã£ãŠãWebhook åä¿¡ãµãŒããŒã¯ XNUMX ã€ã®äž»èŠãªæäœããµããŒãããå¿ èŠããããŸãã
- åºçãµãŒãã¹ã®ç»é²ç¢ºèªãªã¯ãšã¹ãã«å¿çãã
- åä¿¡ã€ãã³ããåŠçããŸãã
Webhookåä¿¡ãµãŒããŒã®ã€ã³ã¹ããŒã«
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) ...
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 ãŸã㯠Web ã€ã³ã¿ãŒãã§ã€ã¹ãä»ã㊠Webhook åä¿¡ãµãŒããŒãç»é²ã§ããŸãã ç°¡åã«ããããã«ãWeb ã€ã³ã¿ãŒãã§ã€ã¹çµç±ã§ç»é²ããŸãã
ãã±ããã»ã¯ã·ã§ã³ã«è¡ããŸããã å¶åŸ¡å®€ã§ã- Webhook ãèšå®ãããã±ããã«ç§»åããæ¯è»ãã¯ãªãã¯ããŸãã
ãWebhooksãã¿ãã«ç§»åãããè¿œå ããã¯ãªãã¯ããŸãã
次ã®ãã£ãŒã«ãã«å
¥åããŸãã
ID â Webhook ã®ååã
ã€ãã³ã - ã©ã®ã€ãã³ããéä¿¡ãããã ãã¡ã€ã«ã®æäœ (è¿œå ããã³åé€) æã«çºçãããã¹ãŠã®ã€ãã³ãã®éä¿¡ãèšå®ããŸããã
URL â Webhook åä¿¡ãµãŒããŒã®ã¢ãã¬ã¹ã
ãã£ã«ã¿ãŒ ãã¬ãã£ãã¯ã¹/ãµãã£ãã¯ã¹ã¯ãååãç¹å®ã®ã«ãŒã«ã«äžèŽãããªããžã§ã¯ãã«å¯ŸããŠã®ã¿ Webhook ãçæã§ãããã£ã«ã¿ãŒã§ãã ããšãã°ãWebhook ãæ¡åŒµå .png ãæã€ãã¡ã€ã«ã®ã¿ãããªã¬ãŒããã«ã¯ã次ã®ããã«ããŸãã ãã£ã«ã¿ã®ãµãã£ãã¯ã¹ ãpngããšæžãå¿ èŠããããŸãã
çŸåšãWebhook åä¿¡ãµãŒããŒãžã®ã¢ã¯ã»ã¹ã«ã¯ããŒã 80 ãš 443 ã®ã¿ããµããŒããããŠããŸãã
ã¯ãªãã¯ããŸããã ããã¯ãè¿œå ãã ãããŠã次ã®ããšãããããŸãã
ããã¯ãè¿œå ããŸããã
Webhook åä¿¡ãµãŒããŒã¯ãããã¯ç»é²ããã»ã¹ã®é²è¡ç¶æ³ããã°ã«è¡šç€ºããŸãã
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 åä¿¡ãµãŒããŒã®åäœã¢ã«ãŽãªãºã ã詳ããèŠãŠãããŸãã
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/ping ãä»ããŠå¿çããã«ãŒããliveness ãããŒãã®æãåçŽãªå®è£ ã
- Webhook() - ã¡ã€ã³ã«ãŒããURL/Webhook ãã³ãã©ãŒ:
- å ¬éãµãŒãã¹ãžã®ç»é²ã確èªããŸã (Subscriptionconfirmation é¢æ°ã«ç§»åããŸã)ã
- åä¿¡ãã Webhook ãåŠçããŸã (Gorecords æ©èœ)ã
- é¢æ° HmacSha256 ããã³ HmacSha256hex ã¯ãHMAC-SHA256 ããã³ HMAC-SHA256 æå·åã¢ã«ãŽãªãºã ã®å®è£ ã§ããã眲åãèšç®ããããã® 16 é²æ°ã®æååãšããŠåºåãããŸãã
- main 㯠main é¢æ°ã§ãã³ãã³ã ã©ã€ã³ ãã©ã¡ãŒã¿ãåŠçããURL ãã³ãã©ãç»é²ããŸãã
ãµãŒããŒãåãå ¥ããã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿:
- -port ã¯ããµãŒããŒããªãã¹ã³ããããŒãã§ãã
- -address - ãµãŒããŒããªãã¹ã³ãã IP ã¢ãã¬ã¹ã
- -script ã¯ãåä¿¡ããã¯ããšã«åŒã³åºãããå€éšããã°ã©ã ã§ãã
ããã€ãã®é¢æ°ã詳ããèŠãŠã¿ãŸãããã
//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
ããŸãã¯é¢æ°ã« GotRecords
.
Subscriptionconfirmation é¢æ°ã«ã€ããŠã¯è©³çŽ°ã«ã¯èæ
®ããŸããããã®é¢æ°ã¯ãããã§èª¬æãããŠããååã«åŸã£ãŠå®è£
ãããŸãã
GotRecords é¢æ°ã¯åä¿¡ãªã¯ãšã¹ãã解æããå Record ãªããžã§ã¯ãã«å¯ŸããŠæ¬¡ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠå€éšã¹ã¯ãªãã (-script ãã©ã¡ãŒã¿ãŒã§æž¡ãããåå) ãåŒã³åºããŸãã
- ãã±ããå
- ãªããžã§ã¯ãããŒ
- ã¢ã¯ã·ã§ã³ïŒ
- copy - å ã®ãªã¯ãšã¹ãã®å Žå EventName = ObjectCreated | ãªããžã§ã¯ãã眮ã | PutObjectCopy
- delete - å ã®ãªã¯ãšã¹ãã®å Žå EventName = ObjectRemoved | ãªããžã§ã¯ãã®åé€
ãããã£ãŠã説æããããã«ãããã¯ã Post ãªã¯ãšã¹ããšãšãã«å°çãããšã
script.sh bucketA some-file-to-bucket copy
ãã® Webhook åä¿¡ãµãŒããŒã¯å®å šãªéçšãœãªã¥ãŒã·ã§ã³ã§ã¯ãªããå¯èœãªå®è£ ã®ç°¡ç¥åãããäŸã§ããããšãç解ããŠãã ããã
äœåäŸ
MCS ã®ã¡ã€ã³ ãã±ãããã AWS ã®ããã¯ã¢ãã ãã±ããã«ãã¡ã€ã«ãåæããŠã¿ãŸãããã ã¡ã€ã³ ãã±ãã㯠myfiles-ash ãšåŒã°ããããã¯ã¢ãã ãã±ãã㯠myfiles-backup ãšåŒã°ããŸã (AWS ã§ã®ãã±ããæ§æã«ã€ããŠã¯ããã®èšäºã®ç¯å²å€ã§ã)ã ãããã£ãŠããã¡ã€ã«ãã¡ã€ã³ãã±ããã«é 眮ããããšããã®ã³ããŒãããã¯ã¢ãããã±ããã«è¡šç€ºãããã¡ã€ã³ãã±ããããåé€ããããšãããã¯ã¢ãããã±ããããåé€ãããå¿ èŠããããŸãã
MCS ã¯ã©ãŠã ã¹ãã¬ãŒãžãš AWS ã¯ã©ãŠã ã¹ãã¬ãŒãžã®äž¡æ¹ãšäºææ§ã®ãã awscli ãŠãŒãã£ãªãã£ã䜿çšããŠãã±ãããæäœããŸãã
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
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
ããã§ãWeb ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã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:~$
ãã¡ã€ã«ãåé€ãããåé¡ã¯è§£æ±ºãããŸããã
çµè«ãšToDo
ãã®èšäºã§äœ¿çšãããŠãããã¹ãŠã®ã³ãŒãã¯ã
ãã®ã³ãŒãã¯ãã¢ã¯ãã£ããã£ã§ S3 Webhook ã䜿çšããæ¹æ³ã®äŸã«ãããŸããã åé ã§è¿°ã¹ãããã«ããã®ãããªãµãŒããŒãéçšç°å¢ã§äœ¿çšããäºå®ãããå Žåã¯ãå°ãªããšãéåæäœæ¥çšã«ãµãŒããŒãæžãçŽãå¿ èŠããããŸããã€ãŸããåä¿¡ Webhook ããã¥ãŒ (RabbitMQ ãŸã㯠NATS) ã«ç»é²ãããããããããã解æããŠåŠçããŸããã¯ãŒã«ãŒã¢ããªã±ãŒã·ã§ã³ã䜿çšããŸãã ããããªããšãWebhook ã倧éã«å°çãããšãã«ãã¿ã¹ã¯ãå®äºããããã®ãµãŒã㌠ãªãœãŒã¹ãäžè¶³ããå¯èœæ§ããããŸãã ãã¥ãŒã®ååšã«ããããµãŒããŒãšã¯ãŒã«ãŒãåæ£ã§ããã ãã§ãªããé害ãçºçããå Žåã®ç¹°ãè¿ãã¿ã¹ã¯ã®åé¡ã解決ããããšãã§ããŸãã ãŸãããã°ããã詳现ã§æšæºåããããã®ã«å€æŽããããšããå§ãããŸãã
ã°ããã©ãã¯ïŒ
ãã®ãããã¯ã«ã€ããŠããã«èªã:
Mail.ru ã¯ã©ãŠã ãœãªã¥ãŒã·ã§ã³ S3 ãªããžã§ã¯ã ã¹ãã¬ãŒãžããã¡ã€ã« ã·ã¹ãã ãšããŠäœ¿çšããŸãã 競åä»ç€Ÿã«åã€ããã®ãªããžã§ã¯ã ã¹ãã¬ãŒãžã®äœ¿çšæ¹æ³ã
åºæïŒ habr.com