AWS Lambda - Guia rápido

AWS Lambdaé um serviço que executa computação sem servidor, que envolve computação sem nenhum servidor. O código é executado com base na resposta de eventos nos serviços da AWS, como adicionar / remover arquivos no intervalo S3, atualizar tabelas dB do Amazon Dynamo, solicitação de HTTP do gateway de API da Amazon etc.

Para começar a trabalhar com AWS Lambda, só precisamos enviar o código para o serviço AWS Lambda. Todas as outras tarefas e recursos, como infraestrutura, sistema operacional, manutenção de servidor, monitoramento de código, logs e segurança, são cuidados pela AWS.

AWS Lambdasuporta linguagens como Java, NodeJS, Python, C # e Go. Observe que o AWS Lambda funcionará apenas com serviços AWS.

O que é AWS Lambda?

A definição do AWS Lambda conforme dada por sua documentação oficial é a seguinte -

O AWS Lambda é um serviço de computação que permite executar código sem provisionar ou gerenciar servidores. O AWS Lambda executa seu código apenas quando necessário e escala automaticamente, de algumas solicitações por dia a milhares por segundo. Você paga apenas pelo tempo de computação que consome - não há cobrança quando seu código não está em execução.

Como o AWS Lambda funciona?

O diagrama de blocos que explica o funcionamento do AWS Lambda em cinco etapas fáceis é mostrado abaixo -

Step 1 − Faça upload do código lambda da AWS em qualquer uma das linguagens compatíveis com o lambda da AWS, ou seja, NodeJS, Java, Python, C # e Go.

Step 2 − Esses são alguns serviços da AWS nos quais o lambda do AWS pode ser acionado.

Step 3 −AWS Lambda que possui o código de upload e os detalhes do evento no qual o gatilho ocorreu. Por exemplo, evento do Amazon S3, Amazon API Gateway, Dynamo dB, Amazon SNS, Amazon Kinesis, CloudFront, Amazon SES, CloudTrail, aplicativo móvel etc.

Step 4 − Executa o código AWS Lambda apenas quando acionado pelos serviços da AWS em cenários como -

  • O usuário carrega arquivos no intervalo S3
  • http get / post endpoint URL é atingido
  • os dados são adicionados / atualizados / excluídos nas tabelas dB do dínamo
  • notificação push
  • coleta de fluxos de dados
  • hospedagem de site
  • envio de email
  • aplicativo móvel, etc.

Step 5 − Lembre-se de que a AWS cobra apenas quando o código lambda da AWS é executado, e não de outra forma.

Vantagens de usar AWS Lambda

O AWS Lambda oferece vários benefícios quando você está trabalhando nisso. Esta seção os discute em detalhes -

Facilidade de trabalhar com código

O AWS Lambda oferece a infraestrutura para fazer upload de seu código. Ele se encarrega de manter o código e dispara o código sempre que o evento necessário acontecer. Ele permite que você escolha a memória e o tempo limite necessário para o código.

O AWS Lambda também pode executar solicitações paralelas de acordo com os gatilhos de evento.

Provisão de Log

O AWS Lambda fornece os detalhes do número de vezes que um código foi executado e o tempo gasto para execução, a memória consumida etc. O AWS CloudWatch coleta todos os logs, o que ajuda a entender o fluxo de execução e na depuração do código.

Faturamento com base no uso

O faturamento do AWS Lambda é feito com base no uso da memória, na solicitação feita e na execução, que é faturada em incrementos de no mínimo 100 ms. Portanto, para uma execução de 500ms, o faturamento será a cada 100ms. Se você especificar seu código lambda da AWS para ser executado em 500 ms e o tempo de execução for de apenas 200 ms, a AWS cobrará você apenas pelo tempo gasto, ou seja, 200 ms de execução em vez de 500 ms. A AWS sempre cobra pelo tempo de execução usado. Você não precisa pagar se a função não for executada.

Suporte multilíngue

O AWS Lambda oferece suporte a linguagens populares, como Node. js, Python, Java, C # e Go. Essas são linguagens amplamente utilizadas e qualquer desenvolvedor achará fácil escrever código para AWS Lambda.

Facilidade de criação e implantação de código

Existem muitas opções disponíveis para Lambda para autoria e implantação de código. Para escrever seu código, você pode usar o editor online AWS, Visual Studio IDE ou Eclipse IDE. Ele também oferece suporte para estrutura sem servidor, o que facilita a escrita e a implantação do código AWS Lambda. Além do console AWS, temos AWS-cli para criar e implantar o código.

Outras características

Você pode usar o AWS Lambda gratuitamente obtendo um login para o nível gratuito da AWS. Oferece serviço gratuito por 1 ano. Dê uma olhada nos serviços gratuitos oferecidos pelo nível gratuito da AWS.

Desvantagens de usar AWS Lambda

Apesar de muitas vantagens, o AWS Lambda possui as seguintes desvantagens -

  • Não é adequado para pequenos projetos.

  • Você precisa analisar cuidadosamente seu código e decidir a memória e o tempo limite. Caso sua função precise de mais tempo do que o alocado, ela será encerrada de acordo com o tempo limite especificado e o código não será executado totalmente.

  • Como o AWS Lambda depende totalmente da AWS para a infraestrutura, você não pode instalar nenhum software adicional se seu código exigir.

Eventos que acionam o AWS Lambda

Os eventos que podem acionar o AWS Lambda são os seguintes -

  • Entrada em um objeto S3
  • Inserção, atualização e exclusão de dados na tabela Dynamo DB
  • Notificações push do SNS
  • Chamadas GET / POST para API Gateway
  • Modificação de cabeçalhos no visualizador ou solicitação / resposta de origem no CloudFront
  • Entradas de registro no fluxo de dados AWS Kinesis
  • Registrar histórico no CloudTrail

Casos de uso do AWS Lambda

O AWS Lambda é um serviço de computação usado principalmente para executar processos em segundo plano. Ele pode ser acionado quando usado com outros serviços AWS. A lista de serviços AWS onde podemos usar AWS Lambda é fornecida abaixo -

S3 Object e AWS Lambda

O Amazon S3 passa os detalhes do evento para AWS Lambda quando há qualquer upload de arquivo no S3. Os detalhes do upload ou exclusão do arquivo ou movimentação do arquivo são passados ​​para o AWS Lambda. O código no AWS Lambda pode realizar a etapa necessária para quando ele recebe os detalhes do evento. Por exemplo, criando uma miniatura da imagem inserida no S3.

DynamoDB e AWS Lambda

O DynamoDB pode acionar o AWS Lambda quando houver dados adicionados, atualizados e excluídos da tabela. O evento AWS Lambda possui todos os detalhes da tabela AWS DynamoDB sobre a inserção / atualização ou exclusão.

API Gateway e AWS Lambda

O API Gateway pode acionar o AWS Lambda em métodos GET / POST. Podemos criar um formulário e compartilhar detalhes com o endpoint do API Gateway e usá-lo com o AWS Lambda para processamento posterior, por exemplo, fazendo uma entrada dos dados na tabela DynamoDB.

SNS e AWS Lambda

O SNS é usado para notificações push, envio de SMS etc. Podemos acionar o AWS lambda quando houver qualquer notificação push acontecendo no SNS. Também podemos enviar SMS para o número de telefone do AWS Lambda quando ele recebe o gatilho.

Eventos programados e AWS Lambda

Eventos agendados podem ser usados ​​para tarefas cron. Ele pode acionar o AWS Lambda para realizar a tarefa no padrão de tempo regular.

CloudTrail e AWS Lambda

O CloudTrail pode ser útil no monitoramento dos logs da conta. Podemos usar o AWS Lambda para processar posteriormente os logs do CloudTrail.

Kinesis e AWS Lambda

Kinesis é usado para capturar / armazenar dados de rastreamento em tempo real provenientes de cliques em sites, logs, feeds de mídia social e um gatilho para que o AWS Lambda possa fazer processamento adicional nesses logs.

CloudFront e Lambda @ Edge

CloudFront é uma rede de entrega de conteúdo onde você pode hospedar seu site e Lambda @ Edge pode ser usado para processar os cabeçalhos provenientes da solicitação do visualizador, solicitação de origem, resposta de origem e resposta do visualizador. A modificação de cabeçalhos inclui tarefas como modificação de dados de cookies, reescrita de URL, usados ​​para testes AB para alterar a resposta enviada ao usuário de volta, adicionando informações de cabeçalhos extras para fins de segurança etc.

Antes de começar a trabalhar com o AWS Lambda, você precisa ter um login com o console da Amazon. O AWS Lambda oferece suporte a dois IDEs:Visual studio e Eclipse. Neste capítulo, discutiremos sobre a instalação do AWS Lambda em detalhes.

Criar login no AWS Console

Você pode criar seu login no AWS Console gratuitamente usando o nível gratuito da Amazon. Você pode seguir estas etapas fornecidas abaixo para criar um login com a Amazon para fazer uso dos serviços da Amazon -

Passo 1

Vamos para https://aws.amazon.com/free/e clique em criar conta gratuita. Você pode ver a captura de tela conforme mostrado abaixo -

Passo 2

Clique em Create a Free Account botão e você será redirecionado para a tela conforme mostrado abaixo -

Agora, preencha os detalhes de endereço de e-mail, senha e nome da conta AWS de acordo com sua escolha neste formulário mostrado acima e clique Continue.

etapa 3

Agora, você pode encontrar a tela conforme mostrado abaixo -

Insira todos os detalhes necessários neste formulário.

Observe que há taxas mínimas a serem pagas com base no país selecionado. O mesmo será devolvido assim que os dados inseridos forem validados. Você precisa dos detalhes do cartão de crédito ou débito para criar a conta gratuita. Para usuários indianosRs 2/- é deduzido e para os EUA $1 é cobrado. O mesmo é devolvido ao respectivo usuário do cartão uma vez que o usuário seja validado.

Observe que a conta é gratuita e não há limite para o uso dos serviços. Se o uso exceder o limite, o usuário será cobrado por isso.

Assim que os detalhes forem inseridos no formulário mostrado acima, clique Create Account and Continue.

Você será redirecionado para a próxima tela, conforme mostrado abaixo.

Passo 4

Você precisa inserir os detalhes de pagamento, ou seja, cartão de crédito ou débito, junto com sua data de validade e o nome do titular do cartão conforme mostrado abaixo -

Etapa 5

Depois de inserir todos os detalhes, clique em Secure Submit e vai validar o cartão com o banco e dar-lhe o OTPno seu celular que está vinculado ao cartão. Você pode encontrar uma janela conforme mostrado abaixo -

Agora, entre no OTP detalhes e clique Make Payment. Você é cobrado com base no país selecionado.

Etapa 6

Assim que o pagamento for feito, a próxima etapa é a verificação do telefone. Você precisa inserir o número do seu celular conforme mostrado abaixo -

Assim que os detalhes forem preenchidos, clique Call Me Now. A AWS ligará imediatamente usando sistema automatizado. Quando solicitado na chamada, digite o número de 4 dígitos que aparecerá no seu site AWS para o seu telefone usando o teclado do telefone. Isso verificará o seu número e você obterá a ativação do e-mail no id de e-mail especificado no início ao criar o login.

Etapa 7

Clique no link de e-mail e insira o nome da conta ou id de e-mail e a senha e faça login para você nos serviços da AWS conforme mostrado abaixo -

O nome da conta é exibido no canto superior direito, conforme mostrado acima. Agora você pode começar a usar o serviço AWS Lambda. Para o serviço AWS Lambda, as linguagens suportadas são NodeJS, Python, Java, C # e Go.

Instalação do Visual Studio 2017

Existem 2 IDEs compatíveis com AWS: Visual Studio e Eclipse. Nesta seção, discutiremos a instalação do Visual Studio 2017 no Windows, Linux Mac. Vá para o site oficial do Visual Studio:https://www.visualstudio.com/downloads/. Você pode encontrar a tela de boas-vindas conforme mostrado -

Baixe a versão da comunidade, ou seja Visual Studio Community 2017como é um livre agora para a prática. Depois de instalado, ele o conduzirá pelas etapas de instalação em que você precisa selecionar os pacotes a serem usados ​​posteriormente. Você pode selecionar nodejs, python, c# pacote para trabalharmos mais tarde.

Suporte do kit de ferramentas AWS para Visual Studio 2017

Depois de instalar o Visual Studio 2017, você terá que seguir as etapas fornecidas para instalar o suporte do AWS Toolkit para Visual Studio 2017 -

Passo 1

Vamos para https://aws.amazon.com/visualstudio/ e baixe o kit de ferramentas AWS para Visual Studio. A exibição é mostrada abaixo -

Observe que o pacote baixado para Visual Studio 2017 é vsixpacote. Se a sua versão do Visual Studio estiver entre 2013-2015, ele irá instalar ummsiinstalador. Clique noDownload botão como mostrado abaixo.

Passo 2

Agora, clique duas vezes no pacote vsix baixado e ele o conduzirá pelas etapas de instalação conforme mostrado abaixo -

Depois que o Visual Studio for instalado com êxito, você pode ver uma janela, conforme mostrado abaixo -

etapa 3

Agora, abra o Visual Studio 2017 e você verá uma página de boas-vindas da AWS conforme mostrado abaixo -

Observe que você precisa adicionar a chave de acesso, a chave secreta e o número da conta para começar e usar os serviços AWS do visual studio.s

AWS Lambda BoilerPlate para NodeJS

Você pode usá-lo com visual studio code como mostrado abaixo.

Passo 1

Você pode baixar Visual studio code gratuitamente no site oficial:https://www.visualstudio.com/downloads/. A página inicial de downloads do Visual Studio se parece com isto -

Passo 2

Agora, abra o código do Visual Studio conforme mostrado abaixo -

etapa 3

Para instalar o suporte para AWS, support for nodejsa opção está disponível dentro das extensões. Você pode pesquisar por AWS e ele exibirá a opção a seguir -

Passo 4

Agora, instale o clichê para AWS Lambda em nodejs como mostrado -

Etapa 5

Clique no repositório e clone-o no Visual Studio para começar a escrever a função Lambda no Visual Studio. Ele redireciona você para este repositório que podemos clonar no Visual Studio:https://github.com/loganarnett/vscode-lambda-snippets. Agora, abra a paleta de comandos deView opção no Visual Studio.

Etapa 6

Clique nele e escolha clone git como mostrado abaixo -

Etapa 7

Insira o url do repositório e salve-o de acordo com sua escolha local. Crioindex.js arquivo como mostrado abaixo para trabalhar com a função lambda -

Instalação de Eclipse IDE

Agora, você terá que instalar o Eclipse Java EE IDE mais recente. Você pode baixá-lo do site oficial do Eclipse:https://www.eclipse.org/downloads/

Suporte do kit de ferramentas AWS para Eclipse IDE

Depois que o Eclipse estiver instalado, execute as seguintes etapas -

Passo 1

Vá para a ajuda no menu e clique em Install New Software.

Passo 2

Entrar https://aws.amazon.com/eclipse na caixa de texto rotulada Work with na parte superior da caixa de diálogo.

etapa 3

Agora, selecione o necessário AWS Core Management Tools e outros itens opcionais da lista mostrada abaixo.

Passo 4

Agora clique Next. O Eclipse irá guiá-lo através das etapas de instalação restantes, conforme descrito nas etapas adicionais fornecidas abaixo.

Etapa 5

Os módulos principais da AWS são exibidos na grade abaixo, conforme mostrado na captura de tela fornecida abaixo -

Etapa 6

Depois de instalada, a ferramenta AWS estará disponível no Eclipse conforme mostrado abaixo -

Etapa 7

Você pode ver a seguinte tela ao clicar no serviço Amazon.

Agora, clique em AWS Explorer para ver os serviços disponíveis. Discutiremos como trabalhar com o IDE instalado nos próximos capítulos.

O AWS Lambda é um serviço que cuida de computar seu código sem nenhum servidor. Diz-se que é computação sem servidor. O código é executado com base na resposta de eventos em serviços AWS, como adicionar / remover arquivos no intervalo S3, atualizar Amazon DynamoDBtables, solicitação HTTP do gateway Amazon Api etc.

O código AWS Lambda pode ser escrito em NodeJS, Java, C #, Python e Go. Este capítulo falará em detalhes sobre a criação da função AWS Lambda no console AWS.

AWS Console

Faça login no AWS Console no link https://aws.amazon.com/console. Depois de fazer o login, ele o redirecionará para a tela onde os serviços da AWS são exibidos.

Exemplo: Criação de uma função

Vamos entender a funcionalidade do AWS Console com a ajuda de um exemplo. Clique em Lambda (marcado acima), ele irá redirecionar para criar a função conforme mostrado abaixo -

Clique Create function botão e a tela exibe os seguintes detalhes -

Observe que, por padrão, a opção é Author from scratch. Esta opção permite que você escreva o código Lambda do zero. Terá apenas uma função simples comhello world mensagem.

A segunda opção Blue prints tem os seguintes detalhes.

Ele fornece detalhes do código já escrito para alguns dos serviços aws em idiomas disponíveis com AWS Lambda. Caso você precise escrever o código AWS Lambda para todos os serviços que puder verificarblue prints e comece.

A terceira opção Serverless Application Repository possui a configuração de aplicativo sem servidor que ajudará a implantar o código AWS Lambda.

Na discussão posterior, trabalharemos na primeira opção, onde criamos a função lambda da AWS usando Author from scratch.

Antes de criarmos a função Lambda, será necessária uma função, ou seja, permissão para trabalhar com serviços AWS e aws lambda. Posteriormente, a função deve ser atribuída à função aws lambda.

Criação de função no AWS Console

Para criar uma função no console da AWS, vá para os serviços do console da AWS e clique em IAM conforme mostrado abaixo -

Agora, se você clicar IAM, você verá a tela conforme mostrado abaixo -

Se você selecionar Roles, você pode ver os seguintes botões na tela -

Agora clique Create role. Ele solicitará que você escolha o serviço em que precisa usar a função criada.

Uma vez que precisamos usar esta função com AWS Lambda, selecione Lambda e clique Next:Permissionsbotão como mostrado acima. A próxima tela exibe o nome da política que está disponível de acordo com os serviços da AWS. Você pode selecionar a política aqui -

Por exemplo, se você deseja permissão para o AWS Lambda funcionar com S3 e DynamoDB, você precisa selecionar a política. Na caixa de pesquisa, insira o serviço AWS e clique na caixa de seleção. Você pode selecionar várias políticas e depois clicar emNext:Review.

Também é possível criar sua própria política. Por exemplo, existe uma tabela dynamodb e você precisa dar permissão apenas para essa tabela, em tais casos, você pode criar uma política.

Clique em Create policybotão conforme mostrado na tela acima. A seguir estão os detalhes exibidos na tela.

Escolha um Servicepara o qual você está criando a política. Mais tarde, ele exibirá dados para Ações,resources e Request conditions.

Agora, devemos escolher o serviço. Deixe-nos selecionarAWS Dynamodb da pesquisa. Actions tem os seguintes detalhes -

Agora, entre no Access levelvocê quer dar ao DynamoDB. Então,resources exibirá os seguintes detalhes -

Agora, selecione o tipo de recurso da tabela. Você pode ver a seguinte saída -

Para permissão na mesa, você precisa Add ARN. ARN são os detalhes exclusivos da tabela criada no AWS DynamoDB. Você obterá os detalhes quando a tabela for criada no dynamodb.

Se você clicar Add ARN e exibirá os seguintes detalhes -

Agora, se você entrar no ARN e a Region, Account e Tableo nome será preenchido. Você deve clicarAddbotão para adicionar a política. Da mesma forma, você pode criar políticas para outros serviços.

Aqui, selecionamos duas políticas AmazonS3FullAccess e AmazonDynamoDBFullACcess. Demos acesso total ao S3 e ao DynamoDB nessa função. No entanto, é sugerido que você dê permissão apenas para os intervalos e tabelas necessários.

Você pode seguir as etapas discutidas anteriormente para criar as políticas usando ARN.

Passo 1

Clique Create rolebotão para criar a função. Todas as funções criadas são exibidas conforme mostrado -

Passo 2

Observe que você pode selecionar a função necessária, caso precise de alguma modificação para a função criada. Se selecionarmosAuthor from scratch option, você tem que entrar Name, Runtime and Role.

etapa 3

Você pode observar os seguintes detalhes em Runtime dropdown -

Passo 4

Você pode selecionar o tempo de execução de sua escolha e prosseguir conforme mostrado.

Role dropdown tem as seguintes opções -

  • Choose an existing role − Isso exibirá todas as funções criadas nas funções do IAM.

  • Create new role from template(s) −Isso permitirá que você crie uma função e exibirá a permissão para ser selecionado para essa função. Observe a captura de tela para um melhor entendimento.

  • Create a custom role − Isso permite que o usuário crie políticas conforme discutimos anteriormente.

Etapa 5

Selecione os runtime, rolee adicione a função. Clique emCreate functionbotão para criar a função lambda. A próxima tela exibida é a seguinte -

Partes da função AWS Lambda

Existem duas partes para a função AWS Lambda:Configuration e Monitoring. Vamos discutir cada um em detalhes.

Configuração

As seguintes funcionalidades estão incluídas na Configuração.

Add Triggers

Os gatilhos que são necessários para adicionar à função AWS Lambda são exibidos da seguinte forma -

Observe que, quando selecionamos um gatilho, precisamos adicionar os detalhes de configuração para esse gatilho. Por exemplo, para o gatilho S3, precisamos selecionar o nome do intervalo; para o acionador Dynamodb, precisamos selecionar o nome da tabela.

Exemplo

Vamos ver um exemplo de detalhes de configuração para um gatilho S3 -

Agora, adicione detalhes de configuração para o gatilho S3 adicionado -

Aqui você precisa selecionar o bucket name, event type no qual você deseja acionar Lambda, prefixo e padrão de filtro, se houver, e Add o gatilho.

Adicionando Código no Lambda

Agora, devemos nos concentrar no código Lambda a ser escrito. Para adicionar código em aws lambda, existem três opções -

  • Usando o editor embutido
  • Usando arquivo .zip
  • Carregar arquivo do Amazon S3

Isso é mostrado na imagem abaixo -

Vamos discutir cada um deles em detalhes.

Using the inline editor

O editor de código embutido onde você pode escrever seu código é o seguinte -

Você pode escrever seu código escolhendo o idioma de sua escolha. Você tem permissão para escolher o tempo de execução novamente aqui.

Observe a imagem a seguir para uma melhor compreensão -

O código deve ser escrito em index.js.Handler. Os detalhes variam de acordo com o tempo de execução. Paranodejs, isto é filename.export function que é agora index.lambda handler.

Upload a .ZIP file

Você pode primeiro escrever o código, compactá-lo e fazer o upload do arquivo zip selecionando Upload a .ZIP file.

Upload a file from Amazon S3

Você pode fazer o upload do arquivo no intervalo S3 e escolher a opção Upload a file from Amazon S3.

Observe que para .ZIP e S3 não será possível alterar o tempo de execução.

Variáveis ​​ambientais

Eles pegam pares de valores-chave e os compartilham com o código AWS Lambda. Podemos usar variáveis ​​de ambiente no AWS Lambda para armazenar os detalhes de conexão do banco de dados, detalhes do arquivo para armazenar a saída, detalhes do arquivo de log, etc.

Tag

Eles são pares de valores-chave adicionados ao AWS Lambda para organizar melhor a função quando usados ​​em diferentes regiões. Para um caso de uso simples, não é necessário. Quando há muitas funções do Lambda criadas, a marcação ajuda a filtrar e gerenciar as funções do Lambda.

Função de execução

Você pode alterar a função novamente aqui, se não for feito corretamente no início da criação da função Lambda. Você pode atualizar ou criar uma nova função aqui. Ele fornece as mesmas opções que foram exibidas no início da criação da função Lambda.

Configurações básicas

Aqui você precisa inserir uma breve descrição do que sua função Lambda está fazendo. Selecione a memória e o tempo limite necessários para a função Lambda.

Rede

Isso permite que você selecione o VPC que permitirá que você acesse a função Lambda do VPC. Por padrão, nenhum VPC é selecionado.

Depuração e tratamento de erros

Para depuração e tratamento de erros, você pode selecionar o serviço AWS para enviar os detalhes. As opções disponíveis sãoNone, SNS e SQS.

Simultaneidade

Isso permite que você aloque um limite específico de execuções simultâneas permitidas para esta função.

Auditoria e Conformidade

Ele contém logs que são gerenciados com a ajuda do AWS CloudTrail.

Uma vez feito isso, você precisa salvar as alterações usando o botão Salvar, conforme mostrado aqui -

Agora, se você clicar Testbotão, ele solicitará um evento de teste. Você pode passar em um evento de teste de amostra da seguinte maneira -

O evento de teste criado é mostrado aqui -

Agora, salve o evento de teste e clique no botão de teste para ver a execução da função AWS Lambda -

O código para index.js é o seguinte -

exports.lambdahandler = (event, context, callback) => {
   // TODO implement
   console.log(event.key1);
   console.log(event.key2);
   console.log(event.key3);
   callback(null, 'Lambda test');
};

Observe que a função de retorno de chamada é chamada quando há erro ou sucesso. Se tiver sucesso, você pode verLambda test será exibido.

Monitoramento

Selecione a guia de monitoramento para visualizar os detalhes de execução da função Lambda. Os gráficos mostram os detalhes do tempo de execução, erros ocorridos etc.

Você também pode ver os registros no Cloudwatch. Para isso, acesse os serviços da AWS e selecione o Cloudwatch conforme mostrado -

Agora, selecione os registros do lado esquerdo e insira o nome da função no filtro -

