áá±áž áá¬á!
áá»á¶áááºážáá±áá²á· áá±áá¬ááºááœá±ááᯠááŒáá¯ááºáá¬ážá áá»áœááºáá±á¬áº á¡á²áá«ááᯠááŸá áºáááºáá«áááºá áá«áá±ááá·áº á¡áá®ážáá»ááºáá±áá»áááºááŸá¬ áá¬áááºááŒá®ážáá²á· á¡áááºážá¡ááŒá áºáá áºáá¯ááŒá áºáá²á· Aviasales á០áá±áá¬ááºáááºááŸááºá¡áá»ááºá¡áááºááœá±ááᯠááœá²ááŒááºážá áááºááŒá¬ááŒááºážááá¯áááºáž ááá±á¬áá»áá²á·áá«áááºá
ááá±á·áá»áœááºá¯ááºááá¯á·ááẠAmazon Kinesis ááá¯ááºáááºážááá¯ááœá²ááŒááºážá áááºááŒá¬ááŒá®áž á¡áá»áááºááŸáá·áºáá áºááŒá±ážáá®ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááŒáá·áº streaming system áá áºáá¯ááá¯áááºáá±á¬ááºáááºá Amazon DynamoDB NoSQL áá±áá¬áá±á·á áºááᯠáááºááá±áá¬ááá¯ááŸá±á¬ááºááŸá¯á¡ááŒá Ạááá·áºááœááºážááŒá®áž á áááºáááºá á¬ážá áá¬áá±á¬ááºážáá±á¬áááºááŸááºáá»á¬ážá¡ááœáẠSMS á¡áááá±ážáá»ááºáá»á¬ážááᯠá áá áºááá·áºááœááºážáá«áááºá
á¡áá±ážá áááºá¡áá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŒááºáá±á¬ááºááŸá¯á¡á±á¬ááºááœáẠáá±á¬áºááŒáá¬ážáááºá ááœá¬áž!
áááá«ááºáž
á¥ááá¬á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáááºáá±á¬ááºááœáá·áº ááá¯á¡ááºáá«áááºá
á€áá±á¬ááºážáá«ážá á¡ááááááºááœááºáá»ááºááŸá¬ AWS ááœáẠááááºážááœáŸáá·áºááŒááºážá¡áá¯á¶ážááŒá¯ááŒááºážá áá±áá°áá»áá¬ážáááºááá±á¬áá±á«ááºá á±áááºááŒá áºááŒá®ážá á¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ API ááŸááŒááºáá±ážááá·áºáá±áá¬ááẠáááºážááŒááºá áœá¬ up-to-date ááá¯ááºááŒá±á¬ááºážááŸáá·áº áááºážááŒá áºááá·áº cache á០áá±ážááá¯á·ááŒááºážááŒá áºáááºá ááœááºáá²á·áá±á¬ 48 áá¬áá®á¡ááœááºáž Aviasales.ru ááŸáá·áº Jetradar.com ááá¯ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá ááŸá¬ááœá±ááŸá¯áá»á¬ážá¡áá±á«áº á¡ááŒá±áá¶á ááœá²á·á ááºážáá²á·áááºá
API ááŸáá áºááá·áº áááºáá¶áááŸáááá·áº Kinesis-agent ááẠKinesis Data Analytics ááŸáá áºááá·áº áá±áá¬áá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠááœá²ááŒááºážá áááºááŒá¬ááŒá®áž á¡ááá¯á¡áá»á±á¬áẠáá¯ááºááœáŸáá·áºáá±ážáááºááŒá áºáááºá á€á á®ážááŒá±á¬ááºážá á¡ááŒááºážáááºáá¬ážááŸááºážááᯠá ááá¯ážááá¯ááºááá¯á· ááá¯ááºááá¯ááºáá±ážáá¬ážáá«áááºá DynamoDB ááœáẠá¡áá¯á¶ážááŒá¯áá¬ážááá·áº áá±áá¬áá¯ááºááŒááºážááá¯ááŸá±á¬ááºááŸá¯ááẠAWS Quick Sight áá²á·ááá¯á·áá±á¬ BI áááááá¬áá»á¬ážááŸáá áºááá·áº ááá¯ááá¯áááºááŸáá¯ááºážáá±á¬ áááºááŸááºááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠááœáá·áºááŒá¯áááºááŒá áºáááºá
á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠáá áºáá¯áá¯á¶ážááᯠááŒáá·áºáá»ááºá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠááœá±ážáá»ááºá áá¬ááŸá áºáá¯ááᯠáá»áœááºá¯ááºááá¯á·á ááºážá á¬ážáá«áááº-
- áááºá áœá² - AWS Management Console ááŸáááá·áº;
- Terraform áá¯ááºá០á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠááẠáá»ááºážáááá±á¬ á¡á±á¬áºááá¯áááºáá¬áá»á¬ážá¡ááœáẠááŒá áºáááºá
áááá¯áá¬á áá Ạáá®ááœááºáá²á·áááºá
á¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ á¡á
áááºá¡ááá¯ááºážáá»á¬áž
Aviasales API â ဠAPI ááŸááŒááºáá¬áá±á¬áá±áá¬ááᯠáá±á¬ááºáááºááœá²á¡áá¯ááºá¡á¬ážáá¯á¶ážá¡ááœáẠá¡áá¯á¶ážááŒá¯áá«áááºáEC2 áá¯ááºáá¯ááºáá° á¥ááᬠâ input data stream ááá¯áá¯ááºáá±ážááá·áº cloud ááŸá áá¯á¶ááŸáẠvirtual machine áá áºáá¯-Kinesis á¡á±ážáá»áá·áº Kinesis (Kinesis Data Streams ááá¯á·ááá¯áẠKinesis Firehose) ááá¯á· áá±áá¬á á¯áá±á¬ááºážááŒááºážááŸáá·áº áá±ážááá¯á·ááẠááœááºáá°áá±á¬áááºážáááºážááᯠáá¶á·ááá¯ážáá±ážááá·áº á ááºáá±á«áºááœáẠááŒááºááœááºážá ááá·áºááœááºážáá¬ážáá±á¬ Java á¡ááá®áá±ážááŸááºážáá áºáá¯ááŒá áºáááºá á¡á±ážáá»áá·áºááẠáááºááŸááºáá¬ážáá±á¬ áááºážááŒá±á¬ááºážáá»á¬ážááŸá ááá¯ááºá¡á á¯á¶ááᯠá¡áááºáááŒáẠá á±á¬áá·áºááŒáá·áºáá±ááŒá®áž Kinesis ááá¯á· áá±áá¬á¡áá áºáá»á¬áž áá±ážááá¯á·áááºáAPI áá±á«áºááá¯áá° Script - API ááá¯áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááŒá¯áá¯ááºááŒá®áž Kinesis Agent ááŸá á±á¬áá·áºááŒáá·áºáá¬ážáá±á¬ááá¯ááºááœá²áá áºáá¯ááá¯á·ááá·áºááœááºážáá±ážááá·áº Python script áá áºáá¯á
Kinesis áá±áá¬á á®ážááŒá±á¬ááºážáá»á¬áž â áá»ááºááŒáá·áºáá±á¬ á¡ááá¯ááºážá¡áá¬á áœááºážáááºáá»á¬ážááŒáá·áº á¡áá»áááºááŸáá·áºáááŒá±ážáá® áá±áá¬ááœáŸáá·áºááŒááºážáááºáá±á¬ááºááŸá¯áKinesis ááá¯ááºážááŒá¬ážá áááºááŒá¬áá»áẠáá±áá¬áá»á¬ážááᯠá¡áá»áááºááŸáá·áºáááŒá±ážáá® streaming ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠááá¯ážááŸááºážááœááºáá°á á±ááá·áº áá¬áá¬áá²á·áááºáá±á¬ááºááŸá¯áá áºáá¯ááŒá áºáááºá Amazon Kinesis Data Analytics ááẠá¡ááá®áá±ážááŸááºážáááºážááŒá áºáá»á¬ážááᯠá á®á ááºáááºááŸááºáá±ážááŒá®áž áááºáá¬ááá·áºáá±áá¬ááá¬áááᯠááá¯ááºááœááºááẠá¡ááá¯á¡áá»á±á¬áẠáá»áááºááŸááá±ážáááºáAWS Lambda â áá¬áá¬áá»á¬ážááᯠá¡áááºááááºážáááºážááŒááºáž ááá¯á·ááá¯áẠáá¬áá¬áá»á¬ážááá·áºááœááºážááŒááºážáááŒá¯áá² áá¯ááºááᯠáá¯ááºáá±á¬ááºááá¯ááºá á±ááá·áº áááºáá±á¬ááºááŸá¯áá áºáá¯á áá±á«áºááá¯ááŸá¯áá áºáá¯á á®á¡ááœáẠááœááºáá»á°áá¬áá«áá«á¡á¬ážáá¯á¶ážááᯠá¡ááá¯á¡áá»á±á¬áẠáá»áááºááŸááááºáAmazon DynamoDB - áááºááá·áºá áá±ážááœááºáááá¯áá¯ááºáá±á¬ááºáá±áá»áááºááœáẠlatency 10 áá®áá®á áá¹ááá·áºáááºáááºážáá±á¬ áá±á¬á·áááºááá¯ážá¡ááœá²áá»á¬ážááŸáá·áº á á¬ááœááºá á¬áááºážáá»á¬ážááá±áá¬áá±á·á áºáá áºáá¯á DynamoDB ááá¯á¡áá¯á¶ážááŒá¯áá±á¬á¡áá«á áááºááẠáááºááá·áºáá¬áá¬áá»á¬ážááá¯áááᯠáá¶á·ááá¯ážááŸá¯á áá¬áá±ážááŸá¯ ááá¯á·ááá¯áẠá á®áá¶ááá·áºááœá²ááẠáááá¯á¡ááºáá«á DynamoDB ááẠáááŸáááá¯ááºáá±á¬á¡áááºážá¡ááŒá áºáá»á¬ážááá¬áááᯠáá»áááºááŸááááºááŸáá·áº ááŒáá·áºáá¬ážáá±á¬á áœááºážáá±á¬ááºáááºááᯠááááºážááááºážááẠááá¬ážáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºááá¯ááºážáá¬áááºá á áá áºá á®áá¶ááá·áºááœá²áááºáááá¯á¡ááºáá«áAmazon SNS - áá¯ááºáá±áá°-á á¬áááºážááœááºážáá° (Pub/Sub) áá±á¬áºáááºááᯠá¡áá¯á¶ážááŒá¯á áááºáá±á·ááºá»ááá¯á·ááŒááºážá¡ááœáẠá¡ááŒáá·áºá¡á á á®áá¶ááá·áºááœá²ááá·áº áááºáá±á¬ááºááŸá¯ááŒá áºááŒá®ážá áááºááẠááá¯ááºáááá¯áááºáá±á¬ááºááŸá¯áá»á¬ážá ááŒáá·áºáá±ááŸá¯á áá áºáá»á¬ážááŸáá·áº áá¬áá¬áá²á·á¡ááºááºáá®áá±ážááŸááºážáá»á¬ážááᯠááœá²áá¯ááºááá¯ááºáááºá SNS ááᯠááá¯ááá¯ááºážááœááºážá¡á¬ážáá±áž á¡áááá±ážáá»ááºáá»á¬ážá SMS áááºáá±á·áá»áºáá»á¬ážááŸáá·áº á¡á®ážáá±ážááºáá»á¬ážááŸáá áºááá·áº áá¯á¶ážá áœá²áá°áá»á¬ážáᶠá¡áá»ááºá¡áááºáá»á¬áž áá±ážááá¯á·ááẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áááŠážáááºáááºáž
áá±áá¬á
á®ážáááºážááŸá¯ááᯠá¡áá¯áá°ááẠAviasale 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 script ááœáẠá¡áá¯á¶ážááŒá¯áá«áááºá
á¡ááŒá± á¥ááá¬-
{{
"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 áá¯á¶á·ááŒááºááŸá¯ááœáẠá¥ááá¬á¡á¬ážááŒáá·áº á
ááá·áºáá®áá¬á
áááºá០Phuk ááá¯á· áááºááŸááºáá
áºá
á±á¬ááºááᯠááŒááááº... á¡áá¯áž... á¡áááºáááºáá
áºáá¯...
áá»áœááºá¯ááºááẠKazan ááŸááŒá
áºááŒá®áž ááá¯á¡áá« Phuket ááẠ"á¡áááºáááºáá
áºáá¯áá¬ááŒá
áºáááº" ááŒá
áºáá±á¬ááŒá±á¬áá·áº á
ááá·áºáá®áá¬á
áááºá០Kazan ááá¯á· áááºááŸááºáá»á¬ážááᯠááŸá¬ááœá±ááŒáá·áºááŒáá«á
áá¯á·á
ááá·áºááœáẠAWS á¡áá±á¬áá·áºáá áºáá¯ááŸááá±ááŒá®áᯠáááºážáá°ááááºá Kinesis ááŸáá·áº SMS ááŸáááá·áºá¡ááŒá±á¬ááºážááŒá¬ážáá»ááºáá»á¬ážáá±ážááá¯á·ááŒááºážááá¯á·áááºááŸá áºá ááºááœááºááá«áááºááŒá±á¬ááºážááá¯áá»ááºáá»ááºážá¡áá°ážá¡á¬áá¯á¶á áá¯ááºááá¯áá«áááºá
á¡ááá²á·á¡ááá·áº (á¡ááá²á·á¡áá¯á¶ážááŒá¯ááŸá¯) . áá«áá±ááá·áº áá±á«áºáá¬ááŸá áºáá±á«áºáá¬áá±á¬áẠá áááºáá²ááŸá¬ááŸááá±áá±áá²á·áááºáž á¡ááá¯ááŒá¯áá¬ážáá²á·á áá áºááᯠáááºáá±á¬ááºááŒá®áž áááºážáá²á·áá á¬ážááá¯á· á¡áá±á¬áºáá±áž ááŒá áºááá¯ááºáá»á±ááŸááá«áááºá ááá¯á·á¡ááŒááºá áááºážááá¯á·áááá¯á¡ááºáá±á¬á·ááá·áºáá±á¬áẠá¡áááºážá¡ááŒá áºá¡á¬ážáá¯á¶ážááᯠáá»ááºáááºááá±á·áá«ááŸáá·áºá
áá¶áá±á¬ááºážáá±á¬ááºáá áœá¬á áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á áá áẠá¡ááá²á·ááá·áºáááºáá»ááºáá»á¬ážááᯠááŒáá·áºáá®áá«á DynamoDb ááŸáá·áº lambda áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠá¡ááá²á·ááŒá áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá DynamoDB á¡ááœááº- ááá¯ááŸá±á¬ááºááŸá¯ 25 GBá 25 WCU/RCU ááŸáá·áº áá±ážááŒááºážáá»áẠáááºáž 100á áá áºááá»áŸáẠlambda function áá±á«áºááá¯ááŸá¯ áá áºáááºážá
Manual á áá ẠááŒáá·áºáá»ááºááŒááºážá
Kinesis áá±áá¬á á®ážááŒá±á¬ááºážáá»á¬ážááᯠá áá áºááá·áºááœááºážááŒááºážá
Kinesis Data Streams áááºáá±á¬ááºááŸá¯ááá¯á·ááœá¬ážá áá¯ááºááœáŸáá·áºááŸá¯á¡áá áºááŸá áºáá¯á áá áºáá¯á á®á¡ááœáẠshard áá áºáá¯áááºáá®ážááŒáá«á áá¯á·á
Shard ááá¯áá¬áá¬áá²á
Shard ááẠAmazon Kinesis stream áá
áºáá¯á á¡ááŒá±áá¶áá±áá¬ááœáŸá²ááŒá±á¬ááºážáá°áá
áºááŒá
áºáááºá á¡ááá¯ááºážáá
áºáá¯ááẠáá±áá¬ááœáŸá²ááŒá±á¬ááºážááŸá¯ááᯠ1 MB/s á¡ááŒááºááŸá¯ááºážááŒáá·áº áá¶á·ááá¯ážáá±ážááŒá®áž áá±áá¬ááœáŸá²ááŒá±á¬ááºážááŸá¯ á¡ááŒááºááŸá¯ááºáž 2 MB/s ááŒáá·áº áá¶á·ááá¯ážáá±ážáá«áááºá á¡ááá¯ááºážáá
áºáá¯ááẠáá
áºá
áá¹ááá·áºáá»áŸáẠPUT entry 1000 á¡áá áá¶á·ááá¯ážáá±ážáááºá áá±áá¬á
á®ážááŒá±á¬ááºážááᯠáááºáá®ážááá·áºá¡áá« ááá¯á¡ááºáá±á¬ á¡ááá¯ááºážá¡áá±á¡ááœááºááᯠáááºááŸááºááẠááá¯á¡ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠá¡ááá¯ááºážááŸá
áºááá¯ááºážááŒáá·áº áá±áá¬á
á®ážááŒá±á¬ááºážáá
áºáá¯ááᯠáááºáá®ážááá¯ááºáááºá á€áá±áá¬á
á®ážááŒá±á¬ááºážááẠááá·áºááœááºážáá±áá¬ááœáŸá²ááŒá±á¬ááºážááŸá¯ 2 MB/s ááŸáá·áº á¡ááœááºáá±áá¬ááœáŸá²ááŒá±á¬ááºážááŸá¯ 4 MB/s ááŒáá·áº áá¶á·ááá¯ážáá±ážáááºááŒá
áºááŒá®áž áá
áºá
áá¹ááá·áºáá»áŸáẠ2000 PUT ááŸááºáááºážáá»á¬ážá¡áá áá¶á·ááá¯ážáá±ážáááºááŒá
áºáááºá
ááá·áºá á®ážááŒá±á¬ááºážááœáẠshards áá»á¬ážáá±áá±á áááºážá áá¯ááºááœáŸáá·áºááŸá¯ ááá¯áá»á¬ážáá±ááŒá áºáááºá áá°á¡áá shards áá±á«ááºážááá·áºááŒááºážááŒáá·áº flows ááᯠscale áá¯ááºáá¯á¶ááŒá áºáá«áááºá áá«áá±ááá·áº ááá·áºááŸá¬ á¡ááœááºááœá±áá»á¬ážáá±áá±á á á»á±ážá ááá¯ááŒáá·áºáá±áá«áá²á shard áá áºáá¯á á®ááẠáá áºáá¬áá®áá»áŸáẠ1,5 ááá·áº ááŸáá·áº PUT payload áá°áá Ạáá áºáááºážááá¯ááºážá¡ááœáẠáá±á¬ááºááẠ1.4 ááá·áº áá¯ááºáá»áááºá
áá¬áááºáá²á· stream á¡áá áºáá áºáᯠáááºáá®ážááá¯ááºáá¡á±á¬áẠáá±ááŒá±á¬ááºážááá¯ááºáž_áááºááŸááºáá»á¬áž1 shard ááẠáá°á·á¡ááœáẠáá¯á¶áá±á¬ááºáááá·áºáááº-
á¡áᯠáá¬áááºáá²á· áá±á¬ááºááá¯áẠáááºáá®ážááŒáá·áºáá¡á±á¬áẠá¡áá°áž_á
á®ážááŒá±á¬ááºáž:
áá¯ááºáá¯ááºáá° á áá áºááá·áºááœááºážááŒááºážá
á¡áá¯ááºáá áºáá¯ááᯠááœá²ááŒááºážá áááºááŒá¬áááºá áá¯á¶ááŸáẠEC2 instance ááᯠáá±áá¬áá¯ááºáá¯ááºáá°á¡ááŒá Ạá¡áá¯á¶ážááŒá¯ááẠáá¯á¶áá±á¬ááºáá«áááºá áááºážááẠá¡á¬ážáá±á¬ááºážááŒá®áž á á»á±ážááŒá®ážáá±á¬ virtual machine áá áºáá¯ááŒá áºááẠáááá¯á¡ááºáá«á spot t2.micro ááẠáá±á¬ááºážááœááºá áœá¬áá¯ááºáá±á¬ááºááá¯ááºáááºááŒá áºáááºá
á¡áá±ážááŒá®ážáá±á¬ááŸááºáá»ááº- á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠáá¯ááºáá¯á¶ááᯠá¡áá¯á¶ážááŒá¯ááá·áºááẠ- Amazon Linux AMI 2018.03.0á áááºážááœáẠKinesis Agent ááᯠáá»ááºááŒááºá áœá¬ááœáá·áºáááºá¡ááœáẠáááºáááºá¡áááºážáááºáá¬ááŸááááºá
EC2 áááºáá±á¬ááºááŸá¯ááá¯á·ááœá¬ážáá«á á¡ááá²á·á¡ááá·áºááœááºáá«ááŸááá±á¬ t2.micro á¡áá»áá¯ážá¡á á¬ážááŒáá·áº á¡ááá¯ááŸááá±á¬ AMI ááᯠááœá±ážáá»ááºáá«á
á¡áá
áºáááºáá®ážáá¬ážáá±á¬ virtual machine ááẠKinesis áááºáá±á¬ááºááŸá¯ááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááá¯ááºá
á±áááºá¡ááœáẠáááºážááᯠáá¯ááºáá±á¬ááºááẠá¡ááœáá·áºá¡áá±ážáá»á¬áž áá±ážááááºááŒá
áºáááºá áá®ááá¯áá¯ááºááá¯á· á¡áá±á¬ááºážáá¯á¶ážáááºážáááºážááá±á¬á· IAM Role ááᯠáááºááŸááºáá±ážááá¯á·áá«áá²á ááá¯á·ááŒá±á¬áá·áºá á¡ááá·áº 3- Configure Instance Details áá»ááºááŸá¬ááŒááºááœááºá áááºááœá±ážáá»ááºááá·áºáááºá IAM Role á¡áá
áºáááºáá®ážáá«á:
EC2 á¡ááœáẠIAM á¡áááºážááá¹áááᯠáááºáá®ážááŒááºážá
ááœáá·áºáá¬áá±á¬áááºážááá¯ážááœááºá áá»áœááºá¯ááºááá¯á·ááẠEC2 á¡ááœáẠá¡áááºážááá¹áá¡áá
áºáá
áºáá¯ááᯠáááºáá®ážáá±ááŒá±á¬ááºážááᯠááœá±ážáá»ááºááŒá®áž ááœáá·áºááŒá¯áá»ááºáá»á¬ážááá¹áááá¯á· ááœá¬ážáá«-
áá±á·áá»áá·áºáá±ážááá°áá¬ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠá¡áááºážá¡ááŒá
áºá¡ááœáá·áºá¡áá±ážáá»á¬ážá á¡áá±ážá
áááºáá¯á¶á
á¶ááœá²á·á
ááºážááŸá¯á ááŸá¯ááºááœá±ážááŸá¯ááºááœá±ážááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠááá¯ááºáá¬áááºáááá¯á¡ááºáá«á ááá¯á·ááŒá±á¬áá·áº Amazon á០ááŒáá¯áááºááŒááºáááºáá¬ážáá±á¬ áá°áá«ááá»á¬ážááᯠááœá±ážáá«áááá·áºáááº- AmazonKinesisFullAccess ááŸáá·áº CloudWatchFullAccessá
á€á¡áááºážááá¹áá¡ááœáẠá¡áááá¹áá«ááºááŸááá±á¬ á¡áááºá¡áá»áá¯á·ááᯠáá±ážááŒáá«á áá¯á·á á¥ááá¬- EC2-KinesisStreams-FullAccessá ááááºááẠá¡á±á¬ááºáá«áá¯á¶ááœáẠááŒáá¬ážááá·áºá¡ááá¯ááºáž áá°áá®ááá«áááºá
á€á¡áááºážááá¹áá¡áá
áºááᯠáááºáá®ážááŒá®ážáá±á¬ááºá áááºážááᯠáááºáá®ážáá¬ážáá±á¬ virtual machine instance ááœáẠáá°ážááœá²ááá·áºááẠááá±á·áá«ááŸáá·áºá
áá»áœááºá¯ááºááá¯á·ááẠá€á
ááááºáá±á«áºááœáẠá¡ááŒá¬ážáááºááá·áºá¡áá¬ááá¯áá»áŸ áááŒá±á¬ááºážáá²áá² áá±á¬ááºáááºááá¯ážáá»á¬ážááá¯á· áááºááœá¬ážáá«á
áá¬á·ááºáááá¯ááºáááºáááºáá»á¬ážááᯠáá¯á¶áá±á¡ááŒá áºáá¬ážááá¯ááºááŒá®áž áááºáá»á¬ážáá²á·ááá¯á· áá¬ážááá¯ááºááẠ(áááºáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááẠá¡áá±á·á¡áá»áá·áºáá±á¬ááºážáá±á¬áºáááºážá á¡áááºážáá¯á¶áž á¥ááá¬á¡áááºáá áºáá¯áá±ážááŒá®áž áááºáááºážáá»ááºááá¯ááœáŸááºááŒáá«)á
ááᯠáá»áœááºá¯ááºááá¯á·ááẠá¡ááá·áº 6- Configure Security Group áááºááºááœááºááŸáááŒá®ážá á¡áá áºáá áºáá¯áááºáá®ážááẠááá¯á·ááá¯áẠááá·áºá¡á¬áž ssh (port 22) ááŸáá áºááá·áº áá»áááºáááºááá¯ááºá á±ááá·áº áááºáááŸáááŒá®ážáá¬áž áá¯á¶ááŒá¯á¶áá±ážá¡ááœá²á·ááᯠáááºááŸááºááẠááá¯á¡ááºáá«áááºá á¡á²áá®ááŸá¬ Source -> My IP ááá¯ááœá±ážááŒá®áž instance ááá¯ááœáá·áºááá¯ááºáá«áááºá
áááºážááẠáá¯ááºáá±á¬ááºáá±ááá·áº á¡ááŒá±á¡áá±ááá¯á· ááŒá±á¬ááºážáááºááŸáá·áº áááŒáá¯ááºáááºá áááºááẠáááºážááᯠssh ááŸáá
áºááá·áº áá»áááºáááºááẠááŒáá¯ážá
á¬ážááá¯ááºáááºá
Kinesis Agent ááŸáá·áºá¡áá¯ááºáá¯ááºááá¯ááºáááºá á ááºááá¯á·á¡á±á¬ááºááŒááºá áœá¬áá»áááºáááºááŒá®ážáá±á¬ááºá áááºááẠterminal ááœáẠá¡á±á¬ááºáá« command áá»á¬ážááá¯ááá¯ááºááá·áºááá«áááºá
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
á¡á±ážáá»áá·áºáá áááºáá®á áááºááẠáááºážá config ááᯠconfigure áá¯ááºááẠááá¯á¡ááºáááº-
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
ááᯠAPI ááŸáá±áá¬áá±á¬ááºážááá¯ááá·áº Python script ááá¯áá±á«ááºážáá¯ááºáá¯ááºááŒáá«á áá¯á·á
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 script ááẠAviasales ááŸáá±áá¬ááá¯áá±á¬ááºážááá¯ááŒá®áž Kinesis á¡á±ážáá»áá·áºá áááºáááºááá·áºáááºážááœáŸááºááœááºáááºáá¶áááŸááá±á¬áá¯á¶á·ááŒááºááŸá¯ááá¯ááááºážáááºážáááºá ဠscript áá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áááºá¡áá±á¬áºáá±ážá á¶ááŒá áºáááºá 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 script ááᯠá ááºážáááºááŒáá·áºááŒáá«á áá¯á·á
sudo ./api_caller.py TOKEN
Agent ááŸááºáááºážáá»á¬ážááŸáá·áº airline_tickets áá±áá¬á
á®ážááŒá±á¬ááºážááŸá á
á±á¬áá·áºááŒáá·áºáá±á·áá¬áá±ážáááºááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡áá¯ááºáááááºááᯠááŒáá·áºááŸá¯áááº-
tail -f /var/log/aws-kinesis-agent/aws-kinesis-agent.log
áááºááŒááºááá·áºá¡ááá¯ááºážá á¡áá¬á¡á¬ážáá¯á¶ážá¡áá¯ááºáá¯ááºááŒá®áž Kinesis Agent ááẠáá±áá¬á
á®ážááŒá±á¬ááºážááá¯á· á¡á±á¬ááºááŒááºá
áœá¬áá±ážááá¯á·áááºá á¡áá¯áá² á
á¬ážáá¯á¶ážáá°ááᯠáá¯á¶áá±á¬áºááŒáá·áºáá¡á±á¬ááºá
Kinesis Data Analytics ááᯠá áá áºááá·áºááœááºážááŒááºážá
á áá áºáá áºáá¯áá¯á¶ážá áááá¯á¡á áááºá¡ááá¯ááºážááá¯á· áááºááœá¬ážááŒáá«á áá¯á· - Kinesis Data Analytics ááœáẠkinesis_analytics_airlines_app áá¯áá±á«áºáá±á¬ á¡ááºááºá¡áá áºáá áºáᯠáááºáá®ážáá«á
Kinesis Data Analytics ááẠSQL áá¬áá¬á
áá¬ážááᯠá¡áá¯á¶ážááŒá¯á Kinesis Stream á០á¡áá»áááºááŸáá·áºáá
áºááŒá±ážáá® áá±áá¬ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºá
á±áá«áááºá áááºážááẠá¡ááŒáá·áºá¡á á¡ááá¯á¡áá»á±á¬áẠáá»á²á·ááœááºááŒááºáž áááºáá±á¬ááºááŸá¯ (Kinesis Streams ááŸáá·áº ááá°) ááŒá
áºáááº-
- á¡áááºážá¡ááŒá áºáá±áá¬áá±á¬ááºážááá¯ááŸá¯áá»á¬ážá¡áá±á«áºá¡ááŒá±áá¶á á á®ážááŒá±á¬ááºážá¡áá áºáá»á¬áž (Output Stream) ááá¯áááºáá®ážáááºááœáá·áºááŒá¯áááºá
- á¡ááá®áá±ážááŸááºážáá»á¬áž áá¯ááºáá±á¬ááºáá±áá»áááºááœáẠááŒá áºáá±á«áºáá²á·áá±á¬ á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááŸáá·áº ááá¯ááºááá¯ááºáá¯ááºááœáŸáá·áºááŸá¯ááᯠáá¶á·ááá¯ážáá±ážááẠ(Error Stream);
- ááá·áºááœááºážáá±áá¬á¡á á®á¡á ááºááᯠá¡ááá¯á¡áá»á±á¬ááºáá¯á¶ážááŒááºááá¯ááºááẠ(ááá¯á¡ááºáá«á áááºážááᯠááá¯ááºááá¯ááºááŒááºáááºáááºááŸááºááá¯ááºáááº)á
áááºážááẠá á»á±ážáá±á«áá±á¬áááºáá±á¬ááºááŸá¯ááá¯ááºáá« - á¡áá¯ááºááá áºáá¬áá®áá»áŸáẠ0.11 USD ááŒá áºáá±á¬ááŒá±á¬áá·áº áááºážááᯠááá¯áá áá¯ááºá¡áá¯á¶ážááŒá¯ááŒá®áž ááŒá®ážáá±á¬á¡áá« áááºážááá¯áá»ááºáá áºááá·áºáááºá
á¡ááá®áá±ážááŸááºážááᯠáá±áá¬á¡áááºážá¡ááŒá áºááŸáá·áº áá»áááºáááºááŒáá«á áá¯á·á
áá»áœááºá¯ááºááá¯á·áá»áááºáááºááá·áº á
á®ážááŒá±á¬ááºáž (airline_tickets) ááᯠááœá±ážáá«-
ááá¯á·áá±á¬ááºá áááºááẠá¡ááá®áá±ážááŸááºážá០stream ááŸáááºááá¯ááºááŒá®áž stream ááá¯á·á
á¬áá±ážááá¯ááºá
á±ááẠIAM Role á¡áá
áºáá
áºáᯠáá°ážááœá²ááẠááá¯á¡ááºáá«áááºá áá®ááá¯áá¯ááºááá¯á·á Access ááœáá·áºááŒá¯áá»ááºááááºááá¯á·ááŒááºážááŸá¬ áá¬ááá¯á០áááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ááºá¡á±á¬áẠáá¯á¶áá±á¬ááºáá«áááºá
ááᯠáá¯ááºááœáŸáá·áºááŸá¯ááœáẠáá±áá¬á¡á
á®á¡á
ááºááᯠááŸá¬ááœá±ááœá±á·ááŸáááẠáá±á¬ááºážááá¯ááá¯ááºááŒáá«á
áá¯á·á áááºážááá¯áá¯ááºáá±á¬ááºááẠ"Discover schema" ááá¯ááºááᯠááŸáááºáá«á ááááºá¡áá±ááŸáá·áºá IAM á¡áááºážááá¹áááᯠá¡ááºááááºáá¯ááºááẠ(á¡áá
áºáá
áºáá¯ááᯠáááºáá®ážáá«áááº) ááŸáá·áº stream ááœááºáá±á¬ááºááŸáááŒá®ážáá±á¬áá±áá¬á០schema áá±á¬ááºááŸááºážááŸá¯ááᯠá
áááºáááá·áºáááº-
ááá¯ááẠSQL editor ááá¯á·ááœá¬ážáááºááá¯á¡ááºáááºá á€ááá¯ááºááᯠááŸáááºááá¯ááºáá±á¬á¡áá«á á¡ááá®áá±ážááŸááºážááᯠá
áááºááẠááá·áºá¡á¬áž áá±á¬ááºážááá¯ááá·áº áááºážááá¯ážáá
áºáᯠáá±á«áºáá¬áááá·áºááẠ- áááºá
áááºááá¯ááá·áºá¡áá¬ááᯠááœá±ážáá»ááºáá«-
á¡á±á¬ááºáá«ááá¯ážááŸááºážáá±á¬áá±ážááœááºážááᯠSQL áááºážááŒááºáááºážááá¯ážááœáẠááá·áºááœááºážááŒá®áž SQL ááᯠSave and Run ááá¯ááŸáááºáá«á
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';
áááºá ááºáá±áá¬áá±á·á áºáá»á¬ážááœáẠáááºááẠááŸááºáááºážáá»á¬ážááá·áºáááºááŸáá·áº á¡áá»ááºá¡áááºááŸá¬ááœá±áááºá¡ááœáẠSELECT ááŒá±áá¬áá»ááºááᯠINSERT áá¯ááºááŒááºáá»ááºáá»á¬ážá¡á¬áž á¡áá¯á¶ážááŒá¯á ááá¬ážáá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºáááºá Amazon Kinesis áá±áᬠááá¯ááºážááŒá¬ážá áááºááŒá¬áá»ááºááœáẠáááºááẠá ááºážáá»á±á¬ááºážáá»á¬áž (á ááºážáá»á±á¬ááºážáá»á¬áž) ááŸáá·áº ááá·áºáá»á¬áž (PUMPs) ááŒáá·áº á¡áá¯ááºáá¯ááºáááºâá¡ááá®áá±ážááŸááºážáá áºáá¯á០áá¯ááºááœáŸáá·áºááŸá¯áá áºáá¯á០áá±áá¬ááᯠá¡ááŒá¬ážá á®ážááŒá±á¬ááºážááá¯á· ááá·áºááœááºážááá·áº á¡áááºáááŒáẠááá·áºááœááºážáá±á¬ááºážááá¯ááŸá¯áá»á¬ážá
á¡áááºáá±á¬áºááŒáá« SQL query ááẠáá°áááºáá«ážáá±á¬ááºá¡á±á¬áẠáá¯ááºáá»á ááááºááŒáá·áº Aeroflot áááºááŸááºáá»á¬ážááᯠááŸá¬ááœá±áááºá á€á¡ááŒá±á¡áá±áá»á¬ážááŸáá·áº ááá¯ááºáá®áá±á¬ ááŸááºáááºážá¡á¬ážáá¯á¶ážááᯠDESTINATION_SQL_STREAM áá¯ááºááœáŸáá·áºááŸá¯ááœáẠáá¬ážááŸááá«áááºá
Destination block ááœááºá special_stream stream ááᯠááœá±ážáá«á ááŸáá·áº In-application stream name DESTINATION_SQL_STREAM drop-down list ááœááº-
ááŒááºááŸááºááŸá¯á¡á¬ážáá¯á¶ážáááááºááẠá¡á±á¬ááºáá«áá¯á¶ááŸáá·áºáááºáá°ááá·áºá¡áá¬ááŒá
áºááá·áºáááº-
SNS áá±á«ááºážá ááºáá áºáá¯ááᯠáááºáá®ážááŒááºážááŸáá·áº á á¬áááºážááœááºážááŒááºážá
ááá¯ážááŸááºážáá±á¬ááááá±ážáá»ááºáááºáá±á¬ááºááŸá¯ááá¯á·ááœá¬ážá áá±ááŒá±á¬ááºážááá¯ááºážá¡áááºááŒáá·áº áá±á«ááºážá ááºá¡áá áºáá áºáá¯áááºáá®ážáá«á
á€á¡ááŒá±á¬ááºážá¡áá¬ááᯠá
á¬áááºážááœááºážááŒá®áž SMS á¡ááŒá±á¬ááºážááŒá¬ážáá»ááºáá»á¬áž áá±ážááá¯á·ááá·áº ááá¯ááá¯ááºážáá¯ááºážáá¶áá«ááºááᯠááœáŸááºááŒáá«-
DynamoDB ááœáẠááá¬ážáá áºáá¯áááºáá®ážáá«á
áááºážááá¯á·á airline_tickets á á®ážááŒá±á¬ááºážá០áá±áá¬á¡ááŒááºážááᯠááááºážáááºážáááºá á¡áááºáá° DynamoDB ááœáẠááá¬ážáá áºáᯠáááºáá®ážááá¯ááºááŒáá«á áá¯á·á áá»áœááºá¯ááºááá¯á·ááẠáááºááá±á¬á·á¡ááŒá Ạrecord_id ááᯠá¡áá¯á¶ážááŒá¯áá«áááº-
lambda áá¯ááºáá±á¬ááºáá»ááºá á¯áá±á¬ááºážáá° áááºáá®ážááŒááºážá
Collector áá¯áá±á«áºáá±á¬ lambda áá¯ááºáá±á¬ááºáá»ááºááᯠáááºáá®ážááŒáá«á áá¯á·á áááºážááá¬áááºááŸá¬ airline_tickets á á®ážááŒá±á¬ááºážááᯠá á áºáááºážáá±á¬ááºáá°áááºááŸáá·áº ááá¯áá±áá¬ááœáẠááŸááºáááºážá¡áá áºáá»á¬ážááœá±á·ááŸááá«áá á¡ááá¯áá«ááŸááºáááºážáá»á¬ážááᯠDynamoDB ááá¬ážááœáẠááá·áºááœááºážáá«á áá¯á¶ááŸááºá¡ááœáá·áºá¡áá±ážáá»á¬ážá¡ááŒááºá ဠlambda ááẠKinesis áá±áá¬á á®ážááŒá±á¬ááºážááá¯á· áááºáá±á¬ááºáááºááŸá¯ááá¯ááºáááºááŒá áºááŒá®áž DynamoDB ááá¯á· á á¬áá±ážáááºáá±á¬ááºááœáá·áºááŸáááá«áááºá
á
á¯áá±á¬ááºážáá° lambda áá¯ááºáá±á¬ááºáá»ááºá¡ááœáẠIAM á¡áááºážááá¹áááᯠáááºáá®ážááŒááºážá
áŠážá
áœá¬á Lambda-TicketsProcessingRole á¡áááºááŸá lambda á¡ááœáẠIAM á¡áááºážááá¹áá¡áá
áºááᯠáááºáá®ážááŒáá«á
áá¯á·á
á
ááºážáááºááŸá¯á¥ááá¬á¡ááœááºá ááŒáá¯áááºááŒááºáááºáá¬ážáá±á¬ AmazonKinesisReadOnlyAccess ááŸáá·áº AmazonDynamoDBFullAccess áá°áá«ááá»á¬ážááẠá¡á±á¬ááºáá±á¬áºááŒáá«áá¯á¶ááœááºááŒáá¬ážááá·áºá¡ááá¯ááºáž á¡áá±á¬áºáá±ážááá·áºáá»á±á¬áºáá«áááºá
á¡áá
áºáááºáá±á¬ááºááŸá¯áá»á¬áž airline_stream ááá¯á·áááºáá±á¬ááºáá±á¬á¡áá«ááœáẠKinesis ááŸá¡á
áá»áá¯ážááŒááºážááŒáá·áº ဠlambda ááá¯á
áááºááá·áºáááºá ááá¯á·ááŒá±á¬áá·áº trigger á¡áá
áºáá
áºáá¯áááºááá·áºáááºááá¯á¡ááºáááº-
áá»ááºáá¬á¡á¬ážáá¯á¶ážá áá¯ááºááá¯ááá·áºááœááºážááŒá®áž 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 áá¯ááºáá±á¬ááºáá»áẠá¡áááá±ážáá»ááºáá áºáᯠáááºáá®ážááŒááºážá
áá¯ááá stream (special_stream) ááᯠá á±á¬áá·áºááŒáá·áºááŒá®áž SNS ááá¯á· á¡ááŒá±á¬ááºážááŒá¬ážáá»áẠáá±ážááá¯á·ááá·áº áá¯ááá lambda áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¬ážáá°áá¯á¶á á¶ááŒáá·áº áááºáá®ážáá¬ážáááºá ááá¯á·ááŒá±á¬áá·áºá ဠlambda ááẠKinesis á០áááºááŸá¯ááœáá·áºááŸáááŒá®áž SNS áááºáá±á¬ááºááŸá¯á០á€á¡ááŒá±á¬ááºážá¡áá¬á á á¬áááºážááœááºážáá°á¡á¬ážáá¯á¶ážáᶠSNS áááºáá±á¬ááºááŸá¯á០áá±ážááá¯á·ááá·áº áá±ážáá¬ážáá±á¬ SNS áá±á«ááºážá ááºááá¯á· áááºáá±á·áá»áºáá»á¬áž áá±ážááá¯á·ááááºááŒá áºáááºá
IAM á¡áááºážááá¹áááᯠáááºáá®ážááŒááºážá
ááááŠážá
áœá¬á áá»áœááºá¯ááºááá¯á·ááẠဠlambda á¡ááœáẠIAM á¡áááºážááá¹á Lambda-KinesisAlarm ááᯠáááºáá®ážááŒá®ážá ááá¯á·áá±á¬áẠáááºáá®ážáá±ááá·áº alarm_notifier lambda ááá¯á· á€á¡áááºážááá¹áááᯠáááºááŸááºáá±ážáááº-
ဠlambda ááẠspecial_stream ááá¯á·áááºáá±á¬ááºááẠááŸááºáááºážá¡áá
áºáá»á¬ážá¡ááœáẠá¡á
áá»áá¯ážáá
áºáá¯ááœáẠáá¯ááºáá±á¬ááºááá·áºáááºá ááá¯á·ááŒá±á¬áá·áº Collector lambda á¡ááœáẠáá»áœááºá¯ááºááá¯á·ááŒá¯áá¯ááºáá²á·ááá·áºá¡ááá¯ááºáž trigger ááᯠconfigure áá¯ááºááẠááá¯á¡ááºáá«áááºá
ဠlambda ááᯠconfigure áá¯ááºááẠááá¯ááá¯ááœááºáá°á á±áááºá áá±ááŒá±á¬ááºážááá¯ááºáž áá±á«ááºážá ááºá ANR (Amazon Recourse Names) áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á· áá±áá¬áá»áá±ážááá·áº áááºážáá»ááºááŒá±á¬ááºážáá²ááŸá¯- TOPIC_ARN ááᯠááááºáááºáá±ážááŒáá«á áá¯á·á
ááŒá®ážáá»áŸáẠ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))
á€áááºááŸá¬ manual system configuration ááŒá®ážáá¯á¶ážááœá¬ážáá¯á¶ááááºá áá»ááºáá¬á¡á¬ážáá¯á¶ážá á¡á¬ážáá¯á¶ážááᯠááŸááºáááºá áœá¬ ááŒááºáááºááŒá®ážááŒá±á¬ááºáž áá±áá»á¬á¡á±á¬áẠá ááºážáááºááá¯á·áá«á
Terraform áá¯ááºá០á¡áá¯á¶ážááŒá¯áá«á
ááá¯á¡ááºáá±á¬ááŒááºáááºááŸá¯
ááŒáá·áºáá»á®áá±ážá¡á¬áž áá±á«ááºážáá¯ááºááœá²ááá¯ááºáá«áááºá
áááºááá¯á áááá²
ááá±á¬áá»ááºá áá¯ááºá¡ááŒáá·áºá¡á
á¯á¶ááŸá¬
áá±á¬ááºážáá±á¬á¡áá±á·á¡áá»áá·áºáá áºáá¯ááŸá¬ cloud ááœáẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠTerraform á áááºááŸááááºáá®ážáá±áááºáá»á¬ážááᯠááŒáá·áºááŸá¯ááẠá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶áá áºáá¯áá¯á¶ážááᯠá¡áá¯á¶ážáááŒá¯áá® á¡á á®á¡á ááºá¡áááá·áºááᯠáá¯ááºáá±á¬ááºáááºááŒá áºáááº-
terraform.exe plan
á¡ááŒá±á¬ááºážááŒá¬ážáá»ááºáá»á¬áž áá±ážááá¯á·ááẠáá¯ááºážáá¶áá«ááºááᯠááá·áºááœááºážááẠááá·áºá¡á¬áž á¡ááŒá±á¬ááºážááŒá¬ážáá«áááºá á€á¡ááá·áºááœáẠáááºážááᯠááá·áºááœááºážááẠáááá¯á¡ááºáá«á
áááá¯ááááºá áá¯ááºáááºážáá±á¬ááºááœááºááŸá¯ á¡á
á®á¡á
ááºááᯠááá¯ááºážááŒá¬ážá
áááºááŒá¬ááŒá®áž á¡áááºážá¡ááŒá
áºáá»á¬ážááᯠá
áááºáááºáá®ážááá¯ááºáááº-
terraform.exe apply
á€á¡áááá·áºááᯠáá±ážááá¯á·ááŒá®ážáá±á¬ááºá áááºááẠáá¯ááºážáá¶áá«ááºáá áºáᯠááá·áºááœááºážááẠáááºáá¶áá±á¬ááºážááá¯áá¶ááááºááŒá áºááŒá®ážá áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡ááŸááºááááºáá¯ááºáá±á¬ááºááŒááºážááŸáá·áºáááºáááºá áá±ážááœááºážáá áºáá¯ááŒáááá·áºá¡áá« âyesâ ááá¯ááŸáááºáá«á áááºážááẠááá·áºá¡á¬áž á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶áá áºáá¯áá¯á¶ážááᯠáááºáá±á¬ááºááá¯ááºáááºááŒá áºááŒá®ážá EC2 á ááá¯á¡ááºáá±á¬ááœá²á·á ááºážáá¯á¶á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºááá¯ááºá á±áááºááŒá áºááŒá®ážá lambda áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážáá»ááá¯ááºá á±ááŒááºážá áááºááŒáá·áº áá¯ááºáá±á¬ááºááá¯ááºáááºááŒá áºáááºá
á¡áááºážá¡ááŒá áºá¡á¬ážáá¯á¶ážááᯠTerraform áá¯ááºááŸáá áºááá·áº á¡á±á¬ááºááŒááºá áœá¬áááºáá®ážááŒá®ážáá«áá áááºááẠKinesis Analytics á¡ááá®áá±ážááŸááºážáá¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááá¯á· ááœá¬ážáááºááá¯á¡ááºááẠ(áá¶ááá±á¬ááºážá áœá¬ááŒáá·áºá áááºážááᯠáá¯ááºá០ááá¯ááºááá¯ááºááŸá¬áááœá±á·áá²á·áá«)á
áá»áŸá±á¬ááºááœáŸá¬ááá¯ááœáá·áºáá«-
áááºážááŒá®ážáá±á¬ááºá drop-down á
á¬áááºážá០ááœá±ážáá»ááºááŒááºážááŒáá·áº áááºááẠá¡ááá¡áááºáž á¡ááá®áá±ážááŸááºážá¡ááœááºáž á
á®ážááŒá±á¬ááºážá¡áááºááᯠáááºááŸááºááá«áááºá
á¡áá¯áá±á¬á· á¡á¬ážáá¯á¶ážá¡áááºááá·áºááŒá
áºáá±áá«ááŒá®á
áá»áŸá±á¬ááºááœáŸá¬ááá¯á ááºážáááºááŒááºážá
áááºá áá áºá¡á¬áž áááºááá¯á·á¡áá¯á¶ážááŒá¯áááºááŒá áºá á± áá°ááá¯ááºááá¯áẠááá¯á·ááá¯áẠTerraform áá¯ááºááŸáá áºááá·áº áááºááá¯á·áááºáá¯ááºáá±á¬ááºá á±áá¬áá° áááºážááẠáá°áá®áááºááŒá áºáááºá
Kinesis Agent ááᯠááá·áºááœááºážááŒá®áž api_caller.py script ááᯠrun ááá·áº EC2 virtual machine ááá¯á· áá»áœááºá¯ááºááá¯á· SSH ááŸáá áºááá·áº á¡áá±á¬áá·áºáááºáá«
sudo ./api_caller.py TOKEN
áááºáá¯ááºáááŸá¬á ááá·áºáá¶áá«ááºáá®ááᯠSMS áá áºá á±á¬ááºááᯠá á±á¬áá·áºááá¯ááºáá«á
SMS - 1 áááá
áºáá®ážáá«ážá¡ááŒá¬ááœááºáá¯ááºážáá²ááá¯á·áááºáá±á·ááºá»áá
áºáá¯áá±á¬ááºáá¬áááº-
áá±á¬ááºáááºááœá²á¡áá±ážá
áááºááœá²ááŒááºážá
áááºááŒá¬áááºá¡ááœáẠááŸááºáááºážáá»á¬ážááᯠDynamoDB áá±áá¬áá±á·á
áºááœáẠááááºážáááºážáá¬ážááŒááºážááŸááááŸá ááŒáá·áºááŸá¯áááºáá»ááºáá±áá±ážáááºá airline_tickets ááá¬ážááœáẠááá·áºááŸááºážááŒá±á¡á¬ážááŒáá·áº á¡á±á¬ááºáá«áá±áá¬áá»á¬áž áá«áááºáááº-
áá±á¬ááºáá»ááº
á¡áá¯ááºááŒá®ážáá»áááºááŸá¬á Amazon Kinesis ááᯠá¡ááŒá±áá¶ááŒá®áž á¡áœááºááá¯ááºážáá±áᬠá á®áá¶áá±á¬ááºááœááºáá±ážáá²á· á áá áºáá áºáá¯ááᯠáááºáá±á¬ááºáá²á·áá«áááºá Kinesis Agent ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠááœá±ážáá»ááºá áá¬áá»á¬ážááᯠKinesis Data Streams ááŸáá·áº SQL ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á á¡áá»áááºááŸáá·áºáá áºááŒá±ážáá® ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ Kinesis Analytics ááŸáá·áº Amazon Kinesis á á¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯á¡ááŒáẠá¡ááŒá¬ážáá±á¬ AWS áááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá·áº á¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááᯠááá·áºááœááºážá ááºážá á¬ážáá²á·áááºá
áá»áœááºá¯ááºááá¯á·ááẠá¡áááºáá±á¬áºááŒáá«á áá áºááᯠáááºážáááºážááŸá áºáá»áá¯ážááŒáá·áº ááŒáá·áºáá»ááºáá¬ážáááº- á¡áá±á¬áºáá±ážááŸááºáá»á¬ážáá±á¬ áááºá áœá²á á¬á¡á¯ááºááŸáá·áº Terraform áá¯ááºá០á¡ááŒááºáá áºáá¯á
ááá±á¬áá»áẠá¡áááºážá¡ááŒá
áºáá¯ááºá¡á¬ážáá¯á¶áž áááá¯ááºáá«áááºá
áá±á¬ááºážáá«ážááᯠááœá±ážááœá±ážááᬠáááºážáá¬áá«áááºá áááºážáá²á· ááŸááºáá»ááºááœá±ááᯠá á±á¬áá·áºáá»áŸá±á¬áºáá±áá«áááºá á¡ááŒá¯ááá±á¬áá±á¬ááºáá²á· áá±áááºááŸá¯ááœá±ááᯠáá»áŸá±á¬áºááá·áºáá«áááºá
á¡á±á¬ááºááŒááºáá«á
á±ááá¯á· áá¯áá±á¬ááºážáá«áááºá
source: www.habr.com