Instrumentar as funções do AWS Lambda
O Scorekeep usa duas funções do AWS Lambda. A primeira é a função Node.js na ramificação lambda
que gera nomes aleatórios para novos usuários. Quando um usuário cria uma sessão sem informar um nome, o aplicativo chama uma função denominada random-name
com o AWS SDK for Java. O X-Ray SDK para Java registra informações sobre a chamada ao Lambda em um subsegmento assim como qualquer outra chamada feita com um cliente instrumentado do SDK da AWS.
nota
A execução da função random-name
do Lambda requer a criação de recursos adicionais fora do ambiente do Elastic Beanstalk. Consulte o arquivo leia-me para obter mais informações e instruções: AWS Lambda Integration
A segunda função, scorekeep-worker
, é uma função Python que pode ser executada independentemente da API do Scorekeep. Quando um jogo termina, a API grava o ID da sessão e o ID do jogo em uma fila do SQS. A função de operador lê itens da fila e chama a API do Scorekeep para criar registros completos de cada sessão do jogo para armazenamento no Amazon S3.
O Scorekeep inclui modelos e scripts do AWS CloudFormation para criar as duas funções. Como você precisa empacotar o X-Ray SDK com o código da função, os modelos criam as funções sem nenhum código. Quando você implanta o Scorekeep, um arquivo de configuração incluído na pasta .ebextensions
cria um pacote de origem que inclui o SDK e atualiza o código da função e a configuração com a AWS Command Line Interface.
Funções
Nome aleatório
O Scorekeep chama a função de nome aleatório quando um usuário inicia uma sessão do jogo sem fazer login ou especificando um nome de usuário. Quando o Lambda processa a chamada a random-name
, ele lê o cabeçalho de rastreamento, que contém o ID de rastreamento e a decisão de amostragem gravados pelo X-Ray SDK para Java.
Para cada solicitação amostrada, o Lambda executa o daemon do X-Ray e grava dois segmentos. O primeiro registra informações sobre a chamada ao Lambda que invoca a função. Esse segmento contém as mesmas informações que o subsegmento registrado pelo Scorekeep, mas do ponto de vista do Lambda. O segundo segmento representa o trabalho que a função faz.
O Lambda passa o segmento de função para o X-Ray SDK por meio do contexto da função. Ao instrumentar uma função do Lambda, você não usa o SDK para criar um segmento para as solicitações de entrada. O Lambda fornece o segmento e você usa o SDK para instrumentar clientes e gravar subsegmentos.
![Mapa de rastreamento que mostra como o Scorekeep chama uma função do Lambda a fim de obter nomes aleatórios para novos usuários](images/scorekeep-servicemap-lambda-node.png)
A função random-name
é implementada em Node.js. Ele usa o SDK para JavaScript em Node.js para enviar notificações com o Amazon SNS e o X-Ray SDK para Node.js para instrumentar o cliente de SDK da AWS. Para gravar anotações, a função cria um subsegmento personalizado com AWSXRay.captureFunc
e grava anotações na função instrumentada. No Lambda, não é possível gravar anotações diretamente no segmento da função, apenas em um subsegmento que você criar.
exemplo function/index.js
: função do lambda de nome aleatório
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;
Essa função é criada automaticamente quando você implanta o aplicativo de amostra para o Elastic Beanstalk. A ramificação xray
inclui um script para criar uma função do Lambda vazia. Os arquivos de configuração na pasta .ebextensions
criam o pacote da função com npm install
durante a implantação e, em seguida, atualizam a função do Lambda com a AWS CLI.
Operador
A função de operador instrumentada é fornecida em sua própria ramificação xray-worker
, uma vez que ela não pode executar a menos que você crie a função de operador e os recursos relacionados antes. Consulte o leia-me da ramificação
A função é acionada por um evento do Amazon CloudWatch Events empacotado a cada 5 minutos. Quando ela é executada, a função obtém um item de uma fila do Amazon SQS que o Scorekeep gerencia. Cada mensagem contém informações sobre um jogo concluído.
O operador obtém o registro de jogos e documentos de outras tabelas às quais o registro do jogo faz referência. Por exemplo, o registro do jogo no DynamoDB inclui uma lista de movimentos executados durante o jogo. A lista não contém as movimentações propriamente ditas, mas os IDs das movimentações armazenados em uma tabela separada.
As sessões e os estados também são armazenados como referências. Isso impede que as entradas na tabela de jogos sejam muito grandes, mas requer chamadas adicionais para obter todas as informações sobre o jogo. O operador cancela as referências a todas essas entradas e cria um registro completo do jogo como um único documento no Amazon S3. Quando quiser analisar os dados, você poderá executar consultas diretamente no Amazon S3 com o Amazon Athena sem executar migrações de dados que exigem muita leitura para obter os dados do DynamoDB.
![Mapa de rastreamento que mostra como a função de operador do Scorekeep usa o Amazon SQS, o Amazon S3 e a API do Scorekeep.](images/scorekeep-servicemap-lambdaworker-node.png)
A função de operador tem o rastreamento ativo em sua configuração no AWS Lambda. Diferentemente do nome de função aleatória, o operador não recebe uma solicitação de um aplicativo instrumentado, de modo que AWS Lambda não recebe um cabeçalho de rastreamento. Com o rastreamento ativo, o Lambda cria o ID de rastreamento e toma as decisões de amostragem.
O X-Ray SDK para Python consiste apenas em algumas linhas na parte superior da função que importam o SDK e executam a função patch_all
para aplicar patches ao AWS SDK for Python (Boto) e a HTTclients que ele usa para chamar o Amazon SQS e o Amazon S3. Quando o operador chama a API do Scorekeep, o SDK adiciona o cabeçalho de rastreamento à solicitação para rastrear chamadas por meio da API.
exemplo _lambda/scorekeep-worker/scorekeep-worker.py
-- função do lambda do operador
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
)
...