A função AWS Lambda executa um código quando é chamada. Este capítulo discute todas essas etapas envolvidas no ciclo de vida da função do AWS Lambda em detalhes.

Etapas para construir uma função Lambda

O ciclo de vida da função Lambda inclui quatro etapas necessárias -

  • Authoring
  • Deploying
  • Monitoring
  • Troubleshooting

Código Lambda de Autoria

O código de função do AWS Lambda pode ser escrito nas seguintes linguagens -

  • NodeJS
  • Java,
  • Python
  • C#
  • Go.

Podemos escrever código para AWS Lambda usando o console AWS, AWS CLI, do Eclipse IDE, do Visual Studio IDE, estrutura sem servidor, etc.

A tabela a seguir mostra uma lista de linguagens e as diferentes ferramentas e IDE que podem ser usados ​​para escrever a função Lambda -

Língua IDE para autoria de código Lambda
NodeJS

AWS Lambda Console

IDE do Visual Studio

Java IDE Eclipse
Pitão AWS Lambda Console
C #

IDE do Visual Studio

.NET core

Ir AWS Lambda Console

Implantando Código Lambda

Depois de decidir a linguagem em que deseja escrever a função Lambda, há duas maneiras de implantar o código -

  • Escreva diretamente o código no console AWS
  • Compacte os arquivos com todos os arquivos e dependências

No entanto, lembre-se de que a permissão adequada deve ser dada ao arquivo zip.

Testando Código Lambda

O código Lambda pode ser testado para eventos dentro do console AWS Lambda. Também é possível testar a função Lambda do AWS cli e serverless cli. O console da AWS também possui dados de eventos que podem ser usados ​​como eventos de amostra durante o teste da função AWS Lambda.

Monitorando a função Lambda

O monitoramento da função Lambda pode ser feito usando o AWS CloudWatch. Podemos adicionar mensagens de log necessárias em idiomas que escolhemos e ver o mesmo no AWS CloudWatch.

Para começar a escrever a função Lambda, há um padrão a ser seguido. A seguir estão os principais conceitos básicos a serem seguidos para escrever uma função Lambda -

Handler

Handler é um nome da função lambda da AWS de onde a execução começa. Ele aparece no console da AWS conforme mostrado abaixo -

Observe que aqui alteramos o manipulador padrão para outro nome e atualizamos o mesmo no manipulador -

Observe que a forma como um manipulador é chamado difere dos idiomas selecionados como tempo de execução.

Params passou para handler

Se você observar a função do manipulador, os parâmetros passados ​​são event, context e call back function como mostrado abaixo -

Event parâmetro tem todos os detalhes para o gatilho usado.

ContextO parâmetro basicamente cuida dos detalhes do tempo de execução para a função Lambda executar. Podemos interagir com a função Lambda usando ocontextparam. Ele tem os detalhes como o tempo restante antes que o AWS Lambda termine uma função, ou seja, tempo limite especificado durante a criação da função Lambda, nome da função Lambda, nome do grupo cloudwatch, detalhes de arn etc.

Exemplo

Vamos entender os detalhes obtidos do objeto de contexto AWS Lambda com a ajuda de um exemplo -

exports.lambdahandler = (event, context, callback) => {
   // TODO implement
   console.log("context object details");
   console.log(JSON.stringify(context));
   callback(null, 'Lambda test');
};

Ao executar a função Lambda mostrada acima, você pode ver a seguinte saída -

Resultado

o context os detalhes são fornecidos a seguir -

{
   "callbackWaitsForEmptyEventLoop":true,"logGroupName":"/aws/lambda/myfirstlambdafunction",
   "logStreamName":"2018/05/20/[$LATEST]04f17ee4ff7048d5bb1fedffaa807c71","functionName":
   "myfirstlambdafunction","memoryLimitInMB":"128","functionVersion":"$LATEST","invokeid":
   "c931e21c-5bf3-11e8-acfe-47fdbb39eee9","awsRequestId":"c931e21c-5bf3-11e8-acfe-47fdbb39eee9",
   "invokedFunctionArn":"arn:aws:lambda:us-east-1:625297745038:function:myfirstlambdafunction"
}

Observe que ele tem detalhes como functionName, memorylimit, requestId etc.

Exploração madeireira

Os logs adicionados dentro da função Lambda são exibidos no AWS CloudWatch quando a função AWS é executada. A sintaxe dos registros varia de acordo com o idioma selecionado. Por exemplo emnodejs, é console.log.

Esta é a saída que você pode ver em AWSCloudWatch -

Manipulação de erros

A função AWS Lambda fornece uma função de retorno de chamada que é usada para notificar a função Lambda que ocorreu um erro ou sucesso. Observe que aqui usamos nodejs como o tempo de execução. O tratamento de erros será diferente de acordo com o idioma selecionado.

Observe o exemplo dado aqui para uma melhor compreensão -

exports.lambdahandler = (event, context, callback) => {
   // TODO implement
   var error = new Error("There is error in code");
   callback(error);
};

Resultado

Ao testar o código Lambda, você pode encontrar a saída conforme mostrado abaixo -

Os detalhes do log da seguinte forma -

Nodejs é uma das linguagens que a função AWS Lambda suporta. As versões suportadas com nodejs são v6.10 e v8.10. Neste capítulo, aprenderemos em detalhes sobre as várias funcionalidades da função AWS Lambda no NODEJS.

Handler em NodeJS

Para escrever a função AWS Lambda em nodejs, devemos primeiro declarar um manipulador. O manipulador em nodejs é o nome do arquivo e o nome da função de exportação. Por exemplo, o nome do arquivo éindex.js e o nome da função de exportação é lambda handler, então seu manipulador correspondente é index.lambdahandler

Observe um manipulador de amostra mostrado aqui -

exports.lambdahandler = function(event, context, callback) {   //code goes here}

Params to Handler

Handler é o núcleo principal para a construção da função Lambda. O manipulador leva três parâmetros:event, context e callback.

Parâmetro de Evento

Possui todos os detalhes do evento acionado. Por exemplo, se estivermos usando a função Lambda para ser disparada no S3, o evento terá detalhes do objeto S3.

Parâmetro de Contexto

Ele contém os detalhes do contexto, como as propriedades e os detalhes de configuração da função Lambda.

Função de retorno de chamada

Ajuda a dar detalhes ao chamador. A estrutura do retorno de chamada é a seguinte -

callback(error, result);

Os parâmetros da função de retorno de chamada são explicados abaixo -

Error −Ele terá detalhes se algum erro ocorreu durante a execução da função Lambda. Se a função Lambda for bem-sucedida,null pode ser passado como o primeiro parâmetro para a função de retorno de chamada.

Result −Isso fornecerá os detalhes da execução bem-sucedida da função lambda. Se ocorrer um erro, o parâmetro do resultado será ignorado.

Note −Não é obrigatório usar a função de retorno de chamada no AWS Lambda. Caso não haja função de retorno de chamada, o manipulador irá retorná-lo como nulo.

As assinaturas de retorno de chamada válidas são fornecidas abaixo -

callback();                // It will return success, but no indication to the caller
callback(null);            // It will return success, but no indication to the caller
callback(null, "success"); // It will return the success indication to the caller
callback(error);           //  It will return the error indication to the caller

Sempre que o AWS Lambda é executado, os detalhes do retorno de chamada, como erro ou sucesso, são registrados no AWS CloudWatch junto com as mensagens do console, se houver.

Trabalhando com AWS Lambda em Nodejs8.10

Vamos entender como trabalhar com o AWS Lambda em nodejs8.10 e invocar a função de forma sincronizada e assíncrona.

Invocando a Função Lambda em modo de sincronização

O exemplo a seguir dá uma ideia sobre como invocar a função Lambda de forma sincronizada -

exports.handler = function(event, context, callback) {
   let arrItems = [4,5,6,8,9,10,35,70,80,31];
   function countevennumbers (items) {
      return new Promise(resolve => {
         setTimeout(() => {
            let a = 0;
            for (var i in items) {
               if (items[i] % 2 == 0) {
                  a++;
               } 
            }
            resolve(a);
         },2000);
      });
   }
   let evennumber = countevennumbers(arrItems);
   callback(null,'even numbers equals ='+evennumber);
};

Você pode observar a seguinte saída após testar este código no console AWS -

Observe que a saída do código acima é um objeto de promessa. Ele não fornece a contagem, pois a contagem é incrementada dentro de um setTimeout e a chamada da função não espera pela execução dentro de setTimeout e retorna o objeto de promessa.

Se tivéssemos async/await na função de manipulador obterá a saída exata da função lambda.

Invocando o Handler de maneira assíncrona

O exemplo a seguir dá uma ideia sobre como invocar a função Lambda de forma assíncrona -

exports.handler = async function(event, context, callback) {
   let arrItems = [4,5,6,8,9,10,35,70,80,31];
   function countevennumbers (items) {
      return new Promise(resolve => {
         setTimeout(() => {
            let a = 0;
            for (var i in items) {
               if (items[i] % 2 == 0) {
                  a++;
               } 
            }
            resolve(a);
         }, 2000);
      });
   }
   let evennumber = await countevennumbers(arrItems);
   callback(null,'even numbers equals ='+evennumber);
};

Nós adicionamos async e awaitno código acima. Quando usamosawaitao lado da chamada da função, a execução é interrompida até que a promessa dentro da função seja resolvida. Observe queawait é válido apenas para async funções.

Você pode observar a seguinte saída após testar este código no console AWS -

ContextDetails em NodeJS

O objeto de contexto fornece detalhes como o nome da função Lambda, tempo restante em milissegundos, ID da solicitação, nome do grupo Cloudwatch, detalhes de tempo limite etc.

As tabelas a seguir mostram a lista de métodos e atributos disponíveis com o objeto de contexto -

Método disponível para objeto de contexto

Sr. Não Nome e descrição do método
1

getRemainingTimeInMillis()

Este método fornece o tempo restante em milissegundos até que a função Lambda termine a função

Atributos disponíveis para o objeto de contexto

Sr. Não Nome e descrição do atributo
1

functionName

Isso dá o nome da função AWS Lambda

2

functionVersion

Isso dá a versão da função AWS Lambda executando

3

nvokedFunctionArn

Isso fornecerá detalhes do ARN.

4

memoryLimitInMB

Isso mostra o limite de memória adicionado ao criar a função Lambda

5

awsRequestId

Isso fornece o ID de solicitação da AWS.

6

logGroupName

Isso dará o nome do grupo Cloudwatch

7

logStreamName

Isso fornecerá o nome do fluxo de log do cloudwatch onde os logs são gravados.

8

identity

Isso fornecerá detalhes sobre o provedor de identidade cognito amazon quando usado com o aws mobile sdk.

Os detalhes fornecidos são os seguintes -

  • identity.cognito_identity_id
  • identity.cognito_identity_pool_id
9

clientContext

Isso fornecerá detalhes do aplicativo cliente quando usado com o aws mobile sdk. Os detalhes fornecidos são os seguintes -

  • client_context.client.installation_id
  • client_context.client.app_title
  • client_context.client.app_version_name
  • client_context.client.app_version_code
  • client_context.client.app_package_name
  • client_context.custom - possui ditado de valores personalizados do aplicativo cliente móvel
  • client_context.env - possui detalhes de ambiente do AWS Mobile SDK

Veja o exemplo a seguir para ter uma ideia melhor sobre o objeto de contexto -

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log('Remaining time =>', context.getRemainingTimeInMillis());
   console.log('functionName =>', context.functionName);
   console.log('AWSrequestID =>', context.awsRequestId);
   console.log('logGroupName =>', context.log_group_name);
   console.log('logStreamName =>', context.log_stream_name);
   console.log('clientContext =>', context.clientContext);
   callback(null, 'Name of aws Lambda is=>'+context.functionName);
};

Você pode observar a seguinte saída após testar este código no console AWS -

Você pode observar a seguinte saída de log após testar este código no console AWS -

Login no NodeJS

Podemos usar console.log para registrar em NodeJS. Os detalhes de registro podem ser obtidos do serviço CloudWatch com a função Lambda.

Observe o seguinte exemplo para um melhor entendimento -

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log('Logging for AWS Lamnda in NodeJS');
   callback(null, 'Name of aws Lambda is=>'+context.functionName);
};

Você pode observar a seguinte saída após testar este código no console AWS -

Você pode observar a seguinte captura de tela do CloudWatch -

Tratamento de erros em NodeJS

Vamos entender como a notificação de erro é feita no NodeJS. Observe o seguinte código -

exports.handler = function(event, context, callback) {
   // This Source code only throws error. 
   var error = new Error("something is wrong");
   callback(error);   
};

Você pode observar o seguinte na saída do log -

Os detalhes do erro são fornecidos no retorno de chamada da seguinte forma -

{
   "errorMessage": "something is wrong",
   "errorType": "Error",
   "stackTrace": [    "exports.handler (/var/task/index.js:2:17)"  ]
}

Neste capítulo, vamos entender em detalhes como criar uma função simples do AWS Lambda em Java.

Criação de arquivo JAR no Eclipse

Antes de continuar a trabalhar na criação de uma função lambda no AWS, precisamos do suporte do kit de ferramentas AWS para Eclipse. Para qualquer orientação sobre a instalação do mesmo, você pode consultar oEnvironment Setup capítulo neste tutorial.

Assim que terminar a instalação, siga as etapas fornecidas aqui -

Passo 1

Abra Eclipse IDE e crie um novo projeto com AWS Lambda Java Project. Observe a captura de tela fornecida abaixo para melhor compreensão -

Passo 2

Depois de selecionar Next, ele irá redirecioná-lo para a tela mostrada abaixo -

etapa 3

Agora, um código padrão é criado para o tipo de entrada Custom. Depois de clicarFinish botão o projeto é criado como mostrado abaixo -

Passo 4

Agora, clique com o botão direito no seu projeto e exporte-o. SelecioneJava / JAR arquivo do Export assistente e clique Next.

Etapa 5

Agora, se você clicar Next, será solicitado que você salve o arquivo na pasta de destino, o que será solicitado quando você clicar em Avançar.

Depois que o arquivo for salvo, volte ao AWS Console e crie a função AWS Lambda para Java.

Etapa 6

Agora, carregue o .jar arquivo que criamos usando o Upload botão como mostrado na imagem abaixo -

Detalhes do manipulador para Java

Handler é package name e class name. Veja o exemplo a seguir para entender o manipulador em detalhes -

Exemplo

package com.amazonaws.lambda.demo;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler
      
        { @Override public String handleRequest(Object input, Context context) { context.getLogger().log("Input: " + input); // TODO: implement your handler return "Hello from Lambda!"; } } 
      

Observe que a partir do código acima, o manipulador será com.amazonaws.lambda.demo.LambdaFunctionHandler

Agora, vamos testar as mudanças e ver o resultado -

Objeto de contexto em Java

A interação com a execução do AWS Lambda é feita usando o contexto. Ele fornece os seguintes métodos para serem usados ​​dentro do Java -

Sr. Não Métodos de contexto e descrição
1

getMemoryLimitInMB()

isso fornecerá o limite de memória que você especificou ao criar a função lambda.

2

getFunctionName()

isso dará o nome da função lambda.

3

getFunctionVersion()

isso dará a versão da função lambda em execução.

4

getInvokedFunctionArn()

isso fornecerá o ARN usado para invocar a função.

5

getAwsRequestId()

isso fornecerá o id do pedido aws. Este id é criado para a função lambda e é único. O id pode ser usado com o caso de suporte aws se você enfrentar quaisquer problemas.

6

getLogGroupName()

isso dará o nome do grupo aws cloudwatch vinculado à função aws lambda criada. Será nulo se o usuário iam não tiver permissão para o registro do Cloudwatch.

7

getClientContext()

isso fornecerá detalhes sobre o aplicativo e o dispositivo quando usado com o aws mobile sdk. Ele fornecerá detalhes como nome e código da versão, id do cliente, título, nome do pacote do aplicativo. Pode ser nulo.

8

getIdentity()

isso dará detalhes sobre a identidade do amazon cognito quando usado com o aws mobile sdk. Pode ser nulo.

9

getRemainingTimeInMillis()

isso dará o tempo restante de execução em milissegundos quando a função for encerrada após o tempo limite especificado.

10

getLogger()

isso fornecerá o registrador lambda vinculado ao objeto de contexto.

Agora, vamos atualizar o código fornecido acima e observar a saída de alguns dos métodos listados acima. Observe o código de exemplo fornecido abaixo para uma melhor compreensão -

package com.amazonaws.lambda.demo;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
   @Override
   public String handleRequest(Object input, Context context) {
      context.getLogger().log("Input: " + input);
      System.out.println("AWS Lambda function name: " + context.getFunctionName());
      System.out.println("Memory Allocated: " + context.getMemoryLimitInMB());
      System.out.println("Time remaining in milliseconds: " + context.getRemainingTimeInMillis());
      System.out.println("Cloudwatch group name " + context.getLogGroupName());
      System.out.println("AWS Lambda Request Id " + context.getAwsRequestId());
      
      // TODO: implement your handler
      return "Hello from Lambda!";
   }
}

Depois de executar o código fornecido acima, você pode encontrar a saída conforme fornecido abaixo -

Logs para contexto

Você pode observar a seguinte saída ao visualizar a saída do registro -

A memória alocada para a função Lambda é 512 MB. O tempo alocado é de 25 segundos. O tempo restante conforme exibido acima é 24961, que é em milissegundos. Assim, 25000 - 24961 que equivale a 39 milissegundos é usado para a execução da função Lambda. Observe que o nome do grupo Cloudwatch e a id do pedido também são exibidos conforme mostrado acima.

Observe que usamos o seguinte comando para imprimir logs em Java -

System.out.println (“log message”)

O mesmo está disponível no CloudWatch. Para isso, vá para serviços da AWS, selecioneCloudWatchservices e clique Logs.

Agora, se você selecionar a função Lambda, ela exibirá a data dos registros conforme mostrado abaixo -

Logging em Java

Você também pode usar Lambdalogger em Java para registrar os dados. Observe o seguinte exemplo que mostra o mesmo -

Exemplo

package com.amazonaws.lambda.demo;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
   @Override
   public String handleRequest(Object input, Context context) {
      LambdaLogger logger = context.getLogger();
      logger.log("Input: " + input);
      logger.log("AWS Lambda function name: " + context.getFunctionName()+"\n");
      logger.log("Memory Allocated: " + context.getMemoryLimitInMB()+"\n");
      logger.log("Time remaining in milliseconds: " + context.getRemainingTimeInMillis()+"\n");
      logger.log("Cloudwatch group name " + context.getLogGroupName()+"\n");
      logger.log("AWS Lambda Request Id " + context.getAwsRequestId()+"\n");
      
      // TODO: implement your handler
      return "Hello from Lambda!";
   }
}

O código mostrado acima fornecerá a seguinte saída -

A saída no CloudWatch será conforme mostrado abaixo -

Tratamento de erros em Java para Função Lambda

Esta seção explicará como lidar com erros na função Java para Lambda. Observe o seguinte código que mostra o mesmo -

package com.amazonaws.lambda.errorhandling;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
   @Override
   public String handleRequest(Object input, Context context) {
      throw new RuntimeException("Error from aws lambda");
   } 
}

Observe que os detalhes do erro são exibidos em json formato com errorMessage Error from AWS Lambda. Também oErrorType e stackTrace fornece mais detalhes sobre o erro.

A saída e a saída de registro correspondente do código fornecido acima serão as mostradas nas seguintes capturas de tela fornecidas abaixo -

Neste capítulo, criaremos uma função simples do AWS Lambda em Python e entenderemos seus conceitos de trabalho seguindo os detalhes.

Antes de continuar a trabalhar na criação de uma função Lambda no AWS, precisamos do suporte do kit de ferramentas AWS para Python. Para tal, siga os passos indicados abaixo e observe as capturas de ecrã correspondentes anexadas -

Passo 1

Faça login no console AWS, crie a função Lambda e selecione o idioma como Python.

Passo 2

Agora clique Create functione insira os detalhes para criar um AWS Lambda simples em Python. Este código retorna a mensagemHello from Lambda using Python e parece como mostrado aqui -

etapa 3

Agora, salve as alterações e teste o código para ver a saída. Você deve ver a seguinte saída e logs ao testá-lo no console da AWS usando o botão de teste da IU.

Passo 4

Agora, você pode escrever código dentro de qualquer editor ou IDE para Python. Aqui, estamos usando o código do Visual Studio para escrever o código. Mais tarde, você deve compactar o arquivo e fazer o upload no console da AWS.

Aqui, compactamos o código e o usamos no console da AWS.

Etapa 5

Agora, selecione Upload a .ZIP file opção como mostrado abaixo -

Detalhes do manipulador para Python

Observe que o manipulador deve ser o nome do arquivo seguido pelo nome da função. No caso acima, nosso nome de arquivo éhellopython.py e o nome da função é my_handler; então o manipulador será hellopython.my_handler.

Depois que o upload é feito e as alterações salvas, ele realmente mostra os detalhes do arquivo zip no editor online no console do AWS Lambda. Agora, vamos testar o código para ver a saída e os logs.

Agora, vamos entender os detalhes da função Lambda usando o seguinte código de exemplo -

def my_handler(event, context):
   return "aws lambda in python using zip file"

No código acima, o nome da função my_handler tem 2 parâmetros, evento e contexto.

Objeto de contexto em Python

O objeto de contexto fornece detalhes como o nome da função Lambda, tempo restante em milissegundos, ID da solicitação, nome do grupo de observação em nuvem, detalhes de tempo limite etc.

Os métodos e atributos disponíveis no objeto de contexto são mostrados nas tabelas fornecidas abaixo -

Sr. Não Nome e descrição do método
1

get_remaining_time_in_millis()

Este método fornece o tempo restante em milissegundos até que a função lambda termine a função

Sr. Não Atributo e descrição
1

function_name

Isso dá o nome da função aws lambda

2

function_version

Isso fornece a versão da função lambda de aws em execução

3

invoked_function_arn

Isso fornecerá detalhes do ARN.

4

memory_limit_in_mb

Isso mostra o limite de memória adicionado ao criar a função lambda

5

aws_request_id

Isso fornece o id do pedido aws.

6

og_group_name

Isso dará o nome do grupo Cloudwatch

7

log_stream_name

Isso fornecerá o nome do fluxo de log do cloudwatch onde os logs são gravados.

8

identity

Isso fornecerá detalhes sobre o provedor de identidade cognito amazon quando usado com o aws mobile sdk. Os detalhes fornecidos são os seguintes -

  • identity.cognito_identity_id
  • identity.cognito_identity_pool_id
9

client_context

Isso fornecerá detalhes do aplicativo cliente quando usado com o aws mobile sdk. Os detalhes fornecidos são os seguintes -

  • client_context.client.installation_id
  • client_context.client.app_title
  • client_context.client.app_version_name
  • client_context.client.app_version_code
  • client_context.client.app_package_name
  • client_context.custom - possui ditado de valores personalizados do aplicativo cliente móvel
  • client_context.env - possui detalhes de ambiente do AWS Mobile SDK

Vamos ver um exemplo de trabalho em Python que mostra os detalhes do contexto. Observe o código fornecido abaixo -

def my_handler(event, context):
   print("Log stream name:", context.log_stream_name)
   print("Log group name:",  context.log_group_name)
   print("Request ID:",context.aws_request_id)
   print("Mem. limits(MB):", context.memory_limit_in_mb)
   print("Time remaining (MS):", context.get_remaining_time_in_millis())
   return "aws lambda in python using zip file"

A saída correspondente do código mostrado acima é fornecida abaixo -

Registro usando Python

Para registrar informações usando Python, podemos usar a função de impressão ou logger disponível. Vamos usar o exemplo de contexto acima e verificar inCloudWatch para ver se os logs são impressos. Observe o seguinte código -

def my_handler(event, context):
   print("Log stream name:", context.log_stream_name)
   print("Log group name:",  context.log_group_name)
   print("Request ID:",context.aws_request_id)
   print("Mem. limits(MB):", context.memory_limit_in_mb)
   print("Time remaining (MS):", context.get_remaining_time_in_millis())
   return "aws lambda in python using zip file"

A saída deste código no CloudWatch é mostrada abaixo -

Observe o exemplo a seguir para entender sobre como usar o logger para imprimir logs para CloudWatch -

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def my_handler(event, context):
   logger.info('Using logger to print messages to cloudwatch logs')
   return "aws lambda in python using zip file"

A saída para isso será como mostrado na captura de tela fornecida abaixo -

Tratamento de erros em Python para função Lambda

Nesta seção, vamos ver um exemplo prático que mostra como manipular erros em Python. Observe o trecho de código fornecido aqui -

def error_handler(event, context):
   raise Exception('Error Occured!')

A exibição do log é como mostrado na imagem aqui -

O suporte ao idioma Go é uma adição recente à AWS. Para trabalhar com Go, você precisa selecionar o idioma do console AWS ao criar a função AWS Lambda. Neste capítulo, vamos aprender em detalhes sobre a função AWS Lambda na linguagem Go.

Instalando Go

Para começar, precisamos de suporte para Go Language. Nesta seção, veremos os seguintes detalhes para começar a trabalhar com o AWS Lambda em Go. Este é o site oficial para download do Go:https://golang.org/dl/

Agora, baixe o pacote de acordo com o sistema operacional. Siga o procedimento fornecido aqui para instalar o Go no respectivo sistema operacional.

Instalação em Windows

Observe que para Windows, há download de 32 bits e 64 bits disponíveis. Baixe o arquivo zip, extraia o conteúdo e armazene-o em um diretório de sua escolha.

Adicione as variáveis ​​de ambiente disponíveis em ControlPanel ---> System ---> Advanced system settings.

