S3 āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ Mail.ru āĻ•ā§āϞāĻžāωāĻĄ āϏāϞāĻŋāωāĻļāύ⧇ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ-āϚāĻžāϞāĻŋāϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ

S3 āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ Mail.ru āĻ•ā§āϞāĻžāωāĻĄ āϏāϞāĻŋāωāĻļāύ⧇ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ-āϚāĻžāϞāĻŋāϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ
āϰ⧁āĻŦ⧇ āĻ—ā§‹āĻ˛ā§āĻĄāĻŦāĻžāĻ°ā§āĻ— āĻ•āĻĢāĻŋ āĻŽā§‡āĻļāĻŋāύ

āχāϭ⧇āĻ¨ā§āϟ-āϚāĻžāϞāĻŋāϤ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āϏāĻ‚āĻ¸ā§āĻĨāĻžāύāϗ⧁āϞāĻŋāϰ āĻŦā§āϝāϝāĻŧ āĻĻāĻ•ā§āώāϤāĻž āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧ āĻ•āĻžāϰāĻŖ āϏ⧇āϗ⧁āϞāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧇āϰ āĻŽā§āĻšā§āĻ°ā§āϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāϟāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻ•āĻ°ā§āĻŽā§€ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻ•ā§āϞāĻžāωāĻĄ āϏāĻ¤ā§āϤāĻž āϤ⧈āϰāĻŋ āύāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧇āĻ•āϗ⧁āϞāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āϰāϝāĻŧ⧇āϛ⧇⧎ āĻāĻŦāĻ‚ āφāϜ āφāĻŽāĻŋ FaaS āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āύāϝāĻŧ, āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāĻŦāĨ¤ āφāĻŽāĻŋ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āχāϭ⧇āĻ¨ā§āϟ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻžāϰ āĻāĻ•āϟāĻŋ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻ⧇āĻ–āĻžāĻŦāĨ¤

āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻāĻŦāĻ‚ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻļāĻŦā§āĻĻāĨ¤ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āφāĻĒāύāĻžāϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āϝ⧇āϕ⧋āύ āĻĄā§‡āϟāĻž āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āφāĻ•āĻžāϰ⧇ āϏāĻžā§āϚāϝāĻŧ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ, āϝāĻž S3 āĻŦāĻž āĻ…āĻ¨ā§āϝ API (āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇) HTTP/HTTPS āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏāϝ⧋āĻ—ā§āϝāĨ¤ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ•āϗ⧁āϞāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻ•āĻžāĻ¸ā§āϟāĻŽ HTTP āĻ•āϞāĻŦā§āϝāĻžāĻ•āĨ¤ āĻāϗ⧁āϞāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ āĻĻā§āĻŦāĻžāϰāĻž āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻšāϝāĻŧ, āϝ⧇āĻŽāύ āϕ⧋āĻĄ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻ—ā§āϰāĻšāĻ¸ā§āĻĨāϞ⧇ āĻĒ⧁āĻļ āĻ•āϰāĻž āĻŦāĻž āĻŦā§āϞāϗ⧇ āĻāĻ•āϟāĻŋ āĻŽāĻ¨ā§āϤāĻŦā§āϝ āĻĒā§‹āĻ¸ā§āϟ āĻ•āϰāĻžāĨ¤ āϝāĻ–āύ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ āϘāĻŸā§‡, āϤāĻ–āύ āĻŽā§‚āϞ āϏāĻžāχāϟ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ URL-āĻ āĻāĻ•āϟāĻŋ HTTP āĻ…āύ⧁āϰ⧋āϧ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤ āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āϏāĻžāχāĻŸā§‡āϰ āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻ…āĻ¨ā§āϝ āϏāĻžāχāĻŸā§‡ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ (āωāχāĻ•āĻŋ) āϝ⧇ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āϏ⧋āĻ°ā§āϏ āϏāĻžāχāϟāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ, āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤

āϏāĻšāϜ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āωāĻĻāĻžāĻšāϰāĻŖ āϝāĻ–āύ āĻāχ āϧāϰāύ⧇āϰ āĻ…āĻŸā§‹āĻŽā§‡āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇:

  1. āĻ…āĻ¨ā§āϝ āĻ•ā§āϞāĻžāωāĻĄ āĻ¸ā§āĻŸā§‹āϰ⧇āĻœā§‡ āϏāĻŽāĻ¸ā§āϤ āĻŦāĻ¸ā§āϤ⧁āϰ āĻ•āĻĒāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāĨ¤ āϝāĻ–āύāχ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āϝ⧋āĻ— āĻ•āϰāĻž āĻŦāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āĻšāϝāĻŧ āϤāĻ–āύāχ āĻ•āĻĒāĻŋāϗ⧁āϞāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇⧎
  2. āĻ—ā§āϰāĻžāĻĢāĻŋāĻ• āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϰ āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ⧇āϰ āĻāĻ•āϟāĻŋ āϏāĻŋāϰāĻŋāĻœā§‡āϰ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āϏ⧃āĻˇā§āϟāĻŋ, āĻĢāĻŸā§‹āĻ—ā§āϰāĻžāĻĢāϗ⧁āϞāĻŋāϤ⧇ āĻ“āϝāĻŧāĻžāϟāĻžāϰāĻŽāĻžāĻ°ā§āĻ• āϝ⧋āĻ— āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϚāĻŋāĻ¤ā§āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāĨ¤
  3. āύāϤ⧁āύ āύāĻĨāĻŋāϰ āφāĻ—āĻŽāύ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻāĻ•āϟāĻŋ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāĻŋāĻ‚ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻ•ā§āϞāĻžāωāĻĄā§‡ āĻĒā§āϰāϤāĻŋāĻŦ⧇āĻĻāύāϗ⧁āϞāĻŋ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āφāĻ°ā§āĻĨāĻŋāĻ• āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ āύāϤ⧁āύ āĻĒā§āϰāϤāĻŋāĻŦ⧇āĻĻāύ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāϝāĻŧ, āϏ⧇āϗ⧁āϞāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ•āϰ⧇)āĨ¤
  4. āĻ•āĻŋāϛ⧁āϟāĻž āϜāϟāĻŋāϞ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āϜāĻĄāĻŧāĻŋāϤ, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, Kubernetes-āĻāϰ āĻ•āĻžāϛ⧇ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ āϤ⧈āϰāĻŋ āĻ•āϰāĻž, āϝāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒāĻžāĻ¤ā§āϰ⧇ āĻāĻ•āϟāĻŋ āĻĒāĻĄ āϤ⧈āϰāĻŋ āĻ•āϰ⧇, āĻāϤ⧇ āϟāĻžāĻ¸ā§āĻ• āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻĒāĻžāϏ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻĒāϰ⧇ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϟāĻŋ āϭ⧇āϙ⧇ āĻĒāĻĄāĻŧ⧇āĨ¤

āωāĻĻāĻžāĻšāϰāĻŖ āĻ¸ā§āĻŦāϰ⧂āĻĒ, āφāĻŽāϰāĻž āϟāĻžāĻ¸ā§āĻ• 1 āĻāϰ āĻāĻ•āϟāĻŋ āĻŦ⧈āĻ•āĻ˛ā§āĻĒāĻŋāĻ• āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ, āϝāĻ–āύ Mail.ru āĻ•ā§āϞāĻžāωāĻĄ āϏāϞāĻŋāωāĻļāύ (MCS) āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻŦāĻžāϕ⧇āĻŸā§‡āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞāĻŋ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ AWS āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āĻœā§‡ āϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāχāϜ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦ āϞ⧋āĻĄā§‡āĻĄ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻāĻ•āϟāĻŋ āϏāĻžāϰāĻŋāϤ⧇ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧇ āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāϏ āĻ•āĻžāϜ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻž āωāϚāĻŋāϤ, āϤāĻŦ⧇ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāϪ⧇āϰ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āĻāϟāĻŋ āĻ›āĻžāĻĄāĻŧāĻžāχ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ āĻ•āϰāĻŦ⧎

