āĻāĻā§āĻ¨ā§āĻ-āĻāĻžāĻ˛āĻŋāĻ¤ āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨āĻā§āĻ˛āĻŋāĻ° āĻŦā§āĻ¯āĻ¯āĻŧ āĻĻāĻā§āĻˇāĻ¤āĻž āĻŦāĻžāĻĄāĻŧāĻžāĻ¯āĻŧ āĻāĻžāĻ°āĻŖ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ° āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻāĻŦāĻ āĻāĻ°ā§āĻŽā§ āĻ
ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻ
āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻā§āĻ˛āĻžāĻāĻĄ āĻ¸āĻ¤ā§āĻ¤āĻž āĻ¤ā§āĻ°āĻŋ āĻ¨āĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ
āĻ¨ā§āĻāĻā§āĻ˛āĻŋ āĻŦāĻŋāĻāĻ˛ā§āĻĒ āĻ°āĻ¯āĻŧā§āĻā§ā§ˇ āĻāĻŦāĻ āĻāĻ āĻāĻŽāĻŋ FaaS āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻ¨āĻ¯āĻŧ, āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻĨāĻž āĻŦāĻ˛āĻŦāĨ¤ āĻāĻŽāĻŋ āĻ
āĻŦāĻā§āĻā§āĻ āĻ¸ā§āĻā§āĻ°ā§āĻ āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻā§āĻ¨ā§āĻ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°āĻžāĻ° āĻāĻāĻāĻŋ āĻāĻŋāĻāĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§āĻāĻžāĻŦāĨ¤
āĻ
āĻŦāĻā§āĻā§āĻ āĻ¸ā§āĻā§āĻ°ā§āĻ āĻāĻŦāĻ āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻļāĻŦā§āĻĻāĨ¤ āĻ
āĻŦāĻā§āĻā§āĻ āĻ¸ā§āĻā§āĻ°ā§āĻ āĻāĻĒāĻ¨āĻžāĻā§ āĻā§āĻ˛āĻžāĻāĻĄā§ āĻ¯ā§āĻā§āĻ¨ āĻĄā§āĻāĻž āĻ
āĻŦāĻā§āĻā§āĻ āĻāĻāĻžāĻ°ā§ āĻ¸āĻā§āĻāĻ¯āĻŧ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧ, āĻ¯āĻž S3 āĻŦāĻž āĻ
āĻ¨ā§āĻ¯ API (āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§āĻ° āĻāĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻāĻ° āĻāĻ°ā§) HTTP/HTTPS āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻ
ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸āĻ¯ā§āĻā§āĻ¯āĨ¤ āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻāĻā§āĻ˛āĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻāĻžāĻ¸ā§āĻāĻŽ HTTP āĻāĻ˛āĻŦā§āĻ¯āĻžāĻāĨ¤ āĻāĻā§āĻ˛āĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻāĻāĻāĻŋ āĻāĻā§āĻ¨ā§āĻ āĻĻā§āĻŦāĻžāĻ°āĻž āĻā§āĻ°āĻŋāĻāĻžāĻ° āĻšāĻ¯āĻŧ, āĻ¯ā§āĻŽāĻ¨ āĻā§āĻĄ āĻāĻāĻāĻŋ āĻ¸āĻāĻā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ā§ āĻĒā§āĻļ āĻāĻ°āĻž āĻŦāĻž āĻŦā§āĻ˛āĻā§ āĻāĻāĻāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻĒā§āĻ¸ā§āĻ āĻāĻ°āĻžāĨ¤ āĻ¯āĻāĻ¨ āĻāĻāĻāĻŋ āĻāĻā§āĻ¨ā§āĻ āĻāĻā§, āĻ¤āĻāĻ¨ āĻŽā§āĻ˛ āĻ¸āĻžāĻāĻ āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ URL-āĻ āĻāĻāĻāĻŋ HTTP āĻ
āĻ¨ā§āĻ°ā§āĻ§ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤ āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻĒāĻ¨āĻŋ āĻāĻāĻāĻŋ āĻ¸āĻžāĻāĻā§āĻ° āĻāĻā§āĻ¨ā§āĻāĻā§āĻ˛āĻŋ āĻ
āĻ¨ā§āĻ¯ āĻ¸āĻžāĻāĻā§ āĻā§āĻ°āĻŋāĻāĻžāĻ° āĻ
ā§āĻ¯āĻžāĻāĻļāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ (
āĻ¸āĻšāĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻ¯āĻāĻ¨ āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻ āĻā§āĻŽā§āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§:
- āĻ āĻ¨ā§āĻ¯ āĻā§āĻ˛āĻžāĻāĻĄ āĻ¸ā§āĻā§āĻ°ā§āĻā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻāĻĒāĻŋ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĨ¤ āĻ¯āĻāĻ¨āĻ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋ āĻ¯ā§āĻ āĻāĻ°āĻž āĻŦāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¤āĻāĻ¨āĻ āĻāĻĒāĻŋāĻā§āĻ˛āĻŋ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ā§ˇ
- āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋāĻ° āĻĨāĻžāĻŽā§āĻŦāĻ¨ā§āĻāĻ˛ā§āĻ° āĻāĻāĻāĻŋ āĻ¸āĻŋāĻ°āĻŋāĻā§āĻ° āĻ¸ā§āĻŦāĻ¯āĻŧāĻāĻā§āĻ°āĻŋāĻ¯āĻŧ āĻ¸ā§āĻˇā§āĻāĻŋ, āĻĢāĻā§āĻā§āĻ°āĻžāĻĢāĻā§āĻ˛āĻŋāĻ¤ā§ āĻāĻ¯āĻŧāĻžāĻāĻžāĻ°āĻŽāĻžāĻ°ā§āĻ āĻ¯ā§āĻ āĻāĻ°āĻž āĻāĻŦāĻ āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻāĻŋāĻ¤ā§āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĨ¤
- āĻ¨āĻ¤ā§āĻ¨ āĻ¨āĻĨāĻŋāĻ° āĻāĻāĻŽāĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻŦāĻŋāĻā§āĻāĻĒā§āĻ¤āĻŋ (āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻāĻāĻŋ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻāĻ°āĻž āĻ ā§āĻ¯āĻžāĻāĻžāĻāĻ¨ā§āĻāĻŋāĻ āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻž āĻā§āĻ˛āĻžāĻāĻĄā§ āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§āĻĻāĻ¨āĻā§āĻ˛āĻŋ āĻāĻĒāĻ˛ā§āĻĄ āĻāĻ°ā§ āĻāĻŦāĻ āĻāĻ°ā§āĻĨāĻŋāĻ āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻŖ āĻ¨āĻ¤ā§āĻ¨ āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§āĻĻāĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻŦāĻŋāĻā§āĻāĻĒā§āĻ¤āĻŋ āĻĒāĻžāĻ¯āĻŧ, āĻ¸ā§āĻā§āĻ˛āĻŋ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§ āĻāĻŦāĻ āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖ āĻāĻ°ā§)āĨ¤
- āĻāĻŋāĻā§āĻāĻž āĻāĻāĻŋāĻ˛ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻāĻĄāĻŧāĻŋāĻ¤, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, Kubernetes-āĻāĻ° āĻāĻžāĻā§ āĻāĻāĻāĻŋ āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž, āĻ¯āĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻĒāĻžāĻ¤ā§āĻ°ā§ āĻāĻāĻāĻŋ āĻĒāĻĄ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§, āĻāĻ¤ā§ āĻāĻžāĻ¸ā§āĻ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻāĻžāĻ° āĻĒāĻžāĻ¸ āĻāĻ°ā§ āĻāĻŦāĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖā§āĻ° āĻĒāĻ°ā§ āĻāĻ¨ā§āĻā§āĻāĻ¨āĻžāĻ°āĻāĻŋ āĻā§āĻā§ āĻĒāĻĄāĻŧā§āĨ¤
āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻŽāĻ°āĻž āĻāĻžāĻ¸ā§āĻ 1 āĻāĻ° āĻāĻāĻāĻŋ āĻŦā§āĻāĻ˛ā§āĻĒāĻŋāĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻŦ, āĻ¯āĻāĻ¨ Mail.ru āĻā§āĻ˛āĻžāĻāĻĄ āĻ¸āĻ˛āĻŋāĻāĻļāĻ¨ (MCS) āĻ āĻŦāĻā§āĻā§āĻ āĻ¸ā§āĻā§āĻ°ā§āĻ āĻŦāĻžāĻā§āĻā§āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻā§āĻ˛āĻŋ āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ AWS āĻ āĻŦāĻā§āĻā§āĻ āĻ¸ā§āĻā§āĻ°ā§āĻā§ āĻ¸āĻŋāĻā§āĻā§āĻ°ā§āĻ¨āĻžāĻāĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻāĻāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ āĻ˛ā§āĻĄā§āĻĄ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻāĻāĻāĻŋ āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻāĻ°ā§ āĻ ā§āĻ¯āĻžāĻ¸āĻŋāĻā§āĻā§āĻ°ā§āĻ¨āĻžāĻ¸ āĻāĻžāĻ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°āĻž āĻāĻāĻŋāĻ¤, āĻ¤āĻŦā§ āĻĒā§āĻ°āĻļāĻŋāĻā§āĻˇāĻŖā§āĻ° āĻāĻžāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻ°āĻž āĻāĻāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻāĻ°āĻŦā§ˇ
āĻāĻžāĻā§āĻ° āĻĒāĻ°āĻŋāĻāĻ˛ā§āĻĒāĻ¨āĻž
āĻŽāĻŋāĻĨāĻ¸ā§āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°ā§āĻā§āĻāĻ˛ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤āĻāĻžāĻŦā§ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§
- āĻĒā§āĻ°āĻāĻžāĻļāĻ¨āĻž āĻ¸ā§āĻŦāĻž, āĻ¯āĻž S3 āĻ¸ā§āĻā§āĻ°ā§āĻ āĻ¸āĻžāĻāĻĄā§ āĻĨāĻžāĻā§ āĻāĻŦāĻ āĻ¯āĻāĻ¨ āĻāĻ¯āĻŧā§āĻŦāĻ¨āĻšā§āĻ āĻā§āĻ°āĻŋāĻāĻžāĻ° āĻšāĻ¯āĻŧ āĻ¤āĻāĻ¨ HTTP āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻĒā§āĻ°āĻāĻžāĻļ āĻāĻ°ā§āĨ¤
- āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻ āĻ°āĻŋāĻ¸āĻŋāĻāĻŋāĻ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°, āĻ¯āĻž 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
āĻĒā§āĻ°āĻāĻžāĻļāĻ¨āĻž āĻ¸ā§āĻŦāĻž āĻ¸āĻžāĻŦāĻ¸ā§āĻā§āĻ°āĻžāĻāĻŦ āĻāĻ°ā§āĻ¨
āĻāĻĒāĻ¨āĻŋ API āĻŦāĻž āĻāĻ¯āĻŧā§āĻŦ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻāĻĒāĻ¨āĻžāĻ° āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻ āĻ°āĻŋāĻ¸āĻŋāĻāĻŋāĻ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤ āĻ¸āĻ°āĻ˛āĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž āĻāĻ¯āĻŧā§āĻŦ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻāĻ°āĻŦ:
āĻāĻ˛ā§āĻ¨ buckets āĻŦāĻŋāĻāĻžāĻā§ āĻ¯āĻžāĻ¨ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛ āĻ°ā§āĻŽā§āĨ¤- āĻŦāĻžāĻ˛āĻ¤āĻŋāĻ¤ā§ āĻ¯āĻžāĻ¨ āĻ¯āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻ°āĻž āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻāĻā§āĻ˛āĻŋ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻŦ āĻāĻŦāĻ āĻāĻŋāĻ¯āĻŧāĻžāĻ°ā§ āĻā§āĻ˛āĻŋāĻ āĻāĻ°āĻŦ:
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)
}
}
āĻāĻ āĻĢāĻžāĻāĻļāĻ¨āĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻāĻ°ā§ āĻ¯ā§ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻ¨āĻŋāĻļā§āĻāĻŋāĻ¤ āĻāĻ°āĻžāĻ° āĻ
āĻ¨ā§āĻ°ā§āĻ§ āĻŦāĻž āĻāĻāĻāĻŋ āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻ āĻāĻ¸ā§āĻā§ āĻāĻŋāĻ¨āĻžāĨ¤ āĻĨā§āĻā§ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§āĻĒ
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.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
āĻāĻ¸ā§āĻ¨ 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), āĻāĻŦāĻ āĻ¸ā§āĻāĻžāĻ¨ āĻĨā§āĻā§ āĻ¸ā§āĻā§āĻ˛āĻŋāĻā§ āĻĒāĻžāĻ°ā§āĻ¸ āĻāĻ°ā§āĻ¨ āĻāĻŦāĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ°ā§āĻ¨ā§ˇ āĻāĻ°ā§āĻŽā§ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻ¸āĻšāĨ¤ āĻ āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ, āĻ¯āĻāĻ¨ āĻāĻ¯āĻŧā§āĻŦāĻšā§āĻāĻā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻžāĻĒāĻāĻāĻžāĻŦā§ āĻāĻ¸ā§, āĻāĻĒāĻ¨āĻŋ āĻāĻžāĻāĻā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻāĻ°āĻ¤ā§ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§āĻ° āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨āĻā§āĻ˛āĻŋāĻ° āĻ āĻāĻžāĻŦā§āĻ° āĻ¸āĻŽā§āĻŽā§āĻā§āĻ¨ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ā§ˇ āĻ¸āĻžāĻ°āĻŋāĻā§āĻ˛āĻŋāĻ° āĻāĻĒāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻāĻĒāĻ¨āĻžāĻā§ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻāĻŦāĻ āĻāĻ°ā§āĻŽā§āĻĻā§āĻ° āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻāĻ°āĻžāĻ° āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻŦā§āĻ¯āĻ°ā§āĻĨāĻ¤āĻžāĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋāĻŽā§āĻ˛āĻ āĻāĻžāĻāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧāĨ¤ āĻ˛āĻāĻŋāĻāĻāĻŋāĻā§ āĻāĻ°āĻ āĻŦāĻŋāĻļāĻĻ āĻāĻŦāĻ āĻāĻ°āĻ āĻŽāĻžāĻ¨āĻ¸āĻŽā§āĻŽāĻ¤āĻāĻžāĻŦā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧāĨ¤
āĻ¸ā§āĻāĻžāĻā§āĻ¯ āĻāĻžāĻŽāĻ¨āĻž āĻāĻ°āĻāĻŋ!
āĻŦāĻŋāĻˇāĻ¯āĻŧā§ āĻāĻ°ā§ āĻĒāĻĄāĻŧāĻž:
āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻ˛ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻšāĻŋāĻ¸āĻžāĻŦā§ Mail.ru āĻā§āĻ˛āĻžāĻāĻĄ āĻ¸āĻ˛āĻŋāĻāĻļāĻ¨ S3 āĻ āĻŦāĻā§āĻā§āĻ āĻ¸ā§āĻā§āĻ°ā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§āĻāĻŋāĻ¤āĻžāĻā§ āĻšāĻžāĻ°āĻžāĻ¤ā§ āĻā§āĻāĻžāĻŦā§ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻ¸ā§āĻā§āĻ°ā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com