Mail.ru เจ•เจฒเจพเจ‰เจก เจธเฉ‹เจฒเจฟเจŠเจธเจผเจจเจœเจผ เจฆเฉ‡ S3 เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเจฟเฉฑเจš เจตเฉˆเจฌเจนเฉเฉฑเจ•เจพเจ‚ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ-เจธเฉฐเจšเจพเจฒเจฟเจค เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ

Mail.ru เจ•เจฒเจพเจ‰เจก เจธเฉ‹เจฒเจฟเจŠเจธเจผเจจเจœเจผ เจฆเฉ‡ S3 เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเจฟเฉฑเจš เจตเฉˆเจฌเจนเฉเฉฑเจ•เจพเจ‚ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ-เจธเฉฐเจšเจพเจฒเจฟเจค เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ
เจฐเฉ‚เจฌ เจ—เฉ‹เจฒเจกเจฌเจฐเจ— เจ•เฉŒเจซเฉ€ เจฎเจธเจผเฉ€เจจ

เจ‡เจตเฉˆเจ‚เจŸ-เจธเฉฐเจšเจพเจฒเจฟเจค เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจตเจฐเจคเฉ‡ เจ—เจ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจฒเจพเจ—เจค เจ•เฉเจธเจผเจฒเจคเจพ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจน เจ‰เจฆเฉ‹เจ‚ เจนเฉ€ เจ•เจฟเจฐเจฟเจ†เจธเจผเฉ€เจฒ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ เจœเจฆเฉ‹เจ‚ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เจธ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจนเฉˆ เจ…เจคเฉ‡ เจตเจฐเจ•เจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจพเจงเฉ‚ เจ•เจฒเจพเจ‰เจก เจ‡เจ•เจพเจˆเจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจจเจนเฉ€เจ‚ เจฌเจฃเจพเจ‰เจฃเจพ เจนเฉˆ เจ‡เจธ เจฒเจˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจตเจฟเจ•เจฒเจช เจนเจจเฅค เจ…เจคเฉ‡ เจ…เฉฑเจœ เจฎเฉˆเจ‚ FaaS เจฌเจพเจฐเฉ‡ เจจเจนเฉ€เจ‚, เจชเจฐ เจตเฉˆเจฌเจนเฉเฉฑเจ• เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เจพเฅค เจฎเฉˆเจ‚ เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเฉˆเจฌเจนเฉเฉฑเจ• เจจเจพเจฒ เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฟเฉฐเจ— เจฆเจพ เจ•เฉ‡เจธ เจธเจŸเฉฑเจกเฉ€ เจฆเจฟเจ–เจพเจตเจพเจ‚เจ—เจพเฅค

เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจ…เจคเฉ‡ เจตเฉˆเจฌเจนเฉเฉฑเจ• เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจธเจผเจฌเจฆเฅค เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจคเฉเจนเจพเจจเฉ‚เฉฐ S3 เจœเจพเจ‚ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ API (เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ) เจฆเฉเจ†เจฐเจพ HTTP/HTTPS เจฆเฉเจ†เจฐเจพ เจ‰เจชเจฒเจฌเจง เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ•เจฒเจพเจ‰เจก เจตเจฟเฉฑเจš เจ•เจฟเจธเฉ‡ เจตเฉ€ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค เจตเฉˆเจฌเจนเฉเฉฑเจ• เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจธเจŸเจฎ HTTP เจ•เจพเจฒเจฌเฉˆเจ• เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค เจ‰เจน เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจฟเจธเฉ‡ เจ‡เจตเฉˆเจ‚เจŸ เจฆเฉเจ†เจฐเจพ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฒเจˆ เจ•เฉ‹เจก เจชเฉเจธเจผ เจœเจพเจ‚ เจฌเจฒเฉŒเจ— 'เจคเฉ‡ เจชเฉ‹เจธเจŸ เจ•เฉ€เจคเฉ€ เจŸเจฟเฉฑเจชเจฃเฉ€เฅค เจœเจฆเฉ‹เจ‚ เจ•เฉ‹เจˆ เจ‡เจตเฉˆเจ‚เจŸ เจตเจพเจชเจฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจฎเฉ‚เจฒ เจธเจพเจˆเจŸ เจตเฉˆเจฌเจนเฉเฉฑเจ• เจฒเจˆ เจจเจฟเจฐเจฆเจฟเจธเจผเจŸ URL เจจเฉ‚เฉฐ เจ‡เฉฑเจ• HTTP เจฌเฉ‡เจจเจคเฉ€ เจญเฉ‡เจœเจฆเฉ€ เจนเฉˆเฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจพเจˆเจŸ 'เจคเฉ‡ เจ‡เจตเฉˆเจ‚เจŸ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจฆเฉ‚เจœเฉ€ 'เจคเฉ‡ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจจเฉ‚เฉฐ เจŸเจฐเจฟเฉฑเจ—เจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (เจตเจฟเจ•เจฟ). เจ…เจœเจฟเจนเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจœเจฆเฉ‹เจ‚ เจธเจฐเฉ‹เจค เจธเจพเจˆเจŸ เจ‡เฉฑเจ• เจตเจธเจคเฉ‚ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจ‡เจธเจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจ˜เจŸเจจเจพเจตเจพเจ‚ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจธเจงเจพเจฐเจจ เจ•เฉ‡เจธเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจœเจฟเฉฑเจฅเฉ‡ เจ…เจœเจฟเจนเฉ‡ เจ†เจŸเฉ‹เจฎเฉ‡เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ:

  1. เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจ•เจฒเจพเจ‰เจก เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ€เจ†เจ‚ เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเฉ€เจ†เจ‚ เจ•เจพเจชเฉ€เจ†เจ‚ เจฌเจฃเจพเจ“เฅค เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ‡ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจœเฉ‹เฉœ เจœเจพเจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจ•เจพเจชเฉ€เจ†เจ‚ "เจ‰เฉฑเจกเจฆเฉ‡ เจนเฉ€" เจฌเจฃเจพเจˆเจ†เจ‚ เจœเจพเจฃเฉ€เจ†เจ‚ เจšเจพเจนเฉ€เจฆเฉ€เจ†เจ‚ เจนเจจเฅค
  2. เจ—เฉเจฐเจพเจซเจฟเจ• เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ‡ เจฅเฉฐเจฌเจจเฉ‡เจฒ เจฆเฉ€ เจ‡เฉฑเจ• เจฒเฉœเฉ€ เจฆเฉ€ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจฐเจšเจจเจพ, เจซเฉ‹เจŸเฉ‹เจ†เจ‚ เจตเจฟเฉฑเจš เจตเจพเจŸเจฐเจฎเจพเจฐเจ• เจœเฉ‹เฉœเจจเจพ, เจนเฉ‹เจฐ เจšเจฟเฉฑเจคเจฐ เจธเฉ‹เจงเจพเจ‚เฅค
  3. เจจเจตเฉ‡เจ‚ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฆเฉ€ เจ†เจฎเจฆ เจฌเจพเจฐเฉ‡ เจธเฉ‚เจšเจจเจพ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจตเฉฐเจกเฉ€ เจฒเฉ‡เจ–เจพเจ•เจพเจฐเฉ€ เจธเฉ‡เจตเจพ เจ•เจฒเจพเจ‰เจก 'เจคเฉ‡ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจ…เฉฑเจชเจฒเฉ‹เจก เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจ…เจคเฉ‡ เจตเจฟเฉฑเจคเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจจเจตเฉ€เจ†เจ‚ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจฌเจพเจฐเฉ‡ เจธเฉ‚เจšเจจเจพเจตเจพเจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ…เจคเฉ‡ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจฆเฉ€ เจนเฉˆ)เฅค
  4. เจฅเฉ‹เฉœเฉเจนเจพ เจนเฉ‹เจฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจ•เฉ‡เจธเจพเจ‚ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฌเฉ‡เจจเจคเฉ€ เจคเจฟเจ†เจฐ เจ•เจฐเจจเจพ, เจœเฉ‹ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเจพเจฒ เจ‡เฉฑเจ• เจชเฉŒเจก เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจ‡เจธ เจตเจฟเฉฑเจš เจ•เจพเจฐเจœ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจจเฉ‚เฉฐ เจธเจฎเฉ‡เจŸเจฆเจพ เจนเฉˆเฅค

เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡, เจ…เจธเฉ€เจ‚ เจŸเจพเจธเจ• 1 เจฆเจพ เจ‡เฉฑเจ• เจฐเฉ‚เจช เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡, เจœเจฆเฉ‹เจ‚ เจตเฉˆเจฌเจนเฉเฉฑเจ• เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ Mail.ru เจ•เจฒเจพเจŠเจก เจธเฉ‹เจฒเจฟเจŠเจธเจผเจจ (MCS) เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจฌเจ•เฉ‡เจŸ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจพเจ… AWS เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเจฟเฉฑเจš เจธเจฎเจ•เจพเจฒเฉ€ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจ‡เฉฑเจ• เจ…เจธเจฒ เจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจ•เจคเจพเจฐ เจตเจฟเฉฑเจš เจตเฉˆเจฌเจนเฉเฉฑเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจ•เฉ‡ เจ…เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจธ เจ•เฉฐเจฎ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ, เจชเจฐ เจธเจฟเจ–เจฒเจพเจˆ เจ•เจพเจฐเจœ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจ‡เจธเจฆเฉ‡ เจฌเจฟเจจเจพเจ‚ เจฒเจพเจ—เฉ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจ•เฉฐเจฎ เจฆเฉ€ เจฏเฉ‹เจœเจจเจพ

เจ‡เฉฐเจŸเจฐเจเจ•เจธเจผเจจ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจตเจฟเฉฑเจš เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจนเฉˆ MCS 'เจคเฉ‡ S3 เจตเฉˆเจฌเจนเฉเฉฑเจ• เจฒเจˆ เจ—เจพเจˆเจก. เจ•เฉฐเจฎ เจฆเฉ€ เจฏเฉ‹เจœเจจเจพ เจตเจฟเฉฑเจš เจนเฉ‡เจ  เจฒเจฟเจ–เฉ‡ เจคเฉฑเจค เจนเจจ:

  • เจชเจฌเจฒเจฟเจธเจผเจฟเฉฐเจ— เจธเฉ‡เจตเจพ, เจœเฉ‹ เจ•เจฟ S3 เจธเจŸเฉ‹เจฐเฉ‡เจœ เจฆเฉ‡ เจชเจพเจธเฉ‡ เจนเฉˆ เจ…เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจตเฉˆเจฌเจจเจนเฉ‚เจ• เจซเจพเจ‡เจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจคเจพเจ‚ HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค
  • เจตเฉˆเจฌเจนเฉเฉฑเจ• เจธเจฐเจตเจฐA เจœเฉ‹ HTTP เจ‰เฉฑเจคเฉ‡ เจชเฉเจฐเจ•เจพเจธเจผเจจ เจธเฉ‡เจตเจพ เจคเฉ‹เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจธเฉเจฃเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจšเจฟเจค เจ•เจพเจฐเจตเจพเจˆ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจธเจพเจกเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจ—เฉ‹ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡เฅค

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. เจฌเจพเจฒเจŸเฉ€เจ†เจ‚ เจฆเฉ‡ เจญเจพเจ— 'เจคเฉ‡ เจœเจพเจ“ เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจฐเฉ‚เจฎ เจตเจฟเฉฑเจš.
  2. เจ…เจธเฉ€เจ‚ เจฌเจพเจฒเจŸเฉ€ เจตเจฟเฉฑเจš เจœเจพเจ‚เจฆเฉ‡ เจนเจพเจ‚, เจœเจฟเจธ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจตเฉˆเจฌเจนเฉเฉฑเจ• เจจเฉ‚เฉฐ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจ…เจคเฉ‡ เจ—เฉ‡เจ…เจฐ 'เจคเฉ‡ เจ•เจฒเจฟเฉฑเจ• เจ•เจฐเจพเจ‚เจ—เฉ‡:

Mail.ru เจ•เจฒเจพเจ‰เจก เจธเฉ‹เจฒเจฟเจŠเจธเจผเจจเจœเจผ เจฆเฉ‡ S3 เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเจฟเฉฑเจš เจตเฉˆเจฌเจนเฉเฉฑเจ•เจพเจ‚ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ-เจธเฉฐเจšเจพเจฒเจฟเจค เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ

Webhooks เจŸเฉˆเจฌ 'เจคเฉ‡ เจœเจพเจ“ เจ…เจคเฉ‡ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ 'เจคเฉ‡ เจ•เจฒเจฟเฉฑเจ• เจ•เจฐเฉ‹:

Mail.ru เจ•เจฒเจพเจ‰เจก เจธเฉ‹เจฒเจฟเจŠเจธเจผเจจเจœเจผ เจฆเฉ‡ S3 เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเจฟเฉฑเจš เจตเฉˆเจฌเจนเฉเฉฑเจ•เจพเจ‚ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ-เจธเฉฐเจšเจพเจฒเจฟเจค เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ
เจ–เฉ‡เจคเจฐ เจญเจฐเฉ‹:

Mail.ru เจ•เจฒเจพเจ‰เจก เจธเฉ‹เจฒเจฟเจŠเจธเจผเจจเจœเจผ เจฆเฉ‡ S3 เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเจฟเฉฑเจš เจตเฉˆเจฌเจนเฉเฉฑเจ•เจพเจ‚ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ-เจธเฉฐเจšเจพเจฒเจฟเจค เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ

ID - เจตเฉˆเฉฑเจฌเจนเฉเฉฑเจ• เจฆเจพ เจจเจพเจฎเฅค

เจ‡เจตเฉˆเจ‚เจŸ - เจ•เจฟเจนเฉœเฉ€เจ†เจ‚ เจ˜เจŸเจจเจพเจตเจพเจ‚ เจญเฉ‡เจœเจฃเฉ€เจ†เจ‚ เจนเจจเฅค เจ…เจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจ˜เจŸเจจเจพเจตเจพเจ‚ เจฆเจพ เจชเฉเจฐเจธเจพเจฐเจฃ เจธเฉˆเจŸ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹ เจซเจพเจˆเจฒเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจตเจพเจชเจฐเจฆเฉ€เจ†เจ‚ เจนเจจ (เจœเฉ‹เฉœเจจ เจ…เจคเฉ‡ เจนเจŸเจพเจ‰เจฃเจพ)เฅค

URL - เจตเฉˆเจฌเจนเฉเฉฑเจ• เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจธเจฐเจตเจฐ เจฆเจพ เจชเจคเจพเฅค

เจซเจฟเจฒเจŸเจฐ เจชเฉเจฐเฉ€เจซเจฟเจ•เจธ/เจชเจฟเจ›เฉ‡เจคเจฐ - เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจ‰เจนเจจเจพเจ‚ เจตเจธเจคเฉ‚เจ†เจ‚ เจฒเจˆ เจตเฉˆเจฌเจนเฉเฉฑเจ• เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเฉ‡ เจจเจพเจฎ เจ•เฉเจ เจจเจฟเจฏเจฎเจพเจ‚ เจจเจพเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจตเฉˆเฉฑเจฌเจนเฉเฉฑเจ• เจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ .png เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ เจตเจพเจฒเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ 'เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ, เจ‡เจจ เจซเจฟเจฒเจŸเจฐ เจชเจฟเจ›เฉ‡เจคเจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ "png" เจฒเจฟเจ–เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš, เจตเฉˆเจฌเจนเฉเฉฑเจ• เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจธเจฐเจตเจฐ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ เจฒเจˆ เจธเจฟเจฐเจซเจผ เจชเฉ‹เจฐเจŸ 80 เจ…เจคเฉ‡ 443 เจธเจฎเจฐเจฅเจฟเจค เจนเจจเฅค

เจšเจฒเฉ‹ เจฆเจฌเจพเจ“ เจนเฉเฉฑเจ• เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจนเฉ‡เจ  เจฒเจฟเจ–เจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เจพเจ‚เจ—เฉ‡:

Mail.ru เจ•เจฒเจพเจ‰เจก เจธเฉ‹เจฒเจฟเจŠเจธเจผเจจเจœเจผ เจฆเฉ‡ S3 เจ†เจฌเจœเฉˆเจ•เจŸ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเจฟเฉฑเจš เจตเฉˆเจฌเจนเฉเฉฑเจ•เจพเจ‚ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ-เจธเฉฐเจšเจพเจฒเจฟเจค เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ
เจนเฉเฉฑเจ• เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ†เฅค

เจฒเฉŒเจ—เจธ เจตเจฟเฉฑเจš เจตเฉˆเจฌเจนเฉเฉฑเจ• เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเจพ เจธเจฐเจตเจฐ เจนเฉเฉฑเจ• เจฐเจœเจฟเจธเจŸเฉเจฐเฉ‡เจธเจผเจจ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจชเฉเจฐเจ—เจคเฉ€ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ:

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

