ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ°, ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½Π° ΠΎΡ ΡΡΠ±ΠΈΡΠΈΡ, ΠΏΠΎΠ²ΠΈΡΠ°Π²Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΡΠ°Π·Ρ
ΠΎΠ΄ΠΈΡΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°ΠΌΠΎ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ°, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ. ΠΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡΠΈΠΈ ΠΊΠ°ΠΊ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ ΡΠΎΠ²Π° ΠΈ Π΄Π° Π½Π΅ ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ ΠΊΠ°ΡΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π Π΄Π½Π΅Ρ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ Π½Π΅ Π·Π° FaaS, Π° Π·Π° webhooks. Π©Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ ΡΡΠΎΠΊ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΡΠ±ΠΈΡΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ΅Π±ΠΊΡΠΊΠΈΡΠΊΠΈ Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ.
ΠΡΠΊΠΎΠ»ΠΊΠΎ Π΄ΡΠΌΠΈ Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ ΠΈ ΡΠ΅Π± ΠΊΡΠΊΠΈΡΠ΅. ΠΠ±Π΅ΠΊΡΠ½ΠΎΡΠΎ ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΡ
ΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ Π΄Π°Π½Π½ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ, Π΄ΠΎΡΡΡΠΏΠ½ΠΈ ΡΡΠ΅Π· S3 ΠΈΠ»ΠΈ Π΄ΡΡΠ³ API (Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ) ΡΡΠ΅Π· HTTP/HTTPS. Π£Π΅Π± ΠΊΡΠΊΠΈΡΠΊΠΈΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ HTTP ΠΎΠ±ΡΠ°ΡΠ½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ. Π’Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Ρ ΠΎΡ ΡΡΠ±ΠΈΡΠΈΠ΅, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ ΠΊΡΠΌ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ Π² Π±Π»ΠΎΠ³. ΠΠΎΠ³Π°ΡΠΎ Π²ΡΠ·Π½ΠΈΠΊΠ½Π΅ ΡΡΠ±ΠΈΡΠΈΠ΅, ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΈΡΡ ΡΠ°ΠΉΡ ΠΈΠ·ΠΏΡΠ°ΡΠ° HTTP Π·Π°ΡΠ²ΠΊΠ° Π΄ΠΎ URL Π°Π΄ΡΠ΅ΡΠ°, ΠΏΠΎΡΠΎΡΠ΅Π½ Π·Π° ΡΠ΅Π± ΠΊΡΠΊΠΈΡΠΊΠ°ΡΠ°. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΊΠ°ΡΠ°ΡΠ΅ ΡΡΠ±ΠΈΡΠΈΡ Π½Π° Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΡ Π΄Π° Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π° Π΄ΡΡΠ³ (
ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΏΡΠΎΡΡΠΈ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°ΠΊΠ°Π²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ:
- Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΏΠΈΡ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ Π² Π΄ΡΡΠ³ΠΎ ΠΎΠ±Π»Π°ΡΠ½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅. ΠΠΎΠΏΠΈΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΠ΅Π΄ΠΈΡΠ° ΠΎΡ ΠΌΠΈΠ½ΠΈΠ°ΡΡΡΠΈ Π½Π° Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π²ΠΎΠ΄Π½ΠΈ Π·Π½Π°ΡΠΈ ΠΊΡΠΌ ΡΠ½ΠΈΠΌΠΊΠΈ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
- ΠΠ·Π²Π΅ΡΡΠΈΠ΅ Π·Π° ΠΏΡΠΈΡΡΠΈΠ³Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡΠ΅ΡΠΎΠ²ΠΎΠ΄Π½Π° ΡΡΠ»ΡΠ³Π° ΠΊΠ°ΡΠ²Π° ΠΎΡΡΠ΅ΡΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ°, Π° ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΈΠ·Π²Π΅ΡΡΠΈΡ Π·Π° Π½ΠΎΠ²ΠΈ ΠΎΡΡΠ΅ΡΠΈ, ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π³ΠΈ ΠΈ Π³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°).
- ΠΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ Π²ΠΊΠ»ΡΡΠ²Π°Ρ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ Kubernetes, ΠΊΠΎΡΡΠΎ ΡΡΠ·Π΄Π°Π²Π° pod Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΠΏΡΠ΅Π΄Π°Π²Π° ΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ° ΠΈ ΡΠ»Π΅Π΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ²ΠΈΠ²Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π²Π°ΡΠΈΠ°Π½Ρ Π½Π° Π·Π°Π΄Π°ΡΠ° 1, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΊΠΎΡΠ°ΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ Π½Π° Mail.ru Cloud Solutions (MCS) ΡΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Ρ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ Π½Π° AWS Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ΅Π±ΠΊΡΠΊΠΈΡΠΊΠΈ. Π ΡΠ΅Π°Π»Π½ΠΎ Π·Π°ΡΠ΅Π΄Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π° ΡΠ°Π±ΠΎΡΠ° ΡΡΠ΅Π· ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅ Π½Π° webhooks Π² ΠΎΠΏΠ°ΡΠΊΠ°, Π½ΠΎ Π·Π° Π·Π°Π΄Π°ΡΠ°ΡΠ° Π·Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π±Π΅Π· ΡΠΎΠ²Π°.
Π‘Ρ Π΅ΠΌΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°
ΠΡΠΎΡΠΎΠΊΠΎΠ»ΡΡ Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π΅ ΠΎΠΏΠΈΡΠ°Π½ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π²
- ΠΠ·Π΄Π°ΡΠ΅Π»ΡΠΊΠ° ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΎΡ ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ 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 ΠΈΠ»ΠΈ ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠ° ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ ΡΠ΅ ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅ ΡΡΠ΅Π· ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°:
ΠΠ° ΠΎΡΠΈΠ΄Π΅ΠΌ Π² ΡΠ΅ΠΊΡΠΈΡΡΠ° Ρ ΠΊΠΎΡΠΈ Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π°ΡΠ° Π·Π°Π»Π°.- ΠΡΠΈΠ΄Π΅ΡΠ΅ Π΄ΠΎ ΠΊΠΎΡΠ°ΡΠ°, Π·Π° ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ webhooks ΠΈ ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ Π²ΡΡΡ Ρ Π·ΡΠ±Π½ΠΎΡΠΎ ΠΊΠΎΠ»Π΅Π»ΠΎ:
ΠΡΠΈΠ΄Π΅ΡΠ΅ Π² ΡΠ°Π·Π΄Π΅Π»Π° Webhooks ΠΈ ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ Π²ΡΡΡ
Ρ ΠΠΎΠ±Π°Π²ΡΠ½Π΅:
ΠΠΎΠΏΡΠ»Π½Π΅ΡΠ΅ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ°:
ID β ΠΈΠΌΠ΅ΡΠΎ Π½Π° webhook.
Π‘ΡΠ±ΠΈΡΠΈΠ΅ - ΠΊΠΎΠΈ ΡΡΠ±ΠΈΡΠΈΡ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ. ΠΠ°Π΄Π°Π»ΠΈ ΡΠΌΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ±ΠΈΡΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π°Ρ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ (Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅).
URL β Π°Π΄ΡΠ΅Ρ Π½Π° ΡΡΡΠ²ΡΡ Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° webhook.
ΠΡΠ΅ΡΠΈΠΊΡ/ΡΡΡΠΈΠΊΡ Π½Π° ΡΠΈΠ»ΡΡΡΠ° Π΅ ΡΠΈΠ»ΡΡΡ, ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΡΠ΅Π±ΠΊΡΠΊΠΈΡΠΊΠΈ ΡΠ°ΠΌΠΎ Π·Π° ΠΎΠ±Π΅ΠΊΡΠΈ, ΡΠΈΠΈΡΠΎ ΠΈΠΌΠ΅Π½Π° ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ webhook Π΄Π° Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° ΡΠ°ΠΌΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ .png, Π² Π‘ΡΡΠΈΠΊΡ Π½Π° ΡΠΈΠ»ΡΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ βpngβ.
ΠΠΎΠ½Π°ΡΡΠΎΡΡΠ΅ΠΌ ΡΠ°ΠΌΠΎ ΠΏΠΎΡΡΠΎΠ²Π΅ 80 ΠΈ 443 ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΡΡΠ²ΡΡΠ° Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° webhook.
ΠΠ° ΡΡΠ°ΠΊΠ½Π΅ΠΌ ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΊΡΠΊΠ° ΠΈ ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
ΠΠΎΠ±Π°Π²Π΅Π½Π° ΠΊΡΠΊΠ°.
Π‘ΡΡΠ²ΡΡΡΡ Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° 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. ΠΠ°ΠΊΡΠΎ ΡΠ»Π΅Π΄Π²Π° ΠΎΡ
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; ΡΡ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΡΠ³Π»Π°ΡΠ½ΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΡΠ΅, ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈ Π²
Π€ΡΠ½ΠΊΡΠΈΡΡΠ° GotRecords Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π²Ρ ΠΎΠ΄ΡΡΠ° Π·Π°ΡΠ²ΠΊΠ° ΠΈ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΠ±Π΅ΠΊΡ Record ΠΈΠ·Π²ΠΈΠΊΠ²Π° Π²ΡΠ½ΡΠ΅Π½ ΡΠΊΡΠΈΠΏΡ (ΡΠΈΠ΅ΡΠΎ ΠΈΠΌΠ΅ Π΅ ΠΏΡΠ΅Π΄Π°Π΄Π΅Π½ΠΎ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° -script) Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅:
- ΠΈΠΌΠ΅ Π½Π° ΠΊΠΎΡΠ°ΡΠ°
- ΠΎΠ±Π΅ΠΊΡΠ΅Π½ ΠΊΠ»ΡΡ
- Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅:
- ΠΊΠΎΠΏΠΈΠ΅ - Π°ΠΊΠΎ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° Π·Π°ΡΠ²ΠΊΠ° EventName = ObjectCreated | ΠΠΎΡΡΠ°Π²Π΅ΡΠ΅ ΠΎΠ±Π΅ΠΊΡ | PutObjectCopy
- ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ - Π°ΠΊΠΎ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° Π·Π°ΡΠ²ΠΊΠ° EventName = ObjectRemoved | ΠΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ
Π’Π°ΠΊΠ°, Π°ΠΊΠΎ ΠΊΡΠΊΠ° ΠΏΡΠΈΡΡΠΈΠ³Π½Π΅ Ρ Post Π·Π°ΡΠ²ΠΊΠ°, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ
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
ΠΠ΅ΠΊΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ. ΠΡΠ΅Π·
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
Π¦Π΅Π»ΠΈΡΡ ΠΊΠΎΠ΄, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ, Π΅
Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ Π½Π΅ Π΅ Π½ΠΈΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ S3 webhooks Π²ΡΠ² Π²Π°ΡΠΈΡΠ΅ Π΄Π΅ΠΉΠ½ΠΎΡΡΠΈ. ΠΠ°ΠΊΡΠΎ ΠΊΠ°Π·Π°Ρ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ, Π°ΠΊΠΎ ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ°ΠΊΡΠ² ΡΡΡΠ²ΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ, ΡΡΡΠ±Π²Π° ΠΏΠΎΠ½Π΅ Π΄Π° ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΡΡΠ²ΡΡΠ° Π·Π° Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π° ΡΠ°Π±ΠΎΡΠ°: ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΉΡΠ΅ Π²Ρ ΠΎΠ΄ΡΡΠΈ ΡΠ΅Π±ΠΊΡΠΊΠΈ Π² ΠΎΠΏΠ°ΡΠΊΠ° (RabbitMQ ΠΈΠ»ΠΈ NATS) ΠΈ ΠΎΡΡΠ°ΠΌ Π³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ Ρ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅Π± ΠΊΡΠΊΠΈΡΠΊΠΈΡΠ΅ ΠΏΡΠΈΡΡΠΈΠ³Π½Π°Ρ ΠΌΠ°ΡΠΎΠ²ΠΎ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ΅ΡΠ½Π΅ΡΠ΅ Π»ΠΈΠΏΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ½ΠΈ ΡΠ΅ΡΡΡΡΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°ΡΠΈ. ΠΠ°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΎΠΏΠ°ΡΠΊΠΈ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΡΠ΅ ΡΡΡΠ²ΡΡΠ° ΠΈ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄Π° ΡΠ΅ΡΠ°Π²Π°ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΏΠΎΠ²ΡΠ°ΡΡΡΠΈ ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΏΠΎΠ²ΡΠ΅Π΄Π°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΈ ΠΏΠΎ-ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠ°Π½ΠΎ.
Good Luck!
ΠΡΠ΅ ΡΠ΅ΡΠΈΠ²Π° ΠΏΠΎ ΡΠ΅ΠΌΠ°ΡΠ°:
Π Π°Π±ΠΎΡΠ° ΡΡΡ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ Mail.ru Cloud Solutions S3 ΠΊΠ°ΡΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ°. ΠΠ°ΠΊ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ, Π·Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ±Π΅Π΄ΠΈ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡΡΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com