Agora clique Environment Variables botão e adicione o caminho do diretório conforme mostrado aqui -

Você também pode editar a variável do sistema conforme mostrado aqui -

Depois de concluir essas etapas, você poderá começar a trabalhar com Go. Abra o prompt de comando e verifique a versão do comando Go. Observe a imagem a seguir para o mesmo.

Instalação para Linux e Mac OS

Para instalar pacotes no Linux e Mac OS, siga as instruções conforme mostrado abaixo -

Desempacote os pacotes e guarde-os no local /usr/local/go. Agora, adicione/usr/local/go/binà variável de ambiente PATH. Isso pode ser feito usando/etc/profile ou $HOME/.profile.

Para este propósito, você pode usar o seguinte comando

export PATH=$PATH:/usr/local/go/bin

Para adicionar suporte AWS para Windows, Linux e mac, use o seguinte em sua linha de comando git -

go.exe get -u github.com/aws/aws-lambda-go/lambda 
go.exe get -u github.com/aws/aws-lambda-go/lambdacontext
go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip

Para compilar o código Windows / Linux / Mac, use os seguintes comandos -

GOOS=linux GOARCH=amd64 go build -o main main.go
%GOPATH%\bin\build-lambda-zip.exe -o main.zip main

Função AWS Lambda usando GO

Um programa retornado em Go quando o build fornece um arquivo executável. A seguir está um programa simples em Go com suporte AWS Lambda. Precisamos importar ogithub.com/aws/aws-lambda-go/lambda, já que tem a funcionalidade de programação Lambda. Outra necessidade importante do AWS Lambda é o manipulador.

Main.go

// main.go
package main

import (
   "github.com/aws/aws-lambda-go/lambda"
)
func hello() (string, error) {
   return "Hello Lambda", nil
}
func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

Observe que a execução do Goo programa começa do principal, onde lambda. start é chamado com a função de manipulador. Observe o código mostrado abaixo -

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

Agora, vamos executar o arquivo acima usando o comando Go e, em seguida, compactar o arquivo executável.

A estrutura do arquivo que estamos usando é mostrada aqui -

Com go build, ele cria um arquivo executável chamado main.exe. Para compactar o arquivo e carregá-lo no AWS Lambda, você pode usar o seguinte procedimento -

Para compilar o código Windows / Linux / Mac, use os seguintes comandos -

GOOS=linux GOARCH=amd64 go build -o main main.go
%GOPATH%\bin\build-lambda-zip.exe -o main.zip main

Em seguida, faça login no console AWS e crie a função Lambda usando Go como tempo de execução -

Assim que a função for criada, carregue o arquivo zip executável criado acima.

Manipulador de função Lambda com Go

Handler é onde a execução do programa Go começa. Da chamada principal paralambda.start, a execução é chamada com a função de manipulador. Observe que o manipulador a ser adicionado serámain.

Observe o código aqui para uma compreensão -

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

Siga de acordo com as capturas de tela fornecidas abaixo -

Agora, salve a função e teste-a. Você pode ver o resultado da execução conforme mostrado aqui.

A saída de log correspondente será como mostrado aqui -

Objeto de contexto com Go

O AWS Lambda in Go fornece as seguintes variáveis ​​globais e propriedades para contexto.

  • MemoryLimitInMB - Limite de memória, em MB que é configurado em aws lambda.

  • FunctionName - nome da função aws lambda.

  • FunctionVersion - a versão da função lambda do aws em execução.

  • LogStreamName - nome do fluxo de registro do cloudwatch.

  • LogGroupName - nome do grupo Cloudwatch.

As propriedades disponíveis no contexto são fornecidas como em -

AwsRequestID

Este é o ID de solicitação da AWS que você obtém quando a função AWS Lambda é invocada.

ClientContext

Contém detalhes sobre o aplicativo cliente e o dispositivo quando invocado por meio do AWS Mobile SDK. Pode ser nulo. O contexto do cliente fornece detalhes como ID do cliente, título do aplicativo, nome da versão, código da versão e nome do pacote do aplicativo.

InvokedFunctionArn

O ARN da função invocada. Um ARN não qualificado executa a versão $ LATEST e os aliases executam a versão da função para a qual está apontando.

Identidade

Ele fornece detalhes sobre o provedor de identidade Amazon Cognito quando usado com o SDK móvel da AWS.

As mudanças adicionadas a main.go para imprimir detalhes de contexto -

// main.go
package main

import (
   "context"
   "log"
   "github.com/aws/aws-lambda-go/lambda"
   "github.com/aws/aws-lambda-go/lambdacontext"
)

func hello(ctx context.Context) (string, error) {
   lc, _ := lambdacontext.FromContext(ctx);
   log.Print(lc);
   log.Print(lc.AwsRequestID);
   log.Print(lc.InvokedFunctionArn);
   return "Hello Lambda", nil
}

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

Precisamos importar o log e lambda contextpara usá-lo com Go. Os detalhes do contexto são os seguintes -

func hello(ctx context.Context) (string, error) {
   lc, _ := lambdacontext.FromContext(ctx);
   log.Print(lc);
   log.Print(lc.AwsRequestID);
   log.Print(lc.InvokedFunctionArn);	
   return "Hello Lambda", nil
}

Você pode observar a seguinte saída ao testar o código acima -

Dados de registro

Com Go você pode registrar dados usando o módulo log ou fmt conforme mostrado abaixo -

// main.go
package main

import (
   "log"
   "fmt"
   "github.com/aws/aws-lambda-go/lambda"
)

func hello() (string, error) {
   log.Print("Hello from Lambda Go using log");
   fmt.Print("Hello from Lambda Go using fmt");
   return "Hello Lambda", nil
}

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

A saída para o mesmo é mostrada abaixo -

Verificando Logs no CloudWatch

Você pode ver os logs no CloudWatch também. Para isso, vá para o serviço AWS e selecione cloudwatch e clique emLogsno lado esquerdo. Agora, procure a função Lambda na lista para ver os logs -

Erros de função

Você pode criar tratamento de erros personalizado no AWS Lambda usando o módulo de erros, conforme mostrado no código abaixo -

// main.go
package main
import (
   "errors"
   "github.com/aws/aws-lambda-go/lambda"
)

func hello() error  {
   return errors.New("There is an error in the code!")
}

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

A saída para o código mostrado acima é a seguinte -

Este capítulo irá explicar como trabalhar com a função AWS Lambda em C # em detalhes. Aqui, usaremos o visual studio para escrever e implantar o código no AWS Lambda. Para obter qualquer informação e ajuda sobre a instalação do Visual studio e adição do kit de ferramentas AWS ao Visual Studio, consulte oIntroductioncapítulo neste tutorial. Depois de concluir a instalação do Visual Studio, siga as etapas fornecidas abaixo. Consulte as respectivas capturas de tela para uma melhor compreensão -

Passo 1

Abra seu Visual Studio e siga as etapas para criar um novo projeto. Clique emFile -> New -> Project.

Passo 2

Agora, a seguinte tela é exibida onde você seleciona AWS Lambda for Visual C#. SelecioneAWS Lambda Project (.NET Core).

Você pode alterar o nome se necessário, manterá aqui o nome padrão. CliqueOK continuar.

A próxima etapa solicitará que você selecione um Blueprint.

Selecione Empty function para este exemplo e clique Finish. Ele criará uma nova estrutura de projeto conforme mostrado abaixo -

Agora, selecione Function.cs que é o arquivo principal onde o manipulador com evento e contexto é criado para AWS Lambda.

A exibição do arquivo Functions.cs é a seguinte -

Você pode usar o comando fornecido a seguir para serializar os parâmetros de entrada e saída para a função AWS Lambda.

[assembly: 
LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

Detalhes do manipulador para C #

O manipulador é exibido da seguinte forma -

public string FunctionHandler(string input, ILambdaContext context) {
   return input?.ToUpper();
}

Vários componentes do código acima são explicados abaixo -

FunctionHandler −Este é o ponto de partida da função C # AWS Lambda.

String input − Os parâmetros para o manipulador string input tem todos os dados do evento, como objeto S3, detalhes do gateway API etc.

ILambdaContext context −ILamdaContext é uma interface que possui detalhes de contexto. Tem detalhes como nome da função lambda, detalhes de memória, detalhes de tempo limite, etc.

O manipulador Lambda pode ser chamado de forma sincronizada e assíncrona. Se chamado de forma sincronizada, conforme mostrado acima, você pode ter o tipo de retorno. Se assíncrono, o tipo de retorno deve ser nulo.

Agora, vamos implantar o AWS Lambda C # e testar o mesmo. Clique com o botão direito no projeto e clique emPublish to AWS Lambda como mostrado abaixo -

Encha o Function Name e clique em Next. A próxima tela exibida é oAdvanced Function Details como mostrado -

Introduzir o Role Name, Memory e Timeout. detalhes Observe que aqui nós selecionamos a função existente criada e usamos a memória como 128 MB e o tempo limite como 10 segundos. Quando terminar, cliqueUpload para publicar no console AWS Lambda.

Você pode ver a tela a seguir assim que a função AWS Lambda for carregada. CliqueInvokepara executar a função AWS Lambda criada. No momento, ele mostra erro, pois precisa de alguma entrada de acordo com o código escrito.

Agora, vamos inserir alguns exemplos de entrada e Invokeisso de novo. Observe que aqui inserimos algum texto na caixa de entrada e o mesmo clicando eminvokeé exibido em maiúsculas na seção de resposta. A saída do log é exibida abaixo -

Agora, vamos também verificar o console da AWS para ver se a função foi criada conforme implementamos a função do Visual Studio.

A função Lambda criada acima é aws lambda using csharp e o mesmo é exibido no console da AWS, conforme mostrado nas capturas de tela fornecidas abaixo -

Assinatura do manipulador

O manipulador é o ponto de partida para a execução do AWS. O nome do manipulador deve ser definido como -

ASSEMBLY::TYPE::METHOD

Os detalhes da assinatura são explicados a seguir -

ASSEMBLY- Este é o nome do assembly .NET para o aplicativo criado. É basicamente o nome da pasta de onde o projeto é criado.

TYPE- Este é o nome do manipulador. É basicamente o namespace.classname.

METHOD - Este é o nome do manipulador de função.

O código para assinatura do manipulador é mostrado abaixo -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.Lambda.Core;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda3 {
   public class Function {

      /// <summary>
      /// A simple function that takes a string and does a ToUpper
      /// </summary>
      /// <param name="input"></param>
      /// <param name="context"></param>
      /// <returns></returns>
      public string FunctionHandler(string input, ILambdaContext context) {
         return input?.ToUpper();
      }
   }
}

Observe que aqui a montagem é AWSLamda3, O tipo é namespace.classname que é AWSLambda3.Function e o método é FunctionHandler. Assim, a assinatura do manipulador éAWSLamda3::AWSLambda3.Function::FunctionHandler

Objeto de contexto em C #

Objeto de contexto fornece informações úteis sobre o tempo de execução no ambiente AWS. As propriedades disponíveis no objeto de contexto são mostradas na tabela a seguir -

Sr. Não Propriedades e descrição
1

MemoryLimitInMB

Isso fornecerá detalhes da memória configurada para a função AWS Lambda

2

FunctionName

Nome da função AWS Lambda

3

FunctionVersion

Versão da função AWS Lambda

4

InvokedFunctionArn

ARN usado para invocar esta função.

5

AwsRequestId

AWS request id para a função AWS criada

6

LogStreamName

Nome do fluxo de registro do Cloudwatch

7

LogGroupName

Nome do grupo Cloudwatch

8

ClientContext

Informações sobre o aplicativo cliente e dispositivo quando usado com AWS Mobile SDK

9

Identity

Informações sobre a identidade amazon cogbnito quando usada com o SDK móvel AWS

10

RemainingTime

Tempo de execução restante até a função ser encerrada

11

Logger

O logger associado ao contexto

Exemplo

Nesta seção, vamos testar algumas das propriedades acima no AWS Lambda em C #. Observe o código de amostra fornecido abaixo -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda6 {
   public class Function {

      /// <summary>
      /// </summary>
      /// <param name="input"></param>
      /// <param name="context"></param>
      /// <returns></returns>
      public void FunctionHandler(ILambdaContext context) {
         LambdaLogger.Log("Function name: " + context.FunctionName+"\n");
         context.Logger.Log("RemainingTime: " + context.RemainingTime+"\n");
         LambdaLogger.Log("LogGroupName: " + context.LogGroupName+"\n");            
      }
   }
}

A saída relacionada que você pode observar quando invoca o código acima em C# é como mostrado abaixo -

A saída relacionada que você pode observar quando invoca o código acima em AWS Console é como mostrado abaixo -

Log usando C #

Para registro, você pode usar duas funções -

  • context.Logger.Log

  • LambdaLogger.Log

Observe o seguinte exemplo mostrado aqui -

public void FunctionHandler(ILambdaContext context) {
   LambdaLogger.Log("Function name: " + context.FunctionName+"\n");
   context.Logger.Log("RemainingTime: " + context.RemainingTime+"\n");
   LambdaLogger.Log("LogGroupName: " + context.LogGroupName+"\n");            
}

A saída correspondente para o código fornecido acima é mostrada aqui -

Você pode obter os logs do CloudWatch conforme mostrado abaixo -

Tratamento de erros em C # para função Lambda

Esta seção discute sobre o tratamento de erros em C #. Para tratamento de erros,Exception a classe deve ser estendida conforme mostrado no exemplo mostrado abaixo -

exemplo

namespace example {            
   public class AccountAlreadyExistsException : Exception {
      public AccountAlreadyExistsException(String message) :
         base(message) {
      }
   }
} 
namespace example {
   public class Handler {
     public static void CreateAccount() {
       throw new AccountAlreadyExistsException("Error in AWS Lambda!");
     }
   }
}

A saída correspondente para o código fornecido acima é fornecida abaixo -

{
   "errorType": "LambdaException",
   "errorMessage": "Error in AWS Lambda!"
}

Nos capítulos anteriores, aprendemos como criar a função AWS Lambda no console AWS. No entanto, existem outros parâmetros para criar uma função Lambda. Isso inclui alocação de memória, tempo limite etc.

Neste capítulo, vamos entender em detalhes as seguintes propriedades de configuração do AWS Lambda.

Alocação de memória

Faça login no console da AWS e crie ou selecione a função lambda existente. Clique noConfigurationguia para obter os detalhes da memória alocada. Olhe para a imagem mostrada abaixo -

Observe que, por padrão, a memória alocada é 128MB. Se você quiser aumentar a memória, pode clicar no controle deslizante.

A memória será incrementada para 64MBconforme você move o controle deslizante. Observe que a memória máxima disponível é3008MB. Olhe para a imagem mostrada abaixo -

Você também pode usar aws clino prompt de comando para aumentar o limite de memória. Você terá que fornecer a memória em incrementos de 64 MB.

Agora, vamos aumentar o limite de memória do AWS Lambda com o nome:myfirstlambdafunction.

Os detalhes da memória da função são mostrados na imagem abaixo -

O comando usado para mudar a memória usando aws cli é o seguinte -

aws lambda update-function-configuration --function-name your function name --
region region where your function resides --memory-size memory amount --
profile admin user

A saída correspondente da função AWS Lambda myfirstlambdafunctionno console AWS é mostrado aqui. Observe que a memória foi alterada de 128 MB para 256 MB.

Tempo Máximo de Execução

O tempo limite é o tempo alocado para a função AWS Lambda terminar se o tempo limite acontecer. A função AWS Lambda será executada dentro do tempo alocado ou será encerrada se exceder o tempo limite fornecido. Você precisa avaliar o tempo necessário para a função ser executada e, portanto, selecionar o tempo emConfiguration guia no console AWS conforme mostrado abaixo -

Papel IAM

Ao criar a função AWS Lambda, a função ou a permissão precisa ser atribuída. No caso de você precisar do AWS Lambda para S3 ou dynamoDB, a permissão para os serviços de lambda precisa ser atribuída. Com base na função atribuída, o AWS Lambda decidirá as etapas a serem executadas. Por exemplo, se você fornecer acesso total ao dynamodb, poderá adicionar, atualizar e excluir as linhas da tabela do dynamodb.

Nome do manipulador

Este é o início da execução da função AWS Lambda. A função de manipulador tem os detalhes do evento acionado, o objeto de contexto e o retorno de chamada que deve ser enviado de voltasuccess ou error do AWS Lambda.

O formato da função de manipulador em nodejs é mostrado aqui -

exports.handler = (event, context, callback) => {
   callback(null, "hello from lambda");
};

Função Lambda usando variáveis ​​de ambiente

Nesta seção, criaremos uma função Lambda simples usando variáveis ​​de ambiente adicionadas na seção de configuração. Para isso, siga os passos abaixo e consulte as respectivas capturas de tela -

Passo 1

Vá para o console AWS e crie uma função no Lambda conforme mostrado.

Passo 2

Agora, adicione as variáveis ​​de ambiente conforme mostrado -

etapa 3

Agora, vamos buscar o mesmo no código Lambda da seguinte maneira -

exports.handler = (event, context, callback) => {
   var hostName = process.env.host;   
   var userName = process.env.username;
   callback(null, "Environment Variables =>"+hostName+" and "+userName);
};

Passo 4

Para obter os detalhes das variáveis ​​de ambiente, precisamos usar process.envcomo mostrado. Observe que esta sintaxe é paraNodeJS tempo de execução.

var hostName = process.env.host;   
var userName = process.env.username;

Etapa 5

A saída para a função Lambda na execução será como mostrado -

Podemos criar a função Lambda e testar a mesma no console da AWS. Este capítulo discute isso em detalhes. Para isso, você terá que seguir os passos dados aqui e observar as respectivas imagens fornecidas -

Passo 1

Faça login no console AWS https://aws.amazon.com/console/. Agora, você será redirecionado para a tela onde os serviços da AWS são exibidos.

Passo 2

Agora clique em Lambdaserviço conforme destacado acima. Isso irá redirecionar para criar a função conforme mostrado abaixo -

etapa 3

Agora clique Create functione insira os detalhes da função. Então você pode ver uma tela conforme mostrado abaixo -

Passo 4

Você pode escrever seu código escolhendo o idioma de sua escolha. O código deve ser escrito no editor se a opção selecionada for editar código embutido. As outras opções disponíveis são as seguintes -

Etapa 5

Uma vez feito isso, você precisa salvar as alterações para as quais o botão é fornecido no canto superior direito, conforme mostrado abaixo -

Etapa 6

Agora clique Testbotão. Isso dá todos os detalhes da execução da função Lambda como mostrado abaixo -

Etapa 7

O código para index.js é o seguinte -

exports.handler = (event, context, callback) => {
   // TODO implement
   callback(null, 'Lambda test');
};

Isso vai chamar o Callback functione o resultado pode ser erro ou sucesso. No sucesso, você verá umLambda testmensagem; se houver erro, passará nulo.

Etapa 8

o Role os detalhes da função Lambda fazem parte da configuração e são exibidos conforme mostrado abaixo -

Etapa 9

Agora, você pode atualizar a função, se necessário, e salvar a função Lambda. Em seguida, os detalhes de memória e tempo limite para a função lambda são exibidos conforme mostrado abaixo -

Etapa 10

Agora, precisamos adicionar gatilho à função Lambda para que seja executada quando o evento ocorrer. Os detalhes do acionador são exibidos no início da tela de função do AWS Lambda, conforme mostrado abaixo -

A partir disso, você pode selecionar o gatilho que deseja que sua função Lambda seja ativada. Quando você seleciona o gatilho, os detalhes de configuração do gatilho devem ser adicionados.

Por exemplo, para o gatilho no S3, os detalhes de configuração a serem adicionados são os seguintes -

Etapa 11

Agora, selecione o balde em que deseja ativar o gatilho. O tipo de evento tem os seguintes detalhes -

Etapa 12

Para o gatilho, você também pode mencionar os arquivos do tipo prefixo ou padrão de arquivo, o Lambda deve ser o gatilho. Os detalhes são mostrados -

Etapa 13

Agora, preencha os detalhes necessários para o gatilho e clique Add botão .Salve a função Lambda para que o gatilho seja adicionado. Salvar a função implanta os detalhes e, a partir de agora, sempre que arquivos forem adicionados ao balde S3, o Lambda será ativado.

Observe a seguinte captura de tela que mostra o gatilho S3 adicionado ao AWS Lambda -

Etapa 14

Agora, vamos usar o evento de amostra S3 para testar a função Lambda. O código para o mesmo é mostrado aqui -

Amazon S3 Put Sample Event

{
   "Records": [{
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
         "ExampleIPAddress": "127.0.0.1"
      },
      "s3": {
         "configurationId": "testConfigRule",
         "object": {
            "eTag": "0123456789abcdef0123456789abcdef",
            "sequencer": "0A1B2C3D4E5F678901",
            "key": "HappyFace.jpg",
            "size": 1024
         },
         "bucket": { 
            "arn": bucketarn,
            "name": "Examplebucket",
            "ownerIdentity": {
               "principalId": "Example"
            }
         },
         "s3SchemaVersion": "1.0"
      },
      "responseElements": { 
         "x-amz-id-2": "Example123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
         "x-amz-request-id": "Example123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
         "principalId": "Example"
      },
      "eventSource": "aws:s3"
   }]
}

Você terá que usar o seguinte comando para obter os detalhes do arquivo carregado do evento put S3 -

event.Records[0].s3.object.key     //will display the name of the file

Você terá que usar o seguinte comando para obter o nome do intervalo -

event.Records[0].s3.bucket.name    //will give the name of the bucket.

Você terá que usar o seguinte comando para obter o EventName -

event.Records[0].eventName        // will display the event name

Etapa 15

Agora, vamos atualizar o código AWS Lambda para imprimir os detalhes S3 conforme mostrado abaixo -

