ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° управлявано ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π² ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ S3 Π½Π° Mail.ru Cloud Solutions

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° управлявано ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π² ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ S3 Π½Π° Mail.ru Cloud Solutions
ΠšΠ°Ρ„Π΅ машина Rube Goldberg

АрхитСктурата, управлявана ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, повишава СфСктивността Π½Π° Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡ‚Π΅ рСсурси, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ само Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ. Има ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π° ΠΈ Π΄Π° Π½Π΅ ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ прилоТСния. И днСс Ρ‰Π΅ говоря Π½Π΅ Π·Π° FaaS, Π° Π·Π° webhooks. Π©Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅Π½ ΡƒΡ€ΠΎΠΊ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΡƒΠ΅Π±ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ.

Няколко Π΄ΡƒΠΌΠΈ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΠΈ ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‚Π΅. ΠžΠ±Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π²ΠΈ позволява Π΄Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚Π΅ всякакви Π΄Π°Π½Π½ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ° ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ Ρ‡Ρ€Π΅Π· S3 ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ API (Π² зависимост ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ) Ρ‡Ρ€Π΅Π· HTTP/HTTPS. Π£Π΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈΡ‚Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ са пСрсонализирани HTTP ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΈ извиквания. Π’Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ сС задСйстват ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅, ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ към Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈΠ»ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ Π² Π±Π»ΠΎΠ³. ΠšΠΎΠ³Π°Ρ‚ΠΎ възникнС ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅, ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΈΡΡ‚ сайт ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° HTTP заявка Π΄ΠΎ URL адрСса, посочСн Π·Π° ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠ°Ρ‚Π°. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΊΠ°Ρ€Π°Ρ‚Π΅ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Π½Π° Π΅Π΄ΠΈΠ½ сайт Π΄Π° задСйстват дСйствия Π½Π° Π΄Ρ€ΡƒΠ³ (ΡƒΠΈΠΊΠΈ). Π’ случай, Ρ‡Π΅ изходният сайт Π΅ ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, ΡΡŠΠ±ΠΈΡ‚ΠΈΡΡ‚Π° дСйстват ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° прости случаи, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ‚Π°ΠΊΠ°Π²Π° автоматизация:

  1. БъздаванС Π½Π° копия Π½Π° всички ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎ ΠΎΠ±Π»Π°Ρ‡Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. ΠšΠΎΠΏΠΈΡΡ‚Π° трябва Π΄Π° сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ всСки ΠΏΡŠΡ‚, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС добавят ΠΈΠ»ΠΈ промСнят Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.
  2. Автоматично създаванС Π½Π° ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π° ΠΎΡ‚ ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€ΠΈ Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, добавянС Π½Π° Π²ΠΎΠ΄Π½ΠΈ Π·Π½Π°Ρ†ΠΈ към снимки ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° изобраТСния.
  3. Π˜Π·Π²Π΅ΡΡ‚ΠΈΠ΅ Π·Π° пристиганСто Π½Π° Π½ΠΎΠ²ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° счСтоводна услуга ΠΊΠ°Ρ‡Π²Π° ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ°, Π° финансовият ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° извСстия Π·Π° Π½ΠΎΠ²ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ, провСрява Π³ΠΈ ΠΈ Π³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°).
  4. Малко ΠΏΠΎ-слоТнитС случаи Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° заявка към Kubernetes, която създава pod с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ, ΠΏΡ€Π΅Π΄Π°Π²Π° ΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΈ слСд ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° свива ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

ΠšΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° Π·Π°Π΄Π°Ρ‡Π° 1, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² ΠΊΠΎΡ„Π°Ρ‚Π° Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π½Π° Mail.ru Cloud Solutions (MCS) сС синхронизират Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π½Π° AWS с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΡƒΠ΅Π±ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ. Π’ Ρ€Π΅Π°Π»Π½ΠΎ Π·Π°Ρ€Π΅Π΄Π΅Π½ случай трябва Π΄Π° сС осигури асинхронна Ρ€Π°Π±ΠΎΡ‚Π° Ρ‡Ρ€Π΅Π· рСгистриранС Π½Π° webhooks Π² опашка, Π½ΠΎ Π·Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ внСдряванСто Π±Π΅Π· Ρ‚ΠΎΠ²Π°.

