αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

ហេហេ!

αžαžΎαž’αŸ’αž“αž€αž…αžΌαž›αž…αž·αžαŸ’αžαž™αž“αŸ’αžαž αŸ„αŸ‡αž αŸ„αŸ‡αž‘αŸ? αžαŸ’αž‰αž»αŸ†αžŸαŸ’αžšαž›αžΆαž‰αŸ‹αžœαžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž―αž€αŸ„αžαŸ’αž›αž½αž“αž―αž„ αžαŸ’αž‰αž»αŸ†αž€αŸαž’αŸ’αž›αžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž’αž“αŸ’αž›αž„αŸ‹αžŸαŸ’αž“αŸαž αŸαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžœαž·αž—αžΆαž‚αž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αŸ†αž–αžΈαžŸαŸ†αž”αž»αžαŸ’αžšαž™αž“αŸ’αžαž αŸ„αŸ‡αž–αžΈαž’αž“αž’αžΆαž“αžŠαŸαž›αŸ’αž”αžΈαž˜αž½αž™αž‚αžΊ Aviasales αŸ”

αžαŸ’αž„αŸƒαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αžœαž·αž—αžΆαž‚αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹ Amazon Kinesis αž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™αž€αžΆαžšαžœαž·αž—αžΆαž‚αž–αŸαž›αžœαŸαž›αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αžŠαŸ†αž‘αžΎαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ Amazon DynamoDB NoSQL αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ†αžαžΆαž“αŸ‹ αž“αž·αž„αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„ SMS αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αž”αž»αžαŸ’αžšαžŠαŸ‚αž›αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαŸ”

αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž‚αžΊαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αžšαŸ„αž˜αž€αžΆαžšαž€αžΆαžαŸ‹! αž‘αŸ…!

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†

αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎ Aviasales API. αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αžŠαŸ„αž™αž˜αž·αž“αž‚αž·αžαžαŸ’αž›αŸƒ αž“αž·αž„αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαžšαžΉαžαž”αž“αŸ’αžαžΉαž„ αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€ "αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ" αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆ API αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž”αŸ’αžšαžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αž‚αŸ„αž›αž”αŸ†αžŽαž„αžŸαŸ†αžαžΆαž“αŸ‹αž“αŸƒαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αž‘αžΌαž‘αŸ…αž’αŸ†αž–αžΈαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αžΆαžšαž•αŸ’αžŸαžΆαž™αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ AWS αž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαžαžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž˜αž€αžœαž·αž‰αžŠαŸ„αž™ API αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαž‚αžΊαž˜αž·αž“αž‘αžΆαž“αŸ‹αžŸαž˜αŸαž™αž™αŸ‰αžΆαž„αžαžΉαž„αžšαŸ‰αžΉαž„ αž“αž·αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαŸ‚αž›αž‡αžΆ αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αžŠαŸ„αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš Aviasales.ru αž“αž·αž„ Jetradar.com αžšαž™αŸˆαž–αŸαž› 48 αž˜αŸ‰αŸ„αž„αž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ”

Kinesis-agent αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž•αž›αž·αž αž”αžΆαž“αž‘αž‘αž½αž›αžαžΆαž˜αžšαž™αŸˆ API αž“αžΉαž„αž‰αŸ‚αž€ αž“αž·αž„αž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‘αŸ…αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αžαžΆαž˜αžšαž™αŸˆ Kinesis Data Analytics αŸ” αž€αŸ†αžŽαŸ‚αžŠαžΎαž˜αž“αŸƒαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ…αž αžΆαž„αŸ” αž€αžΆαžšαž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž†αŸ…αžŠαŸ‚αž›αž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ DynamoDB αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαžœαž·αž—αžΆαž‚αžŸαŸ†αž”αž»αžαŸ’αžšαž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αžαžΆαž˜αžšαž™αŸˆαž§αž”αž€αžšαžŽαŸ BI αžŠαžΌαž…αž‡αžΆ AWS Quick Sight αž‡αžΆαžŠαžΎαž˜αŸ”

αž™αžΎαž„αž“αžΉαž„αž–αž·αž…αžΆαžšαžŽαžΆαž‡αž˜αŸ’αžšαžΎαžŸαž–αžΈαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž›αŸ–

  • αžŸαŸ€αžœαž—αŸ…αžŽαŸ‚αž“αžΆαŸ† - αžαžΆαž˜αžšαž™αŸˆ AWS Management Console;
  • αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αžΈαž€αžΌαžŠ Terraform αž‚αžΊαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžαŸ’αž‡αž·αž›αŸ”

αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαŸ–

  • Aviasales API - αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž˜αž€αžœαž·αž‰αžŠαŸ„αž™ API αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž„αžΆαžšαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”
  • αž§αž‘αžΆαž αžšαžŽαŸαž’αŸ’αž“αž€αž•αž›αž·αž EC2 - αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž’αž˜αŸ’αž˜αžαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž–αž–αž€αžŠαŸ‚αž›αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αž‰αŸ’αž…αžΌαž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ–
    • αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžš Kinesis αž‚αžΊαž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Java αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžœαž·αž’αžΈαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž› αž“αž·αž„αž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž€αžΆαž“αŸ‹ Kinesis (Kinesis Data Stream ឬ Kinesis Firehose)αŸ” αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αžΌαžœαžŸαŸ†αžŽαž»αŸ†αž―αž€αžŸαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžαžαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αž˜αžΈαž‘αŸ… Kinesis αŸ”
    • API Caller Script - αžŸαŸ’αž‚αŸ’αžšαžΈαž” Python αžŠαŸ‚αž›αž’αŸ’αžœαžΎαžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹ API αž αžΎαž™αžŠαžΆαž€αŸ‹αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ„αž™αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžš Kinesis αŸ”
  • αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™ Kinesis - αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž˜αž–αŸαž›αžœαŸαž›αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž˜αžαŸ’αžαž—αžΆαž–αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž’αŸ†αž‘αžΌαž›αžΆαž™αŸ”
  • αž€αžΆαžšαžœαž·αž—αžΆαž‚ Kinesis αž‚αžΊαž‡αžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αžŠαŸ‚αž›αž‡αž½αž™αžŸαž˜αŸ’αžšαž½αž›αžŠαž›αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αž“αŸƒαž€αžΆαžšαž•αŸ’αžŸαžΆαž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ’αž“αž»αž„αž–αŸαž›αžœαŸαž›αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αŸ” Amazon Kinesis Data Analytics αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž’αž“αž’αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αžšαž·αž˜αžΆαžŽαž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αžΌαž›αŸ”
  • AWS Lambda - αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΌαžŠαžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αž¬αžŠαŸ†αž‘αžΎαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ” αžαžΆαž˜αž–αž›αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž αŸ…αž“αžΈαž˜αž½αž™αŸ—αŸ”
  • αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ Amazon DynamoDB - αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸƒαž‚αžΌαžαž˜αŸ’αž›αŸƒ αž“αž·αž„αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž—αžΆαž–αž™αžΊαžαž™αŸ‰αžΆαžœαžαž·αž…αž‡αžΆαž„ 10 αž˜αžΈαž›αžΈαžœαž·αž“αžΆαž‘αžΈ αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŽαžΆαž˜αž½αž™αŸ” αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎ DynamoDB αž’αŸ’αž“αž€αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž•αŸ’αžαž›αŸ‹ αž”αŸ†αžŽαŸ‡ αž¬αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŽαžΆαž˜αž½αž™αž‘αžΎαž™αŸ” DynamoDB αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžαžΆαžšαžΆαž„αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαž”αžšαž·αž˜αžΆαžŽαž’αž“αž’αžΆαž“αžŠαŸ‚αž›αž˜αžΆαž“ αž“αž·αž„αžšαž€αŸ’αžŸαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αž–αžŸαŸ‹αŸ” αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžš;
  • αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ Amazon SNS - αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž™αŸ‰αžΆαž„αž–αŸαž‰αž›αŸαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαž‚αŸ†αžšαžΌαž’αŸ’αž“αž€αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™-αž‡αžΆαžœ (Pub/Sub) αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž‰αŸ‚αž€αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αž“αžΆαžαžαžΌαž… αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™ αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ” SNS αž’αžΆαž…β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž•αŸ’αž‰αžΎβ€‹αž–αŸαžαŸŒαž˜αžΆαž“β€‹αž‘αŸ…β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž…αž»αž„β€‹αž€αŸ’αžšαŸ„αž™β€‹αžαžΆαž˜β€‹αžšαž™αŸˆβ€‹αž€αžΆαžšβ€‹αž‡αžΌαž“β€‹αžŠαŸ†αžŽαžΉαž„β€‹αžαžΆαž˜β€‹αž‘αžΌαžšαžŸαž–αŸ’αž‘β€‹αž…αž›αŸαž សអរ SMS αž“αž·αž„β€‹αž’αŸŠαžΈαž˜αŸ‚αž›αŸ”

αž€αžΆαžšαž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αž”αž‹αž˜

αžŠαžΎαž˜αŸ’αž”αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž›αŸ†αž αžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αŸ’αžšαžΎαž–αŸαžαŸŒαž˜αžΆαž“αžŸαŸ†αž”αž»αžαŸ’αžšαž™αž“αŸ’αžαž αŸ„αŸ‡αžŠαŸ‚αž›αž”αž‰αŸ’αž‡αžΌαž“αž˜αž€αžœαž·αž‰αžŠαŸ„αž™ Aviasales APIαŸ” IN αž―αž€αžŸαžΆαžš αž”αž‰αŸ’αž‡αžΈαž™αŸ‰αžΆαž„αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αžŸαžΌαž˜αž™αž€αž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αž‚αŸ - "αž”αŸ’αžšαžαž·αž‘αž·αž“αžαž˜αŸ’αž›αŸƒαž”αŸ’αžšαž…αžΆαŸ†αžαŸ‚" αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αžαž˜αŸ’αž›αŸƒαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž„αŸƒαž“αžΈαž˜αž½αž™αŸ—αž“αŸƒαžαŸ‚ αžŠαŸ„αž™αžŠαžΆαž€αŸ‹αž‡αžΆαž€αŸ’αžšαž»αž˜αžαžΆαž˜αž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž”αŸ’αžšαžΆαž€αŸ‹αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžαŸ‚αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαžΎαž‘αŸ αž–αŸαžαŸŒαž˜αžΆαž“αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž˜αž€αžœαž·αž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŸαžΌαž˜αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αžŸαŸ†αžŽαžΎαž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

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 αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† αž€αž˜αŸ’αžšαž·αžαž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ (αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ„αž™αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ). αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž“αŸαŸ‡αž€αŸαžŠαŸ„αž™ αžŠαŸ„αž™αž‚αž·αžαž›αž»αž™αž–αžΈαžšαž”αžΈαžŠαž»αž›αŸ’αž›αžΆαžš αžœαžΆαž–αž·αžαž‡αžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαž‘αžΎαž„ αž αžΎαž™αž›αŸαž„αž‡αžΆαž˜αž½αž™αžœαžΆαŸ” αž αžΎαž™αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž€αž»αŸ†αž—αŸ’αž›αŸαž…αž›αž»αž”αž’αž“αž’αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž–αž½αž€αž‚αŸαž›αŸ‚αž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ”

αž‡αžΆαžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ αž˜αž»αžαž„αžΆαžš DynamoDb αž“αž·αž„ lambda αž“αžΉαž„αž˜αž·αž“αž‚αž·αžαžαŸ’αž›αŸƒαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„αž‘αŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž”αŸ†αž–αŸαž‰αžαžΆαž˜αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαž”αŸ’αžšαž…αžΆαŸ†αžαŸ‚αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ DynamoDBαŸ– αž’αž„αŸ’αž‚αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™ 25 GB, 25 WCU/RCU αž“αž·αž„ 100 αž›αžΆαž“αžŸαŸ†αžŽαž½αžšαŸ” αž“αž·αž„αž€αžΆαžšαž αŸ…αž˜αž»αžαž„αžΆαžš lambda αž˜αž½αž™αž›αžΆαž“αžŠαž„αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ‚αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ„αž™αžŠαŸƒ

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ Kinesis Data Stream

αžαŸ„αŸ‡αž‘αŸ…αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ Kinesis Data Stream αž αžΎαž™αž”αž„αŸ’αž€αžΎαžαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αžαŸ’αž˜αžΈαž–αžΈαžš αž˜αž½αž™ shard αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž“αžΈαž˜αž½αž™αŸ—αŸ”

αž’αŸ’αžœαžΈβ€‹αž‘αŸ…β€‹αž‡αžΆ shard ?
Shard αž‚αžΊαž‡αžΆαž’αž„αŸ’αž‚αž—αžΆαž–αž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαžŸαŸ’αž‘αŸ’αžšαžΈαž˜ Amazon Kinesis αŸ” αž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž›αŸ’αž”αžΏαž“ 1 MB/s αž“αž·αž„αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž›αž‘αŸ’αž’αž•αž›αž€αŸ’αž“αž»αž„αž›αŸ’αž”αžΏαž“ 2 MB/s αŸ” αž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž‚αžΆαŸ†αž‘αŸ’αžšαžšαž αžΌαžαžŠαž›αŸ‹ 1000 PUT αž’αžΆαžαž»αž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈαŸ” αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž…αŸ†αž“αž½αž“αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αž–αžΈαžšαž•αŸ’αž“αŸ‚αž€αŸ” αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸαŸ‡αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž›αŸ’αž”αžΏαž“ 2 MB/s αž“αž·αž„αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž›αž‘αŸ’αž’αž•αž›αž€αŸ’αž“αž»αž„αž›αŸ’αž”αžΏαž“ 4 MB/s αžŠαŸ‚αž›αž‚αžΆαŸ†αž‘αŸ’αžšαžšαž αžΌαžαžŠαž›αŸ‹ 2000 PUT records αž€αŸ’αž“αž»αž„αž˜αž½αž™αžœαž·αž“αžΆαž‘αžΈαŸ”

αž€αžΆαžšβ€‹αžŸαŸ’αž‘αŸ’αžšαžΈαž˜β€‹αž€αžΆαž“αŸ‹β€‹αžαŸ‚β€‹αž…αŸ’αžšαžΎαž“β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž•αŸ’αžŸαžΆαž™β€‹αžšαž”αžŸαŸ‹β€‹αž’αŸ’αž“αž€ αž›αŸ†αž αžΌαžšβ€‹αžšαž”αžŸαŸ‹β€‹αžœαžΆβ€‹αž€αžΆαž“αŸ‹β€‹αžαŸ‚β€‹αž’αŸ†αŸ” αž‡αžΆαž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž“αŸαŸ‡αž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž›αž›αŸ†αž αžΌαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“ - αžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αž”αŸ†αžŽαŸ‚αž€αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž”αžΎβ€‹αž’αŸ’αž“αž€β€‹αž˜αžΆαž“β€‹αžŸαŸ†αž”αž€β€‹αž€αžΆαž“αŸ‹β€‹αžαŸ‚β€‹αž…αŸ’αžšαžΎαž“ αžαž˜αŸ’αž›αŸƒβ€‹αž€αžΆαž“αŸ‹β€‹αžαŸ‚β€‹αžαŸ’αž–αžŸαŸ‹αŸ” shard αž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒ 1,5 αžŸαŸαž“αž€αŸ’αž“αž»αž„αž˜αž½αž™αž˜αŸ‰αŸ„αž„ αž“αž·αž„αž”αž“αŸ’αžαŸ‚αž˜ 1.4 αžŸαŸαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΆαž›αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“ PUT αžšαžΆαž”αŸ‹αž›αžΆαž“αž‚αŸ’αžšαžΏαž„αŸ”

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αžαŸ’αž˜αžΈαž‡αžΆαž˜αž½αž™αžˆαŸ’αž˜αŸ„αŸ‡ αžŸαŸ†αž”αž»αžαŸ’αžšαž™αž“αŸ’αžαž αŸ„αŸ‡, 1 shard αž“αžΉαž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αžΆαžαŸ‹:

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡β€‹αž™αžΎαž„β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αžαŸ’αžŸαŸ‚β€‹αžŸαŸ’αžšαž‘αžΆαž™β€‹αž˜αž½αž™β€‹αž‘αŸ€αžβ€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αžˆαŸ’αž˜αŸ„αŸ‡ αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž–αž·αžŸαŸαžŸ:

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž’αŸ’αž“αž€αž•αž›αž·αž

αžŠαžΎαž˜αŸ’αž”αžΈαžœαž·αž—αžΆαž‚αž€αž·αž…αŸ’αž…αž€αžΆαžšαž˜αž½αž™ αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸ EC2 αž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž’αŸ’αž“αž€αž•αž›αž·αžαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αžœαžΆαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαŸ‚αž›αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžαŸ’αž›αŸƒαžαŸ’αž›αžΆαŸ†αž„αž“αŸ„αŸ‡αž‘αŸ αž€αž“αŸ’αž›αŸ‚αž„ t2.micro αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž›αŸ’αž’αŸ”

αž…αŸ†αžŽαžΆαŸ†αžŸαŸ†αžαžΆαž“αŸ‹αŸ– αž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž”αŸ’αžšαžΎαžšαžΌαž”αž—αžΆαž– - Amazon Linux AMI 2018.03.0 αžœαžΆαž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαž·αž…αž‡αžΆαž„αž˜αž»αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžš Kinesis αž™αŸ‰αžΆαž„αžšαž αŸαžŸαŸ”

αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆ EC2 αž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžαŸ’αž˜αžΈ αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ AMI αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž—αŸαž‘ t2.micro αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„ Free TierαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžαŸ’αž˜αžΈαž’αžΆαž…αž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ Kinesis αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αž•αŸ’αžαž›αŸ‹αžŸαž·αž‘αŸ’αž’αž·αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αžΆαž“αŸ” αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŠαŸαž›αŸ’αž’αž”αŸ†αž•αž»αžαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžœαžΆαž‚αžΊαž€αŸ†αžŽαžαŸ‹αžαž½αž“αžΆαž‘αžΈ IAM αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž›αžΎαž‡αŸ†αž αžΆαž“αž‘αžΈ 3: αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸƒαž’αŸαž€αŸ’αžšαž„αŸ‹ αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ αž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈ IAM αžαŸ’αž˜αžΈαŸ”:

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈ IAM αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ EC2
αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž„αŸ’αž’αž½αž…αžŠαŸ‚αž›αž”αžΎαž€ αžŸαžΌαž˜αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžαžΆαž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈαžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ EC2 αž αžΎαž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž“αŸ‚αž€αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž› αž™αžΎαž„αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‡αžΆαž€αŸ’αžšαž‘αžΆαž“αŸƒαžŸαž·αž‘αŸ’αž’αž·αž’αž“αž’αžΆαž“ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‚αŸ„αž›αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‡αžΆαž˜αž»αž“αžŠαŸ„αž™ AmazonαŸ– AmazonKinesisFullAccess αž“αž·αž„ CloudWatchFullAccess αŸ”

αž…αžΌαžšαž•αŸ’αžαž›αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αžŠαŸαž˜αžΆαž“αž’αžαŸ’αžαž“αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž½αž“αžΆαž‘αžΈαž“αŸαŸ‡ αž§αž‘αžΆαž αžšαžŽαŸαŸ– EC2-KinesisStreams-FullAccessαŸ” αž›αž‘αŸ’αž’αž•αž›αž‚αž½αžšαžαŸ‚αžŠαžΌαž…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈαžαŸ’αž˜αžΈαž“αŸαŸ‡ αž€αž»αŸ†αž—αŸ’αž›αŸαž…αž—αŸ’αž‡αžΆαž”αŸ‹αžœαžΆαž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž™αžΎαž„αž˜αž·αž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž›αžΎαž’αŸαž€αŸ’αžšαž„αŸ‹αž“αŸαŸ‡ αž αžΎαž™αž”αž“αŸ’αžαž‘αŸ…αž”αž„αŸ’αž’αž½αž…αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ’αžšαžΆαž™αžœαŸαžšαžΉαž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž»αž€αž‡αžΆαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž€αŸαžŠαžΌαž…αž‡αžΆαžŸαŸ’αž›αžΆαž€ (αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžœαžΆαž‡αžΆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαžŸαŸ’αž›αžΆαž€ αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž€αŸαž•αŸ’αžαž›αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αž±αŸ’αž™αž§αž‘αžΆαž αžšαžŽαŸ αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž”αžšαž·αžŸαŸ’αžαžΆαž“)αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αžŸαŸ’αžαž·αžαž“αŸ…αž›αžΎαž‡αŸ†αž αžΆαž“αž‘αžΈ 6αŸ– αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αž‘αžΆαŸ†αž„αž€αŸ’αžšαž»αž˜αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαžαŸ’αž˜αžΈαž˜αž½αž™ αž¬αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αŸ’αžšαž»αž˜αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž—αŸ’αž‡αžΆαž”αŸ‹αžαžΆαž˜αžšαž™αŸˆ ssh (αž…αŸ’αžšαž€ 22) αž‘αŸ…αž€αžΆαž“αŸ‹ instance αŸ” αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αŸ’αžšαž—αž– -> IP αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡ αž αžΎαž™αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž§αž‘αžΆαž αžšαžŽαŸαŸ”

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αžŠαžšαžΆαž”αžŽαžΆαžœαžΆαž”αŸ’αžαžΌαžšαž‘αŸ…αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž’αŸ’αž“αž€αž’αžΆαž…αž–αŸ’αž™αžΆαž™αžΆαž˜αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžœαžΆαžαžΆαž˜αžšαž™αŸˆ 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"]
         }
      ]
    }
  ]
}

αžŠαžΌαž…αžŠαŸ‚αž›αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž–αžΈαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžšαž“αžΉαž„αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ .log αž“αŸ…αž€αŸ’αž“αž»αž„αžαž /var/log/airline_tickets/ αž‰αŸ‚αž€αž–αž½αž€αžœαžΆ αž“αž·αž„αž•αŸ’αž‘αŸαžšαž–αž½αž€αžœαžΆαž‘αŸ…αžŸαŸ’αž‘αŸ’αžšαžΈαž˜ 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 αžŸαŸ’αž€αŸαž“αŸ” αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž“αŸαŸ‡αž‚αžΊαž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš αž˜αžΆαž“αžαŸ’αž“αžΆαž€αŸ‹ 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 αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž αžΎαž™αž™αžΎαž„αž˜αžΎαž›αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαž„αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžš αž“αž·αž„αž“αŸ…αž›αžΎαž•αŸ’αž‘αžΆαŸ†αž„αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™ airline_ticketsαŸ–

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

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž αžΎαž™αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžš Kinesis αž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αž‘αŸ…αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αžŠαŸ†αž‘αžΎαž„ Kinesis Data Analytics

αž…αžΌαžšαž”αž“αŸ’αžαž‘αŸ…αž•αŸ’αž“αŸ‚αž€αž€αžŽαŸ’αžαžΆαž›αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž› - αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αž˜αžΈαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„ Kinesis Data Analytics αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆ kinesis_analytics_airlines_appαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
Kinesis Data Analytics αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž€αžΆαžšαžœαž·αž—αžΆαž‚αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž˜αž–αŸαž›αžœαŸαž›αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž–αžΈ Kinesis Stream αžŠαŸ„αž™αž”αŸ’αžšαžΎαž—αžΆαžŸαžΆ SQL αŸ” αžœαžΆαž‚αžΊαž‡αžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž™αŸ‰αžΆαž„αž–αŸαž‰αž›αŸαž‰ (αž˜αž·αž“αžŠαžΌαž… Kinesis Stream) αžŠαŸ‚αž›αŸ–

  1. αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αžαŸ’αž˜αžΈ (αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž›αž‘αŸ’αž’αž•αž›) αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž–αŸ”
  2. αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αž αž»αžŸαžŠαŸ‚αž›αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš (Error Stream);
  3. αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αž‰αŸ’αž…αžΌαž›αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· (αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αžΎαž„αžœαž·αž‰αžŠαŸ„αž™αžŠαŸƒαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹) αŸ”

αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ„αž€αž‘αŸ - 0.11 αžŠαž»αž›αŸ’αž›αžΆαžšαž€αŸ’αž“αž»αž„αž˜αž½αž™αž˜αŸ‰αŸ„αž„αž“αŸƒαž€αžΆαžšαž„αžΆαžš αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž”αŸ’αžšαžΎαžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαž»αž„αž”αŸ’αžšαž™αŸαžαŸ’αž“ αž αžΎαž™αž›αž»αž”αžœαžΆαž…αŸ„αž›αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ”

αžαŸ„αŸ‡αž—αŸ’αž‡αžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αŸ…αž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž€αžΆαžšαž•αŸ’αžŸαžΆαž™αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… (airline_tickets)αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž—αŸ’αž‡αžΆαž”αŸ‹αžαž½αž“αžΆαž‘αžΈ IAM αžαŸ’αž˜αžΈαžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžΆαž…αž’αžΆαž“αž–αžΈαžŸαŸ’αž‘αŸ’αžšαžΈαž˜ αž“αž·αž„αžŸαžšαžŸαŸαžšαž‘αŸ…αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αŸ’αžœαžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž…αžΌαž›αž”αŸ’αžšαžΎαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡β€‹αž™αžΎαž„β€‹αžŸαŸ’αž“αžΎβ€‹αžŸαž»αŸ†β€‹αž€αžΆαžšβ€‹αžšαž€β€‹αžƒαžΎαž‰β€‹αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸβ€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž•αŸ’αžŸαžΆαž™; αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž’αŸ’αžœαžΎβ€‹αžœαžΆβ€‹αž…αž»αž…β€‹αž›αžΎβ€‹αž”αŸŠαžΌαžαž»αž„ "Discover schema"αŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αžαž½αž“αžΆαž‘αžΈ IAM αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž”αŸ‹αžŠαŸαž (αž˜αž½αž™αžαŸ’αž˜αžΈαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž) αž αžΎαž™αž€αžΆαžšαžšαž€αžƒαžΎαž‰αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αžΈαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž˜αž€αžŠαž›αŸ‹αžšαž½αž…αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž₯αž‘αžΌαžœαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αž·αž–αž“αŸ’αž’ SQL αŸ” αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž…αž»αž…αž›αžΎαž”αŸŠαžΌαžαž»αž„αž“αŸαŸ‡ αž”αž„αŸ’αž’αž½αž…αž“αžΉαž„αž›αŸαž…αž‘αžΎαž„αžŠαŸ‚αž›αžŸαž½αžšαž’αŸ’αž“αž€αž±αŸ’αž™αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ - αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž”αž‰αŸ’αž…αžΌαž›αžŸαŸ†αžŽαž½αžšαžŸαžΆαž˜αž‰αŸ’αž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‘αŸ…αž€αŸ’αž“αž»αž„αž”αž„αŸ’αž’αž½αž…αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αž·αž–αž“αŸ’αž’ SQL αž αžΎαž™αž…αž»αž… αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš 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 αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžŸαŸ’αž‘αŸ’αžšαžΈαž˜ (αžŸαŸ’αž‘αŸ’αžšαžΈαž˜) αž“αž·αž„αžŸαŸ’αž“αž”αŸ‹ (PUMPs) - αžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αžŠαŸ‚αž›αž”αž‰αŸ’αž…αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž½αž™αž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αžŸαŸ†αžŽαž½αžš SQL αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž›αžΎαžŸαŸ’αžœαŸ‚αž„αžšαž€αžŸαŸ†αž”αž»αžαŸ’αžš Aeroflot αž€αŸ’αž“αž»αž„αžαž˜αŸ’αž›αŸƒαž€αŸ’αžšαŸ„αž˜αž”αŸ’αžšαžΆαŸ†αž–αžΆαž“αŸ‹αžšαžΌαž”αŸ’αž›αž·αŸαŸ” αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž”αŸ†αž–αŸαž‰αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‘αŸ’αžšαžΈαž˜ DESTINATION_SQL_STREAM αŸ”

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž‘αž·αžŸαžŠαŸ… αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžŸαŸ’αž‘αŸ’αžšαžΈαž˜ special_stream αž αžΎαž™αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž‘αž˜αŸ’αž›αžΆαž€αŸ‹αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ DESTINATION_SQL_STREAMαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž§αž”αžΆαž™αž€αž›αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αž½αžšαžαŸ‚αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„αžšαžΌαž”αž—αžΆαž–αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž‡αžΆαžœαž”αŸ’αžšαž’αžΆαž“αž”αž‘ SNS

αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αžŸαžΆαž˜αž‰αŸ’αž‰ αž αžΎαž™αž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαž’αžΆαž“αž”αž‘αžαŸ’αž˜αžΈαž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αžŠαŸ„αž™αžŠαžΆαž€αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž’αžΆαž€αžΆαžŸαž…αžšαžŽαŸαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž‡αžΆαžœαž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸαŸ‡ αž αžΎαž™αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž›αŸαžαž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αžŠαŸ‚αž›αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„ SMS αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ DynamoDB

αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž†αŸ…αž–αžΈαž€αžΆαžšαžŸαŸ’αž‘αŸ’αžšαžΈαž˜ airline_tickets αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αž…αžΌαžšαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„ DynamoDB αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ record_id αž‡αžΆαžŸαŸ„αž…αž˜αŸ’αž”αž„αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαž˜αžΌαž›αž˜αž»αžαž„αžΆαžš lambda

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαž˜αž»αžαž„αžΆαžš lambda αž αŸ…αžαžΆ Collector αžŠαŸ‚αž›αž—αžΆαžšαž€αž·αž…αŸ’αž…αžšαž”αžŸαŸ‹αžœαžΆαž“αžΉαž„αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αž‘αž„αŸ‹αž˜αžΎαž›αž€αžΆαžšαž•αŸ’αžŸαžΆαž™ airline_tickets αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡ αžŸαžΌαž˜αž”αž‰αŸ’αž…αžΌαž›αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ DynamoDBαŸ” αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαžŸαž·αž‘αŸ’αž’αž·αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ lambda αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž’αžΆαž“αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™ Kinesis αž“αž·αž„αžŸαžšαžŸαŸαžšαžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎ DynamoDB αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈ IAM αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž»αžαž„αžΆαžš lambda αž’αŸ’αž“αž€αž”αŸ’αžšαž˜αžΌαž›
αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈ IAM αžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ lambda αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆ Lambda-TicketsProcessingRoleαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž§αž‘αžΆαž αžšαžŽαŸαžŸαžΆαž€αž›αŸ’αž”αž„ αž‚αŸ„αž›αž€αžΆαžšαžŽαŸ AmazonKinesisReadOnlyAccess αž“αž·αž„ AmazonDynamoDBFullAccess αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‡αžΆαž˜αž»αž“αž‚αžΊαžŸαž˜αžšαž˜αŸ’αž™αžŽαžΆαžŸαŸ‹ αžŠαžΌαž…αž”αž„αŸ’αž αžΆαž‰αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