เจฐเจœเจฟเจธเจŸเฉเจฐเฉ‡เจธเจผเจจ เจ–เจคเจฎ เจนเฉ‹ เจ—เจˆ เจนเฉˆเฅค เจ…เจ—เจฒเฉ‡ เจญเจพเจ— เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจตเฉˆเจฌเจนเฉเฉฑเจ• เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจธเจฐเจตเจฐ เจฆเฉ‡ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฌเจพเจฐเฉ‡ เจตเจงเฉ‡เจฐเฉ‡ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจตเจฟเจšเจพเจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจตเฉˆเจฌเจนเฉเฉฑเจ• เจธเจฐเจตเจฐ เจฆเจพ เจตเฉ‡เจฐเจตเจพ

เจธเจพเจกเฉ€ เจ‰เจฆเจพเจนเจฐเจฃ เจตเจฟเฉฑเจš, เจธเจฐเจตเจฐ เจ—เฉ‹ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค เจ†เจ‰ เจ‡เจธเจฆเฉ‡ เจ•เฉฐเจฎ เจฆเฉ‡ เจฎเฉ‚เจฒ เจธเจฟเจงเจพเจ‚เจคเจพเจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเฉ€เจ.

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/เจตเฉˆเจฌเจนเฉเฉฑเจ• เจนเฉˆเจ‚เจกเจฒเจฐ:
    • เจชเฉเจฐเจ•เจพเจธเจผเจจ เจธเฉ‡เจตเจพ 'เจคเฉ‡ เจฐเจœเจฟเจธเจŸเฉเจฐเฉ‡เจธเจผเจจ เจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ (เจธเจฌเจธเจ•เฉเจฐเจฟเจชเจธเจผเจจ เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจฃ เจซเฉฐเจ•เจธเจผเจจ 'เจคเฉ‡ เจœเจพเจฃเจพ),
    • เจ‡เจจเจ•เจฎเจฟเฉฐเจ— เจตเฉˆเจฌเจนเฉเฉฑเจ• (เจ—เฉ‹เจฐเจ•เจพเจฐเจก เจซเฉฐเจ•เจธเจผเจจ) เจจเฉ‚เฉฐ เจนเฉˆเจ‚เจกเจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
  • HmacSha256 เจ…เจคเฉ‡ HmacSha256hex เจซเฉฐเจ•เจธเจผเจจ HMAC-SHA256 เจ…เจคเฉ‡ HMAC-SHA256 เจเจจเจ•เฉเจฐเจฟเจชเจธเจผเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฆเฉ‡ เจฒเจพเจ—เฉ‚ เจนเจจ เจœเฉ‹ เจฆเจธเจคเจ–เจค เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เจฐเจจ เจฒเจˆ เจนเฉˆเจ•เจธเจพเจกเฉˆเจธเฉ€เจฎเจฒ เจจเฉฐเจฌเจฐเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจคเจฐ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจฆเฉ‡ เจจเจพเจฒ เจนเจจเฅค
  • main เจฎเฉเฉฑเจ– เจซเฉฐเจ•เจธเจผเจจ เจนเฉˆ, เจ•เจฎเจพเจ‚เจก เจฒเจพเจˆเจจ เจตเจฟเจ•เจฒเจชเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉˆเจ‚เจกเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ 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.

เจ…เจธเฉ€เจ‚ เจธเจฌเจธเจ•เฉเจฐเจฟเจชเจธเจผเจจ เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจฃ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจตเจฟเจšเจพเจฐเจพเจ‚เจ—เฉ‡; เจ‡เจน เจ‡เจธ เจตเจฟเฉฑเจš เจฆเจฟเฉฑเจคเฉ‡ เจธเจฟเจงเจพเจ‚เจคเจพเจ‚ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ. เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจซเฉฐเจ•เจธเจผเจจ เจฒเจˆ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก 'เจคเฉ‡ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ git เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€เจ†เจ‚.

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

เจ†เจ“ 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

เจนเฉเจฃ, เจตเฉˆเฉฑเจฌ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฐเจพเจนเฉ€เจ‚, เจฎเจพเจˆเจซเจพเจ‡เจฒ-เจเจธเจผ เจฌเจพเจฒเจŸเฉ€ เจคเฉ‹เจ‚ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ“เฅค

เจธเจฐเจตเจฐ เจฒเฉŒเจ—เจธ:

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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