Π‘Ρ…Π΅ΠΌΠ° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΡŠΡ‚ Π·Π° взаимодСйствиС Π΅ описан ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π² Π ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ S3 Π½Π° MCS. Π Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° схСма Π²ΠΊΠ»ΡŽΡ‡Π²Π° слСднитС Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ:

  • Π˜Π·Π΄Π°Ρ‚Π΅Π»ΡΠΊΠ° услуга, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΎΡ‚ страната Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ S3 ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π° HTTP заявки, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС задСйства webnhook.
  • Π‘ΡŠΡ€Π²ΡŠΡ€ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Webhook, ΠΊΠΎΠΉΡ‚ΠΎ ΡΠ»ΡƒΡˆΠ° заявки ΠΎΡ‚ услугата Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° HTTP ΠΈ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° подходящи дСйствия. Π‘ΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС написан Π½Π° всСки Π΅Π·ΠΈΠΊ; Π² нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‰Π΅ напишСм ΡΡŠΡ€Π²ΡŠΡ€Π° Π½Π° Go.

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»Π½Π° характСристика Π½Π° внСдряванСто Π½Π° ΡƒΠ΅Π±ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π² S3 API Π΅ рСгистрацията Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΡƒΠ΅Π±ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π² услугата Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅. По-спСциално ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook трябва Π΄Π° ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄ΠΈ Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ‚Π° Π·Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΎΡ‚ услугата Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ (ΠΏΡ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° webhook ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½Π΅ сС изисква ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ‚Π°).

Π‘ΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook трябва Π΄Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π΄Π²Π΅ основни ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

  • ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Π½Π° исканСто Π½Π° издатСлската услуга Π·Π° ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° рСгистрацията,
  • ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° входящи ΡΡŠΠ±ΠΈΡ‚ΠΈΡ.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook

Π—Π° Π΄Π° стартиратС ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook, Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Linux ΡΡŠΡ€Π²ΡŠΡ€. Π’ Ρ‚Π°Π·ΠΈ статия, ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π΅Π½ СкзСмпляр, ΠΊΠΎΠΉΡ‚ΠΎ внСдрявамС Π½Π° MCS.

НСка инсталирамС нСобходимия софтуСр ΠΈ стартирамС ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook.

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) ...

ΠšΠ»ΠΎΠ½ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° със ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook:

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

АбонирайтС сС Π·Π° издатСлска услуга

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° рСгистриратС своя ΡΡŠΡ€Π²ΡŠΡ€ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook Ρ‡Ρ€Π΅Π· API ΠΈΠ»ΠΈ ΡƒΠ΅Π± интСрфСйс. Π—Π° ΠΏΠΎ-лСсно Ρ‰Π΅ сС рСгистрирамС Ρ‡Ρ€Π΅Π· ΡƒΠ΅Π± интСрфСйса:

  1. Π”Π° ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ Π² сСкцията с ΠΊΠΎΡ„ΠΈ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π°Ρ‚Π° Π·Π°Π»Π°.
  2. ΠžΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π΄ΠΎ ΠΊΠΎΡ„Π°Ρ‚Π°, Π·Π° която Ρ‰Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ webhooks ΠΈ Ρ‰Ρ€Π°ΠΊΠ½Π΅Ρ‚Π΅ Π²ΡŠΡ€Ρ…Ρƒ Π·ΡŠΠ±Π½ΠΎΡ‚ΠΎ ΠΊΠΎΠ»Π΅Π»ΠΎ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° управлявано ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π² ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ S3 Π½Π° Mail.ru Cloud Solutions

ΠžΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π° Webhooks ΠΈ Ρ‰Ρ€Π°ΠΊΠ½Π΅Ρ‚Π΅ Π²ΡŠΡ€Ρ…Ρƒ ДобавянС:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° управлявано ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π² ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ S3 Π½Π° Mail.ru Cloud Solutions
ΠŸΠΎΠΏΡŠΠ»Π½Π΅Ρ‚Π΅ ΠΏΠΎΠ»Π΅Ρ‚Π°Ρ‚Π°:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° управлявано ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π² ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ S3 Π½Π° Mail.ru Cloud Solutions

ID β€” ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° webhook.

Π‘ΡŠΠ±ΠΈΡ‚ΠΈΠ΅ - ΠΊΠΎΠΈ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Π΄Π° сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚. Π—Π°Π΄Π°Π»ΠΈ смС ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° всички ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, ΠΊΠΎΠΈΡ‚ΠΎ сС случват ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ (добавянС ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅).

