ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ื’ืขืฉืขืขื ื™ืฉ-ื’ืขื˜ืจื™ื‘ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื•ื•ืขื‘ื”ืึธืึธืงืก ืื™ืŸ S3 ื›ื™ื™ืคืขืฅ ืกื˜ืึธืจื™ื“ื–ืฉ Mail.ru ืงืœืึธื•ื“ ืกืึทืœื•ืฉืึทื ื–

ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ื’ืขืฉืขืขื ื™ืฉ-ื’ืขื˜ืจื™ื‘ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื•ื•ืขื‘ื”ืึธืึธืงืก ืื™ืŸ S3 ื›ื™ื™ืคืขืฅ ืกื˜ืึธืจื™ื“ื–ืฉ Mail.ru ืงืœืึธื•ื“ ืกืึทืœื•ืฉืึทื ื–
ืจื•ื‘ ื’ืึธืœื“ื‘ืขืจื’ ืงืึทื•ื•ืข ืžืึทืฉื™ืŸ

ื’ืขืฉืขืขื ื™ืฉ-ื’ืขื˜ืจื™ื‘ืŸ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ื™ื ืงืจื™ืกื™ื– ื“ื™ ืคึผืจื™ื™ึทื– ืขืคืขืงื˜ื™ื•ื•ืงื™ื™ึทื˜ ืคื•ืŸ ื“ื™ ืจืขืกื•ืจืกืŸ ื’ืขื ื™ืฆื˜ ื•ื•ื™ื™ึทืœ ื–ื™ื™ ื–ืขื ืขืŸ ื’ืขื ื™ืฆื˜ ื‘ืœื•ื™ื– ืื™ืŸ ื“ืขื ืžืึธืžืขื ื˜ ื•ื•ืขืŸ ื–ื™ื™ ื–ืขื ืขืŸ ื“ืืจืฃ. ืขืก ื–ืขื ืขืŸ ืคื™ืœืข ืึธืคึผืฆื™ืขืก ื•ื•ื™ ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ืขื ืื•ืŸ ื ื™ืฉื˜ ืฉืึทืคึฟืŸ ื ืึธืš ื•ื•ืึธืœืงืŸ ืขื ื˜ื™ื˜ื™ื– ื•ื•ื™ ืึทืจื‘ืขื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ืื•ืŸ ื”ื™ื™ึทื ื˜ ืื™ืš ื•ื•ืขืœ ืจืขื“ืŸ ื ื™ืฉื˜ ื•ื•ืขื’ืŸ FaaS, ืึธื‘ืขืจ ื•ื•ืขื’ืŸ ื•ื•ืขื‘ื”ืึธืึธืงืก. ืื™ืš ื•ื•ืขื˜ ื•ื•ื™ื™ึทื–ืŸ ืึท ื˜ื•ื˜ืึธืจื™ืึทืœ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื”ืึทื ื“ืœื™ื ื’ ื’ืขืฉืขืขื ื™ืฉืŸ ืžื™ื˜ ื•ื•ืขื‘ื”ืึธืึธืงืก ืคึฟืึทืจ ืึทื‘ื“ื–ืฉืขืงืฅ ืกื˜ืึธืจื™ื“ื–ืฉ.

