ΠΡΠΈΠ²Π΅Ρ, Π₯Π°Π±Ρ!
Π Π²Ρ Π»ΡΠ±ΠΈΡΠ΅ Π»Π΅ΡΠ°ΡΡ Π½Π° ΡΠ°ΠΌΠΎΠ»Π΅ΡΠ°Ρ ? Π― ΠΎΠ±ΠΎΠΆΠ°Ρ, Π½ΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ±ΠΈΠ» Π΅ΡΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ± Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅ΡΠ°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠ° β Aviasales.
Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΡ Amazon Kinesis, ΠΏΠΎΡΡΡΠΎΠΈΠΌ ΡΡΡΠΈΠΌΠΌΠΈΠ½Π³ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Ρ ΡΠ΅Π°Π»-ΡΠ°ΠΉΠΌ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠΎΠΉ, ΠΏΠΎΡΡΠ°Π²ΠΈΠΌ NoSQL Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ Amazon DynamoDB Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π΄Π°Π½Π½ΡΡ ΠΈ Π½Π°ΡΡΡΠΎΠΈΠΌ ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· SMS ΠΏΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ Π±ΠΈΠ»Π΅ΡΠ°ΠΌ.
ΠΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΏΠΎΠ΄ ΠΊΠ°ΡΠΎΠΌ! ΠΠΎΠ΅Ρ Π°Π»ΠΈ!
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΠ΅Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ β Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π² AWS, ΠΌΡ Π²ΡΠ½ΠΎΡΠΈΠΌ Π·Π° ΡΠΊΠΎΠ±ΠΊΠΈ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ API Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΡΡΡΠΎΠ³ΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΈΠ· ΠΊΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΠΌΠΈΡΡΠ΅ΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠΈΡΠΊΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΡΠ°ΠΉΡΠΎΠ² Aviasales.ru ΠΈ Jetradar.com Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 48 ΡΠ°ΡΠΎΠ².
ΠΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π· API Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ± Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅ΡΠ°Ρ Kinesis-agent, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ Π½Π° ΠΌΠ°ΡΠΈΠ½Π΅-ΠΏΡΠΎΠ΄ΡΡΠ΅ΡΠ΅, Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΎΠΌ ΠΏΠ°ΡΡΠΈΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² Π½ΡΠΆΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠ΅ΡΠ΅Π· Kinesis Data Analytics. ΠΠ΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π°ΠΏΡΡΠΌΡΡ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅. Π Π°Π·Π²Π΅ΡΠ½ΡΡΠΎΠ΅ Π² DynamoDB Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Β«ΡΡΡΡΡ Β» Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡΠ±ΠΎΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π±ΠΈΠ»Π΅ΡΠΎΠ² ΡΠ΅ΡΠ΅Π· BI ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, AWS Quick Sight.
ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° Π΄Π΅ΠΏΠ»ΠΎΡ Π²ΡΠ΅ΠΉ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ:
- Π ΡΡΠ½ΠΎΠΉ β ΡΠ΅ΡΠ΅Π· AWS Management Console;
- ΠΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΈΠ· ΠΊΠΎΠ΄Π° Terraform β Π΄Π»Ρ Π»Π΅Π½ΠΈΠ²ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΎΡΠΎΠ²;
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:
Aviasales API β Π΄Π°Π½Π½ΡΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ ΡΡΠΈΠΌ API, Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ Π²ΡΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΡ;EC2 Producer Instance β ΠΎΠ±ΡΡΠ½Π°Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° Π² ΠΎΠ±Π»Π°ΠΊΠ΅, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ :Kinesis Agent β ΡΡΠΎ Java-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π½Π° ΠΌΠ°ΡΠΈΠ½Ρ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ±ΠΎΡΠ° ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π² Kinesis (Kinesis Data Streams ΠΈΠ»ΠΈ Kinesis Firehose). ΠΠ³Π΅Π½Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ Π½Π°Π±ΠΎΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² Kinesis;Π‘ΠΊΡΠΈΠΏΡ API Caller β Python-ΡΠΊΡΠΈΠΏΡ, Π΄Π΅Π»Π°ΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡΡ ΠΊ API ΠΈ ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΠΈΠΉ ΠΎΡΠ²Π΅Ρ Π² ΠΏΠ°ΠΏΠΊΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΡ Kinesis Agent;
Kinesis Data Streams β ΡΠ΅ΡΠ²ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Ρ ΡΠΈΡΠΎΠΊΠΈΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ;Kinesis Analytics β Π±Π΅ΡΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ, ΡΠΏΡΠΎΡΠ°ΡΡΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Amazon Kinesis Data Analytics Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ ΡΠ΅ΡΡΡΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π»ΡΠ±ΡΡ ΠΎΠ±ΡΠ΅ΠΌΠΎΠ² Π²Ρ ΠΎΠ΄ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ ;AWS Lambda β ΡΠ΅ΡΠ²ΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΊΠΎΠ΄ Π±Π΅Π· ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ². ΠΡΠ΅ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠΎΡΠ½ΠΎΡΡΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΡΡΡΡ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΡΠ·ΠΎΠ²;Amazon DynamoDB β Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ ΠΏΠ°Ρ Β«ΠΊΠ»ΡΡβΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅Β» ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΌΠ΅Π½Π΅Π΅ 10 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Π² Π»ΡΠ±ΠΎΠΌ ΠΌΠ°ΡΡΡΠ°Π±Π΅. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ DynamoDB Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΡΠ΅ΡΠ²Π΅ΡΡ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π½Π° Π½ΠΈΡ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΠΌΠΈ. DynamoDB Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅Ρ ΡΠ°Π±Π»ΠΈΡΡ, ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΡ ΠΎΠ±ΡΠ΅ΠΌ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡ Π²ΡΡΠΎΠΊΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ. ΠΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π΅ ΡΡΠ΅Π±ΡΡΡΡΡ;Amazon SNS β ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»Ρ β ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΒ» (Pub/Sub), Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΡ, ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ Π±Π΅ΡΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. SNS ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ°ΡΡΡΠ»ΠΊΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ, SMS-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΡ ΠΏΠΈΡΠ΅ΠΌ.
ΠΠ°ΡΠ°Π»ΡΠ½Π°Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°
ΠΠ»Ρ ΡΠΌΡΠ»ΡΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π΄Π°Π½Π½ΡΡ
Ρ ΡΠ΅ΡΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅ΡΠ°Ρ
, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ API Aviasales. Π
ΠΡΠ°ΠΊ, ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌΡΡ, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ²ΠΎΠΉ ΡΠΎΠΊΠ΅Π½.
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ° Π½ΠΈΠΆΠ΅:
http://api.travelpayouts.com/v2/prices/month-matrix?currency=rub&origin=LED&destination=HKT&show_to_affiliates=true&token=TOKEN_API
ΠΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΎΡ API Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠΊΠ΅Π½Π° Π² Π·Π°ΠΏΡΠΎΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π½ΠΎ ΠΌΠ½Π΅ Π±ΠΎΠ»ΡΡΠ΅ Π½ΡΠ°Π²ΠΈΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΠΎΠΊΠ΅Π½ Π΄ΠΎΡΡΡΠΏΠ° ΡΠ΅ΡΠ΅Π· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΡΠΊΡΠΈΠΏΡΠ΅ api_caller.py Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
ΠΡΠΈΠΌΠ΅Ρ ΠΎΡΠ²Π΅ΡΠ°:
{{
"success":true,
"data":[{
"show_to_affiliates":true,
"trip_class":0,
"origin":"LED",
"destination":"HKT",
"depart_date":"2015-10-01",
"return_date":"",
"number_of_changes":1,
"value":29127,
"found_at":"2015-09-24T00:06:12+04:00",
"distance":8015,
"actual":true
}]
}
Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΡΠ²Π΅ΡΠ° API Π²ΡΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π±ΠΈΠ»Π΅Ρ ΠΈΠ· Π‘Π°Π½ΠΊΡ-ΠΠ΅ΡΠ΅ΡΠ±ΡΡΠ³Π° Π² ΠΡ
ΡΠΊβ¦ ΠΡ
, Π΄Π° ΡΡΠΎ ΠΌΠ΅ΡΡΠ°ΡΡβ¦
Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ ΠΈΠ· ΠΠ°Π·Π°Π½ΠΈ, Π° ΠΡ
ΡΠΊΠ΅Ρ ΡΠ΅ΠΉΡΠ°Ρ Β«Π½Π°ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ½ΠΈΡΡΡΒ», ΠΏΠΎΠΈΡΠ΅ΠΌ Π±ΠΈΠ»Π΅ΡΡ ΠΈΠ· Π‘Π°Π½ΠΊΡ-ΠΠ΅ΡΠ΅ΡΠ±ΡΡΠ³Π° Π² ΠΠ°Π·Π°Π½Ρ.
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ Π°ΠΊΠΊΠ°ΡΠ½Ρ Π² AWS. Π‘ΡΠ°Π·Ρ Ρ ΠΎΡΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡ ΠΎΡΠΎΠ±ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Kinesis ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΡΠ΅ΡΠ΅Π· SMS Π½Π΅ Π²Ρ ΠΎΠ΄ΡΡ Π² Π³ΠΎΠ΄ΠΎΠ²ΠΎΠΉ
Free Tier (Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅) . ΠΠΎ Π΄Π°ΠΆΠ΅ Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΡΠΎ, Π·Π°Π»ΠΎΠΆΠΈΠ² Π² ΡΠΌΠ΅ ΠΏΠ°ΡΡ Π΄ΠΎΠ»Π»Π°ΡΠΎΠ², Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ Ρ Π½Π΅ΠΉ. Π, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, Π½Π΅ ΡΡΠΎΠΈΡ Π·Π°Π±ΡΠ²Π°ΡΡ ΡΠ΄Π°Π»ΡΡΡ Π²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΡΠ°Π»ΠΈ Π½Π΅ Π½ΡΠΆΠ½Ρ.
Π ΡΡΠ°ΡΡΡΡ, DynamoDb ΠΈ Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ΄ΡΡ Π΄Π»Ρ Π½Π°Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠΌΠΈ, Π΅ΡΠ»ΠΈ ΡΠ»ΠΎΠΆΠΈΡΡΡΡ Π² ΠΌΠ΅ΡΡΡΠ½ΡΠ΅ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠ΅ Π»ΠΈΠΌΠΈΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ DynamoDB: 25 ΠΠ± Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, 25 WCU/RCU ΠΈ 100 ΠΌΠ»Π½. Π·Π°ΠΏΡΠΎΡΠΎΠ². Π ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π»ΡΠΌΠ±Π΄Π° ΡΡΠ½ΠΊΡΠΈΠΉ Π² ΠΌΠ΅ΡΡΡ.
Π ΡΡΠ½ΠΎΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Kinesis Data Streams
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ Π² ΡΠ΅ΡΠ²ΠΈΡ Kinesis Data Streams ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π° Π½ΠΎΠ²ΡΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠ°ΡΠ΄Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠ°ΡΠ΄?
Π¨Π°ΡΠ΄ β ΡΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ
ΠΏΠΎΡΠΎΠΊΠ° Amazon Kinesis. ΠΠ΄ΠΈΠ½ ΡΠ΅Π³ΠΌΠ΅Π½Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²Ρ
ΠΎΠ΄Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
ΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡΡ 1 ΠΠ/Ρ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²ΡΡ
ΠΎΠ΄Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
ΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡΡ 2 ΠΠ/Ρ. ΠΠ΄ΠΈΠ½ ΡΠ΅Π³ΠΌΠ΅Π½Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π΄ΠΎ 1000 Π·Π°ΠΏΠΈΡΠ΅ΠΉ PUT Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π΄Π°Π½Π½ΡΡ
ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΡ Π½ΡΠΆΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ
Ρ Π΄Π²ΡΠΌΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ. ΠΡΠΎΡ ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ
ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²Ρ
ΠΎΠ΄Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
ΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡΡ 2 ΠΠ/Ρ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²ΡΡ
ΠΎΠ΄Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
ΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡΡ 4 ΠΠ/Ρ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Π΄ΠΎ 2000 Π·Π°ΠΏΠΈΡΠ΅ΠΉ PUT Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
Π§Π΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ°ΡΠ΄ΠΎΠ² Π² Π²Π°ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ β ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π΅Π³ΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠ½Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ. Π ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, ΡΠ°ΠΊ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΡΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ β ΠΏΡΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ°ΡΠ΄ΠΎΠ². ΠΠΎ ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Ρ Π²Π°Ρ ΡΠ°ΡΠ΄ΠΎΠ², ΡΠ΅ΠΌ Π²ΡΡΠ΅ ΠΈ ΡΠ΅Π½Π°. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°ΡΠ΄ ΡΡΠΎΠΈΡ 1,5 ΡΠ΅Π½ΡΠ° Π² ΡΠ°Ρ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ 1.4 ΡΠ΅Π½ΡΠ° Π·Π° ΠΊΠ°ΠΆΠ΄ΡΠ΅ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π² ΠΏΠΎΡΠΎΠΊ (PUT payload units).
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ airline_tickets, Π΅ΠΌΡ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ 1 ΡΠ°ΡΠ΄Π°:
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ special_stream:
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΡΠΎΠ΄ΡΡΠ΅ΡΠ°
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΎΠ΄ΡΡΠ΅ΡΠ° Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° Π·Π°Π΄Π°ΡΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΡΠ½ΡΠΉ EC2 ΠΈΠ½ΡΡΠ°Π½Ρ. ΠΡΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΌΠΎΡΠ½Π°Ρ Π΄ΠΎΡΠΎΠ³Π°Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π°, Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΡΠΏΠΎΡΠΎΠ²ΡΠΉ t2.micro.
ΠΠ°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ image β Amazon Linux AMI 2018.03.0, Ρ Π½ΠΈΠΌ ΠΌΠ΅Π½ΡΡΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° Kinesis Agent.
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² ΡΠ΅ΡΠ²ΠΈΡ EC2, ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ, Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ Π½ΡΠΆΠ½ΡΠΉ AMI Ρ ΡΠΈΠΏΠΎΠΌ t2.micro, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΎΠ΄ΠΈΡ Π²ΠΎ Free Tier:
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π²Π½ΠΎΠ²Ρ ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° ΡΠΌΠΎΠ³Π»Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ Kinesis, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π°ΡΡ Π΅ΠΉ Π½Π° ΡΡΠΎ ΠΏΡΠ°Π²Π°. ΠΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ β Π½Π°Π·Π½Π°ΡΠΈΡΡ IAM Role. ΠΠΎΡΡΠΎΠΌΡ, Π½Π° ΡΠΊΡΠ°Π½Π΅ Step 3: Configure Instance Details ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠ±ΡΠ°ΡΡ Create new IAM Role:
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ IAM ΡΠΎΠ»ΠΈ Π΄Π»Ρ EC2
Π ΠΎΡΠΊΡΡΠ²ΡΠ΅ΠΌΡΡ ΠΎΠΊΠ½Π΅, Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ, ΡΡΠΎ Π½ΠΎΠ²ΡΡ ΡΠΎΠ»Ρ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π»Ρ EC2 ΠΈ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ Π² ΡΠ°Π·Π΄Π΅Π» Permissions:
ΠΠ° ΡΡΠ΅Π±Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π²Π΄Π°Π²Π°ΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ ΡΠΎΠ½ΠΊΠΎΡΡΠΈ Π³ΡΠ°Π½ΡΠ»ΡΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΡΠ°Π² Π½Π° ΡΠ΅ΡΡΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠ±Π΅ΡΠ΅ΠΌ ΠΏΡΠ΅Π΄Π½Π°ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΠΌΠ°Π·ΠΎΠ½ΠΎΠΌ ΠΏΠΎΠ»ΠΈΡΠΈ: AmazonKinesisFullAccess ΠΈ CloudWatchFullAccess.
ΠΠ°Π΄ΠΈΠΌ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΎΠ΅ ΠΈΠΌΡ Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠΎΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: EC2-KinesisStreams-FullAccess. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅:
ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ, Π½Π΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ ΠΏΡΠΈΡΠ΅ΠΏΠΈΡΡ Π΅Π΅ ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠΌΡ ΠΈΠ½ΡΡΠ°Π½ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ:
ΠΠΎΠ»ΡΡΠ΅ Π½Π° ΡΡΠΎΠΌ ΡΠΊΡΠ°Π½Π΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΈ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠΊΠ½Π°ΠΌ.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΆΠ΅ΡΡΠΊΠΎΠ³ΠΎ Π΄ΠΈΡΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΡΠ³ΠΈ ΡΠΎΠΆΠ΅ (Ρ ΠΎΡΡ, Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π³ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Ρ ΠΎΡΡ Π±Ρ Π΄Π°Π²Π°ΡΡ ΠΈΠΌΡ ΠΈΠ½ΡΡΠ°Π½ΡΡ ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ½Π²Π°ΠΉΡΠΎΠ½ΠΌΠ΅Π½Ρ).
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Π½Π° Π·Π°ΠΊΠ»Π°Π΄ΠΊΠ΅ Step 6: Configure Security Group, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΠΌΠ΅ΡΡΠΈΠΉΡΡ Ρ Π²Π°Ρ SΠ΅curity group, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ Π΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡ ΡΠ΅ΡΠ΅Π· ssh (ΠΏΠΎΡΡ 22) Π½Π° ΠΈΠ½ΡΡΠ°Π½Ρ. ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΡΠ°ΠΌ Source —> My IP ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΈΠ½ΡΡΠ°Π½Ρ.
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅Ρ Π² ΡΡΠ°ΡΡΡ running, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π·Π°ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΈΡΡΡΡ Π½Π° Π½Π΅Π³ΠΎ ΡΠ΅ΡΠ΅Π· ssh.
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ Ρ Kinesis Agent, ΠΏΠΎΡΠ»Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π½Π΅ΠΊΡΠ° ΠΊ ΠΌΠ°ΡΠΈΠ½Π΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²Π²Π΅ΡΡΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅:
sudo yum -y update
sudo yum install -y python36 python36-pip
sudo /usr/bin/pip-3.6 install --upgrade pip
sudo yum install -y aws-kinesis-agent
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡ Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠΎΠ² API:
sudo mkdir /var/log/airline_tickets
ΠΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ Π°Π³Π΅Π½ΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³:
sudo vim /etc/aws-kinesis/agent.json
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° agent.json Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄:
{
"cloudwatch.emitMetrics": true,
"kinesis.endpoint": "",
"firehose.endpoint": "",
"flows": [
{
"filePattern": "/var/log/airline_tickets/*log",
"kinesisStream": "airline_tickets",
"partitionKeyOption": "RANDOM",
"dataProcessingOptions": [
{
"optionName": "CSVTOJSON",
"customFieldNames": ["cost","trip_class","show_to_affiliates",
"return_date","origin","number_of_changes","gate","found_at",
"duration","distance","destination","depart_date","actual","record_id"]
}
]
}
]
}
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΡΠ°ΠΉΠ»Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π°Π³Π΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΡΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ /var/log/airline_tickets/ ΡΠ°ΠΉΠ»Ρ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ .log, ΠΏΠ°ΡΡΠΈΡΡ ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΠΏΠΎΡΠΎΠΊ airline_tickets.
ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ΅ΡΠ²ΠΈΡ ΠΈ ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΠΎΠ½ Π·Π°ΠΏΡΡΡΠΈΠ»ΡΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ:
sudo service aws-kinesis-agent restart
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΊΠ°ΡΠ°Π΅ΠΌ Python-ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Ρ API:
REPO_PATH=https://raw.githubusercontent.com/igorgorbenko/aviasales_kinesis/master/producer
wget $REPO_PATH/api_caller.py -P /home/ec2-user/
wget $REPO_PATH/requirements.txt -P /home/ec2-user/
sudo chmod a+x /home/ec2-user/api_caller.py
sudo /usr/local/bin/pip3 install -r /home/ec2-user/requirements.txt
Π‘ΠΊΡΠΈΠΏΡ api_caller.py Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Ρ Aviasales ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ Kinesis agent. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°, Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ TicketsApi, ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ Π΄Π΅ΡΠ³Π°ΡΡ API. Π ΡΡΠΎΡ ΠΊΠ»Π°ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ ΡΠΎΠΊΠ΅Π½ΠΎΠΌ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π·Π°ΠΏΡΠΎΡΠ°:
class TicketsApi:
"""Api caller class."""
def __init__(self, headers):
"""Init method."""
self.base_url = BASE_URL
self.headers = headers
async def get_data(self, data):
"""Get the data from API query."""
response_json = {}
async with ClientSession(headers=self.headers) as session:
try:
response = await session.get(self.base_url, data=data)
response.raise_for_status()
LOGGER.info('Response status %s: %s',
self.base_url, response.status)
response_json = await response.json()
except HTTPError as http_err:
LOGGER.error('Oops! HTTP error occurred: %s', str(http_err))
except Exception as err:
LOGGER.error('Oops! An error ocurred: %s', str(err))
return response_json
def prepare_request(api_token):
"""Return the headers and query fot the API request."""
headers = {'X-Access-Token': api_token,
'Accept-Encoding': 'gzip'}
data = FormData()
data.add_field('currency', CURRENCY)
data.add_field('origin', ORIGIN)
data.add_field('destination', DESTINATION)
data.add_field('show_to_affiliates', SHOW_TO_AFFILIATES)
data.add_field('trip_duration', TRIP_DURATION)
return headers, data
async def main():
"""Get run the code."""
if len(sys.argv) != 2:
print('Usage: api_caller.py <your_api_token>')
sys.exit(1)
return
api_token = sys.argv[1]
headers, data = prepare_request(api_token)
api = TicketsApi(headers)
response = await api.get_data(data)
if response.get('success', None):
LOGGER.info('API has returned %s items', len(response['data']))
try:
count_rows = log_maker(response)
LOGGER.info('%s rows have been saved into %s',
count_rows,
TARGET_FILE)
except Exception as e:
LOGGER.error('Oops! Request result was not saved to file. %s',
str(e))
else:
LOGGER.error('Oops! API request was unsuccessful %s!', response)
ΠΠ»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΈ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ Π°Π³Π΅Π½ΡΠ° ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ Π·Π°ΠΏΡΡΠΊ ΡΠΊΡΠΈΠΏΡΠ° api_caller.py:
sudo ./api_caller.py TOKEN
Π ΡΠΌΠΎΡΡΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ Π² Π»ΠΎΠ³Π°Ρ
ΠΠ³Π΅Π½ΡΠ° ΠΈ Π½Π° Π·Π°ΠΊΠ»Π°Π΄ΠΊΠ΅ Monitoring Π² ΠΏΠΎΡΠΎΠΊΠ΅ Π΄Π°Π½Π½ΡΡ
airline_tickets:
tail -f /var/log/aws-kinesis-agent/aws-kinesis-agent.log
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ, Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Kinesis Agent ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΏΠΎΡΠΎΠΊ. Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΡΡΡΠΎΠΈΠΌ consumer.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Kinesis Data Analytics
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΠΎΠΌΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π²ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ β ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Kinesis Data Analytics Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ kinesis_analytics_airlines_app:
Kinesis Data Analytics ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π°Π½Π°Π»ΠΈΡΠΈΠΊΡ Π΄Π°Π½Π½ΡΡ
Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΠ· Kinesis Streams Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ·ΡΠΊΠ° SQL. ΠΡΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ (Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Kinesis Streams), ΠΊΠΎΡΠΎΡΡΠΉ:
- ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ (Output Stream) Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ Π΄Π°Π½Π½ΡΠΌ;
- ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊ Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Error Stream);
- ΡΠΌΠ΅Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΡ Π΅ΠΌΡ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ (Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ).
ΠΡΠΎ Π½Π΅Π΄Π΅ΡΠ΅Π²ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ β 0.11 USD Π·Π° ΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ.
ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΡ Π΄Π°Π½Π½ΡΡ :
ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΠΎΡΠΎΠΊ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌcΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ (airline_tickets):
ΠΠ°Π»Π΅Π΅, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠ°ΡΡΠ°ΡΠΈΡΡ Π½ΠΎΠ²ΡΡ IAM Π ΠΎΠ»Ρ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ ΡΠΈΡΠ°ΡΡ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠ° ΠΈ ΠΏΠΈΡΠ°ΡΡ Π² ΠΏΠΎΡΠΎΠΊ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΡΡ Π² Π±Π»ΠΎΠΊΠ΅ Access permissions:
Π’Π΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΡΠΎΡΠΈΠΌ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΡΡ
Π΅ΠΌΡ Π΄Π°Π½Π½ΡΡ
Π² ΠΏΠΎΡΠΎΠΊΠ΅, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Β«Discover schemaΒ». Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡΡ (ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π½ΠΎΠ²Π°Ρ) ΡΠΎΠ»Ρ IAM ΠΈ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΡΡ
Π΅ΠΌΡ ΠΈΠ· Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ ΠΏΡΠΈΠ»Π΅ΡΠ΅Π»ΠΈ Π² ΠΏΠΎΡΠΎΠΊ:
Π’Π΅ΠΏΠ΅ΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡ SQL. ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° ΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ, Π²ΡΠΉΠ΄Π΅Ρ ΠΎΠΊΠ½ΠΎ Ρ Π²ΠΎΠΏΡΠΎΡΠΎΠΌ ΠΎ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ β Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΡΠΎ Ρ
ΠΎΡΠΈΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ:
Π ΠΎΠΊΠ½ΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° SQL Π²ΡΡΠ°Π²ΠΈΠΌ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ Π·Π°ΠΏΡΠΎΡ ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Save and Run SQL:
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" ("cost" DOUBLE, "gate" VARCHAR(16));
CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM"
SELECT STREAM "cost", "gate"
FROM "SOURCE_SQL_STREAM_001"
WHERE "cost" < 5000
and "gate" = 'Aeroflot';
Π ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΡ Π±Π°Π·Π°Ρ Π΄Π°Π½Π½ΡΡ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ INSERT Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ SELECT Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ° Π΄Π°Π½Π½ΡΡ . Π Amazon Kinesis Data Analytics Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ (STREAM) ΠΈ Β«Π½Π°ΡΠΎΡΠ°ΠΌΠΈΒ» (PUMP) β Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΠΌΠΈ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π² Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ.
Π ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ SQL Π·Π°ΠΏΡΠΎΡΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΠΈΡΠΊ Π±ΠΈΠ»Π΅ΡΠΎΠ² ΠΡΡΠΎΡΠ»ΠΎΡΠ° ΠΏΠΎ ΡΡΠΎΠΈΠΌΠΎΡΡΠΈ Π½ΠΈΠΆΠ΅ ΠΏΡΡΠΈ ΡΡΡΡΡ ΡΡΠ±Π»Π΅ΠΉ. ΠΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ, ΠΏΠΎΠΏΠ°Π΄Π°ΡΡΠΈΠ΅ ΠΏΠΎΠ΄ ΡΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ, Π±ΡΠ΄ΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π² ΠΏΠΎΡΠΎΠΊ DESTINATION_SQL_STREAM.
Π Π±Π»ΠΎΠΊΠ΅ Destination Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΠΎΡΠΎΠΊ special_stream, Π° Π² ΡΠ°ΡΠΊΡΡΠ²Π°ΡΡΠ΅ΠΌΡΡ ΡΠΏΠΈΡΠΊΠ΅ In-application stream name DESTINATION_SQL_STREAM:
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²ΡΠ΅Ρ
ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡΡΡ Π½Π΅ΡΡΠΎ ΠΏΠΎΡ
ΠΎΠΆΠ΅Π΅ Π½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ Π½ΠΈΠΆΠ΅:
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΡΠΎΠΏΠΈΠΊ SNS
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² ΡΠ΅ΡΠ²ΠΈΡ Simple Notification Service ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠΎΠΏΠΈΠΊ c ΠΈΠΌΠ΅Π½Π΅ΠΌ Airlines:
ΠΡΠΎΡΠΌΠ»ΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ Π½Π° ΡΡΠΎΡ ΡΠΎΠΏΠΈΠΊ, Π² Π½Π΅ΠΉ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Π°, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡ Π‘ΠΠ‘-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ:
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ Π² DynamoDB
ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° airline_tickets, ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π±Π»ΠΈΡΡ Π² DynamoDB Ρ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ record_id:
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΠΈ collector
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Collector, Π·Π°Π΄Π°ΡΠ΅ΠΉ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ° airline_tickets ΠΈ, Π² ΡΠ»ΡΡΠ°Π΅ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ°ΠΌ Π½ΠΎΠ²ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, Π²ΡΡΠ°Π²ΠΊΠ° ΡΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΠ°Π±Π»ΠΈΡΡ DynamoDB. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡΠ°Π² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΡΠ° Π»ΡΠΌΠ±Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° Π΄Π°Π½Π½ΡΡ Kinesis ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² DynamoDB.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ IAM ΡΠΎΠ»ΠΈ Π΄Π»Ρ Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΠΈ collector
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡΡ IAM ΡΠΎΠ»Ρ Π΄Π»Ρ Π»ΡΠΌΠ±Π΄Ρ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ Lambda-TicketsProcessingRole:
ΠΠ»Ρ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ ΠΏΡΠ΅Π΄Π½Π°ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈ AmazonKinesisReadOnlyAccess ΠΈ AmazonDynamoDBFullAccess, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅:
ΠΠ°Π½Π½Π°Ρ Π»ΡΠΌΠ±Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΏΠΎ ΡΡΠΈΠ³Π³Π΅ΡΡ ΠΎΡ Kinesis ΠΏΡΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΈ Π½ΠΎΠ²ΡΡ
Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΠΏΠΎΡΠΎΠΊ airline_stream, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΡΡΠΈΠ³Π³Π΅Ρ:
ΠΡΡΠ°Π»ΠΎΡΡ Π²ΡΡΠ°Π²ΠΈΡΡ ΠΊΠΎΠ΄ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π»ΡΠΌΠ±Π΄Ρ.
"""Parsing the stream and inserting into the DynamoDB table."""
import base64
import json
import boto3
from decimal import Decimal
DYNAMO_DB = boto3.resource('dynamodb')
TABLE_NAME = 'airline_tickets'
class TicketsParser:
"""Parsing info from the Stream."""
def __init__(self, table_name, records):
"""Init method."""
self.table = DYNAMO_DB.Table(table_name)
self.json_data = TicketsParser.get_json_data(records)
@staticmethod
def get_json_data(records):
"""Return deserialized data from the stream."""
decoded_record_data = ([base64.b64decode(record['kinesis']['data'])
for record in records])
json_data = ([json.loads(decoded_record)
for decoded_record in decoded_record_data])
return json_data
@staticmethod
def get_item_from_json(json_item):
"""Pre-process the json data."""
new_item = {
'record_id': json_item.get('record_id'),
'cost': Decimal(json_item.get('cost')),
'trip_class': json_item.get('trip_class'),
'show_to_affiliates': json_item.get('show_to_affiliates'),
'origin': json_item.get('origin'),
'number_of_changes': int(json_item.get('number_of_changes')),
'gate': json_item.get('gate'),
'found_at': json_item.get('found_at'),
'duration': int(json_item.get('duration')),
'distance': int(json_item.get('distance')),
'destination': json_item.get('destination'),
'depart_date': json_item.get('depart_date'),
'actual': json_item.get('actual')
}
return new_item
def run(self):
"""Batch insert into the table."""
with self.table.batch_writer() as batch_writer:
for item in self.json_data:
dynamodb_item = TicketsParser.get_item_from_json(item)
batch_writer.put_item(dynamodb_item)
print('Has been added ', len(self.json_data), 'items')
def lambda_handler(event, context):
"""Parse the stream and insert into the DynamoDB table."""
print('Got event:', event)
parser = TicketsParser(TABLE_NAME, event['Records'])
parser.run()
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΠΈ notifier
ΠΡΠΎΡΠ°Ρ Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΡΡ Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠΎΠΊ (special_stream) ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π² SNS, ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠ° Π»ΡΠΌΠ±Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Kinesis ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² Π·Π°Π΄Π°Π½Π½ΡΠΉ SNS-ΡΠΎΠΏΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π°Π»Π΅Π΅ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ SNS Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ Π²ΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°ΠΌ ΡΡΠΎΠ³ΠΎ ΡΠΎΠΏΠΈΠΊΠ° (email, SMS ΠΈ Ρ.Π΄).
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ IAM ΡΠΎΠ»ΠΈ
Π‘Π½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΅ΠΌ IAM ΡΠΎΠ»Ρ Lambda-KinesisAlarm Π΄Π»Ρ ΡΡΠΎΠΉ Π»ΡΠΌΠ±Π΄Ρ, Π° ΠΏΠΎΡΠΎΠΌ Π½Π°Π·Π½Π°ΡΠ°Π΅ΠΌ ΡΡΡ ΡΠΎΠ»Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ Π»ΡΠΌΠ±Π΄Ρ alarm_notifier:
ΠΡΠ° Π»ΡΠΌΠ±Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎ ΡΡΠΈΠ³Π³Π΅ΡΡ Π½Π° ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ
Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΠΏΠΎΡΠΎΠΊ special_stream, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΡΠΈΠ³Π³Π΅Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΠΌΡ ΡΡΠΎ Π΄Π΅Π»Π°Π»ΠΈ Π΄Π»Ρ Π»ΡΠΌΠ±Π΄Ρ Collector.
ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΡΠΎΠΉ Π»ΡΠΌΠ±Π΄Ρ, Π²Π²Π΅Π΄Π΅ΠΌ Π½ΠΎΠ²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ β TOPIC_ARN, ΠΊΡΠ΄Π° ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ANR (Amazon Recourse Names) ΡΠΎΠΏΠΈΠΊΠ° Airlines:
Π Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΠ΄ Π»ΡΠΌΠ±Π΄Ρ, ΠΎΠ½ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡΠΉ:
import boto3
import base64
import os
SNS_CLIENT = boto3.client('sns')
TOPIC_ARN = os.environ['TOPIC_ARN']
def lambda_handler(event, context):
try:
SNS_CLIENT.publish(TopicArn=TOPIC_ARN,
Message='Hi! I have found an interesting stuff!',
Subject='Airline tickets alarm')
print('Alarm message has been successfully delivered')
except Exception as err:
print('Delivery failure', str(err))
ΠΠ°ΠΆΠ΅ΡΡΡ, Π½Π° ΡΡΠΎΠΌ ΡΡΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠΈΡΡΠ΅ΠΌΡ Π·Π°Π²Π΅ΡΡΠ΅Π½Π°. ΠΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΌΡ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ Π²ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ.
ΠΠ΅ΠΏΠ»ΠΎΠΉ ΠΈΠ· ΠΊΠΎΠ΄Π° Terraform
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°
ΠΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ² ΡΠΊΠ°ΡΠ°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ
ΠΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ
ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π»Π΅ΠΆΠΈΡ
Π₯ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π΄Π΅ΠΏΠ»ΠΎΠ΅ΠΌ Π²ΡΠ΅ΠΉ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ, Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ plan, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ Terraform Π½Π°ΠΌ ΡΠ΅ΠΉΡΠ°Ρ Π½Π°ΡΠΎΠ·Π΄Π°Π΅Ρ Π² ΠΎΠ±Π»Π°ΠΊΠ΅:
terraform.exe plan
ΠΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π²Π²Π΅ΡΡΠΈ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π° Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π½Π° Π½Π΅Π³ΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ. ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π΅Π³ΠΎ Π²Π²ΠΎΠ΄ΠΈΡΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ.
ΠΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π² ΠΏΠ»Π°Π½ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ²:
terraform.exe apply
ΠΠΎΡΠ»Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΎΠΏΡΡΡ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π·Π°ΠΏΡΠΎΡ Π½Π° Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ΅Π»Π΅ΡΠΎΠ½Π°, Π½Π°Π±ΠΈΡΠ°Π΅ΠΌ Β«yesΒ», ΠΊΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π²ΠΎΠΏΡΠΎΡ ΠΎ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΠΎΠ΄Π½ΡΡΡ Π²ΡΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ, ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π²ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ EC2, ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ Π»ΡΠΌΠ±Π΄Π°-ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Ρ.Π΄.
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ Π±ΡΠ΄ΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π½Ρ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ΄ Terraform, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΉΡΠΈ Π² Π΄Π΅ΡΠ°Π»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Kinesis Analytics (ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Ρ Π½Π΅ Π½Π°ΡΠ΅Π» ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠ°Π·Ρ ΠΈΠ· ΠΊΠΎΠ΄Π°).
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π½ΠΎ Π·Π°Π΄Π°ΡΡ in-application stream name, Π²ΡΠ±ΡΠ°Π² ΠΈΠ· ΡΠ°ΡΠΊΡΡΠ²Π°ΡΡΠ΅Π³ΠΎΡΡ ΡΠΏΠΈΡΠΊΠ°:
Π’Π΅ΠΏΠ΅ΡΡ Π²ΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ ΠΊ ΡΠ°Π±ΠΎΡΠ΅.
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠ½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΊΠ°ΠΊ Π²Ρ Π΄Π΅ΠΏΠ»ΠΎΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ, Π²ΡΡΡΠ½ΡΡ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ΄ Terraform, ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ.
ΠΠ°Ρ ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ SSH Π½Π° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ EC2, Π³Π΄Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Kinesis Agent ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠΊΡΠΈΠΏΡ api_caller.py
sudo ./api_caller.py TOKEN
ΠΡΡΠ°Π»ΠΎΡΡ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ SMS Π½Π° Π²Π°Ρ Π½ΠΎΠΌΠ΅Ρ:
SMS β ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡ Π½Π° ΡΠ΅Π»Π΅ΡΠΎΠ½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΠ΅Π· 1 ΠΌΠΈΠ½ΡΡΡ:
ΠΡΡΠ°Π»ΠΎΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΠΎΡ
ΡΠ°Π½ΠΈΠ»ΠΈΡΡ Π»ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
DynamoDB Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ, Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. Π’Π°Π±Π»ΠΈΡΠ° airline_tickets ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅:
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π Ρ ΠΎΠ΄Π΅ ΠΏΡΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Π±ΡΠ»Π° ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΠ½Π»Π°ΠΉΠ½-ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π½Π° Π±Π°Π·Π΅ Amazon Kinesis. ΠΡΠ»ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Kinesis Agent Π² ΡΠ²ΡΠ·ΠΊΠ΅ Ρ Kinesis Data Streams ΠΈ ΡΠ΅Π°Π»-ΡΠ°ΠΉΠΌ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠΎΠΉ Kinesis Analytics ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ SQL ΠΊΠΎΠΌΠ°Π½Π΄, Π° ΡΠ°ΠΊΠΆΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Amazon Kinesis Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ AWS.
ΠΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΠ»ΠΈ Π΄Π²ΡΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ: Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄ΠΎΠ»Π³ΠΈΠΌ ΡΡΡΠ½ΡΠΌ ΠΈ Π±ΡΡΡΡΡΠΌ ΠΈΠ· ΠΊΠΎΠ΄Π° Terraform.
ΠΠ΅ΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΄ΠΎΡΡΡΠΏΠ΅Π½
Π‘ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΈΠ΅ΠΌ Π³ΠΎΡΠΎΠ² ΠΎΠ±ΡΡΠ΄ΠΈΡΡ ΡΡΠ°ΡΡΡ, ΠΆΠ΄Ρ ΠΠ°ΡΠΈΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π². ΠΠ°Π΄Π΅ΡΡΡ Π½Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½ΡΡ ΠΊΡΠΈΡΠΈΠΊΡ.
ΠΠ΅Π»Π°Ρ ΡΡΠΏΠ΅Ρ
ΠΎΠ²!
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com