āĻ•āĻžāĻœā§‡āϰ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž

āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤāĻ­āĻžāĻŦ⧇ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ MCS-āĻ S3 āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻŋāĻ•āĻž. āĻ•āĻžāĻœā§‡āϰ āĻ¸ā§āĻ•āĻŋāĻŽāϟāĻŋāϤ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋ āϰāϝāĻŧ⧇āϛ⧇:

  • āĻĒā§āϰāĻ•āĻžāĻļāύāĻž āϏ⧇āĻŦāĻž, āϝāĻž S3 āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āϏāĻžāχāĻĄā§‡ āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ āϝāĻ–āύ āĻ“āϝāĻŧ⧇āĻŦāύāĻšā§āĻ• āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻšāϝāĻŧ āϤāĻ–āύ HTTP āĻ…āύ⧁āϰ⧋āϧ āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰ⧇āĨ¤
  • āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āϰāĻŋāϏāĻŋāĻ­āĻŋāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰ, āϝāĻž HTTP āĻĒā§āϰāĻ•āĻžāĻļāύāĻž āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋ āĻļā§‹āύ⧇ āĻāĻŦāĻ‚ āωāĻĒāϝ⧁āĻ•ā§āϤ āĻ•ā§āϰāĻŋāϝāĻŧāĻž āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰ⧇⧎ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϟāĻŋ āϝ⧇āϕ⧋āύ⧋ āĻ­āĻžāώāĻžāϝāĻŧ āϞ⧇āĻ–āĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇; āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāϪ⧇, āφāĻŽāϰāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰāϟāĻŋ Go-āϤ⧇ āϞāĻŋāĻ–āĻŦāĨ¤

S3 API-āĻ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļ⧇āώ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻšāϞ āĻĒā§āϰāĻ•āĻžāĻļāύāĻž āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϤ⧇ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āύāĻŋāĻŦāĻ¨ā§āϧāύāĨ¤ āĻŦāĻŋāĻļ⧇āώ āĻ•āϰ⧇, āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻĒā§āϰāĻ•āĻžāĻļāύāĻž āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻĨ⧇āϕ⧇ āĻŦāĻžāĻ°ā§āϤāĻžāϗ⧁āϞāĻŋāϰ āϏāĻĻāĻ¸ā§āϝāϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ (āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇, āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ⧇āϰ āύāĻŋāĻļā§āϚāĻŋāϤāĻ•āϰāĻŖ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧ āύāĻž)āĨ¤

āϤāĻĻāύ⧁āϏāĻžāϰ⧇, āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻĻ⧁āϟāĻŋ āĻĒā§āϰāϧāĻžāύ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇:

  • āύāĻŋāĻŦāĻ¨ā§āϧāύ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻ•āĻžāĻļāύāĻž āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ⧇ āϏāĻžāĻĄāĻŧāĻž āĻĻāĻŋāύ,
  • āχāύāĻ•āĻžāĻŽāĻŋāĻ‚ āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰ⧁āύāĨ¤

āĻāĻ•āϟāĻŋ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āϰāĻŋāϏāĻŋāĻ­āĻŋāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

ДĐģŅ СаĐŋ҃ҁĐēа ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ĐŋŅ€Đ¸ĐĩĐŧа вĐĩĐąŅ…ŅƒĐēОв ĐŊ҃ĐļĐĩĐŊ Linux-ҁĐĩŅ€Đ˛ĐĩŅ€. В даĐŊĐŊОК ŅŅ‚Đ°Ņ‚ŅŒĐĩ Đ´ĐģŅ ĐŋŅ€Đ¸ĐŧĐĩŅ€Đ° Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧ Đ˛Đ¸Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊŅ‹Đš иĐŊŅŅ‚Đ°ĐŊҁ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš Ņ€Đ°ĐˇĐ˛ĐĩŅ€Ņ‚Ņ‹Đ˛Đ°ĐĩĐŧ ĐŊа 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

āĻĒā§āϰāĻ•āĻžāĻļāύāĻž āϏ⧇āĻŦāĻž āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻžāχāĻŦ āĻ•āϰ⧁āύ