exports.lambdahandler = (event, context, callback) => {
   callback(null, "Bucket name: "+event.Records[0].s3.bucket.name+"  
   File name:"+event.Records[0].s3.object.key );
};

Etapa 16

Salve as alterações. CliqueTest e entrar no evento de amostra S3 -

Etapa 17

Agora clique Test e você pode ver a saída conforme mostrado -

Etapa 18

Para testar o gatilho no S3 usando o serviço S3 AWS, carregue um arquivo no intervalo S3: test bucket trigger. Atualize a função usada com Lambda para obter a política S3 e SES (para enviar correio) para permissões. Isso atualizará o código AWS Lambda para enviar e-mail para ver o acionador funcionando -

O código AWS Lambda atualizado é mostrado -

var aws = require('aws-sdk');
var ses = new aws.SES({
   region: 'us-east-1'
});
exports.lambdahandler = function(event, context, callback) {
   var eParams = {
      Destination: {
         ToAddresses: ["[email protected]"]
      },
      Message: {
         Body: {
            Text: {
               Data: "Bucket name: "+event.Records[0].s3.bucket.name+"  File name:"+event.Records[0].s3.object.key
            }
         },
         Subject: {
            Data: "S3 and AWS Lambda"
         }
      },
      Example: "[email protected]"
   };
   console.log('===SENDING EMAIL===');
   var email = ses.sendEmail(eParams, function(err, data) {
      if (err) console.log(err);
         else {
            console.log("===EMAIL SENT===");
            console.log("EMAIL CODE END");
            console.log('EMAIL: ', email);
            context.succeed(event);
            callback(null, "email is send");
         }
   });
};

A captura de tela correspondente é mostrada aqui -

Etapa 19

Agora, faça upload do arquivo e verifique a id de e-mail fornecida no código AWS Lambda -

AWS CLIé uma ferramenta de linha de comando que ajuda a trabalhar com serviços da AWS. Podemos usá-lo para criar, atualizar, excluir, invocar a função lambda aws. Neste capítulo, você discutirá sobre a instalação e o uso do AWS CLI em detalhes.

Instalação do AWS CLI

Esta seção o guiará pela instalação do AWS CLI em vários sistemas operacionais. Siga as etapas fornecidas e observe as capturas de tela correspondentes sempre que anexadas.

Para Windows

Verifique a configuração do Windows e escolha um dos seguintes links para instalar o AWS CLI MSI -

  • Para Windows 64 bits - instalação AWS CLI MSI para Windows (64 bits)

  • Para Windows de 32 bits - instalação AWS CLI MSI para Windows (32)

Depois de escolher o link correspondente e clicar nele, você pode encontrar uma janela conforme mostrado aqui -

Em seguida, defina o Environment path in windows como mostrado nas imagens abaixo -

Uma vez feito isso, você pode usar o seguinte comando no prompt de comando, para ver se aws cli está instalado -

aws --version

Ele exibe os detalhes da versão do aws-cli, conforme mostrado na imagem a seguir -

Para Linux / Mac

Para instalar no Linux e Mac, você precisa do Python 2.6.3 ou versão superior dele. Em seguida, use os seguintes comandos para outros processos de instalação -

$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" $ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

Agora, precisamos definir as configurações da AWS. Você pode usar o seguinte comando para este propósito -

aws configure

Para este efeito, requer detalhes como -

  • ID da chave de acesso AWS
  • Chave de acesso secreta da AWS
  • Nome da região padrão
  • Saída padrão do formato

Você pode obter esses detalhes no console do aws. Vá para o seu nome de conta no canto superior direito, conforme mostrado -

Agora clique My Security Credentialse selecione os usuários do lado esquerdo. Adicione o usuário com os detalhes solicitados.

Adicione o usuário e para obter a chave de acesso e a chave secreta. Para ver a nova chave de acesso, escolhaShow. Suas credenciais serão semelhantes às mostradas abaixo -

Access key ID − AOSAIOSFOCDD7Example

Secret access key − aJuirCVtnROUN/K7MDENG/bPxRfiCYExampleKEY

Comandos de referência para AWS CLIS

A tabela a seguir fornecerá referências de comando disponíveis para trabalhar com aws cli.

Nome do comando aws cli Referência de comando
create-function função de criação - nome da função <valor> - tempo de execução <valor> --role <valor> --handler <valor> [--code <valor>] [--descrição <valor>] [--timeout < valor>] [--memory-size <valor>] [--environment <value>] [--kms-key-arn <value>] [--tags <value>] [--zip-file <value> ] [--cli-input-json <valor>]
list-functions list-functions [--master-region <value>] [--function-version <value>] [--max-items <value>] [--cli-input-json <value>] [--starting- token <valor>] [--page-size <value>] [--generate-cli-skeleton <value>]
get-function get-function --function-name <value> [--qualifier <value>] [--cli-input-json <value>] [--generate-cli-skeleton <value>]
get-function-configuration get-function-configuration --function-name <value> [--qualifier <value>] [--cli-input-json <value>] [--generate-cli-skeleton <value>]
get-account-settings get-account-settings [--cli-input-json <value>] [--generate-cli-skeleton <value>]
update-function-configuration update-function-configuration --function-name <value> [--role <value>] [--handler <value>] [--description <value>] [--timeout <value>] [--memory- size <value>] [--vpc-config <value>] [--environment <value>] [--runtime <value>] [--dead-letter-config <value>] [--kms-key- arn <value>] [--tracing-config <value>] [--revision-id <value>] [--cli-input-json <value>] [--generate-cli-skeleton <value>]
update-function-code update-function-code --function-name <value> [--zip-file <value>] [--s3-bucket <value>] [--s3-key <value>] [--s3-object- versão <valor>] [--publish | --no-publish] [--dry-run | --no-dry-run] [--revision-id <valor>] [- cli-input-json <value>] [- generate-cli-skeleton <value>]
delete-function delete-function --function-name <value> [--qualifier <value>] [--cli-input-json <value>] [--generate-cli-skeleton <value>]

Agora, vamos discutir esses comandos um por um em detalhes.

função de criação

Essa API criará uma nova função lambda. O código deve ser fornecido em formato zip. Se a função a ser criada já existe, a API falhará. Observe que o nome da função diferencia maiúsculas de minúsculas.

Comandos Incluídos

A lista de comandos que você pode usar com a função de criação é fornecida aqui -

create-function 
--function-name <value>
--runtime <value>
--role <value>
--handler <value>
[--code <value>] 
[--description <value>] 
[--timeout <value>] 
[--memory-size <value>] 
[--environment <value>] 
[--kms-key-arn <value>] 
[--tags <value>] 
[--zip-file <value>] 
[--cli-input-json <value>]

Opções Incluídas

Várias opções que você pode usar com as funções acima são as seguintes -

--function-name (string)- Isso leva o nome da função. O nome pode ter caracteres de 64 bits.

--runtime(string)- Aqui você precisa especificar o ambiente de execução, ou seja, a seleção do idioma. Os detalhes do tempo de execução são fornecidos abaixo -

Opções disponíveis tempo de execução
Python v3.6 python3.6
Python v2.7 python2.7
NodeJS v6.10 nodejs6.10
NodeJS v8.10 nodejs8.10
Java java8
C # 1 dotnetcore1.0
C # 2 dotnetcore2.0
Ir go1.x

--role(string)- Este será o nome da política lambda, ou seja, a função a ser atribuída à função lambda para acessar outros serviços. Ele terá a permissão de acordo com a função especificada.

--handler (string) - Este é o nome do manipulador onde a execução do código lambda será iniciada.

  • Para nodejs, o nome do manipulador é o nome do módulo que exportamos.
  • Para java, é package.classname :: handler ou package.classname
  • Para python, handler é nameofthefile.

--code (structure) −Código AWS Lambda

--description (string) - descrição da função AWS Lambda

--timeout (integer)- timeout terá o tempo em que a função lambda deve terminar a execução. O padrão é 3s.

--memory-size (integer)- Esta é a memória dada à função aws lambda. A AWS alocará a quantidade de CPU e alocação de memória com base na memória fornecida.

--environment (structure) - é um objeto com detalhes de ambiente exigidos na função aws lambda.

e.g : Variables = {Name1 = string, Name2 = string}

--kms-key-arn (string)- este é o nome de recurso amazon (ARN) usado para criptografar as variáveis ​​de ambiente. Se não for fornecido, serão usadas as configurações padrão para criptografar.

--zip-file (blob) - caminho do arquivo zip que contém os detalhes do código.

--cli-input-json (string): Executa a operação de serviço com base na string JSON fornecida. A string JSON segue o formato fornecido por --generate-cli-skeleton. Se outros argumentos forem fornecidos na linha de comando, os valores CLI substituirão os valores fornecidos por JSON.

Agora, vamos criar uma função simples do AWS Lambda usando o tempo de execução como nodejs e adicionar alguns console.logs a serem impressos.

Considere um código de amostra para entender o mesmo -

exports.handler = async (event) => {
   console.log("Using aws cli");
   return 'Hello from Lambda from aws cli!'
};

Agora, compacte o arquivo e armazene-o como awscli.zip.

Obtendo ARN

Para a função, vamos usar o arnda função existente que criamos. Para obter o ARN, você terá que seguir as etapas mostradas aqui. Observe as respectivas capturas de tela sempre que estiverem anexadas -

Passo 1

Vá para IAM e selecione a função que deseja Roles. Os detalhes do ARN para a função são exibidos conforme mostrado abaixo. UsarRole ARN com create-function dentro aws cli.

Observe aqui que a função arn é: arn: aws: iam :: 625297745038: role / lambdaapipolicy

O comando com valores para create-function é o seguinte -

aws lambda create-function 
--function-name "awslambdausingcli" 
--runtime "nodejs8.10" 
--role "arn:aws:iam::625297745038:role/lambdaapipolicy" 
--handler "awscli.handler" 
--timeout 5 
--memory-size 256 
--zip-file "fileb://awscli.zip"

Agora, se você executar o comando em aws cli, poderá encontrar uma saída conforme mostrado abaixo -

No console AWS, a função Lambda é exibida conforme mostrado abaixo -

Os detalhes das funções são mostrados aqui -

Os detalhes da configuração são fornecidos abaixo -

Você pode testar a função e verificar a saída conforme mostrado -

A saída de log correspondente é mostrada aqui -

funções de lista

Esta API fornece a lista de funções criadas até agora no AWS Lambda.

Comandos Incluídos

A seguir estão os comandos associados a esta API -

list-functions
[--master-region <value>]
[--function-version <value>]
[--max-items <value>]
[--cli-input-json <value>]

Opções nas funções de lista

A seguir estão várias opções que você pode usar nesta lista de funções api -

--master-region(string)- opcional. A região da qual as funções precisam ser exibidas.

--function-version(string)- opcional. Isso fornecerá a versão da função.

--max-items(integer)- opcional. Isso dará os itens de acordo com o valor especificado.

--cli-input-json(string)- opcional. Executará a operação com base no arquivo json fornecido.

O comando com valores list-functions é o seguinte -

aws lambda list-functions --max-items 3

O comando exibe os detalhes da seguinte forma -

get-function

Esta API fornecerá detalhes das funções e também um link de url que contém o arquivo zip carregado usando a função de criação. O url com os detalhes do zip será válido apenas por 10 minutos.

Comandos Incluídos

A seguir estão os comandos associados a esta api -

get-function
--function-name <value>
[--qualifier <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]

Opções Incluídas

--function-name- Nome da função AWS Lambda. Você também pode especificar o nome do recurso Amazon da função.

--qualifier(string)- Opcional. A versão da função pode ser usada para obter os detalhes da função.

O comando com valores para get-function são -

aws lambda get-function --function-name awslambdausingcli

Os detalhes de exibição do comando são os seguintes -

Ele fornece o url com o código postal carregado. No caso acima, o url é -

https://prod-04-2014-
tasks.s3.amazonaws.com/snapshots/625297745038/awslambdausingcli-97048f8d-4a08
-4ed9-99d9-acb00d2063d2?versionId=d04HKvPu9S2zz8pzjbW6Rmf5o5fxnc_r&X-Amz-Security
-Token=FQoDYXdzEKT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDCpTmGvtwKToPBiWcyK3A96UcJEnwvYDhMbbxu
%2Bg2gffK2ocfnlEeiCHak8QqqE1RFpbKrdks9NzxP9gNbagL4M9RValxJ1a9PUY%2FOdAekscRHOiX00MVAxUlI8
2pKryhdOwLJWSj0uRzqvOxCcBwJenHrSNPeG6lMa2ZDo0qZFEUDONSaTg4nuSnJK1f6t3pMAKu4vF9wPvf92G%2BU
60rUxwleggigISmD9l1IlZse3%2BVF1JlNuN%2F5d85v0y2Q%2F%2BO515CybcZpn91sHPYG8JMJ00LsrkQ2Ww4VU
9Zz5c5QYH4JYPj0CyEgSz9b%2FMceMPpOoPUAMjctb%2FEwQqcShZeqAr9%2Fcd2ZI%2BXl2%2Bs4ri0ucgPvQQvs
eGIIiZbX3GqdwR2jb1nylrAEIfiuFMoSWfcFYoYtuL0MZnjGR9jy2GNkp6MB%2BlHHr7%2BnuFRUzU26rgDYmdE1w
Rb3%2B21Jm49WGDa9opRLvUxFaux57Or70haib2FuKzN6Gf3Vzzk5KPdWsYUpaLyf%2B1ovEytOZhB1JEXuCs%2FG
IlOXS88yxT%2BpOKmyxweiezpGgI%2FAkSAQTbSRsYQKIOFyIJNHzplwrJKhy28vy60numIBIo9Zqq2AU%3D
&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20180527T112426Z&X-Amz-
SignedHeaders=host&X-Amz-Expires=600&X-Amz-
Credential=ASIAICSQHLSBWFP37U4Q%2F20180527%2Fus-
east-1%2Fs3%2Faws4_request&X-Amz-Signature=
8b97e7d6d7da13313068e027894d2c875be5e50a0c5a62550f55307985bdc1aa

get-function-configuration

Isso fornecerá os detalhes de configuração da função AWS Lambda.

A seguir estão os comandos usados ​​junto com esta api -

get-function-configuration
--function-name <value>
[--qualifier <value>]

The following are the options used with

--function-name (string) −nome da função lambda do aws. Você também pode especificar o nome do recurso Amazon da função.

--qualifier(string) − A versão opcional.Função pode ser usada para obter os detalhes da função.

O comando com valores para get-function são -

aws lambda get-function-configuration --function-name awslambdausingcli

O comando exibe os detalhes da seguinte forma -

get-account-settings

Esta api fornece as configurações de contas.

Comandos Envolvidos

Os comandos que você pode usar com esta API são -

get-account-settings
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]

Opções Envolvidas

Você pode usar as seguintes opções com esta API -

--cli-input-json(string) − Executa o serviço com base na string json fornecida.

--generate-cli-skeleton(string) − Ele imprime a saída json sem enviar a solicitação de API.

Você pode usar o seguinte comando para get-account-settings -

aws lambda get-account-settings

Você pode ver a seguinte saída ao executar o comando fornecido acima -

configuração da função de atualização

Esta api ajuda a atualizar os detalhes de configuração para a função AWS Lambda criada. Você pode alterar a memória, tempo limite, manipulador, função, tempo de execução, descrição etc.

Comandos Envolvidos

A seguir estão os comandos envolvidos na api update-function-configuration -

update-function-configuration
--function-name <value>
[--role <value>]
[--handler <value>]
[--description <value>]
[--timeout <value>]
[--memory-size <value>]
[--environment <value>]
[--runtime <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]

Opções Envolvidas

A seguir estão as opções envolvidas na atualização-função-configuração api -

--function-name − nome da função aws lambda

--role (string) −opcional. O ARN da função precisa ser atualizado.

--handler (string) −opcional. Os detalhes do manipulador da função aws lambda.

--description(string) −opcional. Descrição da função.

--timeout(integer) −opcional. Tempo necessário para que a função aws lambda possa terminar.

--memory-size(integer) −opcional. Esta é a memória dada à função lambda de aws. A AWS alocará a quantidade de CPU e alocação de memória com base na memória fornecida.

--environment (structure) −opcional. É um objeto com detalhes de ambiente exigidos na função aws lambda.

e.g: Variables = {Name1 = string, Name2 = string}

--runtime(string) − Aqui você precisa especificar o ambiente de execução, ou seja, a seleção do idioma.

Os detalhes do tempo de execução são mostrados na tabela abaixo -

Opções disponíveis tempo de execução
Python v3.6 python3.6
Python v2.7 python2.7
NodeJS v6.10 nodejs6.10
NodeJS v8.10 nodejs8.10
Java java8
C # 1 dotnetcore1.0
C # 2 dotnetcore2.0
Ir go1.x

--cli-input-json (string) −opcional. Isso executará a operação na api conforme especificado na string json fornecida.

--generate-cli-skeleton (string) −opcional. Isso produzirá o esqueleto JSON de todos os detalhes sem executar a API. A saída pode ser usada como uma entrada para--cli-input-json.

Agora, vamos alterar a memória e o tempo limite da função AWS Lambda que criamos anteriormente. Siga as etapas fornecidas abaixo e observe as capturas de tela correspondentes anexadas para este propósito -

Passo 1

A memória e o tempo limite antes da alteração ocorrer são os seguintes -

Passo 2

Agora com update-function-configuration, vamos alterar a memória e o tempo limite para 320 MB e o tempo limite para 10s. Para este propósito, use o seguinte comando com valores -

aws lambda update-function-configuration --function-name “awslambdusingcli” 
--timeout 10 --memory-size 320

etapa 3

Então você pode ver a seguinte saída como o display -

Passo 4

A exibição no console AWS após usar update-function-configuration é o seguinte -

Código da função de atualização

Esta api atualizará o código para uma função existente do AWS Lambda.

Comandos Envolvidos

update-function-code
--function-name <value>
[--zip-file <value>]
[--s3-bucket <value>]
[--s3-key <value>]
[--s3-object-version <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]

Opções Envolvidas

A seguir estão as opções envolvidas com a API update-function-code -

--function-name(string) − nome da função aws lambda

--zip-file (blob) −opcional. Caminho do arquivo zip que contém o código a ser atualizado.

--s3-bucket(string) −opcional. Nome do intervalo S3 que contém o arquivo zip com o código carregado.

--s3-key(string) −opcional. Nome da chave do objeto AWS s3 que deve ser carregado.

--s3-object-version (string) −opcional. Versão do objeto AWS s3.

--cli-input-json (string) −opcional. Isso executará a operação na api conforme especificado na string json fornecida.

--generate-cli-skeleton (string) −opcional. Isso produzirá o esqueleto JSON de todos os detalhes sem executar a API. A saída pode ser usada como uma entrada para --cli-input-json.

O código atualizado é mostrado abaixo -

exports.handler = async (event, context) => {
   console.log("Using aws cli");
   console.log()
   return 'Hello from Lambda from aws cli!'
};

Você pode usar o seguinte command with values for this purpose -

aws lambda update-function-code --function-name "awslambdausingcli" 
--zip-file "fileb://awscli.zip"

A saída correspondente é como mostrado aqui -

A exibição do console AWS é mostrada aqui -

A saída de registro correspondente é mostrada abaixo -

função de exclusão

o delete aws cli api excluirá a função fornecida.

Comandos Incluídos

Os detalhes do comando para o mesmo são fornecidos aqui -

delete-function
--function-name <value>
[--qualifier <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]

Opções Incluídas

As opções incluídas nesta api são as fornecidas abaixo -

--function-name(string) − isso levará o nome da função lambda ou o arn da função aws lambda.

--qualifier (string) −Isso é opcional. Aqui você pode especificar a versão de aws lambda que precisa ser excluída.

-- cli-input-json(string) −Executa a operação do serviço com base na string JSON fornecida. A string JSON segue o formato fornecido por --generate-cli-skeleton. Se outros argumentos forem fornecidos na linha de comando, os valores CLI substituirão os valores fornecidos por JSON.

--generate-cli-skeleton(string) − ele imprime o esqueleto json na saída padrão sem enviar a solicitação de API.

aws lambda delete-function --function-name "lambdatestcli"

Agora, observe que a função não será vista na lista de funções do AWS Lambda -

O AWS Lambda pode ser criado e implantado usando uma estrutura sem servidor. Ele permite que você crie gatilhos do AWS Lambda e também implante os mesmos criando as funções necessárias. O framework sem servidor permite lidar com grandes projetos de uma forma mais fácil. Os eventos e recursos necessários são escritos em um só lugar e apenas alguns comandos ajudam a implantar a funcionalidade completa no console da AWS.

Neste capítulo, você aprenderá em detalhes como começar a usar a estrutura sem servidor da AWS.

Instale o Serverless Framework usando npm install

Para começar, você precisa primeiro instalar nodejs. Você pode verificar se há nodejs da seguinte maneira -

Você terá que usar o seguinte comando para instalar sem servidor usando o pacote npm -

npm install -g serverless

Depois que o npm estiver pronto, execute o comando sem servidor que mostra a lista de comandos a serem usados ​​para criar e implantar a função AWS Lambda. Observe as imagens fornecidas abaixo -

Você também pode usar sls em vez de sem servidor. sls é o comando abreviado para sem servidor.

Caso necessite de ajuda no comando sls, você pode usar o seguinte comando -

sls create --help

Para criar uma estrutura sem servidor, você deve seguir as etapas abaixo -

Passo 1

Para começar a usar a estrutura sem servidor, precisamos adicionar as credenciais. Com isso, você pode primeiro o usuário no console AWS da seguinte forma -

Passo 2

Clique em Next:Permissionsbotão para adicionar permissões. Você terá que anexar as políticas existentes ou acesso de administrador a este usuário.

etapa 3

Clique Create Userpara adicionar o usuário. Ele exibirá a chave de acesso e a chave secreta que precisamos para configurar a estrutura sem servidor -

Configurar AWS Serverless Framework

Vamos ver como configurar a estrutura sem servidor da AWS. Você pode usar o seguinte comando para este propósito -

sls config credentials --provider aws --key accesskey --secret secretkey

Observe que os detalhes das credenciais inseridas, ou seja, o access key e secret key são armazenados no file /aws/credentials.

Primeiro, crie uma pasta onde deseja que seus arquivos de projeto sejam armazenados.

Em seguida, começaremos o trabalho em aws-serverless pasta.

Crie AWS Lambda usando Serverless Framework

Agora, vamos criar uma função Lambda com a estrutura sem servidor usando as etapas fornecidas abaixo -

Passo 1

A seguir estão os detalhes para sem servidor create comando -

Passo 2

Agora, precisamos atribuir o modelo, que são os seguintes -

AWS-nodejs, aws-nodejs-typescript, aws-nodejs-ecma-script, aws-python, aws-python3, aws-groovy-gradle etc.

etapa 3

Devemos fazer uso de aws-nodejstemplate para criar nosso primeiro projeto usando framework sem servidor. O comando para o mesmo propósito é mostrado aqui -

sls create --template aws-nodejs

Observe que este comando cria um padrão para o template aws-nodejs.

Passo 4

Agora, abra a pasta criada em um IDE. Aqui, estamos usando o código do Visual Studio e a estrutura da pasta é a seguinte -

Etapa 5

Existem 2 arquivos criados: handler.js e Serverless.yml

Os detalhes da função básica do AWS Lambda são mostrados em handler.js como segue -

'use strict';

