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.
Funzioni
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.
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.
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
)
...