Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€!

А Π²Ρ‹ Π»ΡŽΠ±ΠΈΡ‚Π΅ Π»Π΅Ρ‚Π°Ρ‚ΡŒ Π½Π° самолСтах? Π― обоТаю, Π½ΠΎ Π½Π° самоизоляции полюбил Π΅Ρ‰Π΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ± Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ извСстного рСсурса β€” Aviasales.

БСгодня ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ Amazon Kinesis, построим ΡΡ‚Ρ€ΠΈΠΌΠΌΠΈΠ½Π³ΠΎΠ²ΡƒΡŽ систСму с Ρ€Π΅Π°Π»-Ρ‚Π°ΠΉΠΌ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΎΠΉ, поставим NoSQL Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Amazon DynamoDB Π² качСствС основного Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ настроим ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· SMS ΠΏΠΎ интСрСсным Π±ΠΈΠ»Π΅Ρ‚Π°ΠΌ.

ВсС подробности ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎΠΌ! ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ!

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π°ΠΌ потрСбуСтся доступ ΠΊ API Aviasales. Доступ ΠΊ Π½Π΅ΠΌΡƒ прСдоставляСтся бСсплатно ΠΈ Π±Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ лишь Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ свой API Ρ‚ΠΎΠΊΠ΅Π½ для доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ.

Основная Ρ†Π΅Π»ΡŒ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ использования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² AWS, ΠΌΡ‹ выносим Π·Π° скобки, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ API Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ строго Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΈΠ· кэша, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ формируСтся Π½Π° основании поисков ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ сайтов Aviasales.ru ΠΈ Jetradar.com Π·Π° послСдниС 48 часов.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· API Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ± Π°Π²ΠΈΠ°Π±ΠΈΠ»Π΅Ρ‚Π°Ρ… Kinesis-agent, установлСнный Π½Π° машинС-ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€Π΅, Π±ΡƒΠ΄Π΅Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠΌ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‡Π΅Ρ€Π΅Π· Kinesis Data Analytics. НСобработанная вСрсия этого ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. Π Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠ΅ Π² DynamoDB Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ «сырых» Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π±ΠΈΠ»Π΅Ρ‚ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· BI инструмСнты, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, AWS Quick Sight.

ΠœΡ‹ рассмотрим Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° дСплоя всСй инфраструктуры:

  • Π ΡƒΡ‡Π½ΠΎΠΉ β€” Ρ‡Π΅Ρ€Π΅Π· AWS Management Console;
  • Π˜Π½Ρ„Ρ€Π°ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΈΠ· ΠΊΠΎΠ΄Π° Terraform β€” для Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²;

АрхитСктура Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ систСмы

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹:

  • 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 ΡˆΠ°Ρ€Π΄Π°:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ с ΠΈΠΌΠ΅Π½Π΅ΠΌ special_stream:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless

Настройка ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€Π°

Π’ качСствС ΠΏΡ€ΠΎΠ΄ΡŽΡΠ΅Ρ€Π° Π΄Π°Π½Π½Ρ‹Ρ… для Ρ€Π°Π·Π±ΠΎΡ€Π° Π·Π°Π΄Π°Ρ‡ΠΈ достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ EC2 инстанс. Π­Ρ‚ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ мощная дорогая Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина, Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ спотовый t2.micro.

Π’Π°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ image β€” Amazon Linux AMI 2018.03.0, с Π½ΠΈΠΌ мСньшС настроСк для быстрого запуска Kinesis Agent.

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² сСрвис EC2, создаСм Π½ΠΎΠ²ΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΉ AMI с Ρ‚ΠΈΠΏΠΎΠΌ t2.micro, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π²ΠΎ Free Tier:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вновь созданная Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина смогла Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с сСрвисом Kinesis, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π°Ρ‚ΡŒ Π΅ΠΉ Π½Π° это ΠΏΡ€Π°Π²Π°. Π›ΡƒΡ‡ΡˆΠΈΠΉ способ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ – Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ IAM Role. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π½Π° экранС Step 3: Configure Instance Details слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Create new IAM Role:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ IAM Ρ€ΠΎΠ»ΠΈ для EC2
Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π’ ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΌΡΡ ΠΎΠΊΠ½Π΅, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ создаСм для EC2 ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Ρ€Π°Π·Π΄Π΅Π» Permissions:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
На ΡƒΡ‡Π΅Π±Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π²ΠΎ всС тонкости гранулярной настройки ΠΏΡ€Π°Π² Π½Π° рСсурсы, поэтому Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ прСднастроСнныС Амазоном полиси: AmazonKinesisFullAccess ΠΈ CloudWatchFullAccess.