module.exports.hello = (event, context, callback) => {
   const response = {
      statusCode: 200,
      body: JSON.stringify({
         message: 'Go Serverless v1.0! Your function executed successfully!',
         input: event,
      }),
   };
   callback(null, response);

   // Use this code if you don't use the http event with the LAMBDA-PROXY integration
   // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};

Este ficheiro Serverless.yml tem os detalhes de configuração da estrutura sem servidor, conforme mostrado abaixo -

# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config Examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
#    docs.serverless.com
#
# Happy Coding!
service: aws-nodejs # NOTE: update this with your service name

# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"

provider:
 name: aws
 runtime: nodejs6.10

# you can overwrite defaults here
#  stage: dev
#  region: us-east-1

# you can add statements to the Lambda function's IAM Role here
#  iamRoleStatements:
#    - Effect: "Allow"
#      Action:
#        - "s3:ListBucket"
#      Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ]  }
#    - Effect: "Allow"
#      Action:
#        - "s3:PutObject"
#      Resource:
#        Fn::Join:
#          - ""
#          - - "arn:aws:s3:::"
#            - "Ref" : "ServerlessDeploymentBucket"
#            - "/*"

# you can define service wide environment variables here
#  environment:
#    variable1: value1

# you can add packaging information here
#package:
#  include:
#    - include-me.js
#    - include-me-dir/**
#  exclude:
#    - exclude-me.js
#    - exclude-me-dir/**

functions:
 hello:
   handler: handler.hello

#    The following are a few example events you can configure
#    NOTE: Please make sure to change your handler code to work with those events
#    Check the event documentation for details
#    events:
#      - http:
#          path: users/create
#          method: get
#      - s3: ${env:BUCKET}
#      - schedule: rate(10 minutes)
#      - sns: greeter-topic
#      - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000
#      - alexaSkill: amzn1.ask.skill.xx-xx-xx-xx
#      - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx
#      - iot:
#          sql: "SELECT * FROM 'some_topic'"
#      - cloudwatchEvent:
#          event:
#            Example:
#              - "aws.ec2"
#            detail-type:
#              - "EC2 Instance State-change Notification"
#            detail:
#              state:
#                - pending
#      - cloudwatchLog: '/aws/lambda/hello'
#      - cognitoUserPool:
#          pool: MyUserPool
#          trigger: PreSignUp

#    Define function environment variables here
#    environment:
#      variable2: value2

# you can add CloudFormation resource templates here
#resources:
#  resources:
#    NewResource:
#      Type: AWS::S3::Bucket
#      Properties:
#        BucketName: my-new-bucket
#  Outputs:
#     NewOutput:
#       Description: "Description for the output"
#       Value: "Some output value"

Agora, precisamos adicionar alterações no arquivo serverless.yml de acordo com nossos requisitos. Você pode usar os comandos conforme abaixo -

Você pode usar o seguinte comando para Service -

service: aws-nodejs # NOTE: update this with your service name

Agora, mude o serviço aqui e adicione o nome dado à nossa pasta como mostrado -

service: aws-serverless # NOTE: update this with your service name

Os detalhes do provedor são mostrados -

provider:
   name: aws
   runtime: nodejs6.10

O provedor é aws e o tempo de execução é nodejs6.10. Precisamos adicionar oregion no qual estaremos trabalhando e o stage, isso é dev or prodambiente para o projeto. Então, aqui estão os detalhes atualizados do provedor: provedor -

name: aws
runtime: nodejs6.10
# you can overwrite defaults here
stage: prod
region: us-east-1

Papel IAM

o iam role, ou seja, o código para permissão para trabalhar com Lambda é mostrado aqui no .yml arquivo -

#  iamRoleStatements:
#    - Effect: "Allow"
#      Action:
#        - "s3:ListBucket"
#      Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ]  }
#    - Effect: "Allow"
#      Action:
#        - "s3:PutObject"
#      Resource:
#        Fn::Join:
#          - ""
#          - - "arn:aws:s3:::"
#            - "Ref" : "ServerlessDeploymentBucket"
#            - "/*"

Observe que precisamos fornecer os detalhes da função, ou seja, a permissão necessária com outros serviços da AWS, na seção acima.

Detalhes do AWS Lambda Handler

O nome da função de exportação em handler.jsé olá. Portanto, o manipulador é o nome do arquivo seguido pelo nome da exportação.

functions:
   hello:
      handler: handler.hello

Os detalhes do recurso sobre o serviço s3 adicionado conforme mostrado abaixo aqui -

# you can add CloudFormation resource templates here
#resources:
#  resources:
#    NewResource:
#      Type: AWS::S3::Bucket
#      Properties:
#        BucketName: my-new-bucket
#  Outputs:
#     NewOutput:
#       Description: "Description for the output"
#       Value: "Some output value"

Implantar AWS Lambda usando Serverless Framework

Vamos implantar a função lambda acima no console AWS. Você pode usar as seguintes etapas para esta finalidade -

Passo 1

Primeiro, você terá que usar o seguinte comando -

sls deploy

Passo 2

Agora, você deve ver a função no console AWS agora, conforme mostrado. Os detalhes da AWS sem servidor são registrados na formação da nuvem AWS. Para isso, vá para o serviço AWS e selecioneCloudFormation. Os detalhes do AWS Lambda são exibidos da seguinte forma -

Observe que o nome dado é o nome do projeto seguido da etapa utilizada.

etapa 3

Ele cria a função IAM para AWS Lambda e grupo de log para AWS cloudwatch. O bucket S3 é criado com os detalhes do código armazenados e os detalhes da configuração.

Isso é criado pelo comando sls deploy. Você não precisa especificar a função iam; em vez disso, ela é criada por padrão durante odeploy palco.

Passo 4

O fluxo detalhado de eventos é exibido abaixo no serviço de formação de nuvem.

Código AWS Lambda

O código do AWS Lambda e suas configurações de execução são mostrados na captura de tela fornecida abaixo -

Ao testar a função Lambda, você pode encontrar a seguinte saída -

A saída de log para a função acima é mostrada aqui -

Também podemos testar a função AWS Lambda usando o comando serverless conforme mostrado abaixo -

sls invoke --function hello

A sintaxe do comando invoke é mostrada aqui -

sls invoke --function hello

Este comando invoke aciona a função AWS Lambda e exibe a saída no prompt de comando conforme mostrado abaixo -

Você também pode testar a função Lambda antes de implantar e o comando para a mesma usando o seguinte comando -

sls invoke local --function hello

Observe que nem sempre é possível testar localmente, pois recursos como S3 e DinanoDB não podem ser simulados no ambiente local. Apenas as chamadas de função básicas podem ser testadas localmente.

Usando API Gateway e AWS Lambda com Serverless Framework

Vamos ver como criar um novo projeto para trabalhar com Lambda e gateway api. Você pode usar o seguinte comando para este propósito -

sls create --template aws-nodejs

Agora abra aws-apiprojeto em código visual. Você pode ver que ohandler.js e serverless.ymlarquivos criados. Vamos fazer as mudanças para adicionar o gateway API.

Você terá que fazer as seguintes mudanças em serverless.yml -

Agora, os detalhes dos eventos adicionados para ativação do gateway api com AWS Lambda -

Há uma coisa nova adicionada aqui chamada events. Nós especificamos o evento comohttp, junto com seu caminho e método.

O caminho é o ponto final que usaremos quando o caminho do gateway da API for criado e o método usado for GET.

Observe que o manipulador é handler.helloe hello é o nome de exportação de handler.js.

Observe que você não precisa implantar o gateway api aqui, pois a estrutura sem servidor fará isso.

Agora, vamos executar o sls deploy comando para criar a função AWS Lambda com gatilho como api gateway.

sls deploy

Observe que os detalhes de implantação estão listados acima. Dá oGeturl com o ponto final como os detalhes do caminho. O palco éprodentão o mesmo é usado no url. O nome da função éaws-api-prod-hello.

Vamos acessar o url e ver o resultado. Você pode ver a seguir a resposta que obtemos do api-gateway get url -

{"message":"Go Serverless v1.0! Your function executed 
successfully!","input":{"resource":"/first-api","path":"/first-api","httpMethod":
"GET","headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","CloudFront-Forwarded-Proto":
"https","CloudFront-Is-Desktop-Viewer":"true","CloudFront-Is-Mobile-Viewer":
"false","CloudFront-Is-SmartTV-Viewer":"false","CloudFront-Is-Tablet-Viewer":
"false","CloudFront-Viewer-Country":"IN","Host":"nvbhfdojfg.execute-api.us-east-1.
amazonaws.com","upgrade-insecure-requests":"1","User-Agent":"Mozilla/5.0 
(Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
 Chrome/66.0.3359.181 Safari/537.36","Via":"2.0 707912794802dbb4825c79b7d8626a5d.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"j70MMqkWFp6kmvuauzp_nvTbI-WwKIQmm2Jl5hzSoN6gkdvX11hh-g==",
 "X-Amzn-Trace-Id":"Root=1-5b13f9ef-5b012e36b7f40b5013a326fc","X-Forwarded-For":"157.33.133.217, 54.182.242.73","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},
 "queryStringParameters":null,"pathParameters":null,"stageVariables":null,
 "requestContext":{"resourceId":"pes5sy","resourcePath":"/first-api","httpMethod":
 "GET","extendedRequestId":"H6P9fE-MoAMFdIg=","requestTime":"03/Jun/2018:14:23:
 43 +0000","path":"/prod/first-api","accountId":"625297745038","protocol":"HTTP/1.1",
 "stage":"prod","requestTimeEpoch":1528035823928,"requestId":"b865dbd6-6739-11e8-b135
 -a30269a8ec58","identity":{"cognitoIdentityPoolId":null,"accountId":null,
 "cognitoIdentityId":null,"caller":null,"SourceIp":"157.33.133.217","accessKey":null,
 "cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":null,
 "userAgent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like
 Gecko) Chrome/66.0.3359.181 Safari/537.36","user":null},"apiId":"nvbhfdojfg"},"body":null,
 "isBase64Encoded":false}}

Os detalhes do evento também estão disponíveis na saída quando você acessa o url. O httpMethod é GET e os queryStringParameters são nulos, pois não há nada passado na string de consulta. Os detalhes do evento são fornecidos ainput que especificamos no manipulador AWS Lambda -

A saída que obtemos do gateway api são apenas os body detalhes como message e input. A resposta é totalmente controlada pelo gateway api e como exibi-la como saída.

Agora, vamos passar as entradas para o url GET na string de consulta e ver o display -

Então você pode ver a saída da querystring conforme mostrado abaixo -

{"message":"Go Serverless v1.0! Your function executed 
successfully!","input":{"resource":"/first-api","path":"/first-api","httpMethod":
"GET","headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8","Accept-Encoding":"gzip, deflate, 
br","Accept-Language":"en-US,en;q=0.9","CloudFront-Forwarded-Proto":"https",
"CloudFront-Is-Desktop-Viewer":"true","CloudFront-Is-Mobile-Viewer":"false",
"CloudFront-Is-SmartTV-Viewer":"false","CloudFront-Is-Tablet-Viewer":"false",
"CloudFront-Viewer-Country":"IN","Host":"nvbhfdojfg.execute-api.us-east-1.amazonaws.com",
"upgrade-insecure-requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64)
 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36","Via":"2.0 
 8b1d3263c2fbd0a2c270b174d7aa3d61.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"JIBZw3I-blKbnpHP8LYXPVolCgdW5KmEukZS4at9mi4vrWBMI-UKNw==",
 "X-Amzn-Trace-Id":"Root=1-5b13ff90-7d6e38d4c0e4a5d4e6184f30","X-Forwarded-For":
 "157.33.133.217, 54.182.242.127","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},"queryString
 Parameters":{"displaymessage":"Hello"},"pathParameters":null,"stageVariables":null,
 "requestContext":{"resourceId":"pes5sy","resourcePath":"/first-api","httpMethod":
 "GET","extendedRequestId":"H6TeiG34oAMFguA=","requestTime":"03/Jun/2018:14:47:44 +0000","path":"/prod/first-api","accountId":"625297745038","protocol":"HTTP/1.1",
"stage":"prod","requestTimeEpoch":1528037264252,"requestId":"12e5dca3-
673d-11e8-8966-69fcf43bd4db","identity":{"cognitoIdentityPoolId":null,"accountId":null,
"cognitoIdentityId":null,"caller":null,"exmpleIp":"157.33.133.217","accessKey":null,
"cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":null,
"userAgent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like
 Gecko) Chrome/66.0.3359.181 Safari/537.36","user":null},"apiId":"nvbhfdojfg"},"body":
 null,"isBase64Encoded":false}}

Vamos alterar a função do AWS Lambda para apenas exibir os detalhes da string de consulta conforme mostrado abaixo -

