
āĻāĻā§āύā§āĻ-āĻāĻžāϞāĻŋāϤ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āĻŦā§āϝāĻŦāĻšā§āϤ āϏāĻāϏā§āĻĨāĻžāύāĻā§āϞāĻŋāϰ āĻŦā§āϝāϝāĻŧ āĻĻāĻā§āώāϤāĻž āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧ āĻāĻžāϰāĻŖ āϏā§āĻā§āϞāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϰ āĻŽā§āĻšā§āϰā§āϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ āĻāϰā§āĻŽā§ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻšāĻŋāϏāĻžāĻŦā§ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āĻā§āϞāĻžāĻāĻĄ āϏāϤā§āϤāĻž āϤā§āϰāĻŋ āύāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻ
āύā§āĻāĻā§āϞāĻŋ āĻŦāĻŋāĻāϞā§āĻĒ āϰāϝāĻŧā§āĻā§ā§ˇ āĻāĻŦāĻ āĻāĻ āĻāĻŽāĻŋ FaaS āϏāĻŽā§āĻĒāϰā§āĻā§ āύāϝāĻŧ, āĻāϝāĻŧā§āĻŦāĻšā§āĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāĻŦāĨ¤ āĻāĻŽāĻŋ āĻ
āĻŦāĻā§āĻā§āĻ āϏā§āĻā§āϰā§āĻ āĻāϝāĻŧā§āĻŦāĻšā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻā§āύā§āĻ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻžāϰ āĻāĻāĻāĻŋ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻāĻžāĻŦāĨ¤
āĻ
āĻŦāĻā§āĻā§āĻ āϏā§āĻā§āϰā§āĻ āĻāĻŦāĻ āĻāϝāĻŧā§āĻŦāĻšā§āĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϝāĻŧā§āĻāĻāĻŋ āĻļāĻŦā§āĻĻāĨ¤ āĻ
āĻŦāĻā§āĻā§āĻ āϏā§āĻā§āϰā§āĻ āĻāĻĒāύāĻžāĻā§ āĻā§āϞāĻžāĻāĻĄā§ āϝā§āĻā§āύ āĻĄā§āĻāĻž āĻ
āĻŦāĻā§āĻā§āĻ āĻāĻāĻžāϰ⧠āϏāĻā§āĻāϝāĻŧ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ, āϝāĻž S3 āĻŦāĻž āĻ
āύā§āϝ API (āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§) HTTP/HTTPS āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻ
ā§āϝāĻžāĻā§āϏā§āϏāϝā§āĻā§āϝāĨ¤ āĻāϝāĻŧā§āĻŦāĻšā§āĻāĻā§āϞāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻžāϏā§āĻāĻŽ HTTP āĻāϞāĻŦā§āϝāĻžāĻāĨ¤ āĻāĻā§āϞāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻāĻāĻŋ āĻāĻā§āύā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻā§āϰāĻŋāĻāĻžāϰ āĻšāϝāĻŧ, āϝā§āĻŽāύ āĻā§āĻĄ āĻāĻāĻāĻŋ āϏāĻāĻā§āϰāĻšāϏā§āĻĨāϞ⧠āĻĒā§āĻļ āĻāϰāĻž āĻŦāĻž āĻŦā§āϞāĻā§ āĻāĻāĻāĻŋ āĻŽāύā§āϤāĻŦā§āϝ āĻĒā§āϏā§āĻ āĻāϰāĻžāĨ¤ āϝāĻāύ āĻāĻāĻāĻŋ āĻāĻā§āύā§āĻ āĻāĻā§, āϤāĻāύ āĻŽā§āϞ āϏāĻžāĻāĻ āĻāϝāĻŧā§āĻŦāĻšā§āĻā§āϰ āĻāύā§āϝ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ URL-āĻ āĻāĻāĻāĻŋ HTTP āĻ
āύā§āϰā§āϧ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤ āĻĢāϞāϏā§āĻŦāϰā§āĻĒ, āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āϏāĻžāĻāĻā§āϰ āĻāĻā§āύā§āĻāĻā§āϞāĻŋ āĻ
āύā§āϝ āϏāĻžāĻāĻā§ āĻā§āϰāĻŋāĻāĻžāϰ āĻ
ā§āϝāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ () āϝ⧠āĻā§āώā§āϤā§āϰ⧠āϏā§āϰā§āϏ āϏāĻžāĻāĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ
āĻŦāĻā§āĻā§āĻ āϏā§āĻā§āϰā§āĻ, āĻāĻā§āύā§āĻāĻā§āϞāĻŋ āĻāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤
āϏāĻšāĻ āĻā§āώā§āϤā§āϰ⧠āĻāĻĻāĻžāĻšāϰāĻŖ āϝāĻāύ āĻāĻ āϧāϰāύā§āϰ āĻ āĻā§āĻŽā§āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
- āĻ āύā§āϝ āĻā§āϞāĻžāĻāĻĄ āϏā§āĻā§āϰā§āĻā§ āϏāĻŽāϏā§āϤ āĻŦāϏā§āϤā§āϰ āĻāĻĒāĻŋ āϤā§āϰāĻŋ āĻāϰāĻžāĨ¤ āϝāĻāύāĻ āĻĢāĻžāĻāϞāĻā§āϞāĻŋ āϝā§āĻ āĻāϰāĻž āĻŦāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āĻšāϝāĻŧ āϤāĻāύāĻ āĻāĻĒāĻŋāĻā§āϞāĻŋ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻšāĻŦā§ā§ˇ
- āĻā§āϰāĻžāĻĢāĻŋāĻ āĻĢāĻžāĻāϞāĻā§āϞāĻŋāϰ āĻĨāĻžāĻŽā§āĻŦāύā§āĻāϞā§āϰ āĻāĻāĻāĻŋ āϏāĻŋāϰāĻŋāĻā§āϰ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧ āϏā§āώā§āĻāĻŋ, āĻĢāĻā§āĻā§āϰāĻžāĻĢāĻā§āϞāĻŋāϤ⧠āĻāϝāĻŧāĻžāĻāĻžāϰāĻŽāĻžāϰā§āĻ āϝā§āĻ āĻāϰāĻž āĻāĻŦāĻ āĻ āύā§āϝāĻžāύā§āϝ āĻāĻŋāϤā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĨ¤
- āύāϤā§āύ āύāĻĨāĻŋāϰ āĻāĻāĻŽāύ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ (āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ āĻŦāĻŋāϤāϰāĻŖ āĻāϰāĻž āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻŋāĻ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻā§āϞāĻžāĻāĻĄā§ āĻĒā§āϰāϤāĻŋāĻŦā§āĻĻāύāĻā§āϞāĻŋ āĻāĻĒāϞā§āĻĄ āĻāϰ⧠āĻāĻŦāĻ āĻāϰā§āĻĨāĻŋāĻ āĻĒāϰā§āϝāĻŦā§āĻā§āώāĻŖ āύāϤā§āύ āĻĒā§āϰāϤāĻŋāĻŦā§āĻĻāύ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻŦāĻŋāĻā§āĻāĻĒā§āϤāĻŋ āĻĒāĻžāϝāĻŧ, āϏā§āĻā§āϞāĻŋ āĻĒāϰā§āĻā§āώāĻž āĻāϰ⧠āĻāĻŦāĻ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻāϰā§)āĨ¤
- āĻāĻŋāĻā§āĻāĻž āĻāĻāĻŋāϞ āĻā§āώā§āϤā§āϰ⧠āĻāĻĄāĻŧāĻŋāϤ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, Kubernetes-āĻāϰ āĻāĻžāĻā§ āĻāĻāĻāĻŋ āĻ āύā§āϰā§āϧ āϤā§āϰāĻŋ āĻāϰāĻž, āϝāĻž āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻĒāĻžāϤā§āϰ⧠āĻāĻāĻāĻŋ āĻĒāĻĄ āϤā§āϰāĻŋ āĻāϰā§, āĻāϤ⧠āĻāĻžāϏā§āĻ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻĒāĻžāϏ āĻāϰ⧠āĻāĻŦāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻĒāϰ⧠āĻāύā§āĻā§āĻāύāĻžāϰāĻāĻŋ āĻā§āĻā§ āĻĒāĻĄāĻŧā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ āϏā§āĻŦāϰā§āĻĒ, āĻāĻŽāϰāĻž āĻāĻžāϏā§āĻ 1 āĻāϰ āĻāĻāĻāĻŋ āĻŦā§āĻāϞā§āĻĒāĻŋāĻ āϤā§āϰāĻŋ āĻāϰāĻŦ, āϝāĻāύ Mail.ru āĻā§āϞāĻžāĻāĻĄ āϏāϞāĻŋāĻāĻļāύ (MCS) āĻ āĻŦāĻā§āĻā§āĻ āϏā§āĻā§āϰā§āĻ āĻŦāĻžāĻā§āĻā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻā§āϞāĻŋ āĻāϝāĻŧā§āĻŦāĻšā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠AWS āĻ āĻŦāĻā§āĻā§āĻ āϏā§āĻā§āϰā§āĻā§ āϏāĻŋāĻā§āĻā§āϰā§āύāĻžāĻāĻ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦ āϞā§āĻĄā§āĻĄ āĻā§āώā§āϤā§āϰā§, āĻāĻāĻāĻŋ āϏāĻžāϰāĻŋāϤ⧠āĻāϝāĻŧā§āĻŦāĻšā§āĻ āύāĻŋāĻŦāύā§āϧāύ āĻāϰ⧠āĻ ā§āϝāĻžāϏāĻŋāĻā§āĻā§āϰā§āύāĻžāϏ āĻāĻžāĻ āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻž āĻāĻāĻŋāϤ, āϤāĻŦā§ āĻĒā§āϰāĻļāĻŋāĻā§āώāĻŖā§āϰ āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āĻāĻāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāĻŦ⧎
āĻāĻžāĻā§āϰ āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻž
āĻŽāĻŋāĻĨāϏā§āĻā§āϰāĻŋāϝāĻŧāĻž āĻĒā§āϰā§āĻā§āĻāϞ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤāĻāĻžāĻŦā§ āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ . āĻāĻžāĻā§āϰ āϏā§āĻāĻŋāĻŽāĻāĻŋāϤ⧠āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāĻĒāĻžāĻĻāĻžāύāĻā§āϞāĻŋ āϰāϝāĻŧā§āĻā§:
- āĻĒā§āϰāĻāĻžāĻļāύāĻž āϏā§āĻŦāĻž, āϝāĻž 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 āĻŦāĻž āĻāϝāĻŧā§āĻŦ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻĒāύāĻžāϰ āĻāϝāĻŧā§āĻŦāĻšā§āĻ āϰāĻŋāϏāĻŋāĻāĻŋāĻ āϏāĻžāϰā§āĻāĻžāϰ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āϏāϰāϞāϤāĻžāϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻāϝāĻŧā§āĻŦ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāĻŦ:
- āĻāύā§āĻā§āϰā§āϞ āϰā§āĻŽā§āĨ¤
- āĻŦāĻžāϞāϤāĻŋāϤ⧠āϝāĻžāύ āϝāĻžāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āĻāϝāĻŧā§āĻŦāĻšā§āĻāĻā§āϞāĻŋ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻŦ āĻāĻŦāĻ āĻāĻŋāϝāĻŧāĻžāϰ⧠āĻā§āϞāĻŋāĻ āĻāϰāĻŦ:

