S3 เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเดฟเดฒเต† เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด‡เดตเดจเตเดฑเต-เดกเตเดฐเตˆเดตเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ Mail.ru เด•เตเดฒเต—เดกเต เดธเตŠเดฒเตเดฏเต‚เดทเดจเตเด•เตพ

S3 เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเดฟเดฒเต† เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด‡เดตเดจเตเดฑเต-เดกเตเดฐเตˆเดตเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ Mail.ru เด•เตเดฒเต—เดกเต เดธเตŠเดฒเตเดฏเต‚เดทเดจเตเด•เตพ
เดฑเต‚เดฌเต เด—เต‹เตพเดกเตเดฌเต†เตผเด—เต เด•เต‹เดซเดฟ เดฎเต†เดทเต€เตป

เด‡เดตเดจเตเดฑเต-เดกเตเดฐเตˆเดตเต เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดตเดฟเดญเดตเด™เตเด™เดณเตเดŸเต† เดšเต†เดฒเดตเต เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดค เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ เด…เดต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดจเดฟเดฎเดฟเดทเดคเตเดคเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เดŽเด™เตเด™เดจเต† เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเดฎเต†เดจเตเดจเตเด‚ เด…เดงเดฟเด• เด•เตเดฒเต—เดกเต เดŽเดจเตเดฑเดฟเดฑเตเดฑเดฟเด•เตพ เดตเตผเด•เตเด•เตผ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเดพเดฏเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดฐเตเดคเต†เดจเตเดจเตเด‚ เดจเดฟเดฐเดตเดงเดฟ เด“เดชเตเดทเดจเตเด•เตพ เด‰เดฃเตเดŸเต. เด‡เดจเตเดจเต เดžเดพเตป เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต FaaS เดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเดฒเตเดฒ, webhooks เดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเดพเดฃเต. เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‡เดตเดจเตเดฑเตเด•เตพ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดŸเตเดฏเต‚เดŸเตเดŸเต‹เดฑเดฟเดฏเตฝ เด‰เดฆเดพเดนเดฐเดฃเด‚ เดžเดพเตป เด•เดพเดฃเดฟเด•เตเด•เตเด‚.

เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเต เดธเด‚เดญเดฐเดฃเดคเตเดคเต†เดฏเตเด‚ เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เดฟเดจเต†เดฏเตเด‚ เด•เตเดฑเดฟเดšเตเดšเต เด•เตเดฑเดšเตเดšเต เดตเดพเด•เตเด•เตเด•เตพ. เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เดจเดฟเด™เตเด™เดณเต† เด•เตเดฒเต—เดกเดฟเตฝ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เดณเตเดŸเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดธเด‚เดญเดฐเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, S3 เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเตŠเดฐเต API เดตเดดเดฟ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเดจเดพเด•เตเด‚ (เดจเดŸเดชเตเดชเดพเด•เตเด•เดฒเดฟเดจเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต) HTTP/HTTPS เดตเดดเดฟ. เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เตพ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค HTTP เด•เต‹เตพเดฌเดพเด•เตเด•เตเด•เดณเดพเดฃเต. เด•เต‹เดกเต เด’เดฐเต เดถเต‡เด–เดฐเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดคเดณเตเดณเตเดจเตเดจเดคเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดฌเตเดฒเต‹เด—เดฟเตฝ เดชเต‹เดธเตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดชเต‹เดฒเต†เดฏเตเดณเตเดณ เด’เดฐเต เด‡เดตเดจเตเดฑเต เดตเดดเดฟเดฏเดพเดฃเต เด…เดต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดŸเตเดฐเดฟเด—เตผ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเดคเต. เด’เดฐเต เด‡เดตเดจเตเดฑเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เดฟเดจเดพเดฏเดฟ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ URL-เดฒเต‡เด•เตเด•เต เด‰เดคเตเดญเดต เดธเตˆเดฑเตเดฑเต เด’เดฐเต HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเต. เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดธเตˆเดฑเตเดฑเดฟเดฒเต† เด‡เดตเดจเตเดฑเตเด•เตพ เดฎเดฑเตเดฑเตŠเดจเตเดจเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ (เดตเดฟเด•เตเด•เดฟ). เด‰เดฑเดตเดฟเดŸ เดธเตˆเดฑเตเดฑเต เด’เดฐเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เด†เดฃเต†เด™เตเด•เดฟเตฝ, เด‡เดตเดจเตเดฑเตเด•เตพ เด…เดคเดฟเดจเตเดฑเต† เด‰เดณเตเดณเดŸเด•เตเด•เดคเตเดคเดฟเตฝ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต.

เด…เดคเตเดคเดฐเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดตเตเดจเตเดจ เดฒเดณเดฟเดคเดฎเดพเดฏ เด•เต‡เดธเตเด•เดณเตเดŸเต† เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ:

  1. เดฎเดฑเตเดฑเตŠเดฐเต เด•เตเดฒเต—เดกเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเดฟเตฝ เดŽเดฒเตเดฒเดพ เดตเดธเตเดคเตเด•เตเด•เดณเตเดŸเต†เดฏเตเด‚ เดชเด•เตผเดชเตเดชเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต. เดซเดฏเดฒเตเด•เตพ เดšเต‡เตผเด•เตเด•เตเดฎเตเดชเต‹เดดเต‹ เดฎเดพเดฑเตเดฑเตเดฎเตเดชเต‹เดดเต‹ เดชเด•เตผเดชเตเดชเตเด•เตพ เดˆเดšเตเดšเดฏเดฟเตฝ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดฃเด‚.
  2. เด—เตเดฐเดพเดซเดฟเด•เต เดซเดฏเดฒเตเด•เดณเตเดŸเต† เดฒเด˜เตเดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดชเดฐเดฎเตเดชเดฐ เดธเตเดตเดฏเดฎเต‡เดต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตฝ, เดซเต‹เดŸเตเดŸเต‹เด—เตเดฐเดพเดซเตเด•เดณเดฟเตฝ เดตเดพเดŸเตเดŸเตผเดฎเดพเตผเด•เตเด•เตเด•เตพ เดšเต‡เตผเด•เตเด•เตฝ, เดฎเดฑเตเดฑเต เด‡เดฎเต‡เดœเต เดชเดฐเดฟเดทเตเด•เตเด•เดฐเดฃเด™เตเด™เตพ.
  3. เดชเตเดคเดฟเดฏ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เดณเตเดŸเต† เดตเดฐเดตเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด…เดฑเดฟเดฏเดฟเดชเตเดชเต (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดค เด…เด•เตเด•เต—เดฃเตเดŸเดฟเด‚เด—เต เดธเต‡เดตเดจเด‚ เด•เตเดฒเต—เดกเดฟเดฒเต‡เด•เตเด•เต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เตพ เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดธเดพเดฎเตเดชเดคเตเดคเดฟเด• เดจเดฟเดฐเต€เด•เตเดทเดฃเดคเตเดคเดฟเดจเต เดชเตเดคเดฟเดฏ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด…เดฑเดฟเดฏเดฟเดชเตเดชเตเด•เตพ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต, เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต).
  4. เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด•เต‡เดธเตเด•เดณเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเดพเดคเตเดฐเด™เตเด™เดณเตเดณเตเดณ เด’เดฐเต เดชเต‹เดกเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดฒเต‡เด•เตเด•เต เดŸเดพเดธเตโ€Œเด•เต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต, เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เดฟเดจเต เดถเต‡เดทเด‚ เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดคเด•เดฐเตเดจเตเดจเต.

เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ, Mail.ru เด•เตเดฒเต—เดกเต เดธเตŠเดฒเตเดฏเต‚เดทเตปเดธเต (MCS) เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เดฌเด•เตเด•เดฑเตเดฑเดฟเดฒเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต AWS เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเดฟเตฝ เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดžเด™เตเด™เตพ เดŸเดพเดธเตโ€Œเด•เต 1-เดจเตเดฑเต† เด’เดฐเต เดตเด•เดญเต‡เดฆเด‚ เด‰เดฃเตเดŸเดพเด•เตเด•เตเด‚. เด’เดฐเต เดฏเดฅเดพเตผเดคเตเดฅ เดฒเต‹เดกเต เดšเต†เดฏเตเดค เด•เต‡เดธเดฟเตฝ, เด’เดฐเต เด•เตเดฏเต‚เดตเดฟเตฝ เดตเต†เดฌเตเดนเต‚เด•เตเด•เตเด•เตพ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดคเตเด•เตŠเดฃเตเดŸเต เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดตเตผเด•เตเด•เต เดจเตฝเด•เดฃเด‚, เดŽเดจเตเดจเดพเตฝ เดชเดฐเดฟเดถเต€เดฒเดจ เดšเตเดฎเดคเดฒเดฏเตเด•เตเด•เดพเดฏเดฟ เดžเด™เตเด™เตพ เด‡เดคเต เด•เต‚เดŸเดพเดคเต† เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด‚.

เดตเตผเด•เตเด•เต เดธเตเด•เต€เด‚

เด‡เตปเดฑเดฑเดพเด•เตเดทเตป เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต MCS-เดฒเต† S3 เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด—เตˆเดกเต. เดตเตผเด•เตเด•เต เดธเตเด•เต€เดฎเดฟเตฝ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด˜เดŸเด•เด™เตเด™เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต:

  • เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃ เดธเต‡เดตเดจเด‚, S3 เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เดตเดถเดคเตเดคเตเดณเตเดณเดคเตเด‚ webnhook เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเดฎเตเดชเต‹เตพ HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเตเดฎเดพเดฃเต.
  • Webhook เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ, เด‡เดคเต HTTP เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃ เดธเต‡เดตเดจเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด‰เดšเดฟเดคเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดจเดŸเดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดธเต†เตผเดตเตผ เดเดคเต เดญเดพเดทเดฏเดฟเดฒเตเด‚ เดŽเดดเตเดคเดพเด‚; เดžเด™เตเด™เดณเตเดŸเต† เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ, เดžเด™เตเด™เตพ เด—เต‹เดฏเดฟเตฝ เดธเต†เตผเดตเตผ เดŽเดดเตเดคเตเด‚.

S3 API-เดฏเดฟเตฝ เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดธเดตเดฟเดถเต‡เดทเดค เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃ เดธเต‡เดตเดจเดคเตเดคเดฟเตฝ เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเดฑเดฟเดจเตเดฑเต† เดฐเดœเดฟเดธเตโ€ŒเดŸเตเดฐเต‡เดทเดจเดพเดฃเต. เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚, เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃ เดธเต‡เดตเดจเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดธเดจเตเดฆเต‡เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเดฟเดชเตโ€Œเดทเตป เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฟเด•เตเด•เดฃเด‚ (เดฎเดฑเตเดฑเต เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฒเตเด•เดณเดฟเตฝ, เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเดฟเดชเตโ€Œเดทเดจเตเดฑเต† เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด‚ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ).

เด…เดคเดจเตเดธเดฐเดฟเดšเตเดšเต, webhook เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ เดฐเดฃเตเดŸเต เดชเตเดฐเดงเดพเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เดฃเด‚:

  • เดฐเดœเดฟเดธเตเดŸเตเดฐเต‡เดทเตป เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃ เดธเต‡เดตเดจเดคเตเดคเดฟเดจเตเดฑเต† เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเต‹เดŸเต เดชเตเดฐเดคเดฟเด•เดฐเดฟเด•เตเด•เตเด•,
  • เด‡เตปเด•เดฎเดฟเด‚เด—เต เด‡เดตเดจเตเดฑเตเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเด•.

เด’เดฐเต webhook เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

webhook เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต 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 เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดตเต†เดฌเต เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดตเดดเดฟ เดจเดฟเด™เตเด™เดณเตเดŸเต† webhook เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเดพเด‚. เดฒเดพเดณเดฟเดคเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดžเด™เตเด™เตพ เดตเต†เดฌเต เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดตเดดเดฟ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเด‚:

  1. เดจเดฎเตเด•เตเด•เต เดฌเด•เตเด•เดฑเตเดฑเต เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เดพเด‚ เด•เตบเดŸเตเดฐเต‹เตพ เดฑเต‚เดฎเดฟเตฝ.
  2. เดžเด™เตเด™เตพ เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจ เดฌเด•เตเด•เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เด—เดฟเดฏเดฑเดฟเตฝ เด•เตเดฒเดฟเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•:

S3 เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเดฟเดฒเต† เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด‡เดตเดจเตเดฑเต-เดกเตเดฐเตˆเดตเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ Mail.ru เด•เตเดฒเต—เดกเต เดธเตŠเดฒเตเดฏเต‚เดทเดจเตเด•เตพ

Webhooks เดŸเดพเดฌเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เดšเต‡เตผเด•เตเด•เตเด• เด•เตเดฒเดฟเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•:

S3 เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเดฟเดฒเต† เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด‡เดตเดจเตเดฑเต-เดกเตเดฐเตˆเดตเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ Mail.ru เด•เตเดฒเต—เดกเต เดธเตŠเดฒเตเดฏเต‚เดทเดจเตเด•เตพ
เดซเต€เตฝเดกเตเด•เตพ เดชเต‚เดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเด•:

S3 เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเดฟเดฒเต† เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด‡เดตเดจเตเดฑเต-เดกเตเดฐเตˆเดตเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ Mail.ru เด•เตเดฒเต—เดกเต เดธเตŠเดฒเตเดฏเต‚เดทเดจเตเด•เตพ

เดเดกเดฟ - เดตเต†เดฌเตเดนเตเด•เตเด•เดฟเดจเตเดฑเต† เดชเต‡เดฐเต.

เด‡เดตเดจเตเดฑเต - เดเดคเต เด‡เดตเดจเตเดฑเตเด•เตพ เด•เตˆเดฎเดพเดฑเดฃเด‚. เดซเดฏเดฒเตเด•เดณเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจ เดŽเดฒเตเดฒเดพ เด‡เดตเดจเตเดฑเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดธเด‚เดชเตเดฐเต‡เด•เตเดทเดฃเด‚ เดžเด™เตเด™เตพ เดธเดœเตเดœเดฎเดพเด•เตเด•เดฟ (เดšเต‡เตผเด•เตเด•เตเด•เดฏเตเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด•).

URL โ€” webhook เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ เดตเดฟเดฒเดพเดธเด‚.

เดšเดฟเดฒ เดจเดฟเดฏเดฎเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดฎเดพเดคเตเดฐเด‚ เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดซเดฟเตฝเดŸเตเดŸเดฑเดพเดฃเต เดซเดฟเตฝเดŸเตเดŸเตผ เดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเต/เดธเดซเดฟเด•เตโ€Œเดธเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, .png เดตเดฟเดชเตเดฒเต€เด•เดฐเดฃเดคเตเดคเต‹เดŸเตเด•เต‚เดŸเดฟเดฏ เดซเดฏเดฒเตเด•เตพ เดฎเดพเดคเตเดฐเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต webhook, in เดซเดฟเตฝเดŸเตเดŸเตผ เดชเตเดฐเดคเตเดฏเดฏเด‚ เดจเดฟเด™เตเด™เตพ "png" เดŽเดดเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

เดจเดฟเดฒเดตเดฟเตฝ, เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต 80, 443 เดชเต‹เตผเดŸเตเดŸเตเด•เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เดชเดฟเดจเตเดคเตเดฃเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเตเดณเตเดณเต‚.

เด•เตเดฒเดฟเด•เตเด•เต เดšเต†เดฏเตเดฏเดพเด‚ เดนเตเด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเด• เดžเด™เตเด™เตพ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดต เด•เดพเดฃเตเด‚:

S3 เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเดฟเดฒเต† เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เตเด•เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด‡เดตเดจเตเดฑเต-เดกเตเดฐเตˆเดตเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ Mail.ru เด•เตเดฒเต—เดกเต เดธเตŠเดฒเตเดฏเต‚เดทเดจเตเด•เตพ
เดนเตเด•เตเด•เต เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเดคเตเดคเต.

เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ เด…เดคเดฟเดจเตเดฑเต† เดฒเต‹เด—เตเด•เดณเดฟเตฝ เดนเตเด•เตเด•เต เดฐเดœเดฟเดธเตเดŸเตเดฐเต‡เดทเตป เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเดŸเต† เดชเตเดฐเต‹เด—เดคเดฟ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต:

ubuntu@ubuntu-basic-1-2-10gb:~/s3-webhook$ sudo ./s3-webhook -port 80
2020/06/15 12:01:14 [POST] incoming HTTP request from 
95.163.216.92:42530
2020/06/15 12:01:14 Got timestamp: 2020-06-15T15:01:13+03:00 TopicArn: 
mcs5259999770|myfiles-ash|s3:ObjectCreated:*,s3:ObjectRemoved:* Token: 
E2itMqAMUVVZc51pUhFWSp13DoxezvRxkUh5P7LEuk1dEe9y URL: 
http://89.208.199.220/webhook
2020/06/15 12:01:14 Generate responce signature: 
3754ce36636f80dfd606c5254d64ecb2fd8d555c27962b70b4f759f32c76b66d

เดฐเดœเดฟเดธเตเดŸเตเดฐเต‡เดทเตป เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ. เด…เดŸเตเดคเตเดค เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ, เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเดฑเดฟเดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต† เด…เตฝเด—เต‹เดฐเดฟเดคเด‚ เดžเด™เตเด™เตพ เดธเต‚เด•เตเดทเตเดฎเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด‚.

เดตเต†เดฌเตเดนเตเด•เตเด•เต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเดฑเดฟเดจเตเดฑเต† เดตเดฟเดตเดฐเดฃเด‚

เดžเด™เตเด™เดณเตเดŸเต† เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ, เดธเต†เตผเดตเตผ Go- เตฝ เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเดฟเดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เดคเดคเตเดตเด™เตเด™เตพ เดจเต‹เด•เตเด•เดพเด‚.

package main

// Generate hmac_sha256_hex
func HmacSha256hex(message string, secret string) string {
}

// Generate hmac_sha256
func HmacSha256(message string, secret string) string {
}

// Send subscription confirmation
func SubscriptionConfirmation(w http.ResponseWriter, req *http.Request, body []byte) {
}

// Send subscription confirmation
func GotRecords(w http.ResponseWriter, req *http.Request, body []byte) {
}

// Liveness probe
func Ping(w http.ResponseWriter, req *http.Request) {
    // log request
    log.Printf("[%s] incoming HTTP Ping request from %sn", req.Method, req.RemoteAddr)
    fmt.Fprintf(w, "Pongn")
}

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

func main() {

    // get command line args
    bindPort := flag.Int("port", 80, "number between 1-65535")
    bindAddr := flag.String("address", "", "ip address in dot format")
    flag.StringVar(&actionScript, "script", "", "external script to execute")
    flag.Parse()

    http.HandleFunc("/ping", Ping)
    http.HandleFunc("/webhook", Webhook)

log.Fatal(http.ListenAndServe(*bindAddr+":"+strconv.Itoa(*bindPort), nil))
}

เดชเตเดฐเดงเดพเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด•:

  • Ping() - URL/ping เดตเดดเดฟ เดชเตเดฐเดคเดฟเด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฑเต‚เดŸเตเดŸเต, เดฒเตˆเดตเตเดจเต†เดธเต เดชเตเดฐเต‹เดฌเดฟเดจเตเดฑเต† เดเดฑเตเดฑเดตเตเด‚ เดฒเดณเดฟเดคเดฎเดพเดฏ เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ.
  • Webhook() - เดชเตเดฐเดงเดพเดจ เดฑเต‚เดŸเตเดŸเต, URL/webhook เดนเดพเตปเดกเตโ€Œเดฒเตผ:
    • เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃ เดธเต‡เดตเดจเดคเตเดคเดฟเดฒเต† เดฐเดœเดฟเดธเตเดŸเตเดฐเต‡เดทเตป เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต (เดธเดฌเตเดธเตเด•เตเดฐเดฟเดชเตเดทเตป เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเด•),
    • เด‡เตปเด•เดฎเดฟเด‚เด—เต เดตเต†เดฌเตเดนเต‚เด•เตเด•เตเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต (เด—เต‹เดฑเต†เด•เตเด•เต‹เตผเดกเตเดธเต เดซเด‚เด—เตเดทเตป).
  • HmacSha256, HmacSha256hex เดŽเดจเตเดจเต€ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ, เดธเดฟเด—เตเดจเต‡เดšเตเดšเตผ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดนเต†เด•เตโ€Œเดธเดพเดกเต†เดธเดฟเดฎเตฝ เดธเด‚เด–เตเดฏเด•เดณเตเดŸเต† เด’เดฐเต เดธเตโ€ŒเดŸเตเดฐเดฟเด‚เด—เดพเดฏเดฟ เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเต เด‰เดณเตเดณ HMAC-SHA256, HMAC-SHA256 เดŽเตปเด•เตเดฐเดฟเดชเตเดทเตป เด…เตฝเด—เต‹เดฐเดฟเดคเด™เตเด™เดณเตเดŸเต† เดจเดฟเตผเดตเตเดตเดนเดฃเด™เตเด™เดณเดพเดฃเต.
  • เดชเตเดฐเดงเดพเดจ เดŽเดจเตเดจเดคเต เดชเตเดฐเดงเดพเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฎเดพเดฃเต, เด•เดฎเดพเตปเดกเต เดฒเตˆเตป เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ URL เดนเดพเตปเดกเตโ€Œเดฒเดฑเตเด•เตพ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดธเต†เตผเดตเตผ เด…เด‚เด—เต€เด•เดฐเดฟเดšเตเดš เด•เดฎเดพเตปเดกเต เดฒเตˆเตป เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ:

  • -port เดŽเดจเตเดจเดคเต เดธเต†เตผเดตเตผ เด•เต‡เตพเด•เตเด•เตเดจเตเดจ เดชเต‹เตผเดŸเตเดŸเต เด†เดฃเต.
  • -เดตเดฟเดฒเดพเดธเด‚ - เดธเต†เตผเดตเตผ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจ 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 | เด’เดฌเตเดœเด•เตเดฑเตเดฑเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•

เด…เด™เตเด™เดจเต†, เดตเดฟเดตเดฐเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต†, เด’เดฐเต เดชเต‹เดธเตเดฑเตเดฑเต เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเดฎเดพเดฏเดฟ เด’เดฐเต เดนเตเด•เตเด•เต เดตเดจเตเดจเดพเตฝ เด•เต‚เดŸเตเดคเตฝ, เด•เต‚เดŸเดพเดคเต† -script=script.sh เดŽเดจเตเดจ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเตผ เดคเตเดŸเตผเดจเตเดจเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเดจเต† เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดตเดฟเดณเดฟเด•เตเด•เตเด‚:

script.sh  bucketA some-file-to-bucket copy

เดˆ เดตเต†เดฌเตโ€Œเดนเตเด•เตเด•เต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเต†เตผเดตเตผ เด’เดฐเต เดธเดฎเตเดชเต‚เตผเดฃเตเดฃ เด‰เตฝโ€Œเดชเดพเดฆเดจ เดชเดฐเดฟเดนเดพเดฐเดฎเดฒเตเดฒ, เดธเดพเดงเตเดฏเดฎเดพเดฏ เดจเดŸเดชเตเดชเดพเด•เตเด•เดฒเดฟเดจเตเดฑเต† เดฒเดณเดฟเดคเดฎเดพเดฏ เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฃเต†เดจเตเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดฃเด‚.

เดœเต‹เดฒเดฟเดฏเตเดŸเต† เด‰เดฆเดพเดนเดฐเดฃเด‚

MCS-เดฒเต† เดชเตเดฐเดงเดพเดจ เดฌเด•เตเด•เดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต AWS-เดฒเต† เดฌเดพเด•เตเด•เดชเตเดชเต เดฌเด•เตเด•เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดซเดฏเดฒเตเด•เตพ เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚. เดชเตเดฐเดงเดพเดจ เดฌเด•เตเด•เดฑเตเดฑเดฟเดจเต† myfiles-ash เดŽเดจเตเดจเตเด‚ เดฌเดพเด•เตเด•เดชเตเดชเดฟเดจเต† myfiles-backup เดŽเดจเตเดจเตเด‚ เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต (AWS-เดฒเต† เดฌเด•เตเด•เดฑเตเดฑเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดชเดฐเดฟเดงเดฟเด•เตเด•เดชเตเดชเตเดฑเดฎเดพเดฃเต). เด…เดคเดจเตเดธเดฐเดฟเดšเตเดšเต, เด’เดฐเต เดซเดฏเตฝ เดชเตเดฐเดงเดพเดจ เดฌเด•เตเด•เดฑเตเดฑเดฟเตฝ เดธเตเดฅเดพเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด…เดคเดฟเดจเตเดฑเต† เดชเด•เตผเดชเตเดชเต เดฌเดพเด•เตเด•เดชเตเดชเต เด’เดจเตเดจเดฟเตฝ เดฆเตƒเดถเตเดฏเดฎเดพเด•เดฃเด‚, เดชเตเดฐเดงเดพเดจเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดคเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด…เดคเต เดฌเดพเด•เตเด•เดชเตเดชเต เด’เดจเตเดจเดฟเตฝ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดฃเด‚.

MCS เด•เตเดฒเต—เดกเต เดธเด‚เดญเดฐเดฃเดคเตเดคเดฟเดจเตเด‚ AWS เด•เตเดฒเต—เดกเต เดธเด‚เดญเดฐเดฃเดคเตเดคเดฟเดจเตเด‚ เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ awscli เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดฌเด•เตเด•เดฑเตเดฑเตเด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚.

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 เดตเต†เดฌเต เด‡เดจเตเดฑเตผเดซเต‡เดธเต myfiles-ash เดฌเด•เตเด•เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต test.txt เดซเดฏเตฝ เดšเต‡เตผเด•เตเด•เตเด•. webhook เดธเต†เตผเดตเดฑเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดจเดŸเดคเตเดคเดฟเดฏเดคเดพเดฏเดฟ เด•เตบเดธเต‹เตพ เดฒเต‹เด—เตเด•เตพ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต:

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 เดฌเด•เตเด•เดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพ เดซเดฏเตฝ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด‚.

เดธเต†เตผเดตเตผ เดฒเต‹เด—เตเด•เตพ:

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•