'use strict';
module.exports.hello = (event, context, callback) => {
   const response = {
      statusCode: 200,
      body: JSON.stringify({
         message:(event.queryStringParameters &&     event.queryStringParameters.displaymessage!="") ? event.queryStringParameters.displaymessage : 'Go Serverless v1.0! Your function executed successfully!'
      }),
   };
   callback(null, response);
   // Use this code if you don't use the http event with the LAMBDA-PROXY integration
   // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};

Observe que alteramos a mensagem com base na string de consulta display message. Isso implantará a função novamente e verificará a saída. Ele exibe os detalhes presentes na mensagem de exibição da variável da string de consulta, conforme mostrado abaixo.

Vamos agora adicionar post método para os eventos criados conforme mostrado abaixo -

Agora, implante as alterações feitas e você pode ver a seguinte saída do comando de implantação -

Observe que testar o URL da postagem diretamente no navegador não fornecerá os detalhes. Você deve testar o URL da postagem empostman.

Para pegar o carteiro vá para https://www.getpostman.com/apps. Baixe o aplicativo de acordo com seu sistema operacional. Uma vez instalado, você deve ser capaz de testar o url de sua postagem conforme mostrado abaixo -

Isso exibe a mensagem que adicionamos na função Lambda.

Este capítulo irá explicar em detalhes sobre o processo de execução e invocação da função Lambda e as etapas envolvidas nele.

Modelo de execução AWS Lambda

A execução da AWS depende dos detalhes de configuração adicionados para a função AWS Lambda. Quando a função é criada, há ummemory e time allotted, que é usado para a execução da função AWS Lambda.

Com a ajuda dos detalhes de configuração, o AWS Lambda cria um contexto de execução. O contexto de execução é um ambiente de tempo de execução temporário preparado com quaisquer dependências externas, como conexão de banco de dados, endpoints http, bibliotecas de terceiros etc.

Quando a função do AWS Lambda é chamada pela primeira vez ou se a função lambda é atualizada, há pouca latência adicionada devido à configuração do contexto de execução. No entanto, as chamadas subsequentes são mais rápidas em comparação com a primeira. O AWS Lambda tenta reutilizar o contexto de execução novamente se a função Lambda for chamada levando menos tempo.

A reutilização do contexto de execução tem as seguintes implicações -

  • Se houver alguma conexão de banco de dados feita para a execução do Lambda, a conexão é mantida para reutilização. Portanto, o código Lambda deve ser tal que a conexão deve ser verificada primeiro - se existe e reutilizada; caso contrário, teremos que fazer uma nova conexão.

  • O contexto de execução mantém um espaço em disco de 500 MB em /tmpdiretório. Os dados necessários são armazenados em cache neste diretório. Você pode ter uma verificação adicional no código para ver se os dados existem.

  • Se os retornos de chamada ou alguns processos em segundo plano não forem concluídos quando a função Lambda for chamada, a execução será iniciada quando a função lambda for chamada novamente. Caso você não precise que tal coisa aconteça certifique-se de que seus processos estejam todos finalizados corretamente, quando a execução da função for concluída.

Você deve usar o contexto de execução e os dados armazenados no diretório tmp. Você terá que adicionar as verificações necessárias no código para ver se os dados necessários existem antes de criar novos. Isso vai economizar tempo durante a execução e torná-la mais rápida.

Invocar a função AWS Lambda

Podemos invocar AWS manualmente usando aws cli. Já vimos como criar e implantar AWS Lambda usandocli. Aqui, primeiro criaremos uma função usandoaws cli e invocar o mesmo.

Criação da função AWS Lambda usando AWS CLI

Você pode usar os seguintes comandos para criar a função AWS Lambda usando aws cli -

Commands

create-function 
--function-name <value>
--runtime <value>
--role <value>
--handler <value>
[--code <value>] 
[--description <value>] 
[--timeout <value>] 
[--memory-size <value>] 
[--environment <value>] 
[--kms-key-arn <value>] 
[--tags <value>] 
[--zip-file <value>] 
[--cli-input-json <value>]

Command with values

aws lambda create-function 
--function-name "lambdainvoke" 
--runtime "nodejs8.10" 
--role "arn:aws:iam::625297745038:role/lambdaapipolicy" 
--handler "index.handler" 
--timeout 5 
--memory-size 256 
--zip-file "fileb://C:\nodeproject\index.zip"

A saída é como mostrado abaixo -

A função criada no console AWS é mostrada abaixo -

Agora, você pode invocar a função usando o comando:invoke

--function-name <value>
[--invocation-type <value>]
[--log-type <value>]
[--client-context <value>]
[--payload <value>]
[--qualifier <value>]
outfile <value>

Options

--function-name − Especifique o nome da função que você deseja chamar.

--invocation-type(string) − por padrão, o tipo de invocação é requestresponse. Os valores disponíveis para serem usados ​​com o tipo de invocação sãoRequestResponse, Event e DryRun.

  • O tipo de invocação de evento deve ser usado para resposta assíncrona.

  • DryRun deve ser usado quando você deseja verificar a função Lambda sem a necessidade de executá-la.

--log-type − Será Tailse o tipo de chamada for RequestResponse. Ele fornece os últimos dados de registro codificados em base 64 de 4 KB. Os valores possíveis sãoTail e None.

--client-context −Você pode passar detalhes específicos do cliente para a função Lambda. O clientcontext deve estar no formato json e codificado em base64. O tamanho máximo do arquivo é de 3583 bytes.

--payload − entrada de formato json para sua função lambda.

--qualifier −Você pode especificar a versão da função Lambda ou o nome do alias. Se você passar a versão da função, a api usará a função qualificada arn para invocar a função Lambda. Se você especificar o nome do alias, a api usará o ARN do alias para invocar a função Lambda.

outfile − Este é o nome do arquivo onde o conteúdo será salvo.

Command with values

aws lambda invoke --function-name "lambdainvoke" --log-type 
Tail C:\nodeproject\outputfile.txt

Você pode usar a opção de carga útil para enviar evento fictício para a função lambda no formato json, conforme mostrado abaixo.

O código AWS Lambda relacionado é o seguinte -

exports.handler = async (event, callback) => {
   console.log("Hello => "+ event.name);
   console.log("Address =>"+ event.addr);
   callback(null, 'Hello '+event.name +" and address is "+ event.addr);
};

Observe que no código, temos console event.name e event.addr. Agora, vamos usar a opção de carga útil em aws cli para enviar o evento com nome e endereço da seguinte forma -

aws lambda invoke --function-name "lambdainvoke" --log-type 
Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt

Thenpayload leva entrada como um caminho de arquivo que tem entrada json como mostrado -

{"name":"Roy Singh", "addr":"Mumbai"}

A saída correspondente é mostrada abaixo -

A saída é armazenada no arquivo C:\clioutput\outputfile.txt como segue -

"Hello Roy Singh and address is Mumbai"

Eventos de amostra

Você pode testar a função do AWS Lambda passando um evento de amostra. Esta seção fornece alguns exemplos de eventos para serviços da AWS. Você pode usar oinvokecomando para testar a saída quando acionado com qualquer um dos serviços. Observe os códigos fornecidos para os eventos de amostra correspondentes abaixo -

Amazon S3 Put Sample Event

{
  "Records": [{
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
         "SourceIPAddress": "127.0.0.1"
      },
      "s3": {
         "configurationId": "testConfigRule",
         "object": {
            "eTag": "0123456789abcdef0123456789abcdef",
            "sequencer": "0A1B2C3D4E5F678901",
            "key": "HappyFace.jpg",
            "size": 1024
         },
         "bucket": { 
            "arn": bucketarn,
            "name": "Sourcebucket",
            "ownerIdentity": {
               "principalId": "EXAMPLE"
            }
         },
         "s3SchemaVersion": "1.0"
      },
      "responseElements": {
         "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
         "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
         "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
   }]
}

Para obter o details of the file from the s3 put event, você pode usar o seguinte comando -

event.Records[0].s3.object.key   //will display the name of the file

Para get the bucket name, você pode usar o seguinte comando -

event.Records[0].s3.bucket.name  //will give the name of the bucket.

Para see the EventName, você pode usar o seguinte comando -

event.Records[0].eventName    // will display the eventname

Amazon S3 Delete Sample Event

{
   "Records": [{
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
         "SourceIPAddress": "127.0.0.1"
      },
      "s3": {
         "configurationId": "testConfigRule",
         "object": {
            "sequencer": "0A1B2C3D4E5F678901",
            "key": "HappyFace.jpg"
         },
         "bucket": {
            "arn": bucketarn,
            "name": "Sourcebucket",
            "ownerIdentity": {
               "principalId": "EXAMPLE"
            }
         },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
         "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
         "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectRemoved:Delete",
      "userIdentity": {
         "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
   }]
}

Amazon DynamoDB

O Amazon DynamoDB pode ser um evento no AWS Lambda quando alterações são feitas na tabela do DynamoDB. Podemos realizar operações como adicionar entrada, atualizar e excluir registros da tabela DynamodDB.

Um exemplo de evento para adicionar, inserir e excluir eventos do DynamoDB é mostrado aqui -

{
  "Records": [{
      "eventID": "1",
      "eventVersion": "1.0",
      "dynamodb": {
         "Keys": {
            "Id": {
               "N": "101"
            }
         },
         "NewImage": {
            "Message": {
               "S": "New item!"
            },
            "Id": {
               "N": "101"
            }
         },
         "StreamViewType": "NEW_AND_OLD_IMAGES",
         "SequenceNumber": "111",
         "SizeBytes": 26
      },
      "awsRegion": "us-west-2",
      "eventName": "INSERT",
      "eventSourceARN": eventSourcearn,
      "eventSource": "aws:dynamodb"
   },
   {
      "eventID": "2",
      "eventVersion": "1.0",
      "dynamodb": {
         "OldImage": {
            "Message": {
               "S": "New item!"
            },
            "Id": {
               "N": "101"
            }
         },
        "SequenceNumber": "222",
        "Keys": {
            "Id": {
               "N": "101"
            }
         },
        "SizeBytes": 59,
        "NewImage": {
            "Message": {
               "S": "This item has changed"
            },
            "Id": {
				   "N": "101"
            }
         },
         "StreamViewType": "NEW_AND_OLD_IMAGES"
      },
      "awsRegion": "us-west-2",
      "eventName": "MODIFY",
      "eventSourceARN": Sourcearn,
      "eventSource": "aws:dynamodb"
   },
   {      
   "eventID": "3",
      "eventVersion": "1.0",
      "dynamodb": {
         "Keys": {
            "Id": {
               "N": "101"
            }
         },
         "SizeBytes": 38,
         "SequenceNumber": "333",
         "OldImage": {
            "Message": {
               "S": "This item has changed"
            },
            "Id": {
               "N": "101"
            }
         },
         "StreamViewType": "NEW_AND_OLD_IMAGES"
      },      "awsRegion": "us-west-2",
      "eventName": "REMOVE",
      "eventSourceARN": Sourcearn,
      "eventSource": "aws:dynamodb"    
   }]
}

Amazon Simple Notification Service

O AWS Lambda pode ser útil para processar a notificação criada em Simple Notification Service (SNS). Sempre que houver mensagem publicada no SNS, a função Lambda pode ser acionada com um evento SNS, que contém detalhes das mensagens. Essas mensagens podem ser processadas dentro da função Lambda e podem ser enviadas posteriormente para outros serviços conforme a necessidade.

Assim que a mensagem for inserida, o SNS acionará a função Lambda. Se algum erro tentar chamar a função Lambda, o SNS tentará novamente chamar a função lambda até três vezes.

Evento de amostra do Amazon SNS

Um exemplo de evento que tem todos os detalhes disponíveis na função AWS Lambda para realizar o processo adicional é mostrado abaixo -

{
  "Records": [{
      "EventVersion": "1.0",
      "EventSubscriptionArn": eventsubscriptionarn,
      "EventSource": "aws:sns",
      "Sns": {
         "SignatureVersion": "1",
         "Timestamp": "1970-01-01T00:00:00.000Z",
         "Signature": "EXAMPLE",
         "SigningCertUrl": "EXAMPLE",
         "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
         "Message": "Hello from SNS!",
         "MessageAttributes": {
            "Test": {
               "Type": "String",
               "Value": "TestString"
            },
            "TestBinary": {
               "Type": "Binary",
               "Value": "TestBinary"
            }
         },
         "Type": "Notification",
         "UnsubscribeUrl": "EXAMPLE",
         "TopicArn": topicarn,
         "Subject": "TestInvoke"
      }
   }]
}

Amazon Simple Mail Service

O Amazon Simple Mail Service pode ser usado para enviar e receber mensagens. A função AWS Lambda pode ser chamada no Simple Mail Service quando a mensagem é recebida.

Exemplo de evento de recebimento de e-mail do Amazon SES

Os detalhes do evento SES quando usado dentro do AWS Lambda são mostrados abaixo -

{
  "Records": [{
      "eventVersion": "1.0",
      "ses": {
         "mail": {
            "commonHeaders": {
               "from": [
                  "Jane Doe <[email protected]>"
               ],
            "to": [
               "[email protected]"
            ],
            "returnPath": "[email protected]",
            "messageId": "<0123456789Source.com>",
            "date": "Wed, 7 Oct 2015 12:34:56 -0700",
            "subject": "Test Subject"
         },
         "example": "[email protected]",
         "timestamp": "1970-01-01T00:00:00.000Z",
         "destination": [
            "[email protected]"
         ],
         "headers": [{
            "name": "Return-Path",
            "value": "<[email protected]>"
         },
         {
            "name": "Received",
            "value": "from mailer.example.com (mailer.example.com [203.0.113.1]) by inbound-smtp.us-west-2.amazonaws.com with SMTP id o3vrnil0e2ic for [email protected]; Wed, 07 Oct 2015 12:34:56 +0000 (UTC)"
         },
         {
            "name": "DKIM-Signature",
            "value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=example; h=mime-version:from:date:message-id:subject:to:content-type; bh=jX3F0bCAI7sIbkHyy3mLYO28ieDQz2R0P8HwQkklFj4=; b=sQwJ+LMe9RjkesGu+vqU56asvMhrLRRYrWCbV"
         },
         {
            "name": "MIME-Version",
            "value": "1.0"
         },
         {
            "name": "From",
            "value": "Jane Doe <[email protected]>"
         },
         {
            "name": "Date",
            "value": "Wed, 7 Oct 2015 12:34:56 -0700"
         },
         {
            "name": "Message-ID",
            "value": "<0123456789example.com>"
         },
         {
            "name": "Subject",
            "value": "Test Subject"
         },
         {
            "name": "To",
            "value": "[email protected]"
         },
         {
            "name": "Content-Type",
            "value": "text/plain; charset=UTF-8"
         }],
         "headersTruncated": false,
         "messageId": "o3vrnil0e2ic28tr"
      },
      "receipt": {
         "recipients": [
            "[email protected]"
         ],
         "timestamp": "1970-01-01T00:00:00.000Z",
         "spamVerdict": {
            "status": "PASS"
         },
         "dkimVerdict": {
            "status": "PASS"
         },
         "processingTimeMillis": 574,
         "action": {
            "type": "Lambda",
            "invocationType": "Event",
            "functionArn": "arn:aws:lambda:us-west-2:012345678912:function:example"
         },
         "spfVerdict": {
            "status": "PASS"
         },
         "virusVerdict": {
            "status": "PASS"
         }
      }
   },
   "eventexample": "aws:ses"
   }]
}

Amazon Cloudwatch Logs

O AWS Lambda pode ser acionado a partir do Amazon CloudWatch Logs usando o CloudWatch Logs Subscriptions. As assinaturas do CloudWatch Logs têm dados em tempo real sobre os logs que podem ser processados ​​e analisados ​​dentro do AWS Lambda ou podem ser usados ​​para carregar em outros sistemas.

Amazon CloudWatch Logs Sample Event

{
   "awslogs": {
      "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
      QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
      wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
      DQiMdxRQEAAA=="
   }
}

Amazon API Gateway

A função AWS Lambda pode ser invocada em httpsurl. TI pode ser feito emGET, POST, PUT. Quando o URL https é invocado, a função AWS Lambda também é acionada e os dados passados ​​para https usando get / post podem ser disponibilizados dentro do AWS Lambda para serem usados ​​para inserir no DynamoDB ou enviar e-mail, etc.

Evento de solicitação de proxy de gateway de API

{
   "path": "/test/hello",
   "headers": {
      "Accept":  "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
      "Accept-Encoding": "gzip, deflate, lzma, sdch, br",
      "Accept-Language": "en-US,en;q=0.8",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "US",
      "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
      "Upgrade-Insecure-Requests": "1",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
      "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
      "X-Forwarded-For": "192.168.100.1, 192.168.1.1",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
   },
   "pathParameters": {
      "proxy": "hello"
   },
   "requestContext": {
      "accountId": "123456789012",
      "reexampleId": "us4z18",
      "stage": "test",
      "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
	   "identity": {
         "cognitoIdentityPoolId": "",
         "accountId": "",
         "cognitoIdentityId": "",
         "caller": "",
         "apiKey": "",
         "exampleIp": "192.168.100.1",
         "cognitoAuthenticationType": "",
         "cognitoAuthenticationProvider": "",
         "userArn": "",
         "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
         "user": ""
      },
      "reexamplePath": "/{proxy+}",
      "httpMethod": "GET",
      "apiId": "wt6mne2s9k"
   },
   "reexample": "/{proxy+}",
   "httpMethod": "GET",
   "queryStringParameters": {
      "name": "me"
   },
   "stageVariables": {
      "stageVarName": "stageVarValue"
   }
}

Evento de resposta de proxy de gateway de API

{
   "statusCode": 200,
   "headers": {
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
      "Accept-Encoding": "gzip, deflate, lzma, sdch, br",
      "Accept-Language": "en-US,en;q=0.8",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "US",
      "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
      "Upgrade-Insecure-Requests": "1",
      "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
      "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
      "X-Forwarded-For": "192.168.100.1, 192.168.1.1",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
   },
   "body": "Hello World"
}

A exclusão da função AWS Lambda removerá o AWS Lambda do console AWS. Existem 2 maneiras de excluir a função AWS Lambda.

  • Usando o console AWS.
  • Usando o comando AWS CLI

Este capítulo discute essas duas maneiras em detalhes.

Usando o Console AWS

Para excluir uma função Lambda usando o console AWS, siga as etapas fornecidas abaixo -

Passo 1

Faça login no console da AWS e vá para o serviço AWS Lambda. Você pode descobrir que as funções lambda da AWS criadas até agora estão listadas no console da AWS, conforme mostrado abaixo -

A lista mostra que existem 23 funções do AWS Lambda criadas até agora. Você pode visualizá-los usando a paginação fornecida na parte superior ou pesquisar no AWS Lambda usando a caixa de pesquisa.

Passo 2

Observe que há um botão de opção em cada função do AWS Lambda. Selecione a função que você deseja excluir. Observe a imagem mostrada abaixo -

etapa 3

Depois de selecionar a função AWS Lambda, o ActionA lista suspensa que antes estava desabilitada está destacada agora. Agora, abra a caixa de combinação e ela exibirá as opções mostradas -

Passo 4

Selecione os Deletebotão para excluir a função AWS Lambda. Depois de clicarDelete, ele exibe a mensagem da seguinte forma -

Etapa 5

Leia a mensagem com atenção e depois clique Delete botão para remover a função lambda da AWS permanentemente.

Note- Excluir aws lambda não excluirá a função vinculada. Para remover a função, você precisa ir ao IAM e remover a função.

Etapa 6

A lista de funções criadas até agora é mostrada abaixo. Observe que há umCreate role botão e Delete role botão.

Clique na caixa de seleção da função que deseja excluir. Você também pode selecionar várias funções para excluir de uma vez.

Etapa 7

Você verá uma mensagem de confirmação conforme mostrado abaixo ao clicar no botão Excluir -

Agora, leia os detalhes mencionados com atenção e depois clique Yes, delete botão.

Usando o comando AWS CLI

Vamos primeiro criar uma função Lambda usando aws cli e excluí-la usando o mesmo comando. Siga as etapas fornecidas abaixo para esta finalidade -

Passo 1

O comando com valores para criar função é o seguinte -

aws lambda create-function 
--function-name "lambdatestcli" 
--runtime "nodejs8.10" 
--role "arn:aws:iam::625297745038:role/lambdaapipolicy" 
--handler "index.handler" 
--timeout 5 
--memory-size 256 
--zip-file "fileb://C:\demotest\index.zip"

A saída correspondente é mostrada aqui -

Passo 2

A função AWS Lambda criada é lambdatestcli. Usamos o papel existente arn para criar a função lambda.

Então você pode encontrar esta função exibida no console AWS, conforme mostrado abaixo -

etapa 3

Agora, vamos invocar a função para testar a saída usando o comando mostrado -

aws lambda invoke --function-name "lambdatestcli" --log-type Tail 
C:\demotest\outputfile.txt

Este comando fornecerá a saída conforme mostrado -

Passo 4

Você pode observar os registros do Cloudwatch para a função lambda lambdatestcli

Etapa 5

Agora, vamos à parte real da exclusão da função AWS. Delete aws cli apiirá deletar a função fornecida. Os detalhes do comando usado para esta finalidade são fornecidos abaixo -

Command

delete-function
--function-name <value>
[--qualifier <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]

Options

--function-name(string) - Isso pegará o nome da função Lambda ou o arn da função AWS Lambda.

--qualifier (string)- Isso é opcional. Aqui você pode especificar a versão do AWS Lambda que precisa ser excluída.

-- cli-input-json(string)- Executa a operação do serviço com base na string JSON fornecida. A string JSON segue o formato fornecidoby --generate-cli-skeleton. Se outros argumentos forem fornecidos na linha de comando, os valores CLI substituirão os valores fornecidos por JSON.

--generate-cli-skeleton(string) - imprime o esqueleto json na saída padrão sem enviar a solicitação de API.

Command with values

aws lambda delete-function --function-name "lambdatestcli"

A saída correspondente é mostrada abaixo -

Etapa 6

Se você verificar agora, poderá observar que a função não será vista na lista de funções do AWS Lambda, conforme mostrado na captura de tela fornecida abaixo -

Trabalhando com Amazon API Gateway

A função AWS Lambda pode ser invocada em HTTPSurl. Isso pode ser feito em GET, POST, PUT. Quando o url HTTPS é invocado, a função AWS Lambda também pode ser acionada e os dados passados ​​para HTTPS usandoget/post pode ser disponibilizado dentro do AWS Lambda para ser usado para inserir no DynamoDB ou para enviar e-mail, etc.

Este capítulo discute em detalhes sobre vários processos envolvidos no trabalho com AWS lambda e API Gateway.

Processos envolvidos

A seguir estão os processos envolvidos no trabalho com AWS lambda e API Gateway -

  • Criar papel IAM para permissão
  • Criar função lambda da AWS
  • Criar gateway de API
  • Vincular função lambda ao gateway de API
  • Passando dados para o gateway api

Um diagrama básico que explica o funcionamento do gateway de API e do AWS Lambda é fornecido aqui -

Esses processos são explicados em detalhes mais adiante neste capítulo com capturas de tela relevantes.

Criar papel IAM para permissão

Nos serviços da Amazon, conforme mostrado abaixo, selecione IAM para criar funções a serem usadas pela função Lambda.

Vá para IAM e selecione Roles da seção do lado esquerdo, conforme mostrado abaixo -

Clique Create role para a função Lambda.

Selecione Lambda e clique em Permissionsno fundo. Selecione a permissão necessária para o API Gateway e Lambda.

Procure o gateway de API na pesquisa e ele listará todas as permissões relacionadas. Aqui, escolhemos o acesso total ao gateway de API, conforme mostrado abaixo -

Agora, procure o gateway de API e ele listará todas as permissões relacionadas. Aqui, escolhemos o acesso total ao gateway de API, conforme mostrado abaixo -

Você deve repetir o mesmo processo para as políticas também.

Quando terminar de escolher as políticas necessárias, clique em Reviewpara a próxima etapa. Insira o nome da função de acordo com sua escolha, conforme mostrado abaixo -

Ele exibe as políticas anexadas à função. CliqueCreate role e concluímos a criação da função e podemos prosseguir com a função lambda.

Criar função AWS Lambda

Vá para os serviços da AWS e clique no serviço lambda para criar uma função para conectá-lo ao gateway da API.

A tela da IU para a função Lambda é mostrada abaixo. CliqueCreate function botão para prosseguir com a criação da função Lambda.

Insira o nome da função e escolha a função existente que criamos acima.

Ele pisca uma mensagem que a função com o nome lambdawithapigateway foi criado com sucesso.

Observe que aqui vamos usar nodejstempo de execução para escrever o código. O código AWS comhelloworld mensagem é como mostrado abaixo -

O código AWS Lambda está presente em index.jsArquivo. A função chamada handler tem os parâmetros a saberevents, context e callback.

A função de retorno de chamada basicamente tem o erro e a mensagem de sucesso. Observe que aqui não temos nenhum código relacionado ao erro, então null é passado e a mensagem de sucesso éHelloWorld from lambda.

Por último, salve as alterações adicionadas e vamos prosseguir para adicionar a função Lambda ao gateway da API.

Criar gateway de API

Faça login em sua conta AWS e abra o API Gateway conforme mostrado abaixo -

Clique em API Gateway e você será direcionado para a tela onde um novo API gateway pode ser criado.

Clique Create API e adicione detalhes como mostrado abaixo -

Clique no Create APIbotão no lado direito da tela. Isso exibirá a API recém-criada no lado esquerdo da tela.

Clique no Actions menu suspenso para criar um novo recurso para a API.

Agora, crie um novo recurso conforme mostrado abaixo -

Introduzir o Resource Namecomo mostrado abaixo. Você verá o nome do recurso inserido na url criada ao final. CliqueCreate Resource e você verá na tela da seguinte maneira -

Adicionar GET/POSTmétodos para o recurso criado conforme mostrado abaixo. Selecione o método deActions suspenso.

Clique no GET método para adicionar o método à API.

O próximo passo é a integração que irá integrá-lo com a função Lambda. Agora adicione a função Lambda como mostrado abaixo -

Vincular Função Lambda ao Gateway API

Selecione a função lambda criada anteriormente.

Salve as alterações e você verá uma caixa de diálogo pedindo permissão, conforme mostrado abaixo -

Clique OKpara a permissão. Estes são os detalhes de execução entre a solicitação HTTP do gateway da API e a função Lambda -

Agora, vamos implantar as mudanças no gateway de API. Para isso, precisamos selecionar oDeploy API de Actions lista suspensa conforme mostrado abaixo -

Selecione Deploy API. Ele solicitará o estado de implantação. SelecioneNew Stage na lista suspensa do estágio de implantação e adicione o nome do estágio como Production.

Clique Deploy botão e ele irá redirecioná-lo para o url conforme mostrado abaixo -

Selecione os GETmétodo do lado esquerdo para obter o url. Abra a url em uma nova guia para ver a mensagem da função Lambda.

Este é um exemplo básico de trabalho com AWS Lambda e AWS API Gateway. No exemplo acima, codificamos a mensagem na função Lambda.

Agora, vamos pegar os detalhes da mensagem do API Gateway. Caso a chamada HTTPS tenha que ser chamada de um domínio diferente, por exemplo chamada AJAX para a API, precisamos habilitar o CORS para o gateway da API criado.

Selecione o recurso criado para a API e clique em Actions dropdown -

Agora, Enable CORS irá abrir a seguinte tela -

Você pode usar alguns métodos para ATIVAR O CORS. Access-Control-Allow-Origin está marcado como *, o que significa que permitirá obter conteúdo do gateway de API de qualquer domínio.

Você também pode especificar o nome de domínio com o qual deseja trabalhar com a API. CliqueEnable CORS and replace existing CORS headers botão e exibirá a mensagem de confirmação conforme mostrado abaixo -

Clique Yes, replace existing valuesbotão para ativá-lo. oEnable CORS a tela parece conforme mostrado abaixo -

Passando dados para o gateway de API

Abra a API criada no API Gateway displayhelloworld como mostrado abaixo -

Clique Integration Request para enviar dados conforme mostrado abaixo -

Escolher Body Mapping Templates e adicione o Content-Type para este exemplo como application/json. Clique no tipo de conteúdo adicionado e adicione os detalhes da seguinte forma -

Agora, adicione o modelo no formato JSON conforme mostrado abaixo -

Observe que tomamos a mensagem como parâmetro para obter dados do API Gateway e compartilhá-los com o AWS Lambda. A sintaxe para obter os detalhes é mostrada acima.

Agora, implemente a API para disponibilizar as alterações na URL do API Gateway. Para isso, precisamos alterar a função Lambda para exibir os dados com base na URL do API Gateway. O código para a função Lambda é fornecido abaixo. Observe que estamos pegando a mensagem do evento e passando para o callback.

exports.handler = (event, context, callback) => {
   let message = event.message;
   callback(null, message);
};

Agora, salve as alterações no Lambda e acesse a URL para ver as alterações. Observe a imagem abaixo -

Clique no URL conforme mostrado abaixo -

https://rw2ek1xung.execute-api.us-east-
1.amazonaws.com/prod/hello?message=hello%20from%20api%20gateway

Observe que aqui estamos passando a mensagem como string de consulta para a url GET. Então você pode observar a saída conforme mostrado abaixo -

Ele lê os detalhes enviados para a mensagem do URL e os exibe no navegador.

Usando a função Lambda com Amazon S3

O serviço Amazon S3 é usado para armazenamento de arquivos, onde você pode carregar ou remover arquivos. Podemos acionar o AWS Lambda no S3 quando houver uploads de arquivo em buckets S3. O AWS Lambda tem uma função de manipulador que atua como um ponto inicial para a função AWS Lambda. O manipulador tem os detalhes dos eventos. Neste capítulo, vamos ver como usar o AWS S3 para acionar a função AWS Lambda quando carregamos arquivos no bucket S3.

Etapas para usar a função AWS Lambda com Amazon S3

Para começar a usar o AWS Lambda com Amazon S3, precisamos do seguinte -

  • Criar Bucket S3
  • Crie uma função que tenha permissão para trabalhar com s3 e lambda
  • Crie a função lambda e adicione s3 como o gatilho.

Exemplo

Vamos ver essas etapas com a ajuda de um exemplo que mostra a interação básica entre o Amazon S3 e o AWS Lambda.

  • O usuário fará o upload de um arquivo no bucket do Amazon S3

  • Assim que o arquivo for carregado, ele acionará a função AWS Lambda em segundo plano, que exibirá uma saída na forma de uma mensagem do console informando que o arquivo foi carregado.

  • O usuário poderá ver a mensagem nos logs do Cloudwatch assim que o arquivo for carregado.

O diagrama de blocos que explica o fluxo do exemplo é mostrado aqui -

Criando Balde S3

Vamos começar criando um bucket s3 no console AWS usando as etapas fornecidas abaixo -

Passo 1

Vá para os serviços da Amazon e clique em S3 na seção de armazenamento, conforme destacado na imagem abaixo -

Passo 2

Clique em armazenamento S3 e Create bucket que irá armazenar os arquivos carregados.

etapa 3

Depois de clicar Create bucket botão, você pode ver uma tela como a seguir -

Passo 4

Insira os detalhes Bucket name, Select the Region e clique Createbotão no lado esquerdo inferior. Assim, criamos um intervalo com o nome:workingwithlambdaands3.

Etapa 5

Agora, clique no nome do intervalo e ele solicitará que você carregue os arquivos conforme mostrado abaixo -

Portanto, concluímos a criação do bucket no S3.

Crie uma função que funcione com S3 e Lambda

Para criar uma função que funcione com S3 e Lambda, siga as etapas abaixo -

Passo 1

Vá para os serviços AWS e selecione IAM conforme mostrado abaixo -

Passo 2

Agora clique IAM -> Roles como mostrado abaixo -

etapa 3

Agora clique Create rolee escolha os serviços que usarão essa função. Selecione Lambda e clique emPermission botão.

Passo 4

Adicione a permissão abaixo e clique Review.

Etapa 5

Observe que escolhemos as seguintes permissões -

Observe que as políticas que selecionamos são AmazonS3FullAccess, AWSLambdaFullAccess e CloudWatchFullAccess.

Etapa 6

Agora, insira o nome da função, a descrição da função e clique em Create Role botão na parte inferior.

Assim, nossa função chamada lambdawiths3service é criado.

Criar função Lambda e adicionar gatilho S3

Nesta seção, vamos ver como criar uma função Lambda e adicionar um gatilho S3 a ela. Para isso, você terá que seguir as etapas abaixo -

Passo 1

Acesse AWS Services e selecione Lambda conforme mostrado abaixo -

Passo 2

Clique Lambda e siga o processo para adicionar Name. Escolha oRuntime, Roleetc. e criar a função. A função Lambda que criamos é mostrada na imagem abaixo -

etapa 3

Agora vamos adicionar o gatilho S3.

Passo 4

Escolha o acionador acima e adicione os detalhes conforme mostrado abaixo -

Etapa 5

Selecione o intervalo criado na lista suspensa de intervalos. O tipo de evento tem os seguintes detalhes -

Selecione Object Created (All), pois precisamos do acionador AWS Lambda quando o arquivo é carregado, removido, etc.

Etapa 6

Você pode adicionar prefixo e padrão de arquivo que são usados ​​para filtrar os arquivos adicionados. Por exemplo, para acionar lambda apenas para imagens .jpg. Vamos mantê-lo em branco por enquanto, pois precisamos acionar o Lambda para todos os arquivos carregados. CliqueAdd botão para adicionar o gatilho.

Etapa 7

Você pode encontrar a exibição do acionador para a função Lambda conforme mostrado abaixo -

Vamos adicionar os detalhes da função lambda do aws. Aqui, usaremos o editor online para adicionar nosso código e usar nodejs como o ambiente de execução.

Etapa 8

Para acionar o S3 com AWS Lambda, teremos que usar o evento S3 no código conforme mostrado abaixo -

exports.handler = function(event, context, callback) {
   console.log("Incoming Event: ", event);
   const bucket = event.Records[0].s3.bucket.name;
   const filename = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
   const message = `File is uploaded in - ${bucket} -> ${filename}`;
   console.log(message);
   callback(null, message);
};

Observe que o parâmetro de evento contém os detalhes do S3event. Consolamos o nome do intervalo e o nome do arquivo que serão registrados quando você fizer upload da imagem no S3bucket.

Etapa 9

Agora, vamos salvar as alterações e testar a função lambda com S3upload. A seguir estão os detalhes do código adicionados no AWS Lambda -

Etapa 10

Agora, vamos adicionar a função, memória e tempo limite.

Etapa 11

Agora, salve a função Lambda. Abra o S3 dos serviços da Amazon e abra o intervalo que criamos anteriormente, a saberworkingwithlambdaands3.

Faça upload da imagem conforme mostrado abaixo -

Etapa 12

Clique Upload botão para adicionar arquivos como mostrado -

Etapa 13

Clique Add filespara adicionar arquivos. Você também pode arrastar e soltar os arquivos. Agora cliqueUpload botão.

Portanto, carregamos uma imagem em nosso balde S3.

Etapa 14

Para ver os detalhes do gatilho, vá para o serviço AWS e selecione CloudWatch. Abra os logs da função Lambda e use o seguinte código -

exports.handler = function(event, context, callback) {
   console.log("Incoming Event: ", event);
   const bucket = event.Records[0].s3.bucket.name;
   const filename = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
   const message = `File is uploaded in - ${bucket} -> ${filename}`;
   console.log(message);
   callback(null, message);
};

A saída que você pode observar no Cloudwatch é como mostrado -

A função AWS Lambda é acionada quando o arquivo é carregado no intervalo S3 e os detalhes são registrados no Cloudwatch conforme mostrado abaixo -

Usando a função Lambda com Amazon DynamoDB

O DynamoDB pode acionar o AWS Lambda quando os dados são adicionados às tabelas, atualizados ou excluídos. Neste capítulo, trabalharemos em um exemplo simples que adicionará itens à tabela DynamoDB e AWS Lambda, que lerá os dados e enviará e-mail com os dados adicionados.

Requisitos

Para usar Amazon DB e AWS Lambda, precisamos seguir as etapas conforme mostrado abaixo -

  • Crie uma tabela no DynamoDB com chave primária

  • Crie uma função que terá permissão para trabalhar com DynamoDB e AWS Lambda.

  • Criar função no AWS Lambda

  • AWS Lambda Trigger para enviar e-mail

  • Adicionar dados no DynamoDB

Vamos discutir cada uma dessas etapas em detalhes.

Exemplo

Vamos trabalhar no exemplo a seguir, que mostra a interação básica entre o DynamoDB e o AWS Lambda. Este exemplo irá ajudá-lo a entender as seguintes operações -

  • Criando uma tabela chamada cliente na tabela Dynamodb e como inserir dados nessa tabela.

  • Acionar a função AWS Lambda assim que os dados forem inseridos e enviar e-mail usando o serviço Amazon SES.

O diagrama de blocos básico que explica o fluxo do exemplo é mostrado abaixo -

Criar tabela no DynamoDB com chave primária

Faça login no console da AWS. Vá para AWS Services e selecione DynamoDB conforme mostrado abaixo. Selecione DynamoDB.

O DynamoDB mostra as opções conforme mostrado abaixo -

Agora clique Create tablepara criar a tabela conforme mostrado. Nós nomeamos a mesa comocustomer com chave primária para essa tabela como cust_id. Clique emCreate botão para adicionar a tabela ao dynamodb.

A tabela criada é conforme mostrado abaixo -

Podemos adicionar itens à tabela criada da seguinte maneira -

Clique Items e clique Create item botão como mostrado -

Criação de função com permissões para trabalhar com DynamoDB e AWS Lambda

Para criar a função, vá para serviços da AWS e clique em IAM.

Vamos criar uma política a ser usada apenas para a tabela DynamoDB criada anteriormente -

Agora, escolha um Service. Observe que o serviço que selecionamos éDynamoDB. ParaActions nós pegamos tudo Dynamodbações, ou seja, acesso à lista, leitura e gravação. Pararesources, selecionaremos as ações do tipo de recurso da tabela. Ao clicar nele, você verá uma tela da seguinte forma -

Agora, selecione table e Add ARNa ele como mostrado. Nós conseguiremosARN detalhes de customer table criado conforme mostrado abaixo -

Entrar arn detalhes aqui -

Clique Addbotão para salvar as alterações. Uma vez feitoClick on Review policy. Insira o nome da política, descrição etc. conforme mostrado abaixo -

Clique em create policypara salvá-lo. Adicione a política à função a ser criada. SelecioneRole do lado esquerdo e insira os detalhes.

Observe que as políticas adicionadas são newpolicyfordynamdb, awslambdafullaccess, cloudwatchfullaccess e amazonsesfullaccess. Adicione a função e a usará ao criar a função do AWS Lambda.

Criar função no AWS Lambda

Assim, criamos a função Lambda chamada newlambdafordynamodb como mostrado.

Agora, vamos adicionar o gatilho DynamodDB ao AWS Lambda criado. O runtime que usaremos é Node.js.

Você pode encontrar os seguintes detalhes no acionador Dynamodb que deve ser configurado para AWS Lambda -

Agora, basta clicar Add para adicionar o gatilho ao AWS Lambda.

AWS Lambda Trigger para enviar e-mail

O AWS Lambda será acionado quando os dados forem inseridos no AWS Lambda. O parâmetro do evento terá os dados do dynamodb inseridos. Isso lerá os dados do evento e enviará um e-mail.

Enviando um email

Para enviar e-mail, você precisa seguir as etapas abaixo -

Passo 1

Vá para o serviço AWS e selecione SES (serviço de email simples). Valide o e-mail para o qual precisamos enviar um e-mail conforme mostrado -

Passo 2

Clique no botão Verify a New Email Address para adicionar o endereço de e-mail.

etapa 3

Digite um endereço de e-mail para verificá-lo. O endereço de e-mail receberá um e-mail de ativação da Amazon, que precisa ser clicado. Assim que a ativação é feita, a id do email é verificada e pode ser usada com os serviços AWS.

Passo 4

O código AWS Lambda que lê dados do evento e envia e-mail é fornecido abaixo -

var aws = require('aws-sdk');
var ses = new aws.SES({
   region: 'us-east-1'
});
exports.handler = function(event, context, callback) {
   console.log(event);
   let tabledetails = JSON.parse(JSON.stringify(event.Records[0].dynamodb));
   console.log(tabledetails.NewImage.address.S);
   let customerid = tabledetails.NewImage.cust_id.S;
   let name = tabledetails.NewImage.name.S;
   let address = tabledetails.NewImage.address.S;
	
   var eParams = {
      Destination: {
         ToAddresses: ["[email protected]"]
      },
      Message: {
         Body: {
            Text: {
               Data: "The data added is as follows:\n CustomerId:"+customerid+"\n Name:"+name+"\nAddress:"+address
            }
         },
         Subject: {
            Data: "Data Inserted in Dynamodb table customer"
         }
      },
      Source: "[email protected]"
   };
   console.log('===SENDING EMAIL===');
   var email = ses.sendEmail(eParams, function(err, data) {
      if (err) console.log(err);
      else {
         console.log("===EMAIL SENT===");
         console.log("EMAIL CODE END");
         console.log('EMAIL: ', email);
         context.succeed(event);
         callback(null, "email is send");
      }
   });
}

Agora, salve a função e os dados do Lambda na tabela do DynamoDB.

Adicionar dados no DynamoDB

Use a seguinte sequência para adicionar dados no DynamoDB.

Passo 1

Vai para a mesa customer criado em Dynamodb.

Passo 2

Clique Create item.

etapa 3

Clique Save e verifique o id de email fornecido no AWS Lambda para ver se o email foi enviado pelo AWS Lambda.

Usando a função Lambda com eventos programados

Os eventos programados devem acontecer em intervalos regulares com base em um conjunto de regras. Os eventos programados são usados ​​para executar a função Lambda após um intervalo definido nos serviços de Cloudwatch. Eles são mais usados ​​para trabalhar em cron jobs junto com o AWS Lambda. Este capítulo explicará com um exemplo simples como enviar e-mail a cada 5 minutos usando eventos programados e AWS Lambda.

Requisitos

Os requisitos para usar a função Lambda com eventos programados são os seguintes -

  • Verifique a id do e-mail usando AWS SES
  • Criar função para usar AWS SES, Cloudwatch e AWS Lambda
  • Criar função Lambda para enviar e-mail
  • Adicionar regra para eventos agendados do AWS CloudWatch

Exemplo

O exemplo que vamos considerar adicionará o evento CloudWatch à função AWS Lambda. O Cloudwatch irá acionar o AWS Lambda com base no padrão de tempo anexado a ele. Por exemplo, no exemplo abaixo, usamos 5 minutos como o gatilho. Isso significa que a cada 5 minutos, o AWS Lambda será acionado e o AWS Lambda enviará e-mail sempre que acionado.

O diagrama de blocos básico para o mesmo é mostrado abaixo -

Verifique a ID de e-mail usando AWS SES

Faça login no AWS e vá para o serviço AWS SES conforme mostrado abaixo -

Agora clique Simple Email Serviço conforme mostrado -

Clique Email Addresses no lado esquerdo como mostrado -

Ele exibe um botão Verify a New Email Address. Clique.

Entrar Email Addressvocê deseja verificar. CliqueVerify This Email Addressbotão. Você receberá um e-mail da AWS nesse id de e-mail com o assunto: Amazon Web Services - Solicitação de verificação de endereço de e-mail na região Leste dos EUA (N. Virginia)

Clique no link fornecido no e-mail para verificar o endereço de e-mail. Depois de verificado, ele exibirá o id do e-mail da seguinte forma -

Criar função para usar AWS SES, Cloudwatch e AWS Lambda

Você também pode criar uma função que conceda permissão para usar os serviços. Para isso, vá para IAM e selecione Função. Adicione as políticas necessárias e crie a função. Observe que a função criada aqui éevents with lambda.

Criar função Lambda para enviar e-mail

Você terá que seguir as etapas para criar a função Lambda usando o tempo de execução como nodejs.

Agora, adicione o gatilho ao Lambda como mostrado -

Adicionar detalhes a CloudWatch Events Trigger como mostrado abaixo -

Observe que o evento será acionado a cada 5 minutos de acordo com o acionador de regra criado.

O código Lambda para enviar um e-mail é fornecido abaixo -

var aws = require('aws-sdk');
var ses = new aws.SES({
   region: 'us-east-1'
});
exports.handler = function(event, context, callback) {
   var eParams = {
      Destination: {
         ToAddresses: ["[email protected]"]
      },
      Message: {
         Body: {
            Text: {
               Data: "this mail comes from aws lambda event scheduling"
            }
         },
         Subject: {
            Data: "Event scheduling from aws lambda"
         }
      },
      Source: "[email protected]"
   };
   console.log('===SENDING EMAIL===');
   var email = ses.sendEmail(eParams, function(err, data) {
      if (err) console.log(err);
      else {
         console.log("===EMAIL SENT===");
         console.log("EMAIL CODE END");
         console.log('EMAIL: ', email);
         context.succeed(event);
         callback(null, "email is send");
      }
   });
};

Agora, precisamos do serviço AWS SES. Você pode adicionar isso usando o código mostrado a seguir -

var aws = require('aws-sdk');
var ses = new aws.SES({
   region: 'us-east-1'
});

Para enviar e-mail de nodejs, nós criamos eParams objeto que tem detalhes como o example mail, to mail id e the body with message como segue -

var eParams = {
   Destination: {
      ToAddresses: ["[email protected]"]
   },
   Message: {
      Body: {
         Text: {
            Data: "this mail comes from aws lambda event scheduling"
         }
      },
      Subject: {
         Data: "Event scheduling from aws lambda"
      }
   },
   Source: "[email protected]"
};

O código Lambda para enviar e-mail é o seguinte -

var email = ses.sendEmail(eParams, function(err, data) {
   if (err) console.log(err);
   else {
      console.log("===EMAIL SENT===");
      console.log("EMAIL CODE END");
      console.log('EMAIL: ', email);
      context.succeed(event);
      callback(null, "email is send");
   }
});

Agora, vamos salvar esta função Lambda e verificar o id do e-mail para mensagens. A captura de tela mostrada abaixo mostra que o e-mail é enviado do AWS Lambda a cada 5 minutos.

Usando a função Lambda com Amazon SNS

Amazon SNS é um serviço usado para notificações push. Neste capítulo, explicaremos o funcionamento do AWS Lambda e do Amazon SNS com a ajuda de um exemplo em que realizaremos as seguintes ações -

  • Criar Tópico no Serviço SNS e usar AWS Lambda Adicionar Tópicos ao CloudWatch

  • Envie uma mensagem de texto SNS no número de telefone fornecido.

Requisitos

Para criar um tópico no serviço SNS e usar o AWS Lambda Adicionar tópicos ao CloudWatch, não precisamos seguir as etapas abaixo -

  • Criar Tópico no SNS
  • Criar papel para permissão no IAM
  • Criar função AWS Lambda
  • Publique no tópico para ativar o gatilho
  • Verifique os detalhes da mensagem no serviço CloudWatch.

Para enviar mensagem de texto SNS no número de telefone fornecido, precisamos fazer o seguinte -

  • Adicione o código no AWS Lambda para enviar mensagem ao seu telefone.

Exemplo

Neste exemplo, criaremos um tópico no SNS. Quando os detalhes são inseridos no tópico a ser publicado, o AWS Lambda é acionado. Os detalhes do tópico são registrados no CloudWatch e uma mensagem é enviada no telefone pelo AWS Lambda.

Aqui está um diagrama de blocos básico que explica o mesmo -

Criar Tópico no SNS

Você terá que seguir as etapas abaixo para criar o tópico no SNS -

Passo 1

Faça login no AWS Console e vá para o serviço SNS na Amazon, conforme mostrado abaixo -

Passo 2

Clique Simple Notification Serviço e Create topic iniciar.

etapa 3

Então, você tem que clicar Create new topic botão como mostrado -

Passo 4

Introduzir o Topic name e Display name e clique em Create topic. Você deve ver o nome do tópico na tela da seguinte forma -

Criar papel para permissão no IAM

Para criar uma função para trabalhar com o serviço AWS Lambda e SNS, precisamos fazer login no console da AWS. Em seguida, selecione IAM dos serviços da Amazon e clique em função do lado esquerdo, conforme mostrado abaixo.

Observe que adicionamos políticas para SNS, Lambda e CloudWatch. Adicione o nome da função e clique no botão Criar função para concluir o processo de criação da função.

Criar função AWS Lambda

Nesta seção, vamos entender como criar a função AWS Lambda usando nodejs como o tempo de execução.

Para esse propósito, faça login no console da AWS e escolha AWS Lambda nos serviços da AWS. Adicione o nome da função, detalhes da função, etc. e crie a função AWS Lambda conforme mostrado.

Adicionar SNS Trigger

Para adicionar gatilho SNS, insira os detalhes de configuração SNS como mostrado -

Então, selecione SNS topic e Add o gatilho para a função AWS Lambda conforme mostrado -

Em seguida, adicione o código lambda da AWS fornecido abaixo -

exports.handler = function(event, context, callback) {
   console.log("AWS lambda and SNS trigger ");
   console.log(event);
   const sns = event.Records[0].Sns.Message;
   console.log(sns)
   callback(null, sns);
};

No código acima, event.Records[0].Sns.Messagefornece os detalhes da mensagem adicionados. Adicionamos logs de console para vê-los no CloudWatch. Agora, salve a função Lambda com a memória necessária e alocação de tempo.

Publicar no tópico para ativar o gatilho

Lembre-se de que já criamos o tópico no SNS na Etapa 1. Agora publicaremos no tópico e veremos os detalhes no CloudWatch que será acionado pelo AWS Lambda -

Publicar no tópico

Primeiro, selecione o nome do tópico que deseja publicar. Clique emPublish to topic botão -

Introduzir o Subject e Message detalhes como mostrado abaixo -

Você também pode selecionar JSON formato de mensagem para enviar JSONestilo. CliquePublish the message botão no final da tela.

Verifique os detalhes da mensagem no serviço CloudWatch

Faça login no console do AWS e abra o serviço CloudWatch. Clique nos logs do lado esquerdo e selecione os logs para a função AWS Lambda criada. Você pode encontrar a seguinte exibição para os registros com mensagens criadas conforme mostrado acima -

Adicione o código no AWS Lambda para enviar mensagem ao seu telefone

Aqui, usaremos mensagens de texto SNS para enviar mensagem no telefone usando AWS Lambda. Você pode usar o seguinte código para atualizar o código AWS Lambda da seguinte forma -

const aws =  require("aws-sdk");
const sns = new aws.SNS({
   region:'us-east-1'
});
exports.handler = function(event, context, callback) {
   console.log("AWS lambda and SNS trigger ");
   console.log(event);
   const snsmessage = event.Records[0].Sns.Message;
   console.log(snsmessage);
   sns.publish({
      Message: snsmessage,
      PhoneNumber: '+911212121212'
   }, function (err, data) {
      if (err) {
         console.log(err);
         callback(err, null);
      } else {
         console.log(data);
         callback(null, data);
      }	
   });
};

Adicionamos o AWS SDK e o serviço SNS para usar para enviar mensagens. A mensagem do evento proveniente do SNS é enviada como mensagem de texto no número de telefone fornecido.

Observe o seguinte código, por exemplo -

sns.publish({
   Message: snsmessage,
   PhoneNumber: '+911212121212'
}, function (err, data) {
   if (err) {
      console.log(err);
      callback(err, null);
   } else {
      console.log(data);
      callback(null, data);
   }	
});

Digite o tópico agora para ver a mensagem no Cloudwatch e o número de telefone fornecido acima.

Clique Publish messagepara publicar a mensagem. Você vê uma mensagem no número de telefone fornecido da seguinte forma -

Usando a função Lambda com CloudTrail

AWS CloudTrailé um serviço disponível na Amazon, que ajuda a registrar todas as atividades realizadas dentro do console da AWS. Ele registra todas as chamadas de API e armazena o histórico, que pode ser usado posteriormente para fins de depuração. Observe que não podemos acionar Lambda a partir do CloudTrail. Em vez disso, o CloudTrail armazena todo o histórico na forma de logs no intervalo S3 e podemos acionar o AWS Lambda a partir do S3. Uma vez que todos os logs devem ser processados, o AWS Lambda será acionado sempre que algum log for adicionado ao bucket S3.

Requisitos

Antes de começar a trabalhar com AWS CloudTrail, S3 e AWS Lambda, você precisa realizar o seguinte -

  • Crie um balde S3 para armazenar logs do CloudTrail
  • Criar serviço SNS
  • Crie uma trilha no CloudTrail e atribua o bucket S3 e o serviço SNS
  • Crie um papel IAM com permissão.
  • Criar função lambda de aws
  • Configuração AWS Lambda

Exemplo

Vamos considerar um exemplo que mostra o funcionamento do AWS CloudTrail, S3 e AWS Lambda. Aqui, criaremos um bucket no S3 que armazenará todos os logs de qualquer interação feita no console AWS. Vamos criar um tópico SNS e publicá-lo. Para esta ação, os logs serão inseridos como um arquivo no S3. O AWS lambda será acionado, o que enviará e-mail usando o serviço Amazon SES.

O diagrama de blocos para explicar este processo é mostrado abaixo -

Crie um intervalo S3 para armazenar registros do CloudTrail

Vá para o console da AWS e clique em serviço S3. CliqueCreate bucket e digite o nome do intervalo que deseja armazenar logs de cloudtrail conforme mostrado -

Observe que aqui criamos um balde S3 cloudtraillogsaws para armazenar os logs.

Criar serviço SNS

Vá para o console AWS e clique em Simple notification Service. Selecione os tópicos do lado esquerdo e clique no botão Criar novo tópico.

Nós criamos um tópico chamado displaytrailpara publicar um tópico. Seus detalhes serão armazenados no S3bucket criado acima.

Crie uma trilha no Cloudtrail e atribua o bucket S3 e o serviço SNS

Vá para o console AWS e clique em CloudTrail serviço de ferramentas de gerenciamento, conforme mostrado -

Clique Trails do lado esquerdo, conforme mostrado abaixo -

Clique Create Trailbotão. Introduzir oTrail name, Apply trail to all regions e escolher Yes. Então assim os logs serão aplicados para toda a região.

Para Read/Write events, escolha All. Adicione oS3 bucket e SNS topicdetalhes como mostrado abaixo. Você pode criar um novo aqui ou adicionar um existente.

Observe que existem opções disponíveis para encrypt log files, enable log file validation, send sns notification for every log file deliveryetc. Eu usei os valores padrão aqui. Você pode permitir a criptografia de arquivo e ele solicitará a chave de criptografia. Clique no botão Criar trilha assim que os detalhes forem adicionados.

Criar função IAM com permissão

Vá para o console da AWS e selecione IAM. Crie uma função com permissão para S3, Lambda, CloudTrail e SES para envio de e-mail. A função criada é conforme mostrado abaixo -

Criar função AWS Lambda

Vá para o serviço AWS e clique em Lambdaserviço. Adicione o nome da função, selecione o tempo de execução comonodejse selecione a função criada para a função lambda. A seguir está a função lambda criada.

Configuração AWS Lambda

Em seguida, precisamos adicionar S3 como o gatilho para o AWS lambda criado.

Adicione os detalhes do intervalo S3 para adicionar o gatilho e adicione o seguinte código AWS Lambda -

const aws =  require("aws-sdk");
const sns = new aws.SNS({
region:'us-east-1'
});
var ses = new aws.SES({
   region: 'us-east-1'
});
exports.handler = function(event, context, callback) {
   console.log("AWS lambda and SNS trigger ");
   console.log(event);
   const s3message = "Bucket Name:"+event.Records[0].s3.bucket.name+"\nLog details:"+event.Records[0].s3.object.key;
   console.log(s3message);
   var eParams = {
      Destination: {
         ToAddresses: ["[email protected]"]
      },
      Message: {
         Body: {
            Text: {
               Data:s3message
            }
         },
         Subject: {
            Data: "cloudtrail logs"
         }
      },
      Source: "[email protected]"
   };
   var email = ses.sendEmail(eParams, function(err, data) {
      if (err) console.log(err);
      else {
         console.log("===EMAIL SENT===");
         console.log("EMAIL CODE END");
         console.log('EMAIL: ', email);
         context.succeed(event);
         callback(null, "email is send");
      }
   });
};

Observe que estamos pegando o bucket S3 e os detalhes do log do evento e enviando e-mail usando o serviço SES, conforme mostrado acima.

Sempre que qualquer atividade ocorre no console AWS, os logs serão enviados para o bucket S3 e, ao mesmo tempo, o lambda AWS será acionado e o e-mail será enviado para o id de e-mail mencionado no código.

Observe que você pode processar os logs de acordo com suas necessidades no AWS Lambda.

Usando a função Lambda com Amazon Kinesis

AWS Kinesisserviço é usado para capturar / armazenar dados de rastreamento em tempo real provenientes de cliques em sites, logs, feeds de mídia social. Podemos acionar o AWS Lambda para realizar processamento adicional nesses logs.

Requisitos

Os requisitos básicos para começar a usar Kinesis e AWS Lambda são mostrados -

  • Criar função com as permissões necessárias
  • Crie fluxo de dados no Kinesis
  • Crie a função AWS Lambda.
  • Adicionar código ao AWS Lambda
  • Adicionar dados ao fluxo de dados Kinesis

Exemplo

Vamos trabalhar em um exemplo em que acionaremos o AWS Lambda para processar o fluxo de dados do Kinesis e enviaremos e-mail com os dados recebidos.

Um diagrama de blocos simples para explicar o processo é mostrado abaixo -

Criar função com as permissões necessárias

Vá para o console da AWS e crie uma função.

Criar fluxo de dados no Kinesis

Vá para o console da AWS e crie o fluxo de dados no kinesis.

Existem 4 opções conforme mostrado. Vamos trabalhar em Criar fluxo de dados neste exemplo.

Clique Create data stream. Insira o nome no stream Kinesis fornecido abaixo.

Insira o número de fragmentos para o fluxo de dados.

Os detalhes dos fragmentos são mostrados abaixo -

Digite o nome e clique no Create Kinesis stream botão na parte inferior.

Observe que leva certo tempo para que o stream fique ativo.

Criar função AWS Lambda

Vá para o console da AWS e clique em Lambda. Crie a função AWS Lambda conforme mostrado -

Clique Create functionbotão no final da tela. Adicione Kinesis como o gatilho para AWS Lambda.

Adicione detalhes de configuração ao gatilho Kinesis -

Adicione o gatilho e agora adicione o código ao AWS Lambda.

Adicionando código ao AWS Lambda

Para este propósito, usaremos nodejs como o tempo de execução. Enviaremos e-mail assim que o AWS Lambda for acionado com o fluxo de dados kinesis.

const aws =  require("aws-sdk");
var ses = new aws.SES({
   region: 'us-east-1'
});
exports.handler = function(event, context, callback) {
   let payload = "";
   event.Records.forEach(function(record) {
      // Kinesis data is base64 encoded so decode here
      payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
      console.log('Decoded payload:', payload);
   });
   var eParams = {
      Destination: {
         ToAddresses: ["[email protected]"]
      },
      Message: {
         Body: {
            Text: {
               Data:payload
            }
         },
         Subject: {
            Data: "Kinesis data stream"
         }
      },
      Source: "[email protected]"
   };    
   var email = ses.sendEmail(eParams, function(err, data) {
      if (err) console.log(err);
      else {
         console.log("===EMAIL SENT===");
         console.log("EMAIL CODE END");
         console.log('EMAIL: ', email);
         context.succeed(event);
         callback(null, "email is send");
      }
   });
};

O parâmetro do evento possui os dados inseridos no fluxo de dados do kinesis. O código aws lambda acima será ativado assim que os dados forem inseridos no fluxo de dados do kinesis.

Adicionar dados ao fluxo de dados Kinesis

Aqui, usaremos o AWS CLI para adicionar fluxo de dados de cinesia de dados conforme mostrado abaixo. Para este propósito, podemos usar o seguinte comando -

aws kinesis put-record --stream-name kinesisdemo  --data "hello world" --
partition-key "789675"

Em seguida, o AWS Lambda é ativado e o e-mail é enviado.

Usando a função Lambda com aplicativos de usuário personalizados

Podemos usar a função lambda da AWS para processar usando eventos gerados pelo aplicativo do usuário das duas maneiras a seguir -

  • Usando o Console AWS
  • Usando AWS CLI

Usando o Console AWS

No console da AWS, trabalharemos com eventos e AWS Lambda. Para isso, vá para o console da AWS e crie uma função lambda.

A seguir, vamos adicionar o código para AWS Lambda -

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log("Hello => "+ event.name);
   console.log("Address =>"+ event.addr);
   callback(null, 'Hello '+event.name +" and address is "+ event.addr);
};

Observe que no código acima, estamos imprimindo nome e endereço usando evento.

Os detalhes do evento serão fornecidos usando o evento de teste criado da seguinte forma -

Agora, salve o evento e teste-o.

A saída de log correspondente é mostrada aqui -

Usando AWS CLI

Podemos invocar a função acima usando AWS CLI da seguinte maneira -

aws lambda invoke --function-name "lambdauserevent" --log-type Tail --
payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt

Os detalhes do evento são fornecidos para a carga útil e a saída é armazenada em C:\clioutput\outputfile.txt. como segue -

input.txt

{"name":"Roy Singh", "addr":"Mumbai"}

Ao invocar o Lambda usando AWS CLI, você pode ver que a saída é a seguinte -

Da mesma forma, caso queira testar o AWS Lambda para qualquer outro serviço da AWS, você pode fazer isso usando o evento de teste no console da AWS e AWS CLI. Um exemplo de evento para o serviço SNS é mostrado abaixo -

{
   "Records": [{
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arnid",
      "EventSource": "aws:sns",
      "Sns": {
         "SignatureVersion": "1",
         "Timestamp": "1970-01-01T00:00:00.000Z",
         "Signature": "EXAMPLE",
         "SigningCertUrl": "EXAMPLE",
         "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
         "Message": "Hello from SNS!",
         "MessageAttributes": {
            "Test": {
               "Type": "String",
               "Value": "TestString"
            },
            "TestBinary": {
               "Type": "Binary",
               "Value": "TestBinary"
            }
         },
         "Type": "Notification",
         "UnsubscribeUrl": "EXAMPLE",
         "TopicArn": "topicarn",
         "Subject": "TestInvoke"
      }
   }]
}

Vamos adicionar o evento de amostra mostrado acima e testá-lo conforme mostrado -

No AWS Lambda, o código imprimirá a mensagem SNS conforme mostrado no exemplo abaixo -

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log(event.Records[0].Sns.Message);
   callback(null, event.Records[0].Sns.Message);};

