Hej, Habr!
Tycker du om att flyga med flygplan? Jag Ă€lskar det, men under sjĂ€lvisolering har jag Ă€ven fĂ„tt en förkĂ€rlek för att analysera data om flygbiljetter frĂ„n en kĂ€nd ressida â Aviasales.
Idag kommer vi att gÄ igenom hur Amazon Kinesis fungerar, bygga ett streamingsystem med realtidsanalys, sÀtta upp en NoSQL-databas, Amazon DynamoDB, som huvudlagringssystem och konfigurera SMS-notifieringar för intressanta biljetter.
Alla detaljer under bilden! LÄt oss köra!

Introduktion
Som exempel behöver vi tillgÄng till . TillgÄng till detta erbjuds gratis och utan begrÀnsningar; det krÀvs bara att man registrerar sig i avsnittet 'Utvecklare' för att fÄ sin API-token för att fÄ tillgÄng till data.
Huvudsyftet med denna artikel Àr att ge en allmÀn förstÄelse för anvÀndningen av informationsströmning i AWS; vi lÀmnar dÀrhÀn att de data som returneras av det anvÀnda API:et inte Àr strikt aktuella och överförs frÄn en cache som genereras baserat pÄ sökningar av anvÀndare pÄ Aviasales.ru och Jetradar.com under de senaste 48 timmarna.
Data om flygbiljetter som erhÄllits via API:t kommer Kinesis-agenten, installerad pÄ producentmaskinen, automatiskt att parsa och skicka till rÀtt ström via Kinesis Data Analytics. Den rÄa versionen av denna ström kommer att skrivas direkt till lagret. Det reda lagret i DynamoDB av 'rÄdata' kommer att möjliggöra djupare analys av biljetter via BI-verktyg, till exempel AWS Quick Sight.
Vi kommer att titta pÄ tvÄ alternativ för att distribuera hela infrastrukturen:
- Manuell â via AWS Management Console;
- Infrastruktur av Terraform-kod â för lata automatiserare;
Arkitekturen för det utvecklade systemet

AnvÀnda komponenter:
- â data som returneras av detta API kommer att anvĂ€ndas för allt vidare arbete;
- â en vanlig virtuell maskin i molnet dĂ€r ingĂ„ngsdatastreamen kommer att genereras:
- â detta Ă€r en Java-applikation som installeras lokalt pĂ„ maskinen och möjliggör en enkel metod för insamling och sĂ€ndning av data till Kinesis (Kinesis Data Streams eller Kinesis Firehose). Agenten övervakar kontinuerligt en uppsĂ€ttning filer i angivna kataloger och skickar nya data till Kinesis;
- â ett Python-skript som gör förfrĂ„gningar till API:t och lagrar svaret i en mapp som Kinesis Agent övervakar;
- â en tjĂ€nst för realtidsdataöverföring med omfattande skalningsmöjligheter;
- â en serverlös tjĂ€nst som förenklar analys av realtidsströmdata. Amazon Kinesis Data Analytics anpassar resurser för att köra applikationer och skalar automatiskt för att hantera vilka volymer av inkommande data som helst;
- â en tjĂ€nst som lĂ„ter dig köra kod utan att provisionera och konfigurera servrar. All berĂ€kningskraft skalar automatiskt upp eller ner vid varje anrop;
- â en nyckel-vĂ€rde- och dokumentdatabas, som ger en latens pĂ„ mindre Ă€n 10 millisekunder vid vilken som helst skala. Med DynamoDB krĂ€vs ingen distribution av servrar, installation av uppdateringar eller hantering av dem. DynamoDB skalas automatiskt upp eller ner för att justera tillgĂ„ngen till resurser och upprĂ€tthĂ„lla hög prestanda. Inga systemadministrationsĂ„tgĂ€rder krĂ€vs;
- â en helt hanterad meddelandetjĂ€nst i pub/sub-modell som gör det möjligt att isolera mikrotjĂ€nster, distribuerade system och serverlösa applikationer. SNS kan anvĂ€ndas för att skicka information till slutanvĂ€ndare via mobilpush-meddelanden, SMS och e-post.
Inledande förberedelse
För att emulera en datastream valde jag att anvĂ€nda information om flygbiljetter som returneras av Aviasales API. I en ganska omfattande lista över olika metoder, lĂ„t oss ta en av dem â "Priskalender för en mĂ„nad", som returnerar priser för varje dag i mĂ„naden grupperade efter antal byten. Om ingen mĂ„nad skickas med i begĂ€ran, returneras information för mĂ„naden efter den aktuella.
LÄt oss registrera oss och fÄ vÄr token.
Exempel pÄ begÀran nedan:
http://api.travelpayouts.com/v2/prices/month-matrix?currency=rub&origin=LED&destination=HKT&show_to_affiliates=true&token=TOKEN_APIDen ovan beskrivna metoden för att hÀmta data frÄn API med token i begÀran kommer att fungera, men jag föredrar att skicka Ätkomsttoken genom headern, sÄ i skriptet api_caller.py anvÀnder vi just den metoden.
Exempel pÄ svar:
{{
"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
}]
}
I exemplet pĂ„ API-svaret ovan visas en biljett frĂ„n Sankt Petersburg till Phuket⊠Suck, vad drömmer jagâŠ
Eftersom jag Àr frÄn Kazan och Phuket just nu "bara Àr en dröm", lÄt oss leta efter biljetter frÄn Sankt Petersburg till Kazan.
Det förutsÀtts att du redan har ett konto pÄ AWS. Jag vill genast pÄpeka att Kinesis och att skicka meddelanden via SMS inte ingÄr i det Ärliga . Men trots detta, om man har i Ätanke ett par dollar, Àr det helt möjligt att bygga det föreslagna systemet och leka med det. Och glöm inte att ta bort alla resurser efter att de inte lÀngre behövs.
Som tur Àr kommer DynamoDB och Lambda-funktioner att vara i stort sett gratis för oss om vi hÄller oss inom de mÄnatliga gratisgrÀnserna. Till exempel för DynamoDB: 25 GB lagring, 25 WCU/RCU och 100 miljoner förfrÄgningar. Och en miljon Lambda-funktionsanrop per mÄnad.
Manuell distribueringssystem
InstÀllning av Kinesis Data Streams
LÄt oss gÄ till tjÀnsten Kinesis Data Streams och skapa tvÄ nya flöden, en shard för varje.
Vad Àr en shard?
En shard Àr den grundlÀggande enheten för datatransfer i Amazon Kinesis-streamar. En shard möjliggör överföring av indata med en hastighet av 1 MB/s och utdata med en hastighet av 2 MB/s. En shard stöder upp till 1000 PUT-poster per sekund. NÀr man skapar ett datastream krÀvs det att ange det nödvÀndiga antalet shards. Till exempel kan man skapa ett datastream med tvÄ shards. Denna datastream möjliggör överföring av indata med en hastighet av 2 MB/s och utdata med en hastighet av 4 MB/s med stöd för upp till 2000 PUT-poster per sekund.
Ju fler shards i ditt flöde, desto större kapacitet fÄr det. I princip skalas flöden genom att lÀgga till shards. Men ju fler shards du har, desto högre blir kostnaden. Varje shard kostar 1,5 cent per timme och ytterligare 1,4 cent per varje miljon operationer av att lÀgga till till flödet (PUT payload units).
LÄt oss skapa ett nytt flöde med namnet airline_tickets, det rÀcker med 1 shard:

Nu skapar vi ytterligare ett flöde med namnet special_stream:

InstÀllning av producenten
Som dataprocessor för att hantera uppgiften rÀcker det att anvÀnda en vanlig EC2-instans. Det behöver inte vara en kraftfull dyr virtuell maskin, en spot-t2.micro fungerar utmÀrkt.
Viktigt meddelande: som exempel bör image â Amazon Linux AMI 2018.03.0 anvĂ€ndas, med den krĂ€vs fĂ€rre instĂ€llningar för att snabbt starta Kinesis Agent.
Vi gÄr till EC2-tjÀnsten, skapar en ny virtuell maskin, vÀljer rÀtt AMI med typen t2.micro, som ingÄr i Free Tier:

För att den ny skapade virtuella maskinen ska kunna interagera med Kinesis-tjÀnsten, mÄste vi ge den rÀttigheter att göra det. Det bÀsta sÀttet att göra detta Àr att tilldela en IAM Roll. SÄ pÄ skÀrmen Steg 3: Konfigurera instansdetaljer bör vi vÀlja Skapa ny IAM Roll:
Skapa IAM-roll för EC2

I det öppna fönstret vÀljer vi att skapa den nya rollen för EC2 och gÄr till avsnittet Behörigheter:

I detta utbildningsexempel behöver vi inte gÄ in pÄ alla detaljer kring granulerad instÀllning av resurser, sÄ vi vÀljer Amazons förinstÀllda policyer: AmazonKinesisFullAccess och CloudWatchFullAccess.
Ge denna roll ett meningsfullt namn, till exempel: EC2-KinesisStreams-FullAccess. Resultatet bör bli detsamma som visas pÄ bilden nedan:

Efter att ha skapat denna nya roll, glöm inte att koppla den till den skapade virtuella maskinen:

Vi Àndrar ingenting mer pÄ den hÀr skÀrmen och gÄr vidare till nÀsta fönster.
InstÀllningarna för hÄrddisken kan lÀmnas som standard, och taggarna ocksÄ (Àven om det Àr god praxis att anvÀnda taggar, Ätminstone ge ett namn till instansen och ange miljö).
Nu Ă€r vi pĂ„ fliken Steg 6: Konfigurera sĂ€kerhetsgrupp, dĂ€r vi mĂ„ste skapa en ny eller ange en befintlig sĂ€kerhetsgrupp som tillĂ„ter anslutning via ssh (port 22) till instansen. VĂ€lj dĂ€r KĂ€llan â> Min IP och du kan starta instansen.

SÄ snart den gÄr in i statusen körs, kan du försöka ansluta till den via ssh.
För att fÄ möjlighet att arbeta med Kinesis Agent, efter en framgÄngsrik anslutning till maskinen, mÄste följande kommandon anges i terminalen:
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
Skapa en mapp för att spara API-svaren:
sudo mkdir /var/log/airline_ticketsInnan agenten startas mÄste dess konfigurationsfil stÀllas in:
sudo vim /etc/aws-kinesis/agent.jsonInnehÄllet i filen agent.json bör ha följande format:
{
"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"]
}
]
}
]
}
Som framgÄr av konfigurationsfilen kommer agenten att övervaka filer med filÀndelsen .log i katalogen \/var\/log\/airline_tickets\/, parsa dessa och överföra dem till strömmen airline_tickets.
Vi startar om tjÀnsten och sÀkerstÀller att den har startat och fungerar:
sudo service aws-kinesis-agent restartNu laddar vi ner Python-skriptet som kommer att begÀra data frÄn API:et:
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
Skriptet api_caller.py begÀr data frÄn Aviasales och sparar det mottagna svaret i katalogen som Kinesis-agenten skannar. Implementeringen av detta skript Àr ganska standard, det finns en klass TicketsApi som gör det möjligt att asynkront anropa API:et. I denna klass skickar vi en header med en token och begÀrningsparametrar:
class TicketsApi:
"""Api-anroparens klass."""
def __init__(self, headers):
"""Init-metod."""
self.base_url = BASE_URL
self.headers = headers
async def get_data(self, data):
"""HÀmta data frÄn API-frÄgan."""
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('Svar status %s: %s',
self.base_url, response.status)
response_json = await response.json()
except HTTPError as http_err:
LOGGER.error('Oj! HTTP-fel intrÀffade: %s', str(http_err))
except Exception as err:
LOGGER.error('Oj! Ett fel intrÀffade: %s', str(err))
return response_json
def prepare_request(api_token):
"""Ă
tervÀnd headers och frÄga för API-förfrÄgan."""
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():
"""Kör koden."""
if len(sys.argv) != 2:
print('AnvÀndning: api_caller.py ')
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 har returnerat %s objekt', len(response['data']))
try:
count_rows = log_maker(response)
LOGGER.info('%s rader har sparats i %s',
count_rows,
TARGET_FILE)
except Exception as e:
LOGGER.error('Oj! FörfrÄgningsresultat kunde inte sparas till fil. %s',
str(e))
else:
LOGGER.error('Oj! API-förfrÄgningen var inte framgÄngsrik %s!', response)
För att testa instÀllningarnas korrekthet och agentens funktionalitet kör vi ett test av skriptet api_caller.py:
sudo ./api_caller.py TOKEN 
Och vi ser resultatet i Agent-loggarna och pÄ fliken Monitoring i datastreamen airline_tickets:
tail -f /var/log/aws-kinesis-agent/aws-kinesis-agent.log 

Som vi ser fungerar allt och Kinesis Agent skickar framgÄngsrikt data till strömmen. Nu konfigurerar vi konsumenten.
Konfigurering av Kinesis Data Analytics
LĂ„t oss gĂ„ vidare till det centrala komponenten i hela systemet â vi skapar en ny applikation i Kinesis Data Analytics med namnet kinesis_analytics_airlines_app:

Kinesis Data Analytics gör det möjligt att utföra dataanalys i realtid frÄn Kinesis Streams med hjÀlp av SQL-sprÄket. Detta Àr en helt sjÀlvskalanlÀggande tjÀnst (till skillnad frÄn Kinesis Streams), som:
- möjliggör att skapa nya strömmar (Output Stream) baserat pÄ förfrÄgningar till ursprungsdata;
- tillhandahÄller en felström som uppstÄr under körning av applikationer (Error Stream);
- kan automatiskt bestÀmma schemat för ingÄngsdata (det kan manuellt ÄsidosÀttas vid behov).
Det Àr en kostsam tjÀnst - 0,11 USD per arbetstimme, sÄ du bör anvÀnda den försiktigt och ta bort den nÀr du Àr klar.
Vi kopplar applikationen till datakÀllan:

VÀlj strömmen som vi ska ansluta till (airline_tickets):

DĂ€refter mĂ„ste du bifoga en ny IAM-roll sĂ„ att applikationen kan lĂ€sa frĂ„n strömmen och skriva till strömmen. För detta behöver du inte Ă€ndra nĂ„got i blocket Ă
tkomstbehörigheter:

Nu begÀr vi dataskeman i strömmen, för detta klickar vi pÄ knappen "UpptÀck schema". Resultatet blir att en ny IAM-roll kommer att skapas och upptÀckten av schemat kommer att starta med de data som redan kommit till strömmen:

Nu Àr det dags att gÄ till SQL-redigeraren. NÀr du trycker pÄ den hÀr knappen kommer ett fönster att dyka upp med en frÄga om att starta applikationen - vÀlj vad du vill starta:

I SQL-redigerarens fönster klistrar vi in en sÄ enkel frÄga och klickar pÄ Spara och Kör 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';
I relationsdatabaser arbetar du med tabeller, dÀr du anvÀnder INSERT-operatörer för att lÀgga till poster och SELECT-operatörer för att hÀmta data. I Amazon Kinesis Data Analytics arbetar du med strömmar (STREAM) och "pumpar" (PUMP) - kontinuerliga insÀttningsfrÄgor som lÀgger in data frÄn en ström i applikationen till en annan ström.
I den SQL-frÄga som presenteras ovan utförs en sökning efter Aeroflot-biljetter med ett pris under fem tusen rubel. Alla poster som uppfyller dessa villkor kommer att placeras i strömmen DESTINATION_SQL_STREAM.

I blocket Destination vÀljer vi strömmen special_stream, och i rullgardinsmenyn In-application stream name DESTINATION_SQL_STREAM:

Resultatet av alla manipulationer bör bli nÄgot som pÄ bilden nedan:

Skapande och prenumeration pÄ SNS-Àmnet
GÄ till tjÀnsten Simple Notification Service och skapa ett nytt Àmne med namnet Airlines:

Skapa en prenumeration pÄ detta Àmne dÀr vi anger mobiltelefonnumret som SMS-notifikationerna ska skickas till:

Skapande av en tabell i DynamoDB
För att lagra de rÄa data frÄn strömmen airline_tickets skapar vi en tabell i DynamoDB med samma namn. Vi kommer att anvÀnda record_id som primÀrnyckel:

Skapande av lambda-funktionen collector
Vi skapar en lambda-funktion kallad Collector, vars uppgift Àr att pollera strömmen airline_tickets och, i hÀndelse av att nya poster upptÀckts dÀr, införa dessa poster i DynamoDB-tabellen. Det Àr uppenbart att förutom standardrÀttigheterna bör denna lambda ha tillgÄng till att lÀsa Kinesis-datastreamen och skriva till DynamoDB.
Skapa en IAM-roll för lambda-funktionen collector
Först skapar vi en ny IAM-roll för lambda med namnet Lambda-TicketsProcessingRole:

För ett testexempel fungerar de förinstÀllda policyn AmazonKinesisReadOnlyAccess och AmazonDynamoDBFullAccess bra, som visas pÄ bilden nedan:


Denna lambda ska aktiveras av en trigger frÄn Kinesis nÀr nya poster lÀggs till i strömmen airline_stream, dÀrför behöver vi lÀgga till en ny trigger:


Koden ÄterstÄr att införa och spara lambda-funktionen.
"""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()
Skapa lambda-funktionen notifier
Den andra Lambda-funktionen, som kommer att övervaka den andra strömmen (special_stream) och skicka ett meddelande till SNS, skapas pÄ liknande sÀtt. DÀrför mÄste denna Lambda ha lÀsbehörighet frÄn Kinesis och kunna skicka meddelanden till den angivna SNS-topiken, som sedan kommer att skickas av SNS-tjÀnsten till alla prenumeranter av denna topik (e-post, SMS, etc.).
Skapa IAM-roll
Först skapar vi IAM-rollen Lambda-KinesisAlarm för denna Lambda, och sedan tilldelar vi denna roll till den skapade Lambda alarm_notifier:


Denna Lambda mÄste fungera med en trigger för att fÄ nya poster i strömmen special_stream, sÄ det Àr nödvÀndigt att konfigurera triggern pÄ samma sÀtt som vi gjorde för Lambda Collector.
För att underlĂ€tta konfigurationen av denna Lambda introducerar vi en ny miljövariabel â TOPIC_ARN, dĂ€r vi placerar ANR (Amazon Resource Names) för Airlines-topiken:

Och vi infogar Lambda-koden, den Àr inte sÄ komplicerad:
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='Hej! Jag har hittat nÄgot intressant!',
Subject='Alarm för flygbiljetter')
print('Alarmmeddelandet har levererats framgÄngsrikt')
except Exception as err:
print('Leveransfel', str(err))
Det verkar som att den manuella konfigurationen av systemet Àr avslutad. Det ÄterstÄr bara att testa och se till att vi har konfigurerat allt korrekt.
Distribuering frÄn Terraform-kod
NödvÀndig förberedelse
â ett mycket bekvĂ€mt open-source verktyg för att distribuera infrastruktur frĂ„n kod. Det har sin egen syntax som Ă€r lĂ€tt att förstĂ„ och mĂ„nga exempel pĂ„ hur och vad man kan distribuera. I redaktören Atom eller Visual Studio Code finns det mĂ„nga praktiska tillĂ€gg som gör arbetet med Terraform enklare.
Distributören kan laddas ner . En detaljerad genomgÄng av alla möjligheter med Terraform ligger utanför ramen för denna artikel, sÄ vi begrÀnsar oss till de grundlÀggande aspekterna.
Hur man startar
Den fullstÀndiga koden för projektet finns . Klona förrÄdet till dig. Innan du startar mÄste du vara sÀker pÄ att du har installerat och konfigurerat AWS CLI, eftersom Terraform kommer att leta efter autentiseringsuppgifter i filen ~/.aws/credentials.
En bra praxis Àr att köra kommandot plan innan man distribuerar hela infrastrukturen, för att se vad Terraform just nu kommer att skapa i molnet:
terraform.exe planDet kommer att föreslÄs att du anger ett telefonnummer för att fÄ meddelanden skickade dit. Vid detta steg Àr det inte obligatoriskt att ange det.

Genom att analysera programmets arbetsplan kan vi pÄbörja skapandet av resurser:
terraform.exe applyEfter att ha skickat detta kommando kommer en frÄga att dyka upp igen om du vill ange ditt telefonnummer, skriv "yes" nÀr frÄgan om verklig ÄtgÀrd visas. Detta gör att hela infrastrukturen kan byggas upp, nödvÀndiga instÀllningar för EC2 kan göras, lambda-funktioner kan distribueras osv.
NÀr alla resurser har skapats framgÄngsrikt via Terraform-koden, mÄste du gÄ in i detaljerna för Kinesis Analytics-appen (tyvÀrr kunde jag inte lista ut hur man gör det direkt frÄn koden).
Starta appen:

DÀrefter mÄste du tydligt ange streamnamn i appen genom att vÀlja frÄn rullgardinsmenyn:


Nu Àr allt klart för arbete.
Testa appens funktionalitet
Oavsett hur du distribuerade systemet, manuellt eller via Terraform-koden, kommer det att fungera likadant.
Logga in via SSH pÄ EC2-virtuella maskinen dÀr Kinesis Agent Àr installerad och starta skriptet api_caller.py
sudo ./api_caller.py TOKENDet Àr bara att vÀnta pÄ SMS till ditt nummer:

SMS â meddelandet kommer till telefonen nĂ€stan inom 1 minut:

Vi mÄste kolla om poster har sparats i DynamoDB-databasen för framtida, mer detaljerad analys. Tabell airline_tickets innehÄller ungefÀr sÄdana data:

Slutsats
Den genomförda arbetet har byggt ett system för online databehandling baserat pÄ Amazon Kinesis. AnvÀndningsalternativen för Kinesis Agent i kombination med Kinesis Data Streams och realtidsanalys av Kinesis Analytics med hjÀlp av SQL-kommandon har granskats, liksom interaktionen mellan Amazon Kinesis och andra AWS-tjÀnster.
Det ovan beskrivna systemet har implementerats pÄ tvÄ sÀtt: antingen lÄngsamt manuellt eller snabbt via Terraform-kod.
All kÀllkod för projektet Àr tillgÀnglig , jag föreslÄr att du kollar in det.
Jag ser fram emot att diskutera artikeln och vÀntar pÄ dina kommentarer. Hoppas pÄ konstruktiv kritik.
Jag önskar dig framgÄng!
KĂ€lla: habr.com