āφāĻĒāύāĻŋ API āĻŦāĻž āĻ“āϝāĻŧ⧇āĻŦ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻĒāύāĻžāϰ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āϰāĻŋāϏāĻŋāĻ­āĻŋāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āϏāϰāϞāϤāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻŽāϰāĻž āĻ“āϝāĻŧ⧇āĻŦ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāĻŦ:

  1. āϚāϞ⧁āύ buckets āĻŦāĻŋāĻ­āĻžāϗ⧇ āϝāĻžāύ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞ āϰ⧁āĻŽā§‡āĨ¤
  2. āĻŦāĻžāϞāϤāĻŋāϤ⧇ āϝāĻžāύ āϝāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ•āϗ⧁āϞāĻŋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻŦ āĻāĻŦāĻ‚ āĻ—āĻŋāϝāĻŧāĻžāϰ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰāĻŦ:

S3 āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ Mail.ru āĻ•ā§āϞāĻžāωāĻĄ āϏāϞāĻŋāωāĻļāύ⧇ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ-āϚāĻžāϞāĻŋāϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ

Webhooks āĻŸā§āϝāĻžāĻŦ⧇ āϝāĻžāύ āĻāĻŦāĻ‚ Add āĻ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ:

S3 āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ Mail.ru āĻ•ā§āϞāĻžāωāĻĄ āϏāϞāĻŋāωāĻļāύ⧇ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ-āϚāĻžāϞāĻŋāϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ
āĻ•ā§āώ⧇āĻ¤ā§āϰāϗ⧁āϞāĻŋ āĻĒā§‚āϰāĻŖ āĻ•āϰ⧁āύ:

S3 āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ Mail.ru āĻ•ā§āϞāĻžāωāĻĄ āϏāϞāĻŋāωāĻļāύ⧇ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ-āϚāĻžāϞāĻŋāϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ

āφāχāĻĄāĻŋ — āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āύāĻžāĻŽāĨ¤

āχāϭ⧇āĻ¨ā§āϟ - āϝāĻž āχāϭ⧇āĻ¨ā§āϟ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āφāĻŽāϰāĻž āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ (āϏāĻ‚āϝ⧋āϜāύ āĻāĻŦāĻ‚ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž) āϏāĻŽāĻ¸ā§āϤ āχāϭ⧇āĻ¨ā§āĻŸā§‡āϰ āϏāĻ‚āĻ•ā§āϰāĻŽāĻŖ āϏ⧇āϟ āĻ•āϰ⧇āĻ›āĻŋāĨ¤

URL — āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ āĻŋāĻ•āĻžāύāĻž āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇āĨ¤

āĻĢāĻŋāĻ˛ā§āϟāĻžāϰ āωāĻĒāϏāĻ°ā§āĻ—/āĻĒā§āϰāĻ¤ā§āϝāϝāĻŧ āĻšāϞ āĻāĻ•āϟāĻŋ āĻĢāĻŋāĻ˛ā§āϟāĻžāϰ āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻŽāύ āĻŦāĻ¸ā§āϤ⧁āϰ āϜāĻ¨ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ āϝāĻžāϰ āύāĻžāĻŽ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āύāĻŋāϝāĻŧāĻŽā§‡āϰ āϏāĻžāĻĨ⧇ āĻŽā§‡āϞ⧇āĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ .png āĻāĻ•ā§āϏāĻŸā§‡āύāĻļāύ āϏāĻš āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϕ⧇ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āχāύ āĻĢāĻŋāĻ˛ā§āϟāĻžāϰ āĻĒā§āϰāĻ¤ā§āϝāϝāĻŧ āφāĻĒāύāĻžāϕ⧇ "png" āϞāĻŋāĻ–āϤ⧇ āĻšāĻŦ⧇āĨ¤

āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇, āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āϰāĻŋāϏāĻŋāĻ­āĻŋāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĒā§‹āĻ°ā§āϟ 80 āĻāĻŦāĻ‚ 443 āϏāĻŽāĻ°ā§āĻĨāĻŋāϤāĨ¤