ืขื˜ืœืขื›ืข ื•ื•ืขืจื˜ืขืจ ื•ื•ืขื’ืŸ ืึทื‘ื“ื–ืฉืขืงืฅ ืกื˜ืึธืจื™ื“ื–ืฉ ืื•ืŸ ื•ื•ืขื‘ื”ืึธืึธืงืก. ืึธื‘ื“ื–ืฉืขืงื˜ ืกื˜ืึธืจื™ื“ื–ืฉ ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืงืจืึธื ืงื™ื™ืŸ ื“ืึทื˜ืŸ ืื™ืŸ ื“ื™ ื•ื•ืึธืœืงืŸ ืื™ืŸ ื“ื™ ืคืึธืจืขื ืคื•ืŸ ืึทื‘ื“ื–ืฉืขืงืฅ, ืฆื•ื˜ืจื™ื˜ืœืขืš ื“ื•ืจืš S3 ืึธื“ืขืจ ืืŸ ืื ื“ืขืจ ืึทืคึผื™ (ื“ื™ืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ) ื“ื•ืจืš ื”ื˜ื˜ืคึผ / ื”ื˜ื˜ืคึผืก. ื•ื•ืขื‘ื”ืึธืึธืงืก ื–ืขื ืขืŸ ื‘ื›ืœืœ ืžื ื”ื’ ื”ื˜ื˜ืคึผ ืงืึทืœืœื‘ืึทืงืงืก. ื–ื™ื™ ื–ืขื ืขืŸ ื˜ื™ืคึผื™ืงืœื™ ื˜ืจื™ื’ืขืจื“ ื“ื•ืจืš ืึท ื’ืขืฉืขืขื ื™ืฉ, ืึทื–ืึท ื•ื•ื™ ืงืึธื“ ืคึผื•ืฉื˜ ืฆื• ืึท ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืึธื“ืขืจ ืึท ื‘ืึทืžืขืจืงื•ื ื’ ืื™ื– ืึทืจื™ื™ึทื ื’ืขืฉื™ืงื˜ ืื•ื™ืฃ ืึท ื‘ืœืึธื’. ื•ื•ืขืŸ ืึท ื’ืขืฉืขืขื ื™ืฉ ืึทืงืขืจื–, ื“ื™ ืึธื ื”ื™ื™ื‘ ืคึผืœืึทืฅ ืกืขื ื“ื– ืึท HTTP ื‘ืขื˜ืŸ ืฆื• ื“ื™ URL ืกืคึผืขืกื™ืคื™ืขื“ ืคึฟืึทืจ ื“ื™ ื•ื•ืขื‘ื”ืึธืึธืง. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืื™ืจ ืงืขื ืขืŸ ืžืึทื›ืŸ ื’ืขืฉืขืขื ื™ืฉืŸ ืื•ื™ืฃ ืื™ื™ืŸ ืคึผืœืึทืฅ ืฆื™ื ื’ืœ ืึทืงืฉืึทื ื– ืื•ื™ืฃ ืื ื“ืขืจืŸ (ื•ื•ื™ืงื™). ืื™ืŸ ื“ืขื ืคืึทืœ ื•ื•ื• ื“ื™ ืžืงื•ืจ ืคึผืœืึทืฅ ืื™ื– ืึท ื›ื™ื™ืคืขืฅ ืกื˜ืึธืจื™ื“ื–ืฉ, ื’ืขืฉืขืขื ื™ืฉืŸ ืึทืงื˜ ื•ื•ื™ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• ื–ื™ื™ึทืŸ ืื™ื ื”ืึทืœื˜.

ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ืคึผืฉื•ื˜ ืงืึทืกืขืก ื•ื•ืขืŸ ืึทื–ืึท ืึธื˜ืึทืžื™ื™ืฉืึทืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜:

  1. ืงืจื™ื™ื™ื˜ื™ื ื’ ืงืืคื™ืขืก ืคื•ืŸ ืึทืœืข ืึทื‘ื“ื–ืฉืขืงืฅ ืื™ืŸ ืืŸ ืื ื“ืขืจ ื•ื•ืึธืœืงืŸ ืกื˜ืึธืจื™ื“ื–ืฉ. ืงืืคื™ืขืก ืžื•ื–ืŸ ื–ื™ื™ืŸ ื‘ืืฉืืคืŸ ืื•ื™ืฃ ื“ื™ ืคืœื™ืขืŸ ื•ื•ืขืŸ ื˜ืขืงืขืก ื–ืขื ืขืŸ ืžื•ืกื™ืฃ ืึธื“ืขืจ ื˜ืฉื™ื™ื ื“ื–ืฉื“.
  2. ืึธื˜ืึทืžืึทื˜ื™ืง ืฉืึทืคื•ื ื’ ืคื•ืŸ ืึท ืกืขืจื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื˜ื”ื•ืžื‘ื ืึทื™ืœืก ืคื•ืŸ ื’ืจืึทืคื™ืง ื˜ืขืงืขืก, ืึทื“ื™ื ื’ ื•ื•ืึธื˜ืขืจืžืึทืจืงืก ืฆื• ืคืึธื•ื˜ืึทื’ืจืึทืคืก ืื•ืŸ ืื ื“ืขืจืข ื‘ื™ืœื“ ืžืึธื“ื™ืคื™ืงืึทื˜ื™ืึธื ืก.
  3. ืึธื ื–ืึธื’ ื•ื•ืขื’ืŸ ื“ืขื ืึธื ืงื•ืžืขืŸ ืคื•ืŸ ื ื™ื™ึทืข ื“ืึธืงื•ืžืขื ื˜ืŸ (ืœืžืฉืœ, ืึท ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืึทืงืึทื•ื ื˜ื™ื ื’ ื“ื™ื ืกื˜ ื•ืคึผืœืึธืึทื“ืก ืจื™ืคึผืึธืจืฅ ืฆื• ื“ื™ ื•ื•ืึธืœืงืŸ, ืื•ืŸ ืคื™ื ืึทื ืฆื™ืขืœ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ื ืขืžื˜ ื ืึธื•ื˜ืึทืคืึทืงื™ื™ืฉืึทื ื– ื•ื•ืขื’ืŸ ื ื™ื™ึทืข ืจื™ืคึผืึธืจืฅ, ื˜ืฉืขืงืก ืื•ืŸ ืึทื ืึทืœื™ื–ืขืก ื–ื™ื™).
  4. ืึท ื‘ื™ืกืœ ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ืงืึทืกืขืก ืึทืจื™ื™ึทื ื ืขืžืขืŸ, ืœืžืฉืœ, ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ ืึท ื‘ืงืฉื” ืฆื• Kubernetes, ื•ื•ืึธืก ืงืจื™ื™ื™ืฅ ืึท ืคึผืึธื“ ืžื™ื˜ ื“ื™ ื ื™ื™ื˜ื™ืง ืงืึทื ื˜ื™ื™ื ืขืจื–, ืคึผืึทืกื™ื– ืึทืจื‘ืขื˜ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืฆื• ืขืก, ืื•ืŸ ื ืึธืš ืคึผืจืึทืกืขืกื™ื ื’ ืงืึทืœืึทืคึผืกื™ื– ื“ื™ ืงืึทื ื˜ื™ื™ื ืขืจ.

