рд╣реЗ рд╣рдмрд░!
рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдЙрдбрд╝рд╛рдирд╛ рдкрд╕рдВрдж рд╣реИ? рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЖрддреНрдо-рдЕрд▓рдЧрд╛рд╡ рдХреЗ рджреМрд░рд╛рди рдореБрдЭреЗ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рд╕рдВрд╕рд╛рдзрди - рдПрд╡рд┐рдПрд╕реЗрд▓реНрд╕ рд╕реЗ рд╣рд╡рд╛рдИ рдЯрд┐рдХрдЯреЛрдВ рдкрд░ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рднреА рд╢реМрдХ рд╣реЛ рдЧрдпрд╛ред
рдЖрдЬ рд╣рдо рдЕрдореЗрдЬрд╝реЕрди рдХрд┐рдиреЗрд╕рд┐рд╕ рдХреЗ рдХрд╛рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдЕрдореЗрдЬрд╝реЕрди рдбрд╛рдпрдиреЗрдореЛрдбреАрдмреА рдиреЛрдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдореБрдЦреНрдп рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЯрд┐рдХрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдПрд╕рдПрдордПрд╕ рд╕реВрдЪрдирд╛рдПрдВ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред
рд╕рднреА рд╡рд┐рд╡рд░рдг рдХрдЯреМрддреА рдХреЗ рдЕрдзреАрди рд╣реИрдВ! рдЬрд╛рдирд╛!
рдкрд░рд┐рдЪрдп
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп AWS рдореЗрдВ рд╕реВрдЪрдирд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рджреЗрдирд╛ рд╣реИ; рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╕рдЦреНрддреА рд╕реЗ рдЕрджреНрдпрддрд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреИрд╢ рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╣реИ рдкрд┐рдЫрд▓реЗ 48 рдШрдВрдЯреЛрдВ рдореЗрдВ Aviasales.ru рдФрд░ Jetradar.com рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рдЦреЛрдЬреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЙрддреНрдкрд╛рджрди рдорд╢реАрди рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд╛рдЗрдиреЗрд╕рд┐рд╕-рдПрдЬреЗрдВрдЯ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдЗрдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкрд╛рд░реНрд╕ рдФрд░ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдХрдЪреНрдЪрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реАрдзреЗ рд╕реНрдЯреЛрд░ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред DynamoDB рдореЗрдВ рддреИрдирд╛рдд рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг AWS рдХреНрд╡рд┐рдХ рд╕рд╛рдЗрдЯ рдЬреИрд╕реЗ BI рдЯреВрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрд╣рди рдЯрд┐рдХрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╣рдо рд╕рдВрдкреВрд░реНрдг рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
- рдореИрдиреБрдЕрд▓ - AWS рдкреНрд░рдмрдВрдзрди рдХрдВрд╕реЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ;
- рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХреЛрдб рдХрд╛ рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЖрд▓рд╕реА рдСрдЯреЛрдореЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИ;
рд╡рд┐рдХрд╕рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рдкреНрд░рдпреБрдХреНрдд рдШрдЯрдХ:
рдПрд╡рд┐рдПрд╕реЗрд▓реНрд╕ рдПрдкреАрдЖрдИ - рдЗрд╕ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛;EC2 рдирд┐рд░реНрдорд╛рддрд╛ рдЙрджрд╛рд╣рд░рдг - рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЬрд┐рд╕ рдкрд░ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА:рдХрд╛рдЗрдиреЗрд╕рд┐рд╕ рдПрдЬреЗрдВрдЯ рдорд╢реАрди рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдХрд┐рдЗрдиреЗрд╕рд┐рд╕ (рдХрд╛рдЗрдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдпрд╛ рдХрд┐рдиреЗрд╕рд┐рд╕ рдлрд╛рдпрд░рд╣реЛрдЬ) рдХреЛ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдФрд░ рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдЬреЗрдВрдЯ рд▓рдЧрд╛рддрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рдиреЗрд╕рд┐рд╕ рдХреЛ рдирдпрд╛ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИ;рдПрдкреАрдЖрдИ рдХреЙрд▓рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ - рдПрдХ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓рддреА рд╣реИ рдЬрд┐рд╕рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд┐рдиреЗрд╕рд┐рд╕ рдПрдЬреЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ;
рдХрд┐рдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо - рд╡реНрдпрд╛рдкрдХ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╕реЗрд╡рд╛;рдХрд┐рдиреЗрд╕рд┐рд╕ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдПрдХ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИред рдЕрдореЗрдЬрд╝реЕрди рдХрд┐рдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреА рдХрд┐рд╕реА рднреА рдорд╛рддреНрд░рд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рддрд╛ рд╣реИ;AWS рд▓рд╛рдореНрдмрд╛ - рдПрдХ рд╕реЗрд╡рд╛ рдЬреЛ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдХрд╛ рдмреИрдХрдЕрдк рдпрд╛ рд╕реЗрдЯрдЕрдк рдХрд┐рдП рдмрд┐рдирд╛ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рдХреНрддрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдкреА рдЬрд╛рддреА рд╣реИ;рдЕрдореЗрдЬрд╝реЕрди рдбрд╛рдпрдиреЗрдореЛрдбреАрдмреА - рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХрд╛ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреИрдорд╛рдиреЗ рдкрд░ рдЪрд▓рддреЗ рд╕рдордп 10 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реЗ рдХрдо рдХреА рд╡рд┐рд▓рдВрдмрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред DynamoDB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХрд┐рд╕реА рд╕рд░реНрд╡рд░ рдХрд╛ рдкреНрд░рд╛рд╡рдзрд╛рди, рдкреИрдЪ рдпрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред DynamoDB рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред рдХрд┐рд╕реА рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рд╢рд╛рд╕рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ;рдЕрдореЗрдЬрд╝реЕрди рдПрд╕рдПрдирдПрд╕ - рдкреНрд░рдХрд╛рд╢рдХ-рдЧреНрд░рд╛рд╣рдХ (рдкрдм/рдЙрдк) рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рд╕реЗрд╡рд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ, рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдФрд░ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрд╕рдПрдирдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЛрдмрд╛рдЗрд▓ рдкреБрд╢ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди, рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢ рдФрд░ рдИрдореЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг
рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрд╡рд┐рдПрд╕реЗрд▓реНрд╕ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдИ рдЧрдИ рдПрдпрд░рд▓рд╛рдЗрди рдЯрд┐рдХрдЯ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдореЗрдВ
рддреЛ, рдЖрдЗрдП рдкрдВрдЬреАрдХрд░рдг рдХрд░реЗрдВ рдФрд░ рдЕрдкрдирд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрд░реЛрдз рдиреАрдЪреЗ рд╣реИ:
http://api.travelpayouts.com/v2/prices/month-matrix?currency=rub&origin=LED&destination=HKT&show_to_affiliates=true&token=TOKEN_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
}]
}
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдПрдкреАрдЖрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рд╕реЗ рдлреБрдХ рддрдХ рдХрд╛ рдЯрд┐рдХрдЯ рджрд┐рдЦрд╛рддреА рд╣реИ... рдУрд╣, рдХреНрдпрд╛ рд╕рдкрдирд╛ рд╣реИ...
рдЪреВрдБрдХрд┐ рдореИрдВ рдХрдЬрд╝рд╛рди рд╕реЗ рд╣реВрдБ, рдФрд░ рдлреБрдХреЗрдд рдЕрдм "рдХреЗрд╡рд▓ рдПрдХ рд╕рдкрдирд╛" рд╣реИ, рдЖрдЗрдП рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рд╕реЗ рдХрдЬрд╝рд╛рди рддрдХ рдХреЗ рдЯрд┐рдХрдЯ рджреЗрдЦреЗрдВред
рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ AWS рдЦрд╛рддрд╛ рд╣реИред рдореИрдВ рддреБрд░рдВрдд рдЗрд╕ рддрдереНрдп рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХрд╛рдЗрдиреЗрд╕рд┐рд╕ рдФрд░ рдПрд╕рдПрдордПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдирд╛ рд╡рд╛рд░реНрд╖рд┐рдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ
рдирд┐рдГрд╢реБрд▓реНрдХ рдЯрд┐рдпрд░ (рдореБрдлрд╝реНрдд рдЙрдкрдпреЛрдЧ) . рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХреБрдЫ рдбреЙрд▓рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред рдФрд░, рдирд┐рдГрд╕рдВрджреЗрд╣, рдЬрдм рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд░рд╣ рдЬрд╛рдП рддреЛ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдирд╛ рди рднреВрд▓реЗрдВред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрджрд┐ рд╣рдо рдЕрдкрдиреА рдорд╛рд╕рд┐рдХ рдирд┐рдГрд╢реБрд▓реНрдХ рд╕реАрдорд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ DynamoDb рдФрд░ Lambda рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирд┐рдГрд╢реБрд▓реНрдХ рд╣реЛрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, DynamoDB рдХреЗ рд▓рд┐рдП: 25 рдЬреАрдмреА рд╕реНрдЯреЛрд░реЗрдЬ, 25 WCU/RCU рдФрд░ 100 рдорд┐рд▓рд┐рдпрди рдХреНрд╡реЗрд░реАрдЬрд╝ред рдФрд░ рдкреНрд░рддрд┐ рдорд╛рд╣ рджрд╕ рд▓рд╛рдЦ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ред
рдореИрдиреБрдЕрд▓ рд╕рд┐рд╕реНрдЯрдо рдкрд░рд┐рдирд┐рдпреЛрдЬрди
рдХрд┐рдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреА рд╕реНрдерд╛рдкрдирд╛
рдЖрдЗрдП рдХрд┐рдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рд╕реЗрд╡рд╛ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рджреЛ рдирдИ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдПрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рд░реНрдбред
рд╢рд╛рд░реНрдб рдХреНрдпрд╛ рд╣реИ?
рд╢рд╛рд░реНрдб рдЕрдореЗрдЬрд╝реЕрди рдХрд┐рдиреЗрд╕рд┐рд╕ рд╕реНрдЯреНрд░реАрдо рдХреА рдореВрд▓ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЗрдХрд╛рдИ рд╣реИред рдПрдХ рдЦрдВрдб 1 рдПрдордмреА/рд╕реЗрдХреЗрдВрдб рдХреА рдЧрддрд┐ рд╕реЗ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдФрд░ 2 рдПрдордмреА/рд╕реЗрдХреЗрдВрдб рдХреА рдЧрддрд┐ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЦрдВрдб рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1000 PUT рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╕реЗрдЧрдореЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рджреЛ рдЦрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо 2 рдПрдордмреА/рдПрд╕ рдкрд░ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдФрд░ 4 рдПрдордмреА/рдПрд╕ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 2000 рдкреБрдЯ рд░рд┐рдХреЙрд░реНрдб рддрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ред
рдЖрдкрдХреА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдЯреБрдХрдбрд╝реЗ рд╣реЛрдВрдЧреЗ, рдЙрд╕рдХрд╛ рдереНрд░реВрдкреБрдЯ рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ред рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдЯреБрдХрдбрд╝реЗ рд╣реЛрдВрдЧреЗ, рдХреАрдордд рдЙрддрдиреА рд╣реА рдЕрдзрд┐рдХ рд╣реЛрдЧреАред рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рд░реНрдб рдХреА рд▓рд╛рдЧрдд 1,5 рд╕реЗрдВрдЯ рдкреНрд░рддрд┐ рдШрдВрдЯрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рд▓рд┐рдпрди PUT рдкреЗрд▓реЛрдб рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд 1.4 рд╕реЗрдВрдЯ рд╣реИред
рдЖрдЗрдП рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдПрдВ рдПрдпрд░рд▓рд╛рдЗрди рдЯрд┐рдХрдЯ, 1 рдЯреБрдХрдбрд╝рд╛ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣реЛрдЧрд╛:
рдЕрдм рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдереНрд░реЗрдб рдмрдирд╛рддреЗ рд╣реИрдВ рд╡рд┐рд╢реЗрд╖ рдзрд╛рд░рд╛:
рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗрдЯрдЕрдк
рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдорд┐рдд EC2 рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рдорд╣рдВрдЧреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ; рдПрдХ рд╕реНрдкреЙрдЯ t2.micro рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЕрдореЗрдЬрд╝реЕрди рд▓рд┐рдирдХреНрд╕ рдПрдПрдордЖрдИ 2018.03.0, рдЗрд╕рдореЗрдВ рдХрд┐рдиреЗрд╕рд┐рд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рддреБрд░рдВрдд рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред
EC2 рд╕реЗрд╡рд╛ рдкрд░ рдЬрд╛рдПрдВ, рдПрдХ рдирдИ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрдирд╛рдПрдВ, t2.micro рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд AMI рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЬреЛ рдлреНрд░реА рдЯрд┐рдпрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:
рдирд╡ рдирд┐рд░реНрдорд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдХрд┐рдиреЗрд╕рд┐рд╕ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдПрдХ IAM рднреВрдорд┐рдХрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЪрд░рдг 3: рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рд╡рд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░, рдЖрдкрдХреЛ рдЪрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдирдИ IAM рднреВрдорд┐рдХрд╛ рдмрдирд╛рдПрдБ:
EC2 рдХреЗ рд▓рд┐рдП IAM рднреВрдорд┐рдХрд╛ рдмрдирд╛рдирд╛
рдЦреБрд▓рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдЪреБрдиреЗрдВ рдХрд┐ рд╣рдо EC2 рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рднреВрдорд┐рдХрд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдБ:
рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд╕реНрддреГрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рд╕рднреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдореЗрдЬрд╝реЕрди рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗ: AmazonKineticFullAccess рдФрд░ CloudWatchFullAccessред
рдЖрдЗрдП рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХреЛ рдХреБрдЫ рд╕рд╛рд░реНрдердХ рдирд╛рдо рджреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: EC2-KinesisStreams-FullAccessред рдкрд░рд┐рдгрд╛рдо рд╡реИрд╕рд╛ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдиреАрдЪреЗ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЗрд╕ рдирдИ рднреВрдорд┐рдХрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ:
рд╣рдо рдЗрд╕ рд╕реНрдХреНрд░реАрди рдкрд░ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реА рд╡рд┐рдВрдбреЛ рдкрд░ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред
рд╣рд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЯреИрдЧ рднреА (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЙрджрд╛рд╣рд░рдг рдХреЛ рдПрдХ рдирд╛рдо рджреЗрдВ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ)ред
рдЕрдм рд╣рдо рдЪрд░рдг 6 рдкрд░ рд╣реИрдВ: рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЯреИрдм, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдмрдирд╛рдиреЗ рдпрд╛ рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрд╕рдПрд╕рдПрдЪ (рдкреЛрд░реНрдЯ 22) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд╣рд╛рдВ рд╕реНрд░реЛрдд -> рдореЗрд░рд╛ рдЖрдИрдкреА рдЪреБрдиреЗрдВ рдФрд░ рдЖрдк рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд▓реЙрдиреНрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдЪрд╛рд▓реВ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдк ssh рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╢реАрди рд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХрд╛рдЗрдиреЗрд╕рд┐рд╕ рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
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
рдЖрдЗрдП рдПрдкреАрдЖрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ:
sudo mkdir /var/log/airline_tickets
рдПрдЬреЗрдВрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
sudo vim /etc/aws-kinesis/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 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдпрд░рд▓рд╛рдЗрди_рдЯрд┐рдХрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛ред
рд╣рдо рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЪрд╛рд▓реВ рд╣реИ:
sudo service aws-kinesis-agent restart
рдЕрдм рдЖрдЗрдП рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдЬреЛ рдПрдкреАрдЖрдИ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдЧреА:
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 рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рд╣реЗрдЬрддреА рд╣реИ рдЬрд┐рд╕реЗ Kinetic рдПрдЬреЗрдВрдЯ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рдорд╛рдирдХ рд╣реИ, рдПрдХ рдЯрд┐рдХрдЯрдПрдкреА рдХреНрд▓рд╛рд╕ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдПрдкреАрдЖрдИ рдЦреАрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдФрд░ рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реЗрдбрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
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
рдФрд░ рд╣рдо рдПрдЬреЗрдВрдЯ рд▓реЙрдЧ рдореЗрдВ рдФрд░ рдПрдпрд░рд▓рд╛рдЗрди_рдЯрд┐рдХрдЯ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдЯреИрдм рдкрд░ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:
tail -f /var/log/aws-kinesis-agent/aws-kinesis-agent.log
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд╛рдЗрдиреЗрд╕рд┐рд╕ рдПрдЬреЗрдВрдЯ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред рдЕрдм рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред
рдХрд┐рдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХреА рд╕реНрдерд╛рдкрдирд╛
рдЖрдЗрдП рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХреЗрдВрджреНрд░реАрдп рдШрдЯрдХ рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВ - рдХрд╛рдЗрдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдореЗрдВ рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдХрд┐рдиреЗрд╕рд┐рд╕_рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕_рдПрдпрд░рд▓рд╛рдЗрдиреНрд╕_рдПрдк рд╣реИ:
рдХрд┐рдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдЖрдкрдХреЛ SQL рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдиреЗрд╕рд┐рд╕ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдСрдЯреЛрд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╕реЗрд╡рд╛ рд╣реИ (рдХрд┐рдиреЗрд╕рд┐рд╕ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╡рд┐рдкрд░реАрдд) рдЬреЛ:
- рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирдИ рд╕реНрдЯреНрд░реАрдо (рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо) рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рддреНрд░реБрдЯрд┐ рд╕реНрдЯреНрд░реАрдо);
- рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рдпрд╣ рдХреЛрдИ рд╕рд╕реНрддреА рд╕реЗрд╡рд╛ рдирд╣реАрдВ рд╣реИ - рдХрд╛рдо рдХреЗ рдкреНрд░рддрд┐ рдШрдВрдЯреЗ 0.11 рдЕрдореЗрд░рд┐рдХреА рдбреЙрд▓рд░, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдЗрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
рдЙрд╕ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рдПрдпрд░рд▓рд╛рдЗрди_рдЯрд┐рдХрдЯ):
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдПрдХ рдирдИ IAM рднреВрдорд┐рдХрд╛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдкрдврд╝ рд╕рдХреЗ рдФрд░ рд╕реНрдЯреНрд░реАрдо рдкрд░ рд▓рд┐рдЦ рд╕рдХреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕реЗрд╕ рдЕрдиреБрдорддрд┐ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреБрдЫ рднреА рди рдмрджрд▓рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
рдЕрдм рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдХреАрдорд╛ рдХреА рдЦреЛрдЬ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ; рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рдбрд┐рд╕реНрдХрд╡рд░ рд╕реНрдХреАрдорд╛" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, IAM рднреВрдорд┐рдХрд╛ рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдПрдЧреА (рдПрдХ рдирдИ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА) рдФрд░ рд╕реНрдХреАрдорд╛ рдбрд┐рдЯреЗрдХреНрд╢рди рдЙрд╕ рдбреЗрдЯрд╛ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╣реА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЖ рдЪреБрдХрд╛ рд╣реИ:
рдЕрдм рдЖрдкрдХреЛ SQL рдПрдбрд┐рдЯрд░ рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЬрдм рдЖрдк рдЗрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдПрдХ рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА рдЬреЛ рдЖрдкрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧреА - рдЪреБрдиреЗрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
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 рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЕрдореЗрдЬрд╝реЕрди рдХрд┐рдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдореЗрдВ, рдЖрдк рд╕реНрдЯреНрд░реАрдо (рд╕реНрдЯреНрд░реАрдо) рдФрд░ рдкрдВрдк (рдкрдВрдк) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдирд┐рд░рдВрддрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рдЕрдиреБрд░реЛрдз рдЬреЛ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВред
рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддреБрдд SQL рдХреНрд╡реЗрд░реА рдкрд╛рдБрдЪ рд╣рдЬрд╛рд░ рд░реВрдмрд▓ рд╕реЗ рдХрдо рдХреАрдордд рдкрд░ рдПрдЕрд░реЛрдлрд╝реНрд▓реЛрдд рдЯрд┐рдХрдЯреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддреА рд╣реИред рдЗрди рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд░рд┐рдХреЙрд░реНрдб DESTINATION_SQL_STREAM рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд░рдЦреЗ рдЬрд╛рдПрдВрдЧреЗред
рдЧрдВрддрд╡реНрдп рдмреНрд▓реЙрдХ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖_рд╕реНрдЯреНрд░реАрдо рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдФрд░ рдЗрди-рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреНрд░реАрдо рдирд╛рдо DESTINATION_SQL_STREAM рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдореЗрдВ:
рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
рдПрд╕рдПрдирдПрд╕ рд╡рд┐рд╖рдп рдмрдирд╛рдирд╛ рдФрд░ рдЙрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛
рд╕рд┐рдВрдкрд▓ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╡рд╣рд╛рдВ рдПрдпрд░рд▓рд╛рдЗрдВрд╕ рдирд╛рдо рд╕реЗ рдПрдХ рдирдпрд╛ рд╡рд┐рд╖рдп рдмрдирд╛рдПрдВ:
рдЗрд╕ рд╡рд┐рд╖рдп рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ рдФрд░ рд╡рд╣ рдореЛрдмрд╛рдЗрд▓ рдлрд╝реЛрди рдирдВрдмрд░ рдмрддрд╛рдПрдВ рдЬрд┐рд╕ рдкрд░ рдПрд╕рдПрдордПрд╕ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬреА рдЬрд╛рдПрдВрдЧреА:
DynamoDB рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ
рдЙрдирдХреЗ рдПрдпрд░рд▓рд╛рдЗрди_рдЯрд┐рдХрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП DynamoDB рдореЗрдВ рдЙрд╕реА рдирд╛рдо рд╕реЗ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВред рд╣рдо рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб_рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд▓реЗрдХреНрдЯрд░ рдмрдирд╛рдирд╛
рдЖрдЗрдП рдХрд▓реЗрдХреНрдЯрд░ рдирд╛рдордХ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдп рдПрдпрд░рд▓рд╛рдЗрди_рдЯрд┐рдХрдЯ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░, рдпрджрд┐ рд╡рд╣рд╛рдВ рдирдП рд░рд┐рдХреЙрд░реНрдб рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рдЗрди рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ рдбрд╛рдпрдиреЗрдореЛрдбреАрдмреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓реЗрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдкрд╛рд╕ рдХрд┐рдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рддрдХ рдкрдврд╝рдиреЗ рдХреА рдкрд╣реБрдВрдЪ рдФрд░ рдбрд╛рдпрдиреЗрдореЛрдбреАрдмреА рддрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдкрд╣реБрдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдХрд▓реЗрдХреНрдЯрд░ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ IAM рднреВрдорд┐рдХрд╛ рдмрдирд╛рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд▓рд┐рдП Lambda-TicketsProcessingRole рдирд╛рдордХ рдПрдХ рдирдИ IAM рднреВрдорд┐рдХрд╛ рдмрдирд╛рдПрдБ:
рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ AmazonKinesisReadOnlyAccess рдФрд░ AmazonDynamoDBFullAccess рдиреАрддрд┐рдпрд╛рдВ рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЬрдм рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдПрдпрд░рд▓рд╛рдЗрди_рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИрдВ рддреЛ рдЗрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдХрд┐рдиреЗрд╕рд┐рд╕ рдХреЗ рдПрдХ рдЯреНрд░рд┐рдЧрд░ рджреНрд╡рд╛рд░рд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рдЯреНрд░рд┐рдЧрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдЬреЛ рдХреБрдЫ рдмрдЪрд╛ рд╣реИ рд╡рд╣ рдХреЛрдб рдбрд╛рд▓рдирд╛ рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рд╣реИред
"""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()
рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рдмрдирд╛рдирд╛
рджреВрд╕рд░рд╛ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рджреВрд╕рд░реА рд╕реНрдЯреНрд░реАрдо (рд╡рд┐рд╢реЗрд╖_рд╕реНрдЯреНрд░реАрдо) рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛ рдФрд░ рдПрд╕рдПрдирдПрд╕ рдХреЛ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рднреЗрдЬреЗрдЧрд╛, рдЙрд╕реА рддрд░рд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдкрд╛рд╕ рдХрд┐рдиреЗрд╕рд┐рд╕ рд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдПрд╕рдПрдирдПрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдкрд╣реБрдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдПрд╕рдПрдирдПрд╕ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ (рдИрдореЗрд▓, рдПрд╕рдПрдордПрд╕, рдЖрджрд┐) рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
IAM рднреВрдорд┐рдХрд╛ рдмрдирд╛рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд▓рд┐рдП IAM рднреВрдорд┐рдХрд╛ рд▓реИрдореНрдмреНрдбрд╛-рдХрд┐рдиреЗрд╕рд┐рд╕рдЕрд▓рд╛рд░реНрдо рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХреЛ рдмрдирд╛рдП рдЬрд╛ рд░рд╣реЗ рдЕрд▓рд╛рд░реНрдо_рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рд╕реМрдВрдкрддреЗ рд╣реИрдВ:
рдЗрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рд╡рд┐рд╢реЗрд╖_рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХреЛ рдЙрд╕реА рддрд░рд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдордиреЗ рдХрд▓реЗрдХреНрдЯрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред
рдЗрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рдирдпрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдкреЗрд╢ рдХрд░реЗрдВ - TOPIC_ARN, рдЬрд╣рд╛рдВ рд╣рдо рдПрдпрд░рд▓рд╛рдЗрдВрд╕ рд╡рд┐рд╖рдп рдХреЗ ANR (рдЕрдореЗрдЬрд╝реЕрди рд░реАрдХреЛрд░реНрд╕ рдирд╛рдо) рд░рдЦрддреЗ рд╣реИрдВ:
рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛрдб рдбрд╛рд▓реЗрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ:
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.exe plan
рдЖрдкрдХреЛ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрди рдирдВрдмрд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЗрд╕реЗ рджрд░реНрдЬ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдВрдЪрд╛рд▓рди рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
terraform.exe apply
рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рдПрдХ рдлрд╝реЛрди рдирдВрдмрд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛; рдЬрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдкреНрд░рд╢реНрди рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдП рддреЛ "рд╣рд╛рдВ" рдбрд╛рдпрд▓ рдХрд░реЗрдВред рдпрд╣ рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ, EC2 рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд░рдиреЗ, рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдЖрджрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдЯреЗрд░рд╛рдлрд╝реЙрд░реНрдо рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рд╕рдВрд╕рд╛рдзрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдХрд┐рдиреЗрд╕рд┐рд╕ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдХрд┐ рдЗрд╕реЗ рд╕реАрдзреЗ рдХреЛрдб рд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП)ред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рд╕реЗ рдЪрдпрди рдХрд░рдХреЗ рдЗрди-рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреНрд░реАрдо рдирд╛рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
рдЕрдм рд╕рдм рдХреБрдЫ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ.
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг
рднрд▓реЗ рд╣реА рдЖрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпрд╛ рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рднреА рддреИрдирд╛рдд рдХрд┐рдпрд╛ рд╣реЛ, рдпрд╣ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рд╣рдо SSH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ EC2 рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд╛рдЗрдиреЗрд╕рд┐рд╕ рдПрдЬреЗрдВрдЯ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдФрд░ api_caller.py рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ
sudo ./api_caller.py TOKEN
рдЖрдкрдХреЛ рдмрд╕ рдЕрдкрдиреЗ рдирдВрдмрд░ рдкрд░ рдПрдХ рдПрд╕рдПрдордПрд╕ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реИ:
рдПрд╕рдПрдордПрд╕ - рд▓рдЧрднрдЧ 1 рдорд┐рдирдЯ рдореЗрдВ рдлрд╝реЛрди рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдЖрддрд╛ рд╣реИ:
рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд░рд┐рдХреЙрд░реНрдб рдмрд╛рдж рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдбрд╛рдпрдиреЗрдореЛрдбреАрдмреА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЧрдП рдереЗред рдПрдпрд░рд▓рд╛рдЗрди_рдЯрд┐рдХрдЯ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ:
рдирд┐рд╖реНрдХрд░реНрд╖
рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЗ рджреМрд░рд╛рди, рдЕрдореЗрдЬрд╝реЕрди рдХрд┐рдиреЗрд╕рд┐рд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдСрдирд▓рд╛рдЗрди рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХрд┐рдиреЗрд╕рд┐рд╕ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рдХрд┐рдиреЗрд╕рд┐рд╕ рдПрдЬреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдПрд╕рдХреНрдпреВрдПрд▓ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рдиреЗрд╕рд┐рд╕ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдиреНрдп рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдореЗрдЬрд╝реЕрди рдХрд┐рдиреЗрд╕рд┐рд╕ рдХреА рдмрд╛рддрдЪреАрдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рд╣рдордиреЗ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рдгрд╛рд▓реА рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рд╣реИ: рдПрдХ рдХрд╛рдлреА рд▓рдВрдмрд╛ рдореИрдиреБрдЕрд▓ рдФрд░ рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХреЛрдб рд╕реЗ рдПрдХ рддреНрд╡рд░рд┐рддред
рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрд░реЛрдд рдХреЛрдб рдЙрдкрд▓рдмреНрдз рд╣реИ
рдореБрдЭреЗ рд▓реЗрдЦ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ, рдореИрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдБред
рдореИрдВ рдЖрдкрдХреЛ рд╕рдлрд▓рддрд╛ рдХреА рдХрд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ!
рд╕реНрд░реЛрдд: www.habr.com