āĻāϰ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰāĻž āϝāĻžāĻ• āĻšā§āĻ• āϝ⧋āĻ— āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āφāĻŽāϰāĻž āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ:

S3 āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ Mail.ru āĻ•ā§āϞāĻžāωāĻĄ āϏāϞāĻŋāωāĻļāύ⧇ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ-āϚāĻžāϞāĻŋāϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ
āĻšā§āĻ• āϝ⧋āĻ— āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϤāĻžāϰ āϞāĻ—āϗ⧁āϞāĻŋāϤ⧇ āĻšā§āĻ• āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϰ āĻ…āĻ—ā§āϰāĻ—āϤāĻŋ āĻĻ⧇āĻ–āĻžāϝāĻŧ:

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))
}

āĻĒā§āϰāϧāĻžāύ āĻĢāĻžāĻ‚āĻļāύ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύ:

  • Ping() - āĻāĻ•āϟāĻŋ āϰ⧁āϟ āϝāĻž URL/ping-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϏāĻžāĻĄāĻŧāĻž āĻĻ⧇āϝāĻŧ, āĻāĻ•āϟāĻŋ āϞāĻžāχāĻ­āύ⧇āϏ āĻĒā§āϰ⧋āĻŦ⧇āϰ āϏāĻšāϜāϤāĻŽ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύāĨ¤
  • āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ•() - āĻĒā§āϰāϧāĻžāύ āϰ⧁āϟ, URL/āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ:
    • āĻĒā§āϰāĻ•āĻžāĻļāύāĻž āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϤ⧇ āύāĻŋāĻŦāĻ¨ā§āϧāύ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇ (āϏāĻžāĻŦāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻ•āύāĻĢāĻžāĻ°ā§āĻŽā§‡āĻļāύ āĻĢāĻžāĻ‚āĻļāύ⧇ āϝāĻžāύ),
    • āχāύāĻ•āĻžāĻŽāĻŋāĻ‚ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻĒā§āϰāϏ⧇āϏ āĻ•āϰ⧇ (āĻ—ā§‹āϰāĻ•āĻ°ā§āĻĄāϏ āĻĢāĻžāĻ‚āĻļāύ)āĨ¤
  • HmacSha256 āĻāĻŦāĻ‚ HmacSha256hex āĻĢāĻžāĻ‚āĻļāύ āĻšāϞ HMAC-SHA256 āĻāĻŦāĻ‚ HMAC-SHA256 āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻ…ā§āϝāĻžāϞāĻ—āϰāĻŋāĻĻāĻŽāϗ⧁āϞāĻŋāϰ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ āϝāĻžāϰ āφāωāϟāĻĒ⧁āϟ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻ—āĻŖāύāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻšā§‡āĻ•ā§āϏāĻžāĻĄā§‡āϏāĻŋāĻŽā§‡āϞ āϏāĻ‚āĻ–ā§āϝāĻžāϰ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻšāĻŋāϏāĻžāĻŦ⧇āĨ¤
  • main āĻšāϞ āĻĒā§āϰāϧāĻžāύ āĻĢāĻžāĻ‚āĻļāύ, āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϞāĻžāχāύ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āχāωāφāϰāĻāϞ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰāĻĻ⧇āϰ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧇āĨ¤

āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āĻ—ā§ƒāĻšā§€āϤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϞāĻžāχāύ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ:

  • -āĻĒā§‹āĻ°ā§āϟ āĻšāϞ āϏ⧇āχ āĻĒā§‹āĻ°ā§āϟ āϝ⧇āĻ–āĻžāύ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻļ⧁āύāĻŦ⧇āĨ¤
  • - āĻ āĻŋāĻ•āĻžāύāĻž - āφāχāĻĒāĻŋ āĻ āĻŋāĻ•āĻžāύāĻž āϝāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻļ⧁āύāĻŦ⧇āĨ¤
  • -āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻšāϞ āĻāĻ•āϟāĻŋ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϝāĻž āĻĒā§āϰāϤāĻŋāϟāĻŋ āχāύāĻ•āĻžāĻŽāĻŋāĻ‚ āĻšā§āϕ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāϞāĻž āĻšāϝāĻŧāĨ¤