ื•ื•ื™ ืึท ื‘ื™ื™ืฉืคึผื™ืœ, ืžื™ืจ ื•ื•ืขืœืŸ ืžืึทื›ืŸ ืึท ื•ื•ืึทืจื™ืึทื ื˜ ืคื•ืŸ ืึทืจื‘ืขื˜ 1, ื•ื•ืขืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื“ื™ Mail.ru ืงืœืึธื•ื“ ืกืึทืœื•ืฉืึทื ื– (MCS) ืึทื‘ื“ื–ืฉืขืงื˜ ืกื˜ืึธืจื™ื“ื–ืฉ ืขืžืขืจ ื–ืขื ืขืŸ ืกื™ื ื’ืงืจืึทื ื™ื™ื–ื“ ืื™ืŸ AWS ื›ื™ื™ืคืขืฅ ืกื˜ืึธืจื™ื“ื–ืฉ ืžื™ื˜ ื•ื•ืขื‘ื”ืึธืึธืงืก. ืื™ืŸ ืึท ืคืึทืงื˜ื™ืฉ ืœืึธื•ื“ื™ื“ ืคืึทืœ, ื™ื™ืกื™ื ื’ืงืจืึทื ืึทืก ืึทืจื‘ืขื˜ ื–ืึธืœ ื–ื™ื™ืŸ ืฆื•ื’ืขืฉื˜ืขืœื˜ ื“ื•ืจืš ืจืขื“ื–ืฉื™ืกื˜ืขืจื™ื ื’ ื•ื•ืขื‘ื”ืึธืึธืงืก ืื™ืŸ ืึท ืจื™ื™, ืึธื‘ืขืจ ืคึฟืึทืจ ื“ื™ ื˜ืจื™ื™ื ื™ื ื’ ืึทืจื‘ืขื˜ ืžื™ืจ ื•ื•ืขืœืŸ ื˜ืึธืŸ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืึธืŸ ื“ืขื.

ืึทืจื‘ืขื˜ ืกื›ืขืžืข