Vamos invocar o mesmo usando AWS CLI. Vamos salvar o evento em um arquivo e usá-lo para carga usando o comando mostrado -

aws lambda invoke --function-name "lambdauserevent" --log-type Tail --
payload file://C:\clioutput\sns.txt C:\clioutput\snsoutput.txt

Usando AWS Lambda @ Edge com CloudFront

Lambda @ Edge é uma adição ao serviço de computação AWS Lambda, que é usado para personalizar o conteúdo que o cloudfront oferece.

O diagrama de blocos que mostra o funcionamento do AWS Lambda com o cloudfront da AWS é mostrado abaixo -

Existem quatro maneiras em que o AWS Lambda pode ser usado -

  • Viewer Request − O usuário final faz a solicitação chamada Viewer Request para o CloudFront

  • Origin Request − CloudFront encaminha a solicitação para a origem

  • Origin Response − CloudFront recebe a resposta da origem

  • Viewer Response − CloudFront envia a resposta ao visualizador

Podemos usar Lambda @ Edge para os seguintes fins -

  • Para alterar os cabeçalhos na solicitação e tempo de resposta.

  • Adicione os detalhes dos cookies aos cabeçalhos. Faça o teste AB com base na solicitação e na resposta.

  • Redirecione o URL para outro site, com base nos detalhes do cabeçalho.

  • Podemos buscar o user-agent nos cabeçalhos e descobrir os detalhes do navegador, sistema operacional, etc.

Requisitos

Para começar a trabalhar no CloudFront e Lambda @ Edge, precisamos do seguinte -

  • Crie um intervalo de armazenamento S3 com detalhes do arquivo

  • Crie uma função que permitirá a permissão para trabalhar com CloudFront e Lambda @ Edge

  • Criar distribuição do CloudFront

  • Criar função lambda

  • Adicionar detalhes da função lambda ao cloudfront

  • Verifique o url do Cloudfront no navegador

Vamos trabalhar em um exemplo com o CloudFront e Lambda @ Egde, em que hospedaremos a página e alteraremos a resposta quando detectados como desktop e dispositivos.

Criar balde de armazenamento S3 com detalhes de arquivo

Faça login no console AWS, crie um bucket no S3 e adicione o . html arquivo que você deseja exibir.

Clique em S3 e Create bucket como mostrado abaixo -

Agora clique Create bucket botão e adicione os detalhes do balde conforme mostrado abaixo -

Clique em Create botão e carregue o .html nele.

Criar papel

Vá para o console AWS e clique em IAM.

Agora clique Roles -> Create role botão como mostrado -

Escolha a permissão para S3, Lambda e Cloudfront. É uma boa prática criar a política que conceda permissão apenas para a função necessária, armazenamento, usando os detalhes do ARN.

No exemplo discutido abaixo, estamos mostrando o Full Accesspermissão. Políticas para o nome da funçãorole for cloudfronté adicionado conforme mostrado acima. Clique em Criar função.

Todas as políticas exigidas para lambda @ edge e cloudfront são mostradas acima. Há uma etapa adicional a ser realizada aqui, pois no caso do cloudfront a url estará disponível em toda a região e é necessária uma relação de confiança entre os serviços que estamos utilizando.

Agora, para a função criada, clique em Trust relationships guia como mostrado -

Clique em Edit Trust Relationship como mostrado abaixo -

Ele exibe um documento de política. Precisamos adicionar os outros serviços noPrincipal -> Serviceque estamos planejando usar. O documento final da política de relacionamento de confiança é mostrado abaixo -

Clique Update Trust Policy botão para salvar as alterações.

Criar distribuição do CloudFront

Vá para o serviço CloudFront conforme mostrado abaixo -

Clique no serviço CloudFront e clique em Create Distribution -

Configurações de origem, configurações de comportamento e configurações de distribuição

Vejamos essas configurações uma por uma -

Origin Settings

Vários parâmetros de configurações de origem são explicados como abaixo -

Origin Domain Name −Este é o nome do bucket S3 onde armazenamos os arquivos html. Também podemos armazenar imagens, se houver, no balde S3 criando pastas de nossa escolha.

Origin Path −Aqui você precisa inserir o nome da pasta onde os arquivos estão armazenados. No momento, não temos essa pasta, portanto, a deixaremos em branco por enquanto.

Origin ID −Ele é preenchido quando o nome do domínio de origem é selecionado. Você pode alterar o id de acordo com sua escolha.

Restrict Bucket Access − Neste, vamos escolher a opção yes. Aqui, precisamos de segurança para o bucket S3 para que ninguém tenha acesso ao bucket S3. Para esta opção, existem mais algumas opções preenchidas comoOrigin Access Identity, Comment and Grant Read Permission on Bucket.

Origin Access Identity −Usamos criar uma nova opção de identidade. Você também pode escolher a identidade existente. Isso cria uma nova identidade que é usada pelo CloudFront para ler os detalhes do bucket S3.

Grand Read Permission on Bucket − Para isso, escolha a opção Yes.

Origin Custom Headers − Manteremos os cabeçalhos em branco aqui, pois não precisamos dos detalhes agora.

A seguir, vamos discutir e preencher o Behaviour Settings para distribuição do Cloudront -

Agora, selecione o protocolo - https ou http, e a opção de cache. Observe que o armazenamento em cache padrão é 86400 ou 24 horas. Você pode alterar esse valor de acordo com o requisito.

Clique Object Caching(opção de personalização) para alterar o cache. Você pode usarsmooth streamingno caso de haver algum vídeo em sua página. Aqui, estamos mantendo a opção padrão disponível. Depois que a função lambda for criada, seus detalhes serão adicionados.

Os detalhes das configurações de distribuição são mostrados abaixo -

Vários parâmetros de configurações de distribuição são explicados abaixo -

Price class −Possui detalhes como a origem do tráfego de usuários. Observe que aqui nós selecionamos o padrão -Use All Edge Locations.

AWS WAF Web ACL −Isso é para seleção de firewall de aplicativo da web. Aqui, tem a opção deNone. Primeiro, precisamos criar o firewall no AWS. Ele fornece segurança ao site.

Alternate Domain Names − Aqui você pode especificar o nome do domínio, se tiver.

SSL Certificate −Este contém todos os detalhes a serem selecionados para o certificado SSL. Manteremos os padrões.

Default Root Object −Aqui iremos especificar o nome do arquivo que carregamos no S3. Para isso, precisamos que o conteúdo do .html seja exibido por padrão.

Para o resto, vamos manter a configuração padrão.

Clique Create Distribution botão para adicionar a distribuição.

Observe que a distribuição levará algum tempo para mostrar o status como implantado.

Criar função AWS Lambda

Vá para o console AWS e crie a função Lambda.

No código AWS Lambda, pegaremos os cabeçalhos de solicitação e verificaremos o agente do usuário. Se o agente do usuário for do desktop, mudaremos a resposta para exibir a mensagem como“DESKTOP : Welcome to AWS Lambda with Cloudfront!” e se for dispositivo, a mensagem será“MOBILE DEVICES : Hello from Lambda@Edge!”

O código AWS Lambda correspondente é mostrado abaixo -