lambda αž“αŸαŸ‡αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž€αŸαŸ‡αž–αžΈ Kinesis αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αžΆαžαž»αžαŸ’αž˜αžΈαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ airline_stream αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž˜αžΈαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž“αŸ…β€‹αžŸαž›αŸ‹β€‹αž‚αžΊβ€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž€αžΌαžŠβ€‹αž αžΎαž™β€‹αžšαž€αŸ’αžŸαžΆβ€‹αž‘αž»αž€ lambdaαŸ”

"""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()

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž˜αž»αžαž„αžΆαžš lambda

αž˜αž»αžαž„αžΆαžš lambda αž‘αžΈαž–αžΈαžš αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž•αŸ’αžŸαžΆαž™αž‘αžΈαž–αžΈαžš (special_stream) αž“αž·αž„αž•αŸ’αž‰αžΎαž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž‘αŸ… SNS αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžαžΆαž˜αžšαž”αŸ€αž”αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ lambda αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž’αžΆαž“αž–αžΈ Kinesis αž“αž·αž„αž•αŸ’αž‰αžΎαžŸαžΆαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž”αŸ’αžšαž’αžΆαž“αž”αž‘ SNS αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™ αžŠαŸ‚αž›αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαžŠαŸ„αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ SNS αž‘αŸ…αž€αžΆαž“αŸ‹αž’αžαž·αžαž·αž‡αž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸαŸ‡ (αž’αŸŠαžΈαž˜αŸ‚αž› សអរ SMS αŸ”αž›αŸ”)αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈ IAM
αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈ IAM Lambda-KinesisAlarm αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ lambda αž“αŸαŸ‡ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž€αŸ†αžŽαžαŸ‹αžαž½αž“αžΆαž‘αžΈαž“αŸαŸ‡αž‘αŸ… alarm_notifier lambda αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

lambda αž“αŸαŸ‡αž‚αž½αžšαžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž›αžΎ trigger αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαžαŸ’αž˜αžΈαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ special_stream αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ trigger αžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Collector lambda αžŠαŸ‚αžšαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ lambda αž“αŸαŸ‡ αžŸαžΌαž˜αžŽαŸ‚αž“αžΆαŸ†αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžαŸ’αž˜αžΈ - TOPIC_ARN αžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž™αžΎαž„αžŠαžΆαž€αŸ‹ ANR (Amazon Recourse Names) αž“αŸƒαž”αŸ’αžšαž’αžΆαž“αž”αž‘αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž’αžΆαž€αžΆαžŸαž…αžšαžŽαŸαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αž€αžΌαžŠ lambda αžœαžΆαž˜αž·αž“αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αŸ–

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 αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αžŠαŸαž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αžΈαž€αžΌαžŠαŸ” αžœαžΆαž˜αžΆαž“αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžœαžΆ αžŠαŸ‚αž›αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžšαŸ€αž“ αž“αž·αž„αž˜αžΆαž“αž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž’αŸ†αž–αžΈαžšαž”αŸ€αž” αž“αž·αž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αž·αž–αž“αŸ’αž’ Atom ឬ Visual Studio Code αž˜αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αŸ†αž“αž½αž™αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Terraform αž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αŸ”

αž’αŸ’αž“αž€αž’αžΆαž…αž‘αžΆαž‰αž™αž€αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ αž–αžΈαž‘αžΈαž“αŸαŸ‡. αž€αžΆαžšαžœαž·αž—αžΆαž‚αž›αž˜αŸ’αž’αž·αžαž“αŸƒαžŸαž˜αžαŸ’αžαž—αžΆαž– Terraform αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž αž½αžŸαž–αžΈαžœαž·αžŸαžΆαž›αž—αžΆαž–αž“αŸƒαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αžαŸ’αž›αž½αž“αž™αžΎαž„αž‘αŸ…αž“αžΉαž„αž…αŸ†αžŽαž»αž…αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αŸ”

αžšαž”αŸ€αž”αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜

αž€αžΌαžŠαž–αŸαž‰αž›αŸαž‰αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αž‚αžΊ αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†. αž™αžΎαž„αž€αŸ’αž›αžΌαž“αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž›αž½αž“αž™αžΎαž„αŸ” αž˜αž»αž“αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αž“αž€αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ AWS CLI αž–αŸ’αžšαŸ„αŸ‡... Terraform αž“αžΉαž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αž–αŸαžαŸŒαž˜αžΆαž“αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš ~/.aws/credentials αŸ”

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž‚αžΊαžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž•αŸ‚αž“αž€αžΆαžš αž˜αž»αž“αž–αŸαž›αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž› αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αž’αŸ’αžœαžΈαžŠαŸ‚αž› Terraform αž€αŸ†αž–αž»αž„αž”αž„αŸ’αž€αžΎαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž™αžΎαž„αž“αŸ…αž›αžΎαž–αž–αž€αŸ–

terraform.exe plan

αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž˜αŸ’αžšαž»αž‰αž±αŸ’αž™αž”αž‰αŸ’αž…αžΌαž›αž›αŸαžαž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‰αžΎαž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž‘αŸ…αŸ” αžœαžΆαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αžœαžΆαž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž“αŸαŸ‡αž‘αŸαŸ”

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αžŠαŸ„αž™αž”αžΆαž“αžœαž·αž—αžΆαž‚αž•αŸ‚αž“αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž™αžΎαž„αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αž„αŸ’αž€αžΎαžαž’αž“αž’αžΆαž“αŸ–

terraform.exe apply

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž•αŸ’αž‰αžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡ αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž½αžšαž˜αŸ’αžαž„αž‘αŸ€αžαž±αŸ’αž™αž”αž‰αŸ’αž…αžΌαž›αž›αŸαžαž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ αžŸαžΌαž˜αž…αž»αž… "αž”αžΆαž‘" αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαŸ†αžŽαž½αžšαž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αŸ” αžœαžΆαž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžšαŸ€αž”αž…αŸ†αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž› αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒ EC2 αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž˜αž»αžαž„αžΆαžš lambda αž‡αžΆαžŠαžΎαž˜αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž’αž“αž’αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αžαžΆαž˜αžšαž™αŸˆαž€αžΌαžŠ Terraform αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Kinesis Analytics (αž‡αžΆαž’αž€αž»αžŸαž› αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αžšαž€αžƒαžΎαž‰αžœαž·αž’αžΈαž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž–αžΈαž€αžΌαžŠαž‘αŸ)αŸ”

αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž€αŸ†αžŽαžαŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹ αžŠαŸ„αž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž–αžΈαž”αž‰αŸ’αž‡αžΈαž‘αž˜αŸ’αž›αžΆαž€αŸ‹αž…αž»αŸ‡αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αž‡αžΆαžŸαŸ’αžšαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαž‘αŸ…αŸ”

αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

αžŠαŸ„αž™αž˜αž·αž“αž‚αž·αžαž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αž“αž€αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ„αž™αžŠαŸƒ αž¬αžαžΆαž˜αžšαž™αŸˆαž€αžΌαžŠ Terraform αžœαžΆαž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ”

αž™αžΎαž„αž…αžΌαž›αžαžΆαž˜αžšαž™αŸˆ SSH αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž EC2 αžŠαŸ‚αž› Kinesis Agent αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž” api_caller.py

sudo ./api_caller.py TOKEN

αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‚αžΊαžšαž„αŸ‹αž…αžΆαŸ†αžŸαžΆαžš SMS αž‘αŸ…αž€αžΆαž“αŸ‹αž›αŸαžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
សអរ SMS - αžŸαžΆαžšαž˜αž€αžŠαž›αŸ‹αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž‡αž·αž 1 αž“αžΆαž‘αžΈαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
αžœαžΆαž“αŸ…αžŸαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžαžΆαžαžΎαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ DynamoDB αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž¬αž’αžαŸ‹αŸ” αžαžΆαžšαžΆαž„ airline_tickets αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž αŸ‚αž›αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› Aviasales API αž‡αžΆαž˜αž½αž™ Amazon Kinesis αž“αž·αž„αž—αžΆαž–αžŸαžΆαž˜αž‰αŸ’αž‰αž‚αŸ’αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž„αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎ αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αž“αž‘αžΆαž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ Amazon Kinesis αŸ” αž‡αž˜αŸ’αžšαžΎαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžš Kinesis αžŠαŸ„αž™αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™ Kinesis Data Stream αž“αž·αž„αž€αžΆαžšαžœαž·αž—αžΆαž‚αž–αŸαž›αžœαŸαž›αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ Kinesis Analytics αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ SQL αž€αŸαžŠαžΌαž…αž‡αžΆαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹ Amazon Kinesis αž‡αžΆαž˜αž½αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ AWS αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž–αž·αž…αžΆαžšαžŽαžΆαŸ”

αž™αžΎαž„αž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαžΆαž„αž›αžΎαžαžΆαž˜αž–αžΈαžšαžœαž·αž’αžΈαŸ– αžŸαŸ€αžœαž—αŸ…αžŠαŸƒαžœαŸ‚αž„αž‡αžΆαž„ αž“αž·αž„αž˜αž½αž™αžšαž αŸαžŸαž–αžΈαž€αžΌαžŠ Terraform αŸ”

αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž‚αž˜αŸ’αžšαŸ„αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αžΆαž“ αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ GitHub αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžαŸ’αž‰αž»αŸ†αžŸαŸ’αž“αžΎαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαŸ’αž‚αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αž―αž„αž‡αžΆαž˜αž½αž™αžœαžΆαŸ”

αžαŸ’αž‰αž»αŸ†αžšαžΈαž€αžšαžΆαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αžαŸ’αžαž”αž‘ αžαŸ’αž‰αž»αŸ†αž‘αž“αŸ’αž‘αžΉαž„αžšαž„αŸ‹αž…αžΆαŸ†αž™αŸ„αž”αž›αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αž›αžΎαž€αžΆαžšαžšαž·αŸ‡αž‚αž“αŸ‹αž€αŸ’αž“αž»αž„αž“αŸαž™αžŸαŸ’αžαžΆαž”αž“αžΆαŸ”

αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αž‡αžΌαž“αž–αžšαž±αŸ’αž™αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž”αžΆαž“αž‡αŸ„αž‚αž‡αŸαž™!

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