ื“ื™ ื™ื ื˜ืขืจืึทืงืฉืึทืŸ ืคึผืจืึธื˜ืึธืงืึธืœ ืื™ื– ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ืขื˜ืึทืœ ืื™ืŸ ื’ื™ื™ื“ ืฆื• S3 ื•ื•ืขื‘ื”ืึธืึธืงืก ืื•ื™ืฃ MCS. ื“ื™ ืึทืจื‘ืขื˜ ืกื›ืขืžืข ื›ึผื•ืœืœ ื“ื™ ืคืืœื’ืขื ื“ืข ื™ืกื•ื“ื•ืช:

  • ืคึผื•ื‘ืœื™ืฉื™ื ื’ ื“ื™ื ืกื˜, ื•ื•ืึธืก ืื™ื– ืื•ื™ืฃ ื“ื™ S3 ืกื˜ืึธืจื™ื“ื–ืฉ ื–ื™ื™ึทื˜ ืื•ืŸ ืคึผืึทื‘ืœื™ืฉืึทื– ื”ื˜ื˜ืคึผ ืจื™ืงื•ื•ืขืก ื•ื•ืขืŸ ื“ื™ ื•ื•ืขื‘ื ื”ืึธืึธืง ืื™ื– ื˜ืจื™ื’ืขืจื“.
  • ื•ื•ืขื‘ื”ืึธืึธืง ืจื™ืกื™ื•ื•ื™ื ื’ ืกืขืจื•ื•ืขืจ, ื•ื•ืึธืก ืœื™ืกืึทื ื– ืฆื• ืจื™ืงื•ื•ืขืก ืคื•ืŸ ื“ื™ 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

ืึทื‘ืึธื ื™ืจืŸ ืฆื• ืืจื•ื™ืกื’ืขื‘ืŸ ื“ื™ื ืกื˜

ืื™ืจ ืงืขื ืขืŸ ืจืขื’ื™ืกื˜ืจื™ืจืŸ ื“ื™ื™ืŸ ื•ื•ืขื‘ื”ืึธืึธืง ืจื™ืกื™ื•ื•ื™ื ื’ ืกืขืจื•ื•ืขืจ ื“ื•ืจืš ื“ื™ ืึทืคึผื™ ืึธื“ืขืจ ื•ื•ืขื‘ ืฆื•ื‘ื™ื ื“. ืคึฟืึทืจ ืคึผืึทืฉื˜ืขืก, ืžื™ืจ ื•ื•ืขืœืŸ ืคืึทืจืฉืจื™ื™ึทื‘ืŸ ื“ื•ืจืš ื“ื™ ื•ื•ืขื‘ ืฆื•ื‘ื™ื ื“:

  1. ื–ืืœ ืก ื’ื™ื™ืŸ ืฆื• ื“ื™ ืขืžืขืจ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืื™ืŸ ื“ื™ ืงืึธื ื˜ืจืึธืœ ืฆื™ืžืขืจ.
  2. ื’ื™ื™ืŸ ืฆื• ื“ื™ ืขืžืขืจ ืคึฟืึทืจ ื•ื•ืึธืก ืžื™ืจ ื•ื•ืขืœืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื•ื•ืขื‘ื”ืึธืึธืงืก ืื•ืŸ ื’ื™ื˜ ืื•ื™ืฃ ื“ื™ ื’ืึทื ื’:

ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ื’ืขืฉืขืขื ื™ืฉ-ื’ืขื˜ืจื™ื‘ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื•ื•ืขื‘ื”ืึธืึธืงืก ืื™ืŸ S3 ื›ื™ื™ืคืขืฅ ืกื˜ืึธืจื™ื“ื–ืฉ Mail.ru ืงืœืึธื•ื“ ืกืึทืœื•ืฉืึทื ื–

ื’ื™ื™ืŸ ืฆื• ื“ื™ ื•ื•ืขื‘ื”ืึธืึธืงืก ืงื•ื•ื™ื˜ืœ ืื•ืŸ ื’ื™ื˜ ืœื™ื™ื’:

ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ื’ืขืฉืขืขื ื™ืฉ-ื’ืขื˜ืจื™ื‘ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื•ื•ืขื‘ื”ืึธืึธืงืก ืื™ืŸ S3 ื›ื™ื™ืคืขืฅ ืกื˜ืึธืจื™ื“ื–ืฉ Mail.ru ืงืœืึธื•ื“ ืกืึทืœื•ืฉืึทื ื–
ืคึผืœืึธืžื‘ื™ืจืŸ ืื™ืŸ ื“ื™ ืคืขืœื“ืขืจ:

ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ื’ืขืฉืขืขื ื™ืฉ-ื’ืขื˜ืจื™ื‘ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื•ื•ืขื‘ื”ืึธืึธืงืก ืื™ืŸ S3 ื›ื™ื™ืคืขืฅ ืกื˜ืึธืจื™ื“ื–ืฉ Mail.ru ืงืœืึธื•ื“ ืกืึทืœื•ืฉืึทื ื–

ID - ื“ืขืจ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ื•ื•ืขื‘ื”ืึธืึธืง.

ื’ืขืฉืขืขื ื™ืฉ - ื•ื•ืึธืก ื’ืขืฉืขืขื ื™ืฉืŸ ืฆื• ืึทืจื™ื‘ืขืจืคื™ืจืŸ. ืžื™ืจ ื”ืึธื‘ืŸ ื‘ืึทืฉื˜ื™ืžื˜ ื“ื™ ื˜ืจืึทื ืกืžื™ืกื™ืข ืคื•ืŸ โ€‹โ€‹ืึทืœืข ื’ืขืฉืขืขื ื™ืฉืŸ ื•ื•ืึธืก ืคืึทืœืŸ ื•ื•ืขืŸ ืื™ืจ ืึทืจื‘ืขื˜ ืžื™ื˜ ื˜ืขืงืขืก (ืึทื“ื™ื ื’ ืื•ืŸ ื•ื™ืกืžืขืงืŸ).

URL - ื•ื•ืขื‘ื”ืึธืึธืง ืจื™ืกื™ื•ื•ื™ื ื’ ืกืขืจื•ื•ืขืจ ืึทื“ืจืขืก.

ืคื™ืœื˜ืขืจ ืคึผืจืขืคื™ืงืก / ืกืึทืคื™ืงืก ืื™ื– ืึท ืคื™ืœื˜ืขืจ ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ ื•ื•ืขื‘ื”ืึธืึธืงืก ื‘ืœื•ื™ื– ืคึฟืึทืจ ืึทื‘ื“ื–ืฉืขืงืฅ ื•ื•ืขืžืขื ืก ื ืขืžืขืŸ ื’ืœื™ื™ึทื›ืŸ ื–ื™ื›ืขืจ ื›ึผืœืœื™ื. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื™ืŸ ืกื“ืจ ืคึฟืึทืจ ื“ื™ ื•ื•ืขื‘ื”ืึธืึธืง ืฆื• ืฆื™ื ื’ืœ ื‘ืœื•ื™ื– ื˜ืขืงืขืก ืžื™ื˜ ื“ื™ .ืคึผื ื’ ื’ืขืฉืคึผืจื™ื™ื˜, ืื™ืŸ ืคื™ืœื˜ืขืจ ืกืึทืคื™ืงืก ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ "ืคึผื ื’".

ื“ืขืจื•ื•ื™ื™ึทืœ, ื‘ืœื•ื™ื– ืคึผืึธืจืฅ 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))
}