āφāϏ⧁āύ āĻ•āĻŋāϛ⧁ āĻĢāĻžāĻ‚āĻļāύ āϘāύāĻŋāĻˇā§āĻ āĻ­āĻžāĻŦ⧇ āĻĻ⧇āϖ⧇ āύ⧇āĻ“āϝāĻŧāĻž āϝāĻžāĻ•:

//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Âģ
}

āĻāχ āĻĒā§āϰāĻļā§āύ⧇āϰ āωāĻ¤ā§āϤāϰ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ:

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 āĻĢāĻžāĻ‚āĻļāύ āĻāĻ•āϟāĻŋ āφāĻ—āϤ āĻ…āύ⧁āϰ⧋āϧ āĻĒāĻžāĻ°ā§āϏ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻš āĻāĻ•āϟāĻŋ āĻŦāĻšāĻŋāϰāĻžāĻ—āϤ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ (āϝāĻžāϰ āύāĻžāĻŽ -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:

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="${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

āϚāϞ⧁āύ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻļ⧁āϰ⧁ āĻ•āϰāĻž āϝāĻžāĻ•:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80 -
script scripts/s3_backup_mcs_aws.sh

āĻĻ⧇āĻ–āĻž āϝāĻžāĻ• āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āĻŽāĻžāĻ§ā§āϝāĻŽ MCS āĻ“āϝāĻŧ⧇āĻŦ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ myfiles-ash bucket-āĻ test.txt āĻĢāĻžāχāϞ āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤ āĻ•āύāϏ⧋āϞ āϞāĻ—āϗ⧁āϞāĻŋ āĻĻ⧇āĻ–āĻžāϝāĻŧ āϝ⧇ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ:

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-āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻŦāĻžāϕ⧇āĻŸā§‡āϰ āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻŋ:

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), āĻāĻŦāĻ‚ āϏ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āĻĒāĻžāĻ°ā§āϏ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰ⧁āύ⧎ āĻ•āĻ°ā§āĻŽā§€ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϏāĻšāĨ¤ āĻ…āĻ¨ā§āϝāĻĨāĻžāϝāĻŧ, āϝāĻ–āύ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ•āϗ⧁āϞāĻŋ āĻŦā§āϝāĻžāĻĒāĻ•āĻ­āĻžāĻŦ⧇ āφāϏ⧇, āφāĻĒāύāĻŋ āĻ•āĻžāϜāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āϰāϤ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϏāĻ‚āĻ¸ā§āĻĨāĻžāύāϗ⧁āϞāĻŋāϰ āĻ…āĻ­āĻžāĻŦ⧇āϰ āϏāĻŽā§āĻŽā§āĻ–ā§€āύ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āύ⧎ āϏāĻžāϰāĻŋāϗ⧁āϞāĻŋāϰ āωāĻĒāĻ¸ā§āĻĨāĻŋāϤāĻŋ āφāĻĒāύāĻžāϕ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻāĻŦāĻ‚ āĻ•āĻ°ā§āĻŽā§€āĻĻ⧇āϰ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻžāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋāĻŽā§‚āϞāĻ• āĻ•āĻžāϜāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āϞāĻ—āĻŋāĻ‚āϟāĻŋāϕ⧇ āφāϰāĻ“ āĻŦāĻŋāĻļāĻĻ āĻāĻŦāĻ‚ āφāϰāĻ“ āĻŽāĻžāύāϏāĻŽā§āĻŽāϤāĻ­āĻžāĻŦ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻžāϰ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤

āϏ⧌āĻ­āĻžāĻ—ā§āϝ āĻ•āĻžāĻŽāύāĻž āĻ•āϰāĻ›āĻŋ!

āĻŦāĻŋāώāϝāĻŧ⧇ āφāϰ⧋ āĻĒāĻĄāĻŧāĻž:

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster