AWS Lambda Funzioni di strumentazione - AWS X-Ray

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

AWS Lambda Funzioni di strumentazione

Scorekeep utilizza due AWS Lambda funzioni. La prima è una funzione Node.js del ramo lambda che genera nomi casuali per i nuovi utenti. Quando un utente crea una sessione senza immettere un nome, l'applicazione chiama una funzione denominata random-name con il AWS SDK for Java. L'X-Ray SDK for Java registra le informazioni sulla chiamata a Lambda in un sottosegmento come qualsiasi altra chiamata effettuata con un client SDK strumentato. AWS

Nota

L'esecuzione della funzione random-name Lambda richiede la creazione di risorse aggiuntive all'esterno dell'ambiente Elastic Beanstalk. Per ulteriori informazioni e istruzioni, consulta il file readme: AWS Lambda Integration.

La seconda funzione, scorekeep-worker, è una funzione Python che viene eseguita indipendentemente dall'API Scorekeep. Quando una partita termina, l'API scrive l'ID della sessione e l'ID della partita su una coda SQS. La funzione worker legge gli elementi dalla coda e chiama l'API Scorekeep per creare record completi di ogni sessione di gioco da archiviare in Amazon S3.

Scorekeep include AWS CloudFormation modelli e script per creare entrambe le funzioni. Poiché è necessario raggruppare X-Ray SDK con il codice della funzione, i modelli creano le funzioni senza alcun codice. Quando distribuisci Scorekeep, un file di configurazione incluso nella cartella .ebextensions crea un pacchetto di codice sorgente che include l'SDK e aggiorna il codice della funzione e la configurazione con AWS Command Line Interface.

Nome casuale

Scorekeep richiama la funzione di generazione del nome casuale quando un utente avvia una sessione di gioco senza aver eseguito l'accesso oppure senza aver specificato un nome utente. Quando Lambda elabora la chiamata arandom-name, legge l'intestazione di tracciamento, che contiene l'ID di traccia e la decisione di campionamento scritta da X-Ray SDK for Java.

Per ogni richiesta campionata, Lambda esegue il demone X-Ray e scrive due segmenti. Il primo segmento registra informazioni sulla chiamata a Lambda che richiama la funzione. Questo segmento contiene le stesse informazioni del sottosegmento registrato da Scorekeep, ma dal punto di vista Lambda. Il secondo segmento rappresenta l'attività svolta dalla funzione.

Lambda passa il segmento di funzione a X-Ray SDK tramite il contesto della funzione. Quando si strumenta una funzione Lambda, non si utilizza l'SDK per creare un segmento per le richieste in arrivo. Lambda fornisce il segmento e tu usi l'SDK per strumentare i client e scrivere sottosegmenti.

Mappa di traccia che mostra come scorekeep chiama una funzione Lambda per ottenere nomi casuali per i nuovi utenti

La funzione random-name è implementata in Node.js Utilizza l'SDK per Node.js per JavaScript inviare notifiche con Amazon SNS e l'SDK X-Ray per Node.js per strumentare il client SDK. AWS Per scrivere annotazioni, la funzione crea una sottosegmento personalizzato con AWSXRay.captureFunc e scrive le annotazioni nella funzione analizzata. In Lambda, non puoi scrivere annotazioni direttamente sul segmento di funzione, ma solo su un sottosegmento che crei.

Esempio function/index.js - Funzione Lambda nome casuale
var AWSXRay = require('aws-xray-sdk-core'); var AWS = AWSXRay.captureAWS(require('aws-sdk')); AWS.config.update({region: process.env.AWS_REGION}); var Chance = require('chance'); var myFunction = function(event, context, callback) { var sns = new AWS.SNS(); var chance = new Chance(); var userid = event.userid; var name = chance.first(); AWSXRay.captureFunc('annotations', function(subsegment){ subsegment.addAnnotation('Name', name); subsegment.addAnnotation('UserID', event.userid); }); // Notify var params = { Message: 'Created randon name "' + name + '"" for user "' + userid + '".', Subject: 'New user: ' + name, TopicArn: process.env.TOPIC_ARN }; sns.publish(params, function(err, data) { if (err) { console.log(err, err.stack); callback(err); } else { console.log(data); callback(null, {"name": name}); } }); }; exports.handler = myFunction;

Questa funzione viene creata automaticamente quando distribuisci l'applicazione di esempio su Elastic Beanstalk. Il xray ramo include uno script per creare una funzione Lambda vuota. I file di configurazione nella .ebextensions cartella creano il pacchetto di funzioni con npm install durante la distribuzione, quindi aggiornano la funzione Lambda con la CLI AWS .

Worker

La funzione worker analizzata viene fornito nel suo ramo, xray-worker, poiché non può essere eseguita a meno che non si creino prima la funzione worker e le relative risorse. Per le istruzioni, consulta il readme del ramo.

La funzione viene attivata da un evento Amazon CloudWatch Events in bundle ogni 5 minuti. Quando viene eseguita, la funzione estrae un elemento da una coda Amazon SQS gestita da Scorekeep. Ogni messaggio contiene informazioni su una partita completata.

Il worker preleva il record della partita e i documenti dalle altre tabelle a cui il record della partita fa riferimento. Ad esempio, il record di gioco in DynamoDB include un elenco di mosse eseguite durante il gioco. L'elenco non contiene le mosse, ma gli ID delle mosse che sono memorizzate in una tabella separata.

Anche le sessioni e gli stati sono memorizzati come riferimenti. In questo modo si evita che le voci nella tabella delle partite diventino troppo grandi ma sono necessarie chiamate aggiuntive per recuperare tutte le informazioni sulla partita. L'operatore dereferenzia tutte queste voci e crea un record completo del gioco come documento singolo in Amazon S3. Se desideri eseguire analisi sui dati, puoi eseguire query su di essi direttamente in Amazon S3 con Amazon Athena senza eseguire migrazioni di dati impegnative in lettura per estrarre i dati da DynamoDB.

Mappa di traccia che mostra come la funzione scorekeep worker utilizza Amazon SQS, Amazon S3 e l'API scorekeep.

La funzione worker dispone del tracciamento attivo abilitato nella sua configurazione in AWS Lambda. A differenza della funzione random name, l'operatore non riceve una richiesta da un'applicazione strumentata, quindi AWS Lambda non riceve un'intestazione di tracciamento. Con il tracciamento attivo, Lambda crea l'ID di traccia e prende decisioni di campionamento.

L'X-Ray SDK per Python si trova solo poche righe all'inizio della funzione che importa l'SDK ed esegue la sua patch_all funzione per applicare patch ai client HTTP che utilizza per chiamare Amazon SQS AWS SDK for Python (Boto) e Amazon S3. Quando il worker richiama l'API Scorekeep, l'SDK aggiunge l'intestazione di tracciamento alla richiesta per tracciare le chiamate tramite l'API.

Esempio _lambda/scorekeep-worker/scorekeep-worker.py -- Funzione worker Lambda
import os import boto3 import json import requests import time from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch_all patch_all() queue_url = os.environ['WORKER_QUEUE'] def lambda_handler(event, context): # Create SQS client sqs = boto3.client('sqs') s3client = boto3.client('s3') # Receive message from SQS queue response = sqs.receive_message( QueueUrl=queue_url, AttributeNames=[ 'SentTimestamp' ], MaxNumberOfMessages=1, MessageAttributeNames=[ 'All' ], VisibilityTimeout=0, WaitTimeSeconds=0 ) ...