Π”Π°Π΄ΠΈΠΌ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ осмыслСнноС имя для этой Ρ€ΠΎΠ»ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: EC2-KinesisStreams-FullAccess. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
ПослС создания этой Π½ΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ, Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΈΡ†Π΅ΠΏΠΈΡ‚ΡŒ Π΅Π΅ ΠΊ создаваСмому инстансу Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π½Π° этом экранС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ мСняСм ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠΊΠ½Π°ΠΌ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ТСсткого диска ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, тэги Ρ‚ΠΎΠΆΠ΅ (хотя, Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ являСтся Ρ‚Π΅Π³ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, хотя Π±Ρ‹ Π΄Π°Π²Π°Ρ‚ΡŒ имя инстансу ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ энвайронмСнт).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π½Π° Π·Π°ΠΊΠ»Π°Π΄ΠΊΠ΅ Step 6: Configure Security Group, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ Ρƒ вас SΠ΅curity group, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ Ρ‡Π΅Ρ€Π΅Π· ssh (ΠΏΠΎΡ€Ρ‚ 22) Π½Π° инстанс. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΌ Source —> My IP ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ инстанс.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² статус 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

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
И смотрим Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π»ΠΎΠ³Π°Ρ… АгСнта ΠΈ Π½Π° Π·Π°ΠΊΠ»Π°Π΄ΠΊΠ΅ Monitoring Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… airline_tickets:

tail -f /var/log/aws-kinesis-agent/aws-kinesis-agent.log

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Как Π²ΠΈΠ΄Π½ΠΎ, всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ Kinesis Agent ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ отправляСт Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ настроим consumer.

Настройка Kinesis Data Analytics

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ всСй систСмы β€” создадим Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Kinesis Data Analytics с ΠΈΠΌΠ΅Π½Π΅ΠΌ kinesis_analytics_airlines_app:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Kinesis Data Analytics позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ· Kinesis Streams с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ языка SQL. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π°Π²Ρ‚ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ сСрвис (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Kinesis Streams), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ:

  1. позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ (Output Stream) Π½Π° основС запросов ΠΊ исходным Π΄Π°Π½Π½Ρ‹ΠΌ;
  2. прСдоставляСт ΠΏΠΎΡ‚ΠΎΠΊ с ошибками, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Error Stream);
  3. ΡƒΠΌΠ΅Π΅Ρ‚ автоматичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ схСму Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ нСобходимости).

Π­Ρ‚ΠΎ Π½Π΅Π΄Π΅ΡˆΠ΅Π²Ρ‹ΠΉ сСрвис β€” 0.11 USD Π·Π° час Ρ€Π°Π±ΠΎΡ‚Ρ‹, поэтому ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ слСдуСт Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊ источнику Π΄Π°Π½Π½Ρ‹Ρ…:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ собираСмcя ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ (airline_tickets):

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π”Π°Π»Π΅Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠ°Ρ‚Ρ‚Π°Ρ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ IAM Роль для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΏΠΎΡ‚ΠΎΠΊ. Для этого достаточно Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Π±Π»ΠΎΠΊΠ΅ Access permissions:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π’Π΅ΠΏΠ΅Ρ€ΡŒ запросим ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ схСмы Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, для этого Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«Discover schemaΒ». Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ обновится (создастся новая) Ρ€ΠΎΠ»ΡŒ IAM ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ схСмы ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π»ΠΈ Π² ΠΏΠΎΡ‚ΠΎΠΊ:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ SQL. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° эту ΠΊΠ½ΠΎΠΏΠΊΡƒ, Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ с вопросом ΠΎ запускС прилоТСния β€” Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π’ ΠΎΠΊΠ½ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° 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.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π’ Π±Π»ΠΎΠΊΠ΅ Destination Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ special_stream, Π° Π² Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡΡ спискС In-application stream name DESTINATION_SQL_STREAM:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ всСх манипуляций Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π½ΠΈΠΆΠ΅:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ подписка Π½Π° Ρ‚ΠΎΠΏΠΈΠΊ SNS

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² сСрвис Simple Notification Service ΠΈ создаСм Ρ‚Π°ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΎΠΏΠΈΠΊ c ΠΈΠΌΠ΅Π½Π΅ΠΌ Airlines:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
ΠžΡ„ΠΎΡ€ΠΌΠ»ΡΠ΅ΠΌ подписку Π½Π° этот Ρ‚ΠΎΠΏΠΈΠΊ, Π² Π½Π΅ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ€ мобильного Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ БМБ-увСдомлСния:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² DynamoDB

Для хранСния Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ° airline_tickets, создадим Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² DynamoDB с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π’ качСствС ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ record_id:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ collector

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Collector, Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ опрос ΠΏΠΎΡ‚ΠΎΠΊΠ° airline_tickets ΠΈ, Π² случаС нахоТдСния Ρ‚Π°ΠΌ Π½ΠΎΠ²Ρ‹Ρ… записСй, вставка этих записСй Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ DynamoDB. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡ€Π°Π² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, эта лямбда Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Kinesis ΠΈ записи Π² DynamoDB.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ IAM Ρ€ΠΎΠ»ΠΈ для лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ collector
Для Π½Π°Ρ‡Π°Π»Π° создадим Π½ΠΎΠ²ΡƒΡŽ IAM Ρ€ΠΎΠ»ΡŒ для лямбды с ΠΈΠΌΠ΅Π½Π΅ΠΌ Lambda-TicketsProcessingRole:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Для тСстового ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚ прСднастроСнныС полиси AmazonKinesisReadOnlyAccess ΠΈ AmazonDynamoDBFullAccess, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless

Данная лямбда Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΠΎ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρƒ ΠΎΡ‚ Kinesis ΠΏΡ€ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… записСй Π² ΠΏΠΎΡ‚ΠΎΠΊ airline_stream, поэтому Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ лямбду.

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

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless

Π­Ρ‚Π° лямбда Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠΎ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρƒ Π½Π° ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… записСй Π² ΠΏΠΎΡ‚ΠΎΠΊ special_stream, поэтому Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ ΠΌΡ‹ это Π΄Π΅Π»Π°Π»ΠΈ для лямбды Collector.

Для удобства настройки этой лямбды, Π²Π²Π΅Π΄Π΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния β€” TOPIC_ARN, ΠΊΡƒΠ΄Π° ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ANR (Amazon Recourse Names) Ρ‚ΠΎΠΏΠΈΠΊΠ° Airlines:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
И вставляСм ΠΊΠΎΠ΄ лямбды, ΠΎΠ½ совсСм нСслоТный:

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

НСобходимая ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°

Terraform β€” ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ open-source инструмСнт для развСртывания инфраструктуры ΠΈΠ· ΠΊΠΎΠ΄Π°. Π£ Π½Π΅Π³ΠΎ свой синтаксис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»Π΅Π³ΠΊΠΎ ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΈ мноТСство ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠ°ΠΊ ΠΈ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ. Π’ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Atom ΠΈΠ»ΠΈ Visual Studio Code ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Terraform.

Дистрибутив ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΡΡŽΠ΄Π°. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ всСх возмоТностСй Terraform Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ, поэтому ограничимся основными ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ.

Как Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π»Π΅ΠΆΠΈΡ‚ Π² ΠΌΠΎΠ΅ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. ΠšΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊ сСбС Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. ΠŸΠ΅Ρ€Π΅Π΄ запуском Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρƒ вас установлСн ΠΈ настроСн AWS CLI, Ρ‚.ΠΊ. Terraform Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ ~/.aws/credentials.