let content = `
<\!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="utf-8">
      <title>Simple Lambda@Edge Static Content Response</title>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
   </head>
   
   <body>
      <h1>MOBILE DEVICES : Hello from Lambda@Edge!</h1>
   </body>
</html>
`;
let content1 = `
<\!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="utf-8">
      <title>Simple Lambda@Edge Static Content Response</title>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
   </head>
   
   <body>
      <h1>DESKTOP : Welcome to AWS Lambda with Cloudfront!</h1>
   </body>
</html>
`;
exports.handler = (event, context, callback) => {
   let request = event.Records[0].cf.request;
   let finalrequest = JSON.stringify(request);
   let headers = request.headers;
   let useragent = JSON.stringify(headers["user-agent"][0].value);
   let str = "";
   if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i.test(useragent)) {
      str = content;
   } else {
      str = content1;
   }
   const response = {
      status: '200',
      statusDescription: 'OK',        
      body: str+useragent,
   };
   callback(null, response);
};

Agora, salve a função Lambda. Observe que precisamos publicar a função Lambda para que ela possa ser usada com todas as regiões. Para publicar, precisamos fazer o seguinte -

No menu suspenso Ações, selecione Publish new version como mostrado abaixo -

Se você, clique Publish new version, ele exibe a seguinte tela -

Agora, insira a descrição da versão e clique em Publish. O ARN exibirá a versão da função AWS Lambda criada conforme mostrado abaixo -

Adicione o gatilho do CloudFront para a nova versão criada conforme mostrado abaixo -

Agora, adicione os detalhes de configuração do CloudFront. O evento do CloudFront tem opção paraViewer request, Origin request, Origin response, e Viewer response.

Em seguida, escolha a distribuição do CloudFront criada anteriormente. Deevents, vamos selecionar Viewer request. Com base na solicitação do visualizador, a área de trabalho / dispositivo do agente do usuário será decidida e a resposta será alterada. Em seguida, adicione os detalhes do acionador.

Depois que o gatilho é adicionado, precisamos aguardar a distribuição do CloudFront para ser implantado.

Assim que o status for alterado para Deployed, podemos testar o url do CloudFront e verificar o nome de domínio no navegador.

A exibição no navegador de desktop é mostrada abaixo. Aqui imprimimos o user-agent do evento viewer-request.

Esta é a exibição no dispositivo móvel.

Portanto, no exemplo acima, usamos Lambda @ Edge para alterar a resposta no desktop e no dispositivo móvel.

Monitoramento e solução de problemas usando Cloudwatch

As funções criadas no AWS Lambda são monitoradas pelo Amazon CloudWatch. Ajuda a registrar todas as solicitações feitas à função Lambda quando ela é acionada.

Considere que o seguinte código é carregado no AWS Lambda com o nome da função como lambda and cloudwatch.

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log("Lambda monitoring using amazon cloudwatch");    
   callback(null, 'Hello from Lambda');
};

Quando a função é testada ou acionada, você deve ver uma entrada no Cloudwatch. Para isso, vá para os serviços da AWS e clique em CloudWatch.

Selecione os registros do lado esquerdo.

Quando você clica Logs, tem o Log Groupsda função AWS Lambda criada em sua conta. Selecione qualquer função do AWS Lambda e verifique os detalhes. Aqui, estamos nos referindo à função Lambda com nome:lambdaandcloudwatch. Os logs adicionados à função Lambda são exibidos aqui conforme mostrado abaixo -

Agora, vamos adicionar o gatilho S3 à função Lambda e ver os detalhes dos logs no CloudWatch conforme mostrado abaixo -

Vamos atualizar o código AWS Lambda para exibir o arquivo carregado e o nome do intervalo, conforme mostrado no código fornecido abaixo -

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log("Lambda monitoring using amazon cloudwatch");
   const bucket = event.Records[0].s3.bucket.name;
   const filename = event.Records[0].s3.object.key;
   const message = `File is uploaded in - ${bucket} -> ${filename}`;
   console.log(message);
   callback(null, 'Hello from Lambda');
};

Agora, adicione o arquivo em s3storetestlambdaEventbucket como mostrado -

Quando o arquivo é carregado, as funções do AWS Lambda serão acionadas e as mensagens de log do console do código do Lambda serão exibidas no CloudWatch conforme mostrado abaixo -

Se houver algum erro, o CloudWatch fornece os detalhes do erro conforme mostrado abaixo -

Observe que nos referimos ao nome do intervalo incorretamente no código AWS Lambda, conforme mostrado -

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log("Lambda monitoring using amazon cloudwatch");
   const bucket = event.Records[0].bucket.name;
   const filename = event.Records[0].s3.object.key;
   const message = `File is uploaded in - ${bucket} -> ${filename}`;
   console.log(message);
   callback(null, 'Hello from Lambda');
};

A referência do nome do intervalo do evento está errada. Assim, devemos ver um erro exibido no CloudWatch conforme mostrado abaixo -

CloudWatch Metrics

Os detalhes da execução da função Lambda podem ser vistos nas métricas. CliqueMetrics exibido no lado esquerdo.

Os detalhes do gráfico para a função lambda lambdaandcloudwatch são como mostrados abaixo -

Fornece detalhes como a duração da execução da função Lambda, o número de vezes que ela é chamada e os erros da função Lambda.

AWS Lambda - Exemplo Adicional

Até agora, vimos o trabalho do AWS Lambda com serviços da AWS. Com base nesse conhecimento, vamos criar um formulário de registro de usuário simples e postar os dados usando o gateway de API para o AWS Lambda. O AWS Lambda obterá os dados do evento ou do gatilho do gateway da API e adicionará esses detalhes à tabela do DynamoDB.

Exemplo

Vamos considerar um exemplo e executar as seguintes funcionalidades nele -

  • Criar tabela DynamoDB

  • Criar formulário para registro do usuário

  • Crie AWS Lambda e gateway de API para enviar mensagem ao telefone usando o serviço AWS SNS

  • Crie AWS Lambda e gateway de API para dados de formulário POST e insira na tabela DynamoDb

  • Crie AWS Lambda e gateway de API para ler dados da tabela Dynamodb

  • Trabalho final do formulário de registro do usuário

Criar tabela DynamoDB

Os dados inseridos serão armazenados na tabela DynamodDB. Usaremos o gateway de API para compartilhar dados inseridos com o AWS Lambda e, posteriormente, o AWS Lambda adicionará os detalhes no DynamoDB.

Você pode usar os seguintes detalhes para criar uma tabela DynamodDB no console AWS. Primeiro, vá para Serviço AWS e clique emDynamoDB. CliqueTable para criar a tabela conforme mostrado abaixo -

Você pode usar o ARN para criar uma política para o DynamoDB a ser usado com o AWS Lambda.

Vá para IAM e selecione Policies. CliqueCreate policy, escolha o serviço como DynamodDB conforme mostrado abaixo -

Clique All DynamoDBações conforme mostrado acima. Escolha o recurso e insira o ARN para a tabela conforme mostrado abaixo -

Agora clique Add como mostrado abaixo.

Se você clicar Review policy botão no final da tela, você pode ver a seguinte janela -

Digite o nome da política e clique em Create policybotão no final da página. Agora, precisamos criar uma função a ser usada com Lambda. Precisamos de permissões paraDynamoDB, APIGateway e Lambda.

Acesse os serviços da AWS e selecione IAM. Selecione Funções do lado esquerdo e adicione as funções necessárias.

Insira o nome da função e clique em Create role. A função criada éroleforlambdaexample.

Criar formulário para registro do usuário

Aqui está a tela do formulário de registro do usuário para inserir e ler os dados da tabela dynamodb.

Crie AWS Lambda e API Gateway para enviar mensagem OTP ao telefone usando o serviço SNS

Se você vir o formulário de registro do usuário, há um botão validate phone. O usuário deve inserir o número de telefone e clicar emvalidate phone botão para validar o número de telefone.

Para este propósito -

Quando um usuário clica neste botão, o método post do gateway de API que contém os detalhes do telefone é chamado e internamente o AWS Lambda é acionado.

Em seguida, o AWS Lambda envia o OTP para o número de telefone inserido usando o serviço AWS SNS.

O usuário recebe o OTP e deve inserir este número do OTP.

A caixa de texto para inserir OTP aparecerá quando o número de telefone for inserido e validate phone botão é clicado.

O OTP recebido do AWS Lambda e o OTP inserido pelo usuário devem corresponder, para permitir que o usuário envie o formulário de registro do usuário.

Um diagrama de blocos simples que explica o funcionamento da validação do telefone é mostrado aqui -

A função AWS Lambda criada é mostrada aqui -

O código AWS Lambda correspondente é fornecido abaixo -

const aws =  require("aws-sdk");
const sns = new aws.SNS({
   region:'us-east-1'
});
exports.handler = function(event, context, callback) {
   let phoneno = event.mphone;
   let otp = Math.floor(100000 + Math.random() * 900000);
   let snsmessage = "Your otp is : "+otp;
   sns.publish({
      Message: snsmessage,
      PhoneNumber: "+91"+phoneno
   }, function (err, data) {
      if (err) {
         console.log(err);
         callback(err, null);
      } else {
         console.log(data);
         callback(null, otp);
      }	
   });
};

Observe que estamos usando o serviço SNS para enviar o código OTP. Este código é usado para validar o número do celular inserido pelo usuário no formulário de registro do usuário. O gateway de API criado para a validação do telefone acima é o seguinte -

A função Lambda dada é phonevalidationexample. Estamos pegando os detalhes do celular aqui para serem usados ​​dentro do AWS Lambda. Em seguida, o AWS Lambda enviará o código OTP para o número de celular fornecido.

Crie AWS Lambda e API Gateway para POST Form Data e insira na tabela DynamoDB

Para cadastro de usuários, todos os campos são obrigatórios. Há uma chamada AJAX feita em que os dados inseridos no formulário são postados na URL do gateway de API.

Um diagrama de blocos simples que explica o funcionamento do botão de envio é mostrado aqui -

Assim que o formulário for preenchido, o botão de envio chamará o gateway de API que acionará o AWS Lambda. O AWS Lambda obterá os detalhes do formulário do evento ou do gateway da API e os dados serão inseridos na tabela DynamodDB.

Vamos entender a criação do API Gateway e AWS Lambda.

Primeiro, vá para os serviços da AWS e clique em Lambda. A função Lambda criada é mostrada aqui -

Agora, para criar um gateway de API, vá para o serviço AWS e selecione API Gateway. Clique emCreate API botão mostrado abaixo.

Introduzir o API name e clique em Create API botão para adicionar a API.

Agora, uma API é criada chamada como registeruser. Selecione a API e clique emActions lista suspensa para criar Resource.

Clique Create Resource. Agora, vamos adicionar oPOSTmétodo. Para isso, clique nos recursos criados à esquerda e a partir deActions seleção suspensa create method. Isso exibirá o menu suspenso conforme mostrado abaixo -

Selecione o método POST e adicione a função Lambda que criamos acima.

Clique Savebotão para adicionar o método. Para enviar os detalhes do formulário para a função Lambdalambdaexample precisamos adicionar o Integration Request como mostrado abaixo -

Para postar os detalhes do formulário, você terá que clicar Integration Request. Ele exibirá os detalhes abaixo.

Clique Body Mapping Templates para adicionar os campos do formulário a serem postados.

Em seguida clique Add mapping templatee insira o tipo de conteúdo. Aqui, nós adicionamosapplication/jsoncomo o tipo de conteúdo. Clique nele e aqui você precisa inserir o campo no formato json conforme mostrado abaixo -

Agora, clique no Save botão e implantar a API conforme mostrado abaixo -

Aqui está a API criada para POST que será usada em nosso arquivo .html. Observe que precisamos ativar o CORS para o recurso criado. Irá usar a url do gateway api para fazer uma chamada ajax para que o CORS tenha que ser ativado.

Selecione os Métodos nos quais deseja ativar o CORS. Clique emEnable CORS and replace existing CORS headers.

Ele exibe a tela de confirmação da seguinte forma -

Clique Yes, replace existing values para habilitar o CORS.

O código AWS Lambda para POST API Gateway é mostrado aqui -

const aws =  require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient({
   region:'us-east-1'
});
exports.handler = function(event, context, callback) {
   console.log(event);
   console.log("Entering Data");
   var data = {
      TableName : "registeruser",
      Item : {
         first_name:event.fname,
         last_name:event.lname,
         emailid:event.emailid,	  
         mobile_no : event.mphone,
         otp:event.otp,
         username:event.uname,
         password:event.passwd,
         confirm_password:event.cpasswd
      }
   }
   docClient.put(data, function(err, value) {
      if (err) {
         console.log("Error");
         callback(err, null);
      } else {
         console.log("data added successfully");
         callback(null, value);
      }
   });
}

O parâmetro de evento no manipulador AWS Lambda terá todos os detalhes que são adicionados anteriormente na solicitação de integração POST. Os detalhes do evento são adicionados à tabela DynamodDB conforme mostrado no código.

Agora, precisamos obter os detalhes do serviço do AWS-SDK conforme mostrado abaixo -

const aws =  require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient({
   region:'us-east-1'
});
var data = {
   TableName : "registeruser",
   Item : {
      first_name:event.fname,
      last_name:event.lname,	
      emailid:event.emailid,
      mobile_no : event.mphone,
      otp:event.otp,
      username:event.uname,
      password:event.passwd,
      confirm_password:event.cpasswd
   }
}
docClient.put(data, function(err, value) {
   if (err) {
		console.log("Error");
      callback(err, null);
   } else {
      console.log("data added successfully");
      callback(null, value);
   }
});

Crie AWS Lambda e API Gateway para ler dados da tabela DynamodDB

Agora, criaremos a função AWS Lambda para ler dados da tabela DynamoDB. Iremos acionar o APIGateway para a função AWS Lambda, que enviará dados para o formulário html.

A função AWS Lambda criada é conforme mostrado abaixo -

O código AWS Lambda correspondente é o seguinte -

const aws =  require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient({
   region:'us-east-1'
});
exports.handler = function(event, context, callback) {
   var readdata = {
      TableName : "registeruser",
      Limit : 10
   }
   docClient.scan(readdata, function(err, data) {
      if (err) {
         console.log("Error");
         callback(err, null);
      } else {
         console.log("Data is " + data);
         callback(null, data);
      }
   });
}

Aqui, os dados são lidos da tabela do DynamoDB e fornecidos para o callback. Agora, vamos criar o APIGateway e adicionar a função AWS Lambda como o gatilho.

Adicionaremos o método get à API criada anteriormente.

A função lambda adicionada é lambdareaddataexample. CliqueSave para salvar o método e implantar a API.

Trabalho final do formulário de registro do usuário

A exibição final do formulário é mostrada abaixo -

Agora, insira os detalhes conforme mostrado acima. Observe que o botão enviar está desabilitado. Ele será ativado somente quando todos os detalhes forem inseridos conforme mostrado -

Agora, digite o número do celular e clique validate phonebotão. Ele exibirá a mensagem de alerta dizendo“OTP is send to the mobile, please enter the OTP to continue”. OTP enviado para o número do celular é o seguinte -

Insira o OTP e os detalhes restantes e envie o formulário.

Os dados no DynamoDB registeruser tabela após o envio é como mostrado aqui -

Os detalhes do código são fornecidos abaixo -

Example1.html

<html>
   <head>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <script type="text/javascript" src="formdet.js"></script>
      <style>
         input[type=text], input[type=password],button {
            width: 100%;
            padding: 5px 5px;
            margin: 5px 0;
            box-sizing: border-box;
         }
         #maincontainer {
            width: 80%;
            margin: auto;
            padding: 10px;
         }
         div#userregistration {
            width: 60%;
            float: left;
         }
         div#userdisplay {
            margin-left: 60%;   
         }
      </style>
   </head>
   
   <body>
      <div id="maincontainer">
         <div id="userregistration">
            <h1>User Registration Form</h1>
            <table border="0">
               <tr>
                  <td><b>First Name<span style="color:red;">*</span> : </b></td>
                  <td><input type="text" value="" name="fname" id="fname" /></td>
                  <td id="tdfname" style="display:none;"><span style="color:red;">Enter First Name</span></td>
               </tr>
               <tr>
                  <td><b>Last Name<span style="color:red;">*</span> : </b></td>
                  <td><input type="text" value="" name="lname" id="lname" /></td>
                  <td id="tdlname" style="display:none;"><span style="color:red;">Enter Last Name</span></td>
               </tr>
               <tr>
                  <td><b>Email Id<span style="color:red;">*</span> : </b></td>
                  <td><input type="text" value="" name="emailid" id="emailid" /></td>
                  <td id="tdemailid" style="display:none;"><span style="color:red;">Enter Email</span></td>
               </tr>
               <tr>
                  <td><b>Mobile No<span style="color:red;">*</span> : </b></td>
                  <td><input type="text" name="mphone" id="mphone"/></td>
                  <td id="tdmphone" style="display:none;"><span style="color:red;">Enter Mobile Number</span></td>
               </tr>   
               <tr>
                  <td></td>
                  <td><button id="validatephone">validate phone</button></td>	 
                  <td></td>
               </tr>
               <tr id="otpdiv" style="display:none;">
                  <td><b>Enter OTP<span style="color:red;">*</span>:</b></td>
                  <td><input type="text" value="" name="otp" id="otp" /></td>
                  <td id="tdotp" style="display:none;"><span style="color:red;">Enter OTP</span></td>
               </tr>
               <tr>
                  <td><b>Username<span style="color:red;">*</span>: </b></td>
                  <td><input type="text" value="" name="uname" id="uname"/></td>
                  <td id="tduname" style="display:none;"><span style="color:red;">Enter Username</span></td>
               </tr>
                  <tr><td><b>Password<span style="color:red;">*</span> :</b></td>
                  <td><input type="password" value="" name="passwd" id="passwd"/></td>
                  <td id="tdpasswd" style="display:none;"><span style="color:red;">Enter Password</span></td>
               </tr>
                  <tr><td><b>Confirm Password<span style="color:red;">*</span> :</b></td>
                  <td><input type="password" value="" name="cpasswd" id="cpasswd"/></td>
                  <td id="tdcpasswd" style="display:none;"><span style="color:red;">Enter Confirm Password</span></td>
               </tr>
               <tr>
                  <td></td>
                  <td><button name="submit" id="submit" style="display:;" disabled="true">Submit</button></td>
                  <td></td>
               </tr>
            </table>
         </div>
         
         <div id="userdisplay">
            <h1>User Display</h1>
            <table id="displaydetails" style="display:block;width:80%;padding:5px;margin:5px; border: 1px solid black;">
               <tr>
                  <td></td>
                  <td>FirstName</td>
                  <td>LastName</td>
                  <td>Mobile No</td>
                  <td>EmailID</td>
               </tr>
            </table>
         </div>
      </div>
   </body>
</html>

formdet.js

function validateform() {
   var sError="";
   if ($("#fname").val() === "") { $("#tdfname").css("display","");
      sError++;
   }
   if ($("#lname").val() === "") { $("#tdlname").css("display","");
      sError++;
   }
   if ($("#emailid").val() === "") { $("#tdemailid").css("display","");
      sError++;
   }
   if ($("#mphone").val() === "") { $("#tdmphone").css("display","");
      sError++;
   }
   if ($("#otp").val() === "") { $("#tdotp").css("display","");
      sError++;
   }
   if ($("#uname").val() === "") { $("#tduname").css("display","");
      sError++;
   }
   if ($("#passwd").val() === "") { $("#tdpasswd").css("display","");
      sError++;
   }
   if ($("#cpasswd").val() === "") { $("#tdcpasswd").css("display","");
      sError++;
   }
   if (sError === "") {
      return true;
   } else {
      return false;
   }
}
$("#fname").change(function() { if ($("#fname").val() !== "") {
      $("#tdfname").css("display","none"); } else { $("#tdfname").css("display","");			
   }
});
$("#lname").change(function() { if ($("#lname").val() !== "") {
      $("#tdlname").css("display","none"); } else { $("#tdlname").css("display","");			
   }
});
$("#emailid").change(function() { if ($("#emailid").val() !== "") {
      $("#tdemailid").css("display","none"); } else { $("#tdemailid").css("display","");			
   }
});
$("#mphone").change(function() { if ($("#mphone").val() !== "") {
      $("#tdmphone").css("display","none"); } else { $("#tdmphone").css("display","");			
   }
});
$("#otp").change(function() { if ($("#otp").val() !== "") {
      $("#tdotp").css("display","none"); } else { $("#tdotp").css("display","");			
   }
});
$("#uname").change(function() { if ($("#uname").val() !== "") {
      $("#tduname").css("display","none"); } else { $("#tduname").css("display","");			
   }
});
$("#passwd").change(function() { if ($("#passwd").val() !== "") {
      $("#tdpasswd").css("display","none"); } else { $("#tdpasswd").css("display","");			
   }
});
$("#cpasswd").change(function() { if ($("#cpasswd").val() !== "") {
      $("#tdcpasswd").css("display","none"); } else { $("#tdcpasswd").css("display","");			
   }
});

var posturl = "https://4rvwimysc1.execute-api.us-east-1.amazonaws.com/prod/adduser";
var phonevalidationurl = "https://wnvt01y6nc.execute-api.us-east-1.amazonaws.com/prod/validate";
var otpsend = "";
function getdata() {
   var a = 0;
   $.ajax({ type:'GET', url:posturl, success: function(data) { $("#displaydetails").html('');
         $("#displaydetails").css("display", ""); console.log(data); $("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:gray;"><td>Name</td><td>Mobile No</td><td>EmailID</td></tr>');
         data.Items.forEach(function(registeruser) {
            var clr = (a%2 === 0) ? "#eee": "white";
            a++;
            $("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:'+clr+'"><td>'+registeruser.first_name+'-'+registeruser.last_name+'</td><td>'+registeruser.mobile_no+'</td><td>'+registeruser.emailid+'</td></tr>'); }); }, error: function(err) { console.log(err); } }); } $(document).ready(function() {
   $("#otp").on("change", function() { var otpentered = $("#otp").val();
      if (otpsend == otpentered) {
         document.getElementById("submit").disabled = false;
      } else {
         alert("OTP is not valid.Please enter the valid one or validate phone again to continue!");
         document.getElementById("submit").disabled = true;
      }
   });
   $("#validatephone").on("click", function() { $.ajax({
         type:'POST',
         url:phonevalidationurl,
         data:JSON.stringify({
            "mphone":$("#mphone").val() }), success: function(data) { $("#otpdiv").css("display", "");
            alert("OTP is send to the mobile, please enter to continue");
            console.log(data);
            otpsend = data;
         },
         error : function(err) {
            $("#otpdiv").css("display", "none"); alert("Invalid mobile no."); } }); }); $("#submit").on("click", function() {
      if (validateform()) {
         $.ajax({ type:'POST', url:posturl, data:JSON.stringify({ "fname": $("#fname").val(),
               "lname": $("#lname").val(), "emailid":$("#emailid").val(),
               "mphone":$("#mphone").val(), "otp":$("#otp").val(),
               "uname":$("#uname").val(), "passwd":$("#passwd").val(),
               "cpasswd":$("#cpasswd").val()
            }),
            success: function(data) {
               alert("Data added successfully");
               console.log(data);
               getdata();
            }
         });
      }
   });
   getdata();
});

Até agora, fizemos uma chamada AJAX para a API criada e postamos os dados conforme mostrado acima.

A chamada AJAX para adicionar os dados à tabela é a seguinte -

var posturl = "https://4rvwimysc1.execute-api.us-east-1.amazonaws.com/prod/adduser";
$(document).ready(function() {
   $("#submit").on("click", function() { if (validateform()) { $.ajax({
            type:'POST',
            url:posturl,
            data:JSON.stringify({
               "fname": $("#fname").val(), "lname": $("#lname").val(),
               "emailid":$("#emailid").val(), "mphone":$("#mphone").val(),
               "otp":$("#otp").val(), "uname":$("#uname").val(),
               "passwd":$("#passwd").val(), "cpasswd":$("#cpasswd").val()
            }),
            success: function(data) {
               alert("Data added successfully");
               console.log(data);
               getdata();
            }
         });
      }
   });
});

Observe que para ler os dados, uma função é chamada, cujo código é fornecido a seguir -

function getdata() {
   var a = 0;
   $.ajax({ type:'GET', url:posturl, success: function(data) { $("#displaydetails").html('');
         $("#displaydetails").css("display", ""); console.log(data); $("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:gray;"><td>Name</td><td>Mobile No</td><td>EmailID</td></tr>');
         data.Items.forEach(function(registeruser) {
            var clr = (a%2 === 0) ? "#eee": "white";
            a++;
            $("#displaydetails").append('<tr style="padding:5px;margin:5px;background-color:'+clr+'"><td>'+registeruser.first_name+'-'+registeruser.last_name+'</td><td>'+registeruser.mobile_no+'</td><td>'+registeruser.emailid+'</td></tr>');
         });
      },
      error: function(err) {
         console.log(err);
      }
   });
}

Quando você clica no botão de validação do número do celular, o código a seguir é chamado e envia o número do celular -

var phonevalidationurl = "https://wnvt01y6nc.execute-api.us-east-1.amazonaws.com/prod/validate";
var otpsend = "";
$("#validatephone").on("click", function() {
   $.ajax({ type:'POST', url:phonevalidationurl, data:JSON.stringify({ "mphone":$("#mphone").val()					
      }),
      success: function(data) {
         $("#otpdiv").css("display", ""); alert("OTP is send to the mobile, please enter the OTP to continue"); console.log(data); otpsend = data; }, error : function(err) { $("#otpdiv").css("display", "none");
         alert("Invalid mobile no.");
      }
   });
});

// Validate otp
$("#otp").on("change", function() { var otpentered = $("#otp").val();
   if (otpsend == otpentered) {
      document.getElementById("submit").disabled = false;
   } else {
      alert("OTP is not valid.Please enter the valid one or validate phone again to continue!");
      document.getElementById("submit").disabled = true;
   }
}