Hello, Habr!
Elsker du at flyve med fly? Jeg elsker det, men under selvisoleringen har jeg ogsĂ„ fĂ„et en passion for at analysere data om flybilletter fra en velkendt tjeneste â Aviasales.
I dag vil vi gennemgÄ arbejdet med Amazon Kinesis, opbygge et streamingsystem med realtidsanalyse, implementere en NoSQL-database, Amazon DynamoDB, som det primÊre dataopbevaringssted og opsÊtte SMS-notifikationer om interessante billetter.
Alle detaljer findes nedenfor! Lad os komme i gang!

Introduktion
Til eksemplet har vi brug for adgang til . Adgang til det gives gratis og uden begrÊnsninger, man skal blot registrere sig i afsnittet 'For udviklere' for at fÄ sin API-token til dataadgang.
HovedformÄlet med denne artikel er at give en generel forstÄelse af brugen af streaminginformation i AWS; vi overser, at de data, der returneres af det anvendte API, ikke er strengt aktuelle og overfÞres fra et cache, der dannes pÄ baggrund af sÞgeresultater fra brugerne af Aviasales.ru og Jetradar.com inden for de sidste 48 timer.
De data om flybilletter, der indsamles via API'et, vil Kinesis-agenten installeret pÄ producer-maskinen automatisk analysere og sende til den relevante stream via Kinesis Data Analytics. Den rÄ version af denne stream vil blive skrevet direkte til opbevaringssystemet. Det opsatte opbevaringssystem i DynamoDB for 'rÄ' data vil muliggÞre dybere analyse af billetter gennem BI-vÊrktÞjer som f.eks. AWS Quick Sight.
Vi vil overveje to muligheder for deployment af hele infrastrukturen:
- Manuel â gennem AWS Management Console;
- Infrastruktur fra Terraform-kode â for de dovne automatisatorer;
Arkitekturen for det udviklede system

Brugte komponenter:
- â de data, der returneres af dette API, vil blive brugt til hele den efterfĂžlgende operation;
- â en almindelig virtuel maskine i skyen, hvor den indgĂ„ende datastream vil blive genereret:
- â dette er en Java-applikation, der installeres lokalt pĂ„ maskinen og giver en enkel mĂ„de at indsamle og sende data til Kinesis (Kinesis Data Streams eller Kinesis Firehose). Agenten overvĂ„ger konstant en rĂŠkke filer i de angivne mapper og sender nye data til Kinesis;
- â et Python-script, der foretager forespĂžrgsler til API'et og gemmer svaret i en mappe, som Kinesis Agent overvĂ„ger;
- â realtids streamingtjeneste med omfattende skaleringsmuligheder;
- â en serverlĂžs tjeneste, der forenkler analysen af realtidsdata. Amazon Kinesis Data Analytics konfigurerer ressourcerne til applikationer og skalerer automatisk for at hĂ„ndtere enhver mĂŠngde indkommende data;
- â en tjeneste, der gĂžr det muligt at kĂžre kode uden forudbestilling og opsĂŠtning af servere. Alle beregningsressourcer skalerer automatisk i forhold til hvert kald;
- â en nĂžgle-vĂŠrdi- og dokumentdatabase, der sikrer en latency pĂ„ mindre end 10 millisekunder i enhver skala. Brug af DynamoDB krĂŠver ikke, at du fordeler nogen servere, installerer opdateringer eller administrerer dem. DynamoDB skalerer automatisk tabellerne ved at justere de tilgĂŠngelige ressourcer og opretholde hĂžj ydeevne. Ingen systemadministration er nĂždvendig;
- â en fuldt administreret beskedafsendelsestjeneste baseret pĂ„ âpublic-subscribeâ (Pub/Sub) modellen, som gĂžr det muligt at isolere mikrotjenester, fordelte systemer og serverlĂžse applikationer. SNS kan bruges til at sende information til slutbrugere ved hjĂŠlp af mobile push-notifikationer, SMS-beskeder og e-mails.
Indledende forberedelse
For at emulere dataflowet beslutede jeg mig for at bruge oplysninger om flybilletter, der returneres af Aviasales API. I et ret omfattende udvalg af forskellige metoder, lad os tage en af dem - 'MÄnedens pris kalender', som returnerer priserne for hver dag i mÄneden grupperet efter antal skift. Hvis der ikke sendes en sÞgemÄned i anmodningen, vil informationen for den mÄned, der fÞlger efter den nuvÊrende, blive returneret.
SÄ vi registrerer os, fÄr vores token.
Et eksempel pÄ anmodning nedenfor:
http://api.travelpayouts.com/v2/prices/month-matrix?currency=rub&origin=LED&destination=HKT&show_to_affiliates=true&token=TOKEN_APIDen ovenfor beskrevne mÄde at hente data fra API'et ved at angive token i anmodningen vil fungere, men jeg foretrÊkker at videregive adgangstokenet via headeren, sÄ vi vil bruge denne metode i skriptet api_caller.py.
Eksempel 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 den ovenstĂ„ende API-svarses eksempel vises en billet fra Sankt Petersborg til Phuket⊠Ă
h, hvorfor drĂžmmeâŠ
Da jeg er fra Kazan, og Phuket lige nu kun er en drĂžm, lad os finde billetter fra Sankt Petersborg til Kazan.
Det antages, at du allerede har en konto pÄ AWS. Jeg vil gerne pÄpege, at Kinesis og afsendelse af meddelelser via SMS ikke er inkluderet i det Ärlige . Men selv med dette i tankerne, kan man for et par dollars bygge det foreslÄede system og lege med det. Og selvfÞlgelig skal man huske at fjerne alle ressourcer, nÄr de ikke lÊngere er nÞdvendige.
Heldigvis vil DynamoDb og Lambda-funktioner vÊre omkostningsfrie for os, hvis vi holder os inden for de mÄnedlige gratis grÊnser. For eksempel for DynamoDB: 25 GB lager, 25 WCU/RCU og 100 millioner forespÞrgsler. Og en million Lambda-funktion kald om mÄneden.
Manuel deployment af systemet
Konfiguration af Kinesis Data Streams
Lad os gÄ til Kinesis Data Streams-tjenesten og oprette to nye streams med én shard hver.
Hvad er en shard?
En shard er den grundlĂŠggende enhed til overfĂžrsel af data i Amazon Kinesis-streamen. Ăn shard muliggĂžr overfĂžrsel af inddata med en hastighed pĂ„ 1 MB/s og overfĂžrsel af uddata med en hastighed pĂ„ 2 MB/s. Ăn shard understĂžtter op til 1000 PUT-forespĂžrgsler pr. sekund. Ved oprettelse af en datastream skal der angives det Ăžnskede antal shards. For eksempel kan man oprette en datastream med to shards. Denne datastream vil muliggĂžre inddataoverfĂžrsel med en hastighed pĂ„ 2 MB/s og uddataoverfĂžrsel med en hastighed pĂ„ 4 MB/s med mulighed for op til 2000 PUT-forespĂžrgsler pr. sekund.
Jo flere shards der er i din stream â desto hĂžjere er dens bĂ„ndbredde. Generelt skaleres streams ved at tilfĂžje shards. Men jo flere shards du har, desto hĂžjere er prisen. Hver shard koster 1,5 cent i timen og yderligere 1,4 cent for hver million PUT-operationer.
Lad os oprette en ny stream med navnet airline_tickets, én shard vil vÊre tilstrÊkkelig:

Nu lad os oprette endnu en stream med navnet special_stream:

Konfiguration af producenten
Som dataprocessor til opgaven er det tilstrĂŠkkeligt at bruge en almindelig EC2-instans. Det skal ikke vĂŠre en kraftfuld dyr virtuel maskine, en t2.micro spot-instans vil vĂŠre helt passende.
Vigtig bemĂŠrkning: Som eksempel skal du bruge image â Amazon Linux AMI 2018.03.0, som krĂŠver fĂŠrre indstillinger for hurtig opstart af Kinesis Agent.
Lad os gÄ til EC2-servicen, oprette en ny virtuel maskine, vÊlge den Þnskede AMI med typen t2.micro, som er en del af Free Tier:

For at den nyoprettede virtuelle maskine kan interagere med Kinesis-servicen, er det nÞdvendigt at give den de rette tilladelser. Den bedste mÄde at gÞre dette pÄ er ved at tildele en IAM Role. Derfor skal vi pÄ skÊrmen Step 3: Configure Instance Details vÊlge Opret ny IAM Role:
Oprettelse af IAM-rolle til EC2

I det Äbne vindue vÊlger vi, at den nye rolle oprettes til EC2, og vi gÄr videre til sektionen Tilladelser:

I dette lÊringseksempel behÞver vi ikke dykke ned i alle detaljerne i den granulÊre tildeling af ressourcetilladelser, sÄ vi vÊlger de forudindstillede Amazon-politikker: AmazonKinesisFullAccess og CloudWatchFullAccess.
Lad os give denne rolle et meningsfuldt navn, for eksempel: EC2-KinesisStreams-FullAccess. Resultatet skal vÊre det samme som angivet pÄ billedet nedenfor:

Efter oprettelsen af denne nye rolle mÄ vi ikke glemme at knytte den til den oprettede virtuelle maskine:

Vi Êndrer ikke noget mere pÄ denne skÊrm og gÄr videre til de nÊste vinduer.
Diskparametrene kan efterlades som standard, tags ogsÄ (selvom det er en god praksis at bruge tags, i det mindste for at give instansen et navn og angive miljÞet).
Nu er vi pĂ„ fanen Step 6: Configure Security Group, hvor vi skal oprette en ny eller angive en eksisterende Security group, som tillader forbindelse via ssh (port 22) til instansen. VĂŠlg Source â My IP, og sĂ„ kan du starte instansen.

SĂ„ snart den skifter til status running, kan du forsĂžge at logge ind via ssh.
For at fÄ mulighed for at arbejde med Kinesis Agent, skal du efter succesfuld forbindelse til maskinen indtaste fÞlgende kommandoer 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
Lad os oprette en mappe til opbevaring af API-svarene:
sudo mkdir /var/log/airline_ticketsFĂžr agenten kan startes, er det nĂždvendigt at konfigurere dens konfiguration:
sudo vim /etc/aws-kinesis/agent.jsonIndholdet af filen agent.json skal have fĂžlgende 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 det fremgÄr af konfigurationsfilen, vil agenten overvÄge filer med .log-udvidelse i biblioteket \/var\log\/airline_tickets\/, parse dem og overfÞre dem til strÞmmen airline_tickets.
Vi genstarter tjenesten og sikrer os, at den er startet korrekt:
sudo service aws-kinesis-agent restartNu downloader vi Python-skriptet, som vil anmode om data fra API'en:
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 anmoder data fra Aviasales og gemmer det modtagne svar i det bibliotek, som Kinesis-agenten scanner. Implementeringen af dette script er ret standard, der er en klasse kaldet TicketsApi, som gĂžr det muligt at asynkront forespĂžrge API'en. Til denne klasse sender vi en header med token og forespĂžrgselsparametre:
class TicketsApi:
"""API kalders klasse."""
def __init__(self, headers):
"""Init metode."""
self.base_url = BASE_URL
self.headers = headers
async def get_data(self, data):
"""Hent data fra API forespĂžrgsel."""
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('Respons status %s: %s',
self.base_url, response.status)
response_json = await response.json()
except HTTPError as http_err:
LOGGER.error('Ups! Der opstod en HTTP-fejl: %s', str(http_err))
except Exception as err:
LOGGER.error('Ups! Der opstod en fejl: %s', str(err))
return response_json
def prepare_request(api_token):
"""Returner headers og forespĂžrgsel til API-anmodning."""
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('Brug: 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 returneret %s emner', len(response['data']))
try:
count_rows = log_maker(response)
LOGGER.info('%s rĂŠkker er blevet gemt i %s',
count_rows,
TARGET_FILE)
except Exception as e:
LOGGER.error('Ups! Anmodningens resultat blev ikke gemt i filen. %s',
str(e))
else:
LOGGER.error('Ups! API-anmodningen var ikke succesfuld %s!', response)
For at teste korrektheden af indstillingerne og funktionaliteten af agenten vil vi lave en testkĂžrsel af scriptet api_caller.py:
sudo ./api_caller.py TOKEN 
Og vi ser resultatet af arbejdet i loggene for Agenten og pÄ fanen Monitoring i datastreamen airline_tickets:
tail -f /var/log/aws-kinesis-agent/aws-kinesis-agent.log 

Som det ses, fungerer alt, og Kinesis Agent sender data til strĂžmmen. Nu er vi klar til at konfigurere forbrugeren.
OpsĂŠtning af Kinesis Data Analytics
Lad os gÄ til det centrale komponent i hele systemet - vi opretter en ny applikation i Kinesis Data Analytics med navnet kinesis_analytics_airlines_app:

Kinesis Data Analytics muliggĂžr realtidsdataanalyse fra Kinesis Streams ved hjĂŠlp af SQL-sprog. Dette er en fuldstĂŠndig autoskalerbar tjeneste (i modsĂŠtning til Kinesis Streams), der:
- muliggÞr oprettelse af nye streams (Output Stream) baseret pÄ forespÞrgsler til de oprindelige data;
- giver en fejldata stream, der opstÄr under kÞrsel af applikationer (Error Stream);
- kan automatisk bestemme strukturen af inddata (den kan manuelt overstyres om nĂždvendigt).
Dette er en dyr service - 0,11 USD pr. arbejdstime, sÄ den skal bruges omhyggeligt, og den skal fjernes, nÄr arbejdet er afsluttet.
Vi tilslutter applikationen til datakilden:

VĂŠlg strĂžmmen, som vi Ăžnsker at tilslutte til (airline_tickets):

Derefter skal vi vedhÊfte en ny IAM-rolle, sÄ applikationen kan lÊse fra strÞmmen og skrive til strÞmmen. Det er nok ikke at Êndre noget i blokken Adgangstilladelser:

Nu anmoder vi om at opdage dataskemaet i strÞmmen, for dette klikker vi pÄ knappen 'Opdag skema'. Som resultat vil den opdatere (oprette en ny) IAM-rolle, og der vil blive pÄbegyndt opdagelse af skemaet baseret pÄ dataene, der allerede er kommet til strÞmmen:

Vi skal nu gÄ til SQL-editoren. NÄr du klikker pÄ denne knap, vises et vindue med spÞrgsmÄlet om at starte applikationen - vÊlg hvad du Þnsker at starte:

IndsÊt denne enkle forespÞrgsel i SQL-editorvinduet og klik pÄ Gem og 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 relationelle databaser arbejder du med tabeller, ved at bruge INSERT-operatorer til at tilfĂžje poster og SELECT-operatoren til at forespĂžrge data. I Amazon Kinesis Data Analytics arbejder du med strĂžmme (STREAM) og 'pumper' (PUMP) - kontinuerlige indsĂŠttelsesforespĂžrgsler, der indsĂŠtter data fra en strĂžm i applikationen til en anden strĂžm.
I den SQL-forespĂžrgsel, der er prĂŠsenteret ovenfor, sker der en sĂžgning efter Aeroflot-billetter med en pris under fem tusinde rubler. Alle poster, der opfylder disse betingelser, vil blive placeret i strĂžmmen DESTINATION_SQL_STREAM.

I blokken Destination vĂŠlger vi strĂžmmen special_stream, og i rullemenuen In-application stream name DESTINATION_SQL_STREAM:

Som resultat af alle manipulationer skal vi ende op med noget, der ligner billedet nedenfor:

Oprettelse og abonnement pÄ SNS-emne
Vi gÄr til tjenesten Simple Notification Service og opretter et nyt emne med navnet Airlines:

Vi opretter et abonnement pÄ dette emne, hvor vi angiver telefonnummeret, som SMS-notifikationer vil blive sendt til:

Oprettelse af tabel i DynamoDB
For at gemme de ubehandlede data fra strĂžmmen airline_tickets, opretter vi en tabel i DynamoDB med samme navn. Som primĂŠr nĂžgle vil vi bruge record_id:

Oprettelse af lambda-funktion collector
Vi opretter en lambda-funktion kaldet Collector, hvis opgave vil vÊre at afspille strÞmmen airline_tickets og, hvis der findes nye poster, indsÊtte disse poster i DynamoDB-tabellen. Det er klart, at denne lambda udover standardadgang ogsÄ skal have lÊserettigheder til Kinesis datastrÞmmen og skriveadgang til DynamoDB.
Oprettelse af en IAM-rolle til lambda-funktionen collector
For at begynde opretter vi en ny IAM-rolle til lambdaen med navnet Lambda-TicketsProcessingRole:

Til testformÄl vil de forudkonfigurerede politikker AmazonKinesisReadOnlyAccess og AmazonDynamoDBFullAccess vÊre tilstrÊkkelige, som vist pÄ billedet nedenfor:


Denne lambda skal aktiveres af en trigger fra Kinesis, nÄr der kommer nye poster i strÞmmen airline_stream, sÄ vi skal tilfÞje en ny trigger:


Det er nu tilbage at indsĂŠtte koden og gemme lambdaen.
"""Analyse af strĂžmmen og indsĂŠttelse i DynamoDB-tabellen."""
import base64
import json
import boto3
from decimal import Decimal
DYNAMO_DB = boto3.resource('dynamodb')
TABLE_NAME = 'airline_tickets'
class TicketsParser:
"""Analyse af oplysninger fra strĂžmmen."""
def __init__(self, table_name, records):
"""Init-metode."""
self.table = DYNAMO_DB.Table(table_name)
self.json_data = TicketsParser.get_json_data(records)
@staticmethod
def get_json_data(records):
"""Returner deserialiserede data fra strĂžmmen."""
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):
"""Forbehandling af 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):
"""BatchindsĂŠtning i tabellen."""
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('Der er blevet tilfĂžjet ', len(self.json_data), ' poster')
def lambda_handler(event, context):
"""Analyser strĂžmmen og indsĂŠt i DynamoDB-tabellen."""
print('Modtog begivenhed:', event)
parser = TicketsParser(TABLE_NAME, event['Records'])
parser.run()
Oprettelse af lambda-funktionen notifier
Den anden lambda-funktion, der skal overvÄge den anden strÞm (special_stream) og sende notifikationer til SNS, oprettes pÄ samme mÄde. Derfor skal denne lambda have lÊsetilgang fra Kinesis og kunne sende beskeder til den angivne SNS-topik, som SNS-tjenesten derefter vil sende til alle abonnenter pÄ denne topik (e-mail, SMS osv.).
Oprettelse af IAM-rolle
Vi opretter fĂžrst IAM-rollen Lambda-KinesisAlarm for denne lambda, og derefter tildeler vi denne rolle til den oprettede lambda alarm_notifier:


Denne lambda skal vÊre knyttet til en trigger for nye poster i strÞmmen special_stream, sÄ det er nÞdvendigt at konfigurere triggeren pÄ samme mÄde, som vi gjorde for lambdaen Collector.
For at lette konfigurationen af denne lambda, introducerer vi en ny miljĂžvariabel â TOPIC_ARN, hvor vi placerer ANR (Amazon Resource Names) for topikken Airlines:

Og vi indsĂŠtter lambda-koden, som er ganske enkel:
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! Jeg har fundet noget interessant!',
Subject='Airline billetter alarm')
print('Alarmbesked er blevet leveret med succes')
except Exception as err:
print('Leveringsfejl', str(err))
Det ser ud til, at den manuelle opsĂŠtning af systemet er afsluttet. Nu er det kun tilbage at teste og sikre, at vi har konfigureret alt korrekt.
Deployment fra Terraform-kode
NĂždvendig forberedelse
â et meget praktisk open-source vĂŠrktĂžj til deployment af infrastruktur fra kode. Det har sin egen syntaks, som er nem at lĂŠre, samt mange eksempler pĂ„, hvordan og hvad man kan deploye. I editoren Atom eller Visual Studio Code er der mange nyttige plugins, der kan lette arbejdet med Terraform.
Distributionspakken kan downloades . En detaljeret gennemgang af alle mulighederne i Terraform overskrider rammerne for denne artikel, sÄ vi vil kun begrÊnse os til de grundlÊggende punkter.
SÄdan starter du
Den fulde projektkode ligger . Klon repository'et til din maskine. FĂžr du starter, skal du sikre dig, at AWS CLI er installeret og konfigureret, da Terraform vil lede efter legitimationsoplysninger i filen ~/ .aws / credentials.
Det er god praksis at kĂžre kommandoen plan, fĂžr du deployer hele infrastrukturen, for at se, hvad Terraform vil generere i skyen:
terraform.exe planDu vil blive bedt om at indtaste dit telefonnummer for at modtage notifikationer. PĂ„ dette trin er det ikke nĂždvendigt at indtaste det.

Efter at have analyseret programmets arbejdsplan kan vi begynde at oprette ressourcer:
terraform.exe applyEfter at have sendt denne kommando vil der igen blive bedt om at indtaste telefonnummeret, indtast "yes", nÄr spÞrgsmÄlet om faktisk at udfÞre handlingerne vises. Dette vil tillade at oprette hele infrastrukturen, foretage de nÞdvendige indstillinger af EC2, implementere lambda-funktioner osv.
NÄr alle ressourcer er blevet oprettet med succes gennem Terraform-koden, skal man gÄ ind i detaljerne for Kinesis Analytics-applikationen (desvÊrre kunne jeg ikke finde ud af, hvordan dette gÞres direkte fra koden).
Lad os starte applikationen:

Derefter skal du tydeligt angive in-application stream name ved at vĂŠlge fra droppdown-menuen:


Nu er alt klar til brug.
Test af applikationens funktionalitet
Uanset hvordan du har implementeret systemet, manuelt eller via Terraform-kode, vil det fungere ens.
Log ind via SSH pÄ den virtuelle EC2-maskine, hvor Kinesis Agent er installeret, og kÞr scriptet api_caller.py
sudo ./api_caller.py TOKENNu er det bare at vente pÄ en SMS til dit nummer:

SMS - beskeden kommer til telefonen nĂŠsten efter 1 minut:

Det er tid til at se, om optegnelserne er gemt i DynamoDB-databasen til senere, mere detaljeret analyse. Tabellen airline_tickets indeholder cirka disse data:

Konklusion
I lÞbet af det udfÞrte arbejde blev der bygget et system til online databehandling baseret pÄ Amazon Kinesis. Der blev overvejet muligheder for at bruge Kinesis Agent sammen med Kinesis Data Streams og real-time analytik Kinesis Analytics ved hjÊlp af SQL-kommandoer, samt interaktion mellem Amazon Kinesis og andre AWS-tjenester.
Det ovenfor beskrevne system blev implementeret pÄ to mÄder: en relativt lang manuel metode og en hurtigere metode gennem Terraform-koden.
Hele projektets kildekode er tilgÊngelig , jeg foreslÄr, at du ser nÊrmere pÄ det.
Jeg ser frem til gerne at diskutere artiklen, og jeg venter pÄ dine kommentarer. Jeg hÄber pÄ konstruktiv kritik.
Jeg Ăžnsker dig held og lykke!
Kilde: habr.com