Π₯ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ являСтся ΠΏΠ΅Ρ€Π΅Π΄ Π΄Π΅ΠΏΠ»ΠΎΠ΅ΠΌ всСй инфраструктуры, Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ plan, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Terraform Π½Π°ΠΌ сСйчас насоздаСт Π² ΠΎΠ±Π»Π°ΠΊΠ΅:

terraform.exe plan

Π‘ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ввСсти Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π½Π° Π½Π΅Π³ΠΎ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ. На этом этапС Π΅Π³ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
ΠŸΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π² ΠΏΠ»Π°Π½ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ созданиС рСсурсов:

terraform.exe apply

ПослС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΠΏΡΡ‚ΡŒ появится запрос Π½Π° Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°, Π½Π°Π±ΠΈΡ€Π°Π΅ΠΌ Β«yesΒ», ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ вопрос ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ дСйствий. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ всю инфраструктуру, провСсти всю Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ настройку EC2, Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚.Π΄.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС рСсурсы Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ созданы Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ΄ Terraform, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΉΡ‚ΠΈ Π² Π΄Π΅Ρ‚Π°Π»ΠΈ прилоТСния Kinesis Analytics (ΠΊ соТалСнию, я Π½Π΅ нашСл ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сразу ΠΈΠ· ΠΊΠΎΠ΄Π°).

ЗапускаСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
ПослС этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно Π·Π°Π΄Π°Ρ‚ΡŒ in-application stream name, Π²Ρ‹Π±Ρ€Π°Π² ΠΈΠ· Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ списка:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅.

ВСстированиС Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния

Π’Π½Π΅ зависимости, ΠΊΠ°ΠΊ Π²Ρ‹ Π΄Π΅ΠΏΠ»ΠΎΠΈΠ»ΠΈ систСму, Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ΄ Terraform, Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ.

Π—Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ SSH Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ EC2, Π³Π΄Π΅ установлСн Kinesis Agent ΠΈ запускаСм скрипт api_caller.py

sudo ./api_caller.py TOKEN

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ SMS Π½Π° ваш Π½ΠΎΠΌΠ΅Ρ€:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
SMS β€” сообщСниС ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ практичСски Ρ‡Π΅Ρ€Π΅Π· 1 ΠΌΠΈΠ½ΡƒΡ‚Ρƒ:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless
ΠžΡΡ‚Π°Π»ΠΎΡΡŒ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ Π»ΠΈ записи Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… DynamoDB для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ, Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. Π’Π°Π±Π»ΠΈΡ†Π° airline_tickets содСрТит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Aviasales API с Amazon Kinesis ΠΈ простота serverless

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

Π’ Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Ρ‹Π»Π° построСна систСма ΠΎΠ½Π»Π°ΠΉΠ½-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π±Π°Π·Π΅ Amazon Kinesis. Π‘Ρ‹Π»ΠΈ рассмотрСны Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования Kinesis Agent Π² связкС с Kinesis Data Streams ΠΈ Ρ€Π΅Π°Π»-Ρ‚Π°ΠΉΠΌ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΎΠΉ Kinesis Analytics ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ SQL ΠΊΠΎΠΌΠ°Π½Π΄, Π° Ρ‚Π°ΠΊΠΆΠ΅ взаимодСйствиС Amazon Kinesis с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ сСрвисами AWS.

Π’Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ систСму ΠΌΡ‹ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ двумя способами: достаточно Π΄ΠΎΠ»Π³ΠΈΠΌ Ρ€ΡƒΡ‡Π½Ρ‹ΠΌ ΠΈ быстрым ΠΈΠ· ΠΊΠΎΠ΄Π° Terraform.

Π’Π΅ΡΡŒ исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° доступСн Π² ΠΌΠΎΠ΅ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π½Π° GitHub, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ с Π½ΠΈΠΌ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ.

Π‘ ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅ΠΌ Π³ΠΎΡ‚ΠΎΠ² ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ, ΠΆΠ΄Ρƒ Π’Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². НадСюсь Π½Π° ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΡƒ.

Π–Π΅Π»Π°ΡŽ успСхов!

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