URL β€” адрСс Π½Π° ΡΡŠΡ€Π²ΡŠΡ€ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook.

ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ/суфикс Π½Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° Π΅ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ Π²ΠΈ позволява Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ ΡƒΠ΅Π±ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ само Π·Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, Ρ‡ΠΈΠΈΡ‚ΠΎ ΠΈΠΌΠ΅Π½Π° отговарят Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°. НапримСр, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ webhook Π΄Π° задСйства само Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .png, Π² Буфикс Π½Π° Ρ„ΠΈΠ»Ρ‚ΡŠΡ€Π° трябва Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ β€žpngβ€œ.

ΠŸΠΎΠ½Π°ΡΡ‚ΠΎΡΡ‰Π΅ΠΌ само ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅ 80 ΠΈ 443 сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook.

Π”Π° Ρ‰Ρ€Π°ΠΊΠ½Π΅ΠΌ Π”ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ ΠΊΡƒΠΊΠ° ΠΈ Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ слСдното:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° управлявано ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π² ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ S3 Π½Π° Mail.ru Cloud Solutions
Π”ΠΎΠ±Π°Π²Π΅Π½Π° ΠΊΡƒΠΊΠ°.

Π‘ΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook ΠΏΠΎΠΊΠ°Π·Π²Π° Π² своитС рСгистрационни Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π°ΠΏΡ€Π΅Π΄ΡŠΠΊΠ° Π½Π° процСса Π½Π° рСгистрация Π½Π° ΠΊΡƒΠΊΠ°:

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

РСгистрацията ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ. Π’ слСдващия Ρ€Π°Π·Π΄Π΅Π» Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook.

ОписаниС Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook

Π’ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Π΅ написан Π½Π° 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/ΡƒΠ΅Π± ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€:
    • ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π°Π²Π° рСгистрацията Π² услугата Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ (ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° функцията SubscriptionConfirmation),
    • ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° входящи ΡƒΠ΅Π±ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ (функция Gorecords).
  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ HmacSha256 ΠΈ HmacSha256hex са Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈΡ‚Π΅ Π·Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ HMAC-SHA256 ΠΈ HMAC-SHA256 с ΠΈΠ·Ρ…ΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎ Π½ΠΈΠ· ΠΎΡ‚ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Π΅ΡΠ΅Ρ‚ΠΈΡ‡Π½ΠΈ числа Π·Π° изчисляванС Π½Π° подписа.
  • main Π΅ основната функция, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° командния Ρ€Π΅Π΄ ΠΈ рСгистрира URL ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€ΠΈ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° командния Ρ€Π΅Π΄, ΠΏΡ€ΠΈΠ΅Ρ‚ΠΈ ΠΎΡ‚ ΡΡŠΡ€Π²ΡŠΡ€Π°:

  • -port Π΅ ΠΏΠΎΡ€Ρ‚ΡŠΡ‚, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Ρ‰Π΅ ΡΠ»ΡƒΡˆΠ°.
  • -address - IP адрСс, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Ρ‰Π΅ ΡΠ»ΡƒΡˆΠ°.
  • -script Π΅ външна ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, която сС ΠΈΠ·Π²ΠΈΠΊΠ²Π° Π·Π° всяка входяща ΠΊΡƒΠΊΠ°.

НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΎΡ‚Π±Π»ΠΈΠ·ΠΎ някои ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅:

//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)
    }

}

Π’Π°Π·ΠΈ функция опрСдСля Π΄Π°Π»ΠΈ Π΅ пристигнала заявка Π·Π° ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° рСгистрация ΠΈΠ»ΠΈ webhook. ΠšΠ°ΠΊΡ‚ΠΎ слСдва ΠΎΡ‚ докумСнтация, Π°ΠΊΠΎ рСгистрацията Π΅ ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄Π΅Π½Π°, Π² заявката Π·Π° публикация сС ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° слСдната 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", Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²Π° Π² заявката Π·Π° ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π½Π΅ ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²Π° Π² webhook. Π’ΡŠΠ· основа Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ/ΠΎΡ‚ΡΡŠΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ запис Π² POST заявката, ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½ΠΎΡ‚ΠΎ изпълнСниС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΎΡ‚ΠΈΠ²Π° ΠΈΠ»ΠΈ към функцията SubscriptionConfirmation, ΠΈΠ»ΠΈ във функция GotRecords.

Няма Π΄Π° Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ функцията SubscriptionConfirmation; тя сС изпълнява съгласно ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΡ‚Π΅, ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈ Π² докумСнтация. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ изходния ΠΊΠΎΠ΄ Π·Π° Ρ‚Π°Π·ΠΈ функция Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°.