ื–ืืœ ืก ืงื•ืง ืื™ืŸ ื“ื™ ื”ื•ื™ืคึผื˜ ืคืึทื ื’ืงืฉืึทื ื–:

  • ืคึผื™ื ื’ () - ืึท ืžืึทืจืฉืจื•ื˜ ื•ื•ืึธืก ืจื™ืกืคึผืึทื ื“ื– ื“ื•ืจืš URL / ืคึผื™ื ื’, ื“ื™ ืกื™ืžืคึผืœืึทืกื˜ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืึท ืœืขื‘ืŸ ื–ืึธื ื“.
  • ื•ื•ืขื‘ื”ืึธืึธืง () - ื”ื•ื™ืคึผื˜ ืžืึทืจืฉืจื•ื˜, URL / ื•ื•ืขื‘ื”ืึธืึธืง ื”ืึทื ื“ืœืขืจ:
    • ืงืึทื ืคืขืจืžื– ืจืขื’ื™ืกื˜ืจืึทืฆื™ืข ืื•ื™ืฃ ื“ื™ ืืจื•ื™ืกื’ืขื‘ืŸ ื“ื™ื ืกื˜ (ื’ื™ื™ืŸ ืฆื• ื“ื™ SubscriptionConfirmation ืคื•ื ืงืฆื™ืข),
    • ืคึผืจืึทืกืขืกืึทื– ื™ื ืงืึทืžื™ื ื’ ื•ื•ืขื‘ื”ืึธืึธืงืก (ื’ืึธืจืขืงืึธืจื“ืก ืคึฟื•ื ืงืฆื™ืข).
  • ืคืึทื ื’ืงืฉืึทื ื– HmacSha256 ืื•ืŸ HmacSha256hex ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืึทื ืฅ ืคื•ืŸ ื“ื™ HMAC-SHA256 ืื•ืŸ HMAC-SHA256 ืขื ืงืจื™ืคึผืฉืึทืŸ ืึทืœื’ืขืจื™ื“ืึทืžื– ืžื™ื˜ ืจืขื–ื•ืœื˜ืึทื˜ ื•ื•ื™ ืึท ืฉื˜ืจื™ืงืœ ืคื•ืŸ ื”ืขืงืกืึทื“ืขืกื™ืžืึทืœ ื ื•ืžืขืจืŸ ืคึฟืึทืจ ืงืึทืœืงื™ืึทืœื™ื™ื˜ื™ื ื’ ื“ื™ ื›ืกื™ืžืข.
  • ื”ื•ื™ืคึผื˜ ืื™ื– ื“ื™ ื”ื•ื™ืคึผื˜ ืคึฟื•ื ืงืฆื™ืข, ืคึผืจืึทืกืขืกืึทื– ื‘ืึทืคึฟืขืœืŸ ืฉื•ืจื” ืคึผืึทืจืึทืžืขื˜ืขืจืก ืื•ืŸ ืจืขื“ื–ืฉื™ืกื˜ืขืจื– URL ื”ืึทื ื“ืœืขืจืก.

ื‘ืึทืคึฟืขืœืŸ ืฉื•ืจื” ืคึผืึทืจืึทืžืขื˜ืขืจืก ืื ื’ืขื ื•ืžืขืŸ ื“ื•ืจืš ื“ื™ ืกืขืจื•ื•ืขืจ:

  • -ืคึผืึธืจื˜ ืื™ื– ื“ืขืจ ืคึผืึธืจื˜ ืื•ื™ืฃ ื•ื•ืึธืก ื“ืขืจ ืกืขืจื•ื•ืขืจ ื•ื•ืขื˜ ื”ืขืจืŸ.
  • -ืึทื“ืจืขืกืก - IP ืึทื“ืจืขืก ื•ื•ืึธืก ื“ืขืจ ืกืขืจื•ื•ืขืจ ื•ื•ืขื˜ ื”ืขืจืŸ ืฆื•.
  • -ืกืงืจื™ืคึผื˜ ืื™ื– ืึท ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืคึผืจืึธื’ืจืึทื ื•ื•ืึธืก ืื™ื– ื’ืขืจื•ืคืŸ ืคึฟืึทืจ ื™ืขื“ืขืจ ื™ื ืงืึทืžื™ื ื’ ืงืจื•ืง.

ื–ืืœ ืก ื ืขืžืขืŸ ืึท ื ืขืขื ื˜ืขืจ ืงื•ืง ืื™ืŸ ืขื˜ืœืขื›ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืคืึทื ื’ืงืฉืึทื ื–:

//Webhook
func Webhook(w http.ResponseWriter, req *http.Request) {

    // Read body
    body, err := ioutil.ReadAll(req.Body)
    defer req.Body.Close()
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    // log request
    log.Printf("[%s] incoming HTTP request from %sn", req.Method, req.RemoteAddr)
    // check if we got subscription confirmation request
    if strings.Contains(string(body), 
""Type":"SubscriptionConfirmation"") {
        SubscriptionConfirmation(w, req, body)
    } else {
        GotRecords(w, req, body)
    }

}

