Aviasales API integrÄcija ar Amazon Kinesis un vienkÄrŔība bez serveriem
Äau Habr!
Vai jums patÄ«k lidot ar lidmaŔīnÄm? Man tas patÄ«k, bet paÅ”izolÄcijas laikÄ es iemÄ«lÄjos arÄ« aviobiļeÅ”u datu analÄ«zÄ no viena labi zinÄma resursa - Aviasales.
Å odien mÄs analizÄsim Amazon Kinesis darbu, izveidosim straumÄÅ”anas sistÄmu ar reÄllaika analÄ«zi, kÄ galveno datu krÄtuvi instalÄsim Amazon DynamoDB NoSQL datu bÄzi un iestatÄ«sim SMS paziÅojumus interesantÄm biļetÄm.
Visas detaļas ir zem griezuma! Aiziet!
Ievads
PiemÄram, mums ir nepiecieÅ”ama piekļuve Aviasales API. Piekļuve tai tiek nodroÅ”inÄta bez maksas un bez ierobežojumiem; jums tikai jÄreÄ£istrÄjas sadaÄ¼Ä āIzstrÄdÄtÄjiā, lai saÅemtu API marÄ·ieri, lai piekļūtu datiem.
Å Ä« raksta galvenais mÄrÄ·is ir sniegt vispÄrÄju izpratni par informÄcijas straumÄÅ”anas izmantoÅ”anu AWS; mÄs Åemam vÄrÄ, ka izmantotie API atgrieztie dati nav stingri atjauninÄti un tiek pÄrsÅ«tÄ«ti no keÅ”atmiÅas, kas ir izveidots, pamatojoties uz vietÅu Aviasales.ru un Jetradar.com lietotÄju meklÄjumiem pÄdÄjo 48 stundu laikÄ.
Kinesis aÄ£ents, kas instalÄts ražoÅ”anas maŔīnÄ un saÅemts, izmantojot API, automÄtiski parsÄs un pÄrsÅ«tÄ«s datus uz vÄlamo straumi, izmantojot Kinesis Data Analytics. Å Ä«s straumes neapstrÄdÄtÄ versija tiks rakstÄ«ta tieÅ”i veikalÄ. DynamoDB izvietotÄ neapstrÄdÄto datu krÄtuve ļaus veikt dziļÄku biļeÅ”u analÄ«zi, izmantojot BI rÄ«kus, piemÄram, AWS Quick Sight.
MÄs apsvÄrsim divas iespÄjas visas infrastruktÅ«ras izvietoÅ”anai:
RokasgrÄmata - izmantojot AWS pÄrvaldÄ«bas konsoli;
InfrastruktÅ«ra no Terraform koda ir paredzÄta slinkiem automÄtiem;
IzstrÄdÄtÄs sistÄmas arhitektÅ«ra
IzmantotÄs sastÄvdaļas:
Aviasales API ā Ŕīs API atgrieztie dati tiks izmantoti visam turpmÄkajam darbam;
EC2 ražotÄja instance ā parasta virtuÄlÄ maŔīna mÄkonÄ«, kurÄ tiks Ä£enerÄta ievades datu straume:
KinÄzes aÄ£ents ir ierÄ«cÄ lokÄli instalÄta Java lietojumprogramma, kas nodroÅ”ina vienkÄrÅ”u veidu, kÄ apkopot un nosÅ«tÄ«t datus uz Kinesis (Kinesis Data Streams vai Kinesis Firehose). AÄ£ents pastÄvÄ«gi uzrauga failu kopu norÄdÄ«tajos direktorijos un nosÅ«ta jaunus datus uz Kinesis;
API zvanÄ«tÄja skripts ā Python skripts, kas veic pieprasÄ«jumus API un ievieto atbildi mapÄ, kuru uzrauga Kinesis aÄ£ents;
Kinesis datu straumes ā reÄllaika datu straumÄÅ”anas pakalpojums ar plaÅ”Äm mÄrogoÅ”anas iespÄjÄm;
KinÄzes analÄ«ze ir pakalpojums bez serveriem, kas vienkÄrÅ”o straumÄÅ”anas datu analÄ«zi reÄllaikÄ. Amazon Kinesis Data Analytics konfigurÄ lietojumprogrammu resursus un automÄtiski mÄrogojas, lai apstrÄdÄtu jebkÄda apjoma ienÄkoÅ”os datus;
AWS Lambda ā pakalpojums, kas ļauj palaist kodu bez dublÄÅ”anas vai serveru iestatÄ«Å”anas. Visa skaitļoÅ”anas jauda tiek automÄtiski mÄrogota katram zvanam;
Amazon DynamoDB - AtslÄgu un vÄrtÄ«bu pÄru un dokumentu datu bÄze, kas nodroÅ”ina latentumu, kas mazÄks par 10 milisekundÄm, ja darbojas jebkurÄ mÄrogÄ. Izmantojot DynamoDB, jums nav jÄnodroÅ”ina, jÄlabo vai jÄpÄrvalda serveri. DynamoDB automÄtiski mÄrogo tabulas, lai pielÄgotu pieejamo resursu apjomu un uzturÄtu augstu veiktspÄju. Nav nepiecieÅ”ama sistÄmas administrÄÅ”ana;
Amazon SNS - pilnÄ«bÄ pÄrvaldÄ«ts pakalpojums ziÅojumu sÅ«tÄ«Å”anai, izmantojot izdevÄja-abonenta (Pub/Sub) modeli, ar kuru varat izolÄt mikropakalpojumus, izkliedÄtÄs sistÄmas un lietojumprogrammas bez serveriem. SNS var izmantot, lai nosÅ«tÄ«tu informÄciju gala lietotÄjiem, izmantojot mobilos push paziÅojumus, SMS un e-pastus.
SÄkotnÄjÄ apmÄcÄ«ba
Lai atdarinÄtu datu plÅ«smu, es nolÄmu izmantot Aviasales API atgriezto informÄciju par aviobiļetÄm. IN dokumentÄcija diezgan plaÅ”s dažÄdu metožu saraksts, Åemsim vienu no tiem - āMÄneÅ”a cenu kalendÄrsā, kas atgriež cenas katrai mÄneÅ”a dienai, sagrupÄtas pÄc pÄrskaitÄ«jumu skaita. Ja pieprasÄ«jumÄ nenorÄdÄ«siet meklÄÅ”anas mÄnesi, informÄcija tiks atgriezta par nÄkamo mÄnesi pÄc paÅ”reizÄjÄ mÄneÅ”a.
TÄtad, reÄ£istrÄsimies un saÅemsim savu žetonu.
AugÅ”ÄjÄ API atbildes piemÄrÄ ir redzama biļete no SanktpÄterburgas uz Puku... Ak, kÄds sapnis...
TÄ kÄ esmu no KazaÅas, un Puketa tagad ir ātikai sapnisā, tad meklÄsim biļetes no SanktpÄterburgas uz KazaÅu.
Tiek pieÅemts, ka jums jau ir AWS konts. Uzreiz vÄlos vÄrst Ä«paÅ”u uzmanÄ«bu, ka Kinesis un paziÅojumu sÅ«tÄ«Å”ana ar SMS nav iekļauta gada Bezmaksas lÄ«menis (bezmaksas izmantoÅ”ana). Bet pat neskatoties uz to, ar pÄris dolÄriem prÄtÄ, ir pilnÄ«gi iespÄjams izveidot piedÄvÄto sistÄmu un spÄlÄt ar to. Un, protams, neaizmirstiet izdzÄst visus resursus pÄc tam, kad tie vairs nav vajadzÄ«gi.
Par laimi, DynamoDb un lambda funkcijas mums bÅ«s bez maksas, ja mÄs izpildÄ«sim savus mÄneÅ”a bezmaksas limitus. PiemÄram, DynamoDB: 25 GB krÄtuve, 25 WCU/RCU un 100 miljoni vaicÄjumu. Un miljons lambda funkciju zvanu mÄnesÄ«.
SistÄmas manuÄla izvietoÅ”ana
Kinesis datu straumju iestatīŔana
Dosimies uz pakalpojumu Kinesis Data Streams un izveidosim divas jaunas straumes, katrai pa vienai shardam.
Kas ir lauskas?
Shard ir Amazon Kinesis straumes pamata datu pÄrsÅ«tÄ«Å”anas vienÄ«ba. Viens segments nodroÅ”ina ievades datu pÄrraidi ar Ätrumu 1 MB/s un izejas datu pÄrraidi ar Ätrumu 2 MB/s. Viens segments atbalsta lÄ«dz 1000 PUT ierakstiem sekundÄ. Veidojot datu straumi, jÄnorÄda nepiecieÅ”amais segmentu skaits. PiemÄram, varat izveidot datu straumi ar diviem segmentiem. Å Ä« datu straume nodroÅ”inÄs ieejas datu pÄrsÅ«tÄ«Å”anu ar Ätrumu 2 MB/s un izejas datu pÄrraidi ar Ätrumu 4 MB/s, atbalstot lÄ«dz 2000 PUT ierakstiem sekundÄ.
Jo vairÄk Ŕķembu jÅ«su straumÄ, jo lielÄka ir tÄs caurlaidspÄja. PrincipÄ plÅ«smas tiek mÄrogotas Å”Ädi - pievienojot skaidiÅas. Bet jo vairÄk lauskas jums ir, jo augstÄka cena. Katra Ŕķemba maksÄ 1,5 centus stundÄ un papildu 1.4 centus par katru miljonu PUT kravas vienÄ«bu.
Izveidosim jaunu straumi ar nosaukumu aviobiļetes, viÅam pietiks ar 1 skaidiÅu:
Tagad izveidosim citu pavedienu ar nosaukumu Ä«paÅ”Ä_straume:
RažotÄja iestatÄ«Å”ana
Lai analizÄtu uzdevumu, pietiek ar parastu EC2 gadÄ«jumu kÄ datu veidotÄju. Tai nav jÄbÅ«t jaudÄ«gai, dÄrgai virtuÄlai maŔīnai; t2.micro bÅ«s lieliski piemÄrots.
SvarÄ«ga piezÄ«me: piemÄram, jums vajadzÄtu izmantot attÄlu - Amazon Linux AMI 2018.03.0, tam ir mazÄk iestatÄ«jumu, lai Ätri palaistu Kinesis Agent.
Dodieties uz pakalpojumu EC2, izveidojiet jaunu virtuÄlo maŔīnu, atlasiet vajadzÄ«go AMI ar tipu t2.micro, kas ir iekļauts bezmaksas lÄ«menÄ«:
Lai jaunizveidotÄ virtuÄlÄ maŔīna varÄtu mijiedarboties ar Kinesis servisu, tai ir jÄpieŔķir tiesÄ«bas to darÄ«t. LabÄkais veids, kÄ to izdarÄ«t, ir pieŔķirt IAM lomu. TÄpÄc ekrÄnÄ 3. darbÄ«ba: Instances informÄcijas konfigurÄÅ”ana ir jÄatlasa Izveidojiet jaunu IAM lomu:
IAM lomas izveide EC2
AtvÄrtajÄ logÄ atlasiet, ka mÄs veidojam jaunu lomu EC2, un dodieties uz sadaļu Atļaujas:
Izmantojot apmÄcÄ«bu piemÄru, mums nav jÄiedziļinÄs visÄs resursu tiesÄ«bu detalizÄtÄs konfigurÄcijas sarežģītÄ«bÄs, tÄpÄc mÄs atlasÄ«sim Amazon iepriekÅ” konfigurÄtÄs politikas: AmazonKinesisFullAccess un CloudWatchFullAccess.
MÄs neko citu Å”ajÄ ekrÄnÄ nemainÄm un pÄrejam pie nÄkamajiem logiem.
CietÄ diska iestatÄ«jumus var atstÄt kÄ noklusÄjuma iestatÄ«jumus, kÄ arÄ« tagus (lai gan laba prakse ir izmantot tagus, vismaz pieŔķiriet instancei nosaukumu un norÄdiet vidi).
Tagad mÄs atrodamies cilnÄ 6. darbÄ«ba: droŔības grupas konfigurÄÅ”ana, kur jums ir jÄizveido jauna vai jÄnorÄda esoÅ”Ä droŔības grupa, kas ļauj izveidot savienojumu ar gadÄ«jumu, izmantojot ssh (ports 22). Tur atlasiet Avots -> Mans IP un varat palaist instanci.
TiklÄ«dz tas pÄrslÄdzas uz darbÄ«bas statusu, varat mÄÄ£inÄt izveidot savienojumu ar to, izmantojot ssh.
Lai varÄtu strÄdÄt ar Kinesis Agent, pÄc veiksmÄ«gas savienojuma izveides ar iekÄrtu, terminÄlÄ jÄievada Å”Ädas komandas:
KÄ redzams no konfigurÄcijas faila, aÄ£ents pÄrraudzÄ«s failus ar paplaÅ”inÄjumu .log direktorijÄ /var/log/airline_tickets/, parsÄs tos un pÄrsÅ«tÄ«s uz aviobiļetes straumi.
MÄs restartÄjam pakalpojumu un pÄrliecinÄmies, ka tas ir izveidots un darbojas:
sudo service aws-kinesis-agent restart
Tagad lejupielÄdÄsim Python skriptu, kas pieprasÄ«s datus no API:
Skripts api_caller.py pieprasa datus no Aviasales un saglabÄ saÅemto atbildi direktorijÄ, ko skenÄ Kinesis aÄ£ents. Å Ä« skripta ievieÅ”ana ir diezgan standarta, ir TicketsApi klase, tÄ Ä¼auj asinhroni vilkt API. MÄs nododam galveni ar pilnvaru un pieprasÄm parametrus Å”ai klasei:
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)
Lai pÄrbaudÄ«tu pareizos aÄ£enta iestatÄ«jumus un funkcionalitÄti, pÄrbaudÄ«sim skriptu api_caller.py:
sudo ./api_caller.py TOKEN
Un mÄs aplÅ«kojam darba rezultÄtus aÄ£entu žurnÄlos un cilnÄ Monitorings datu straumÄ airline_tickets:
KÄ redzat, viss darbojas un Kinesis Agent veiksmÄ«gi nosÅ«ta datus uz straumi. Tagad konfigurÄsim patÄrÄtÄju.
Kinesis Data Analytics iestatīŔana
PÄrejam pie visas sistÄmas centrÄlÄs sastÄvdaļas ā izveidojiet jaunu lietojumprogrammu programmÄ Kinesis Data Analytics ar nosaukumu kinesis_analytics_airlines_app:
Kinesis Data Analytics ļauj veikt reÄllaika datu analÄ«zi no Kinesis Streams, izmantojot SQL valodu. Tas ir pilnÄ«bÄ automÄtiskÄs mÄrogoÅ”anas pakalpojums (atŔķirÄ«bÄ no Kinesis Streams), kas:
ļauj izveidot jaunas straumes (Output Stream), pamatojoties uz avota datu pieprasījumiem;
nodroÅ”ina straumi ar kļūdÄm, kas raduÅ”Äs lietojumprogrammu darbÄ«bas laikÄ (Error Stream);
var automÄtiski noteikt ievaddatu shÄmu (ja nepiecieÅ”ams, to var manuÄli pÄrdefinÄt).
Å is nav lÄts pakalpojums - 0.11 USD par darba stundu, tÄpÄc jums tas jÄizmanto uzmanÄ«gi un jÄizdzÄÅ”, kad esat pabeidzis.
Savienosim lietojumprogrammu ar datu avotu:
Atlasiet straumi, ar kuru mÄs izveidosim savienojumu (airline_tickets):
PÄc tam jums jÄpievieno jauna IAM loma, lai lietojumprogramma varÄtu lasÄ«t no straumes un rakstÄ«t straumÄ. Lai to izdarÄ«tu, pietiek neko nemainÄ«t piekļuves atļauju blokÄ:
Tagad pieprasÄ«sim datu shÄmas atklÄÅ”anu straumÄ; lai to izdarÄ«tu, noklikŔķiniet uz pogas āAtklÄt shÄmuā. RezultÄtÄ IAM loma tiks atjauninÄta (tiks izveidota jauna) un tiks palaists shÄmas noteikÅ”ana no datiem, kas jau ir nonÄkuÅ”i straumÄ:
Tagad jums jÄiet uz SQL redaktoru. NoklikŔķinot uz Ŕīs pogas, parÄdÄ«sies logs ar aicinÄjumu palaist lietojumprogrammu - atlasiet, ko vÄlaties palaist:
SQL redaktora logÄ ievietojiet Å”Ädu vienkÄrÅ”o vaicÄjumu un noklikŔķiniet uz SaglabÄt un palaist 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';
RelÄciju datu bÄzÄs jÅ«s strÄdÄjat ar tabulÄm, izmantojot INSERT priekÅ”rakstus, lai pievienotu ierakstus, un SELECT priekÅ”rakstu datu vaicÄÅ”anai. ProgrammÄ Amazon Kinesis Data Analytics jÅ«s strÄdÄjat ar straumÄm (STREAM) un sÅ«kÅiem (PUMP) ā nepÄrtrauktiem ievietoÅ”anas pieprasÄ«jumiem, kas ievieto datus no vienas lietojumprogrammas straumes citÄ straumÄ.
IepriekÅ” parÄdÄ«tais SQL vaicÄjums meklÄ Aeroflot biļetes, kuru cena ir mazÄka par pieciem tÅ«kstoÅ”iem rubļu. Visi ieraksti, kas atbilst Å”iem nosacÄ«jumiem, tiks ievietoti straumÄ DESTINATION_SQL_STREAM.
BlokÄ GalamÄrÄ·is atlasiet straumi special_stream un nolaižamajÄ sarakstÄ straumes nosaukums lietojumprogrammÄ DESTINATION_SQL_STREAM:
Visu manipulÄciju rezultÄtam vajadzÄtu bÅ«t lÄ«dzÄ«gam attÄlÄ redzamajam:
SNS tÄmas izveide un abonÄÅ”ana
Dodieties uz VienkÄrÅ”o paziÅojumu pakalpojumu un izveidojiet jaunu tÄmu ar nosaukumu AviokompÄnijas:
AbonÄjiet Å”o tÄmu un norÄdiet mobilÄ tÄlruÅa numuru, uz kuru tiks nosÅ«tÄ«ti SMS paziÅojumi:
Izveidojiet tabulu DynamoDB
Lai saglabÄtu neapstrÄdÄtos datus no straumes airline_tickets, izveidosim DynamoDB tabulu ar tÄdu paÅ”u nosaukumu. MÄs izmantosim ieraksta_id kÄ primÄro atslÄgu:
Lambda funkciju savÄcÄja izveide
Izveidosim lambda funkciju Collector, kuras uzdevums bÅ«s aptaujÄt airline_tickets straumi un, ja tur tiks atrasti jauni ieraksti, ievietot Å”os ierakstus DynamoDB tabulÄ. AcÄ«mredzot papildus noklusÄjuma tiesÄ«bÄm Å”ai lambda ir jÄbÅ«t lasÄ«Å”anas piekļuvei Kinesis datu straumei un rakstÄ«Å”anas piekļuvei DynamoDB.
IAM lomas izveide kolektora lambda funkcijai
Vispirms izveidosim jaunu IAM lomu lambda ar nosaukumu Lambda-TicketsProcessingRole:
Testa piemÄrÄ iepriekÅ” konfigurÄtÄs AmazonKinesisReadOnlyAccess un AmazonDynamoDBFullAccess politikas ir diezgan piemÄrotas, kÄ parÄdÄ«ts attÄlÄ zemÄk:
Å Ä« lambda ir jÄpalaiž ar Kinesis aktivizÄtÄju, kad airline_stream tiek ievadÄ«ti jauni ieraksti, tÄpÄc mums ir jÄpievieno jauns aktivizÄtÄjs:
Atliek tikai ievietot kodu un saglabÄt 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 funkcijas paziÅotÄja izveide
LÄ«dzÄ«gi tiek izveidota arÄ« otrÄ lambda funkcija, kas uzraudzÄ«s otro straumi (special_stream) un nosÅ«tÄ«s paziÅojumu SNS. TÄpÄc Å”ai lambda ir jÄbÅ«t pieejai, lai lasÄ«tu no Kinesis un nosÅ«tÄ«tu ziÅojumus uz doto SNS tÄmu, ko pÄc tam SNS pakalpojums nosÅ«tÄ«s visiem Ŕīs tÄmas abonentiem (e-pasts, SMS utt.).
IAM lomas izveide
Vispirms mÄs izveidojam IAM lomu Lambda-KinesisAlarm Å”ai lambda un pÄc tam pieŔķiram Å”o lomu alarm_notifier lambda, kas tiek veidota:
Å ai lambda ir jÄdarbojas ar trigeri, lai jauni ieraksti ievadÄ«tu special_stream, tÄpÄc jums ir jÄkonfigurÄ aktivizÄtÄjs tÄdÄ paÅ”Ä veidÄ, kÄ mÄs to darÄ«jÄm Collector lambda.
Lai atvieglotu Ŕīs lambda konfigurÄÅ”anu, ieviesÄ«sim jaunu vides mainÄ«go ā TOPIC_ARN, kurÄ ievietojam Airlines tÄmas ANR (Amazon Recourse Names):
Un ievietojiet lambda kodu, tas nemaz nav sarežģīti:
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))
Å Ä·iet, ka Å”eit ir pabeigta manuÄlÄ sistÄmas konfigurÄÅ”ana. Atliek tikai pÄrbaudÄ«t un pÄrliecinÄties, ka esam visu pareizi konfigurÄjuÅ”i.
Izvietot no Terraform koda
NepiecieÅ”amÄ sagatavoÅ”anÄs
Terraform ir ļoti Ärts atvÄrtÄ pirmkoda rÄ«ks infrastruktÅ«ras izvietoÅ”anai no koda. Tam ir sava sintakse, ko ir viegli iemÄcÄ«ties, un tajÄ ir daudz piemÄru, kÄ un ko izvietot. Atom redaktoram vai Visual Studio Code ir daudz parocÄ«gu spraudÅu, kas atvieglo darbu ar Terraform.
JÅ«s varat lejupielÄdÄt izplatÄ«Å”anu tÄtad. DetalizÄta visu Terraform iespÄju analÄ«ze ir Ärpus Ŕī raksta darbÄ«bas jomas, tÄpÄc mÄs aprobežosimies ar galvenajiem punktiem.
KÄ palaist
Pilns projekta kods ir manÄ repozitorijÄ. MÄs klonÄjam krÄtuvi sev. Pirms darba sÄkÅ”anas jums ir jÄpÄrliecinÄs, vai AWS CLI ir instalÄta un konfigurÄta, jo... Terraform meklÄs akreditÄcijas datus failÄ ~/.aws/credentials.
Laba prakse ir palaist plÄna komandu pirms visas infrastruktÅ«ras izvietoÅ”anas, lai redzÄtu, ko Terraform paÅ”laik mums veido mÄkonÄ«:
terraform.exe plan
Jums tiks piedÄvÄts ievadÄ«t tÄlruÅa numuru, uz kuru nosÅ«tÄ«t paziÅojumus. Å ajÄ posmÄ tas nav jÄievada.
IzanalizÄjot programmas darbÄ«bas plÄnu, varam sÄkt veidot resursus:
terraform.exe apply
PÄc Ŕīs komandas nosÅ«tÄ«Å”anas jums atkal tiks lÅ«gts ievadÄ«t tÄlruÅa numuru; sastÄdiet ājÄā, kad tiek parÄdÄ«ts jautÄjums par darbÄ«bu faktisko izpildi. Tas ļaus jums izveidot visu infrastruktÅ«ru, veikt visu nepiecieÅ”amo EC2 konfigurÄciju, izvietot lambda funkcijas utt.
Kad visi resursi ir veiksmÄ«gi izveidoti, izmantojot Terraform kodu, jums jÄiedziļinÄs Kinesis Analytics lietojumprogrammas detaļÄs (diemžÄl es neatradu, kÄ to izdarÄ«t tieÅ”i no koda).
Palaidiet lietojumprogrammu:
PÄc tam jums ir skaidri jÄiestata lietojumprogrammas straumes nosaukums, nolaižamajÄ sarakstÄ atlasot:
Tagad viss ir gatavs darbam.
Lietojumprogrammas testÄÅ”ana
NeatkarÄ«gi no tÄ, kÄ jÅ«s izvietojÄt sistÄmu, manuÄli vai izmantojot Terraform kodu, tÄ darbosies tÄpat.
MÄs piesakÄmies, izmantojot SSH, virtuÄlajÄ maŔīnÄ EC2, kurÄ ir instalÄts Kinesis Agent, un palaižam skriptu api_caller.py.
sudo ./api_caller.py TOKEN
Viss, kas jums jÄdara, ir jÄgaida SMS uz jÅ«su numuru:
Atliek noskaidrot, vai ieraksti tika saglabÄti DynamoDB datu bÄzÄ turpmÄkai, detalizÄtÄkai analÄ«zei. Aviobiļetes tabulÄ ir aptuveni Å”Ädi dati:
SecinÄjums
PaveiktÄ darba gaitÄ tika uzbÅ«vÄta tieÅ”saistes datu apstrÄdes sistÄma uz Amazon Kinesis bÄzes. Tika apsvÄrtas iespÄjas izmantot Kinesis Agent kopÄ ar Kinesis datu straumÄm un reÄllaika analÄ«zi Kinesis Analytics, izmantojot SQL komandas, kÄ arÄ« Amazon Kinesis mijiedarbÄ«ba ar citiem AWS pakalpojumiem.
IepriekÅ” minÄto sistÄmu mÄs izvietojÄm divos veidos: diezgan garu manuÄlu un Ätru no Terraform koda.