Webhooks āĻā§āϝāĻžāĻŦā§ āϝāĻžāύ āĻāĻŦāĻ Add āĻ āĻā§āϞāĻŋāĻ āĻāϰā§āύ:

āĻā§āώā§āϤā§āϰāĻā§āϞāĻŋ āĻĒā§āϰāĻŖ āĻāϰā§āύ:

āĻāĻāĻĄāĻŋ â āĻāϝāĻŧā§āĻŦāĻšā§āĻā§āϰ āύāĻžāĻŽāĨ¤
āĻāĻā§āύā§āĻ - āϝāĻž āĻāĻā§āύā§āĻ āĻĒā§āϰā§āϰāĻŖ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻāĻŽāϰāĻž āĻĢāĻžāĻāϞāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ (āϏāĻāϝā§āĻāύ āĻāĻŦāĻ āĻŽā§āĻā§ āĻĢā§āϞāĻž) āϏāĻŽāϏā§āϤ āĻāĻā§āύā§āĻā§āϰ āϏāĻāĻā§āϰāĻŽāĻŖ āϏā§āĻ āĻāϰā§āĻāĻŋāĨ¤
URL â āĻāϝāĻŧā§āĻŦāĻšā§āĻ āϏāĻžāϰā§āĻāĻžāϰ āĻ āĻŋāĻāĻžāύāĻž āĻā§āϰāĻšāĻŖ āĻāϰā§āĨ¤
āĻĢāĻŋāϞā§āĻāĻžāϰ āĻāĻĒāϏāϰā§āĻ/āĻĒā§āϰāϤā§āϝāϝāĻŧ āĻšāϞ āĻāĻāĻāĻŋ āĻĢāĻŋāϞā§āĻāĻžāϰ āϝāĻž āĻāĻĒāύāĻžāĻā§ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻŽāύ āĻŦāϏā§āϤā§āϰ āĻāύā§āϝ āĻāϝāĻŧā§āĻŦāĻšā§āĻ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ āϝāĻžāϰ āύāĻžāĻŽ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āύāĻŋāϝāĻŧāĻŽā§āϰ āϏāĻžāĻĨā§ āĻŽā§āϞā§āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāϝāĻŧā§āĻŦāĻšā§āĻ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ .png āĻāĻā§āϏāĻā§āύāĻļāύ āϏāĻš āĻĢāĻžāĻāϞāĻā§āϞāĻŋāĻā§ āĻā§āϰāĻŋāĻāĻžāϰ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāύ āĻĢāĻŋāϞā§āĻāĻžāϰ āĻĒā§āϰāϤā§āϝāϝāĻŧ āĻāĻĒāύāĻžāĻā§ "png" āϞāĻŋāĻāϤ⧠āĻšāĻŦā§āĨ¤
āĻŦāϰā§āϤāĻŽāĻžāύā§, āĻāϝāĻŧā§āĻŦāĻšā§āĻ āϰāĻŋāϏāĻŋāĻāĻŋāĻ āϏāĻžāϰā§āĻāĻžāϰ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻžāϰ āĻāύā§āϝ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒā§āϰā§āĻ 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))
}āĻĒā§āϰāϧāĻžāύ āĻĢāĻžāĻāĻļāύ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰā§āύ:
- 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-backupMCS-āĻāϰ āĻāύā§āϝ, āĻāĻŽāĻžāύā§āĻĄ āĻāĻžāϞāĻžāύā§āϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻžāĻā§ āϝā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§ â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āĻĻā§āĻāĻž āϝāĻžāĻ āĻāĻāĻž āĻāĻŋāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻŽāĻžāϧā§āϝāĻŽ 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