ื“ื™ ืคึฟื•ื ืงืฆื™ืข ื‘ืึทืฉื˜ื™ืžื˜ ืฆื™ ืึท ื‘ืงืฉื” ืฆื• ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืจืขื’ื™ืกื˜ืจืึทืฆื™ืข ืึธื“ืขืจ ืึท ื•ื•ืขื‘ื”ืึธืึธืง ืื™ื– ืื ื’ืขืงื•ืžืขืŸ. ื•ื•ื™ ื’ื™ื™ื˜ ืคื•ืŸ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ, ืื•ื™ื‘ ืจืขื’ื™ืกื˜ืจืึทืฆื™ืข ืื™ื– ื‘ืืฉื˜ืขื˜ื™ืงื˜, ื“ื™ ืคืืœื’ืขื ื“ืข 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 ืคึฟื•ื ืงืฆื™ืข ืคึผืึทืจืกืขืก ืึทืŸ ื™ื ืงืึทืžื™ื ื’ ื‘ืขื˜ืŸ ืื•ืŸ ืคึฟืึทืจ ื™ืขื“ืขืจ ืจืขืงืึธืจื“ ื›ื™ื™ืคืขืฅ ืจื•ืคื˜ ืึท ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืฉืจื™ืคื˜ (ื•ื•ืขืžืขื ืก ื ืึธืžืขืŸ ืื™ื– ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ืื™ืŸ ื“ื™ -ืกืงืจื™ืคึผื˜ ืคึผืึทืจืึทืžืขื˜ืขืจ) ืžื™ื˜ ื“ื™ ืคึผืึทืจืึทืžืขื˜ืขืจืก:

  • ืขืžืขืจ ื ืึธืžืขืŸ
  • ื›ื™ื™ืคืขืฅ ืฉืœื™ืกืœ
  • ืงืึทืžืฃ:
    • ืงืึธืคึผื™ืข - ืื•ื™ื‘ ืื™ืŸ ื“ืขืจ ืึธืจื™ื’ื™ื ืขืœ ื‘ืขื˜ืŸ EventName = ObjectCreated | PutObject | PutObjectCopy
    • ื•ื™ืกืžืขืงืŸ - ืื•ื™ื‘ ืื™ืŸ ื“ืขืจ ืึธืจื™ื’ื™ื ืขืœ ื‘ืขื˜ืŸ EventName = ObjectRemoved | DeleteObject

ืื–ื•ื™, ืื•ื™ื‘ ืึท ืงืจื•ืง ืงื•ืžื˜ ืžื™ื˜ ืึท ืคึผืึธืกื˜ ื‘ืขื˜ืŸ, ื•ื•ื™ ื“ื™ืกืงืจื™ื™ื‘ื“ ื”ืขื›ืขืจ, ืื•ืŸ ื“ืขืจ ืคึผืึทืจืึทืžืขื˜ืขืจ -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=""
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

ื–ืืœ ืก ื–ืขืŸ ื•ื•ื™ ืขืก ืึทืจื‘ืขื˜. ื“ื•ืจืš MCS ื•ื•ืขื‘ ืฆื•ื‘ื™ื ื“ ืœื™ื™ื’ ื“ื™ test.txt ื˜ืขืงืข ืฆื• ื“ื™ myfiles-ash ืขืžืขืจ. ื“ื™ ืงืึทื ืกืึธื•ืœ ืœืึธื’ืก ื•ื•ื™ื™ึทื–ืŸ ืึทื– ืึท ื‘ืงืฉื” ืื™ื– ื’ืขืžืื›ื˜ ืฆื• ื“ื™ ื•ื•ืขื‘ื”ืึธืึธืง ืกืขืจื•ื•ืขืจ:

2020/07/06 09:43:08 [POST] incoming HTTP request from 
95.163.216.92:56612
download: s3://myfiles-ash/test.txt to ../../../tmp/myfiles-ash/test.txt
upload: ../../../tmp/myfiles-ash/test.txt to 
s3://myfiles-backup/test.txt

ืœืึธืžื™ืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ myfiles-backup ืขืžืขืจ ืื™ืŸ AWS:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ aws s3 --profile aws ls 
myfiles-backup
2020-07-06 09:43:10       1104 test.txt

ืื™ืฆื˜, ื“ื•ืจืš ื“ื™ ื•ื•ืขื‘ ืฆื•ื‘ื™ื ื“, ืžื™ืจ ื•ื•ืขืœืŸ ื•ื™ืกืžืขืงืŸ ื“ื™ ื˜ืขืงืข ืคื•ืŸ โ€‹โ€‹ื“ื™ myfiles-ash ืขืžืขืจ.

ืกืขืจื•ื•ื™ืจืขืจ ืœืึธื’ืก:

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’