Ѐункцията GotRecords Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° входяща заявка ΠΈ Π·Π° всСки ΠΎΠ±Π΅ΠΊΡ‚ Record ΠΈΠ·Π²ΠΈΠΊΠ²Π° външСн скрипт (Ρ‡ΠΈΠ΅Ρ‚ΠΎ ΠΈΠΌΠ΅ Π΅ ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° -script) с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅:

  • ΠΈΠΌΠ΅ Π½Π° ΠΊΠΎΡ„Π°Ρ‚Π°
  • ΠΎΠ±Π΅ΠΊΡ‚Π΅Π½ ΠΊΠ»ΡŽΡ‡
  • дСйствиС:
    • ΠΊΠΎΠΏΠΈΠ΅ - Π°ΠΊΠΎ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° заявка EventName = ObjectCreated | ΠŸΠΎΡΡ‚Π°Π²Π΅Ρ‚Π΅ ΠΎΠ±Π΅ΠΊΡ‚ | PutObjectCopy
    • ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ - Π°ΠΊΠΎ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° заявка EventName = ObjectRemoved | Π˜Π·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚

Π’Π°ΠΊΠ°, Π°ΠΊΠΎ ΠΊΡƒΠΊΠ° пристигнС с Post заявка, ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ описано Π³ΠΎΡ€Π΅ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° -script=script.sh Ρ‚ΠΎΠ³Π°Π²Π° ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ Ρ‰Π΅ бъдС ΠΈΠ·Π²ΠΈΠΊΠ°Π½ ΠΊΠ°ΠΊΡ‚ΠΎ слСдва:

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

Врябва Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° webhook Π½Π΅ Π΅ пълно производствСно Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π° опростСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° възмоТна рСализация.

Π Π°Π±ΠΎΡ‚Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

НСка синхронизирамС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ ΠΎΡ‚ основната ΠΊΠΎΡ„Π° Π² 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]:

НСка ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ API Π½Π° AWS S3:

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. РСгистрационнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ‚, Ρ‡Π΅ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½Π° заявка към ΡΡŠΡ€Π²ΡŠΡ€Π° Π½Π° 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

НСка ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° 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:~$

Π€Π°ΠΉΠ»ΡŠΡ‚ Π΅ ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅ Ρ€Π΅ΡˆΠ΅Π½.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ToDo

ЦСлият ΠΊΠΎΠ΄, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² Ρ‚Π°Π·ΠΈ статия, Π΅ Π² ΠΌΠΎΠ΅Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. Има ΡΡŠΡ‰ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° скриптовС ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° прСброяванС Π½Π° подписи Π·Π° рСгистриранС Π½Π° webhooks.

Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π½Π΅ Π΅ Π½ΠΈΡ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ S3 webhooks във Π²Π°ΡˆΠΈΡ‚Π΅ дСйности. ΠšΠ°ΠΊΡ‚ΠΎ ΠΊΠ°Π·Π°Ρ… Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ, Π°ΠΊΠΎ ΠΏΠ»Π°Π½ΠΈΡ€Π°Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ρ‚Π°ΠΊΡŠΠ² ΡΡŠΡ€Π²ΡŠΡ€ Π² производството, трябва ΠΏΠΎΠ½Π΅ Π΄Π° ΠΏΡ€Π΅Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° асинхронна Ρ€Π°Π±ΠΎΡ‚Π°: рСгистрирайтС входящи ΡƒΠ΅Π±ΠΊΡƒΠΊΠΈ Π² опашка (RabbitMQ ΠΈΠ»ΠΈ NATS) ΠΈ ΠΎΡ‚Ρ‚Π°ΠΌ Π³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‚Π΅ с работничСски прилоТСния. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈΡ‚Π΅ пристигнат масово, ΠΌΠΎΠΆΠ΅ Π΄Π° срСщнСтС липса Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π½ΠΈ рСсурси Π·Π° изпълнСниС Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ. НаличиСто Π½Π° опашки Π²ΠΈ позволява Π΄Π° разпрСдСлятС ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ†ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄Π° Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с повтарящи сС Π·Π°Π΄Π°Ρ‡ΠΈ Π² случай Π½Π° ΠΏΠΎΠ²Ρ€Π΅Π΄Π°. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ рСгистриранСто Π½Π° ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΈ ΠΏΠΎ-стандартизирано.

Good Luck!

ΠžΡ‰Π΅ Ρ‡Π΅Ρ‚ΠΈΠ²Π° ΠΏΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚Π°:

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€