Tutorial: Uso do Lambda com API Gateway - AWS Lambda

Tutorial: Uso do Lambda com API Gateway

Neste tutorial, você criará uma API REST que será usada para invocar uma função do Lambda usando uma solicitação HTTP. A função do Lambda executará operações de criação, leitura, atualização e exclusão (CRUD) em uma tabela do DynamoDB. Essa função será fornecida aqui para fins de demonstração, mas você aprenderá a configurar uma API REST do API Gateway que pode invocar qualquer função do Lambda.

Serviços e recursos usados neste tutorial.

O uso do API Gateway fornece aos usuários um endpoint HTTP seguro para invocar a função do Lambda e pode ajudar a gerenciar grandes volumes de chamadas para a função, ao realizar o controle de utilização do tráfego e validar e autorizar as chamadas de API automaticamente. O API Gateway também oferece controles de segurança flexíveis usando o AWS Identity and Access Management (IAM) e o Amazon Cognito. Isso é útil para casos de uso em que é necessária uma autorização prévia para as chamadas em sua aplicação.

Para concluir este tutorial, você passará pelos estágios a seguir:

  1. Criação e configuração de uma função do Lambda em Python ou em Node.js para a execução de operações em uma tabela do DynamoDB.

  2. Criação de uma API REST no API Gateway para conexão com a função do Lambda.

  3. Criação de uma tabela do DynamoDB e realização de teste com a função do Lambda no console.

  4. Implantação da API e realização de teste da configuração completa usando curl em um terminal.

Ao concluir esses estágios, você aprenderá a usar o API Gateway para criar um endpoint HTTP que pode invocar uma função do Lambda com segurança em qualquer escala. Você também aprenderá como implantar a API e testá-la no console, além de como enviar uma solicitação HTTP usando um terminal.

Pré-requisitos

Se você ainda não tem Conta da AWS, siga as etapas a seguir para criar uma.

Para se cadastrar em uma Conta da AWS
  1. Abra https://portal.aws.amazon.com/billing/signup.

  2. Siga as instruções on-line.

    Parte do procedimento de inscrição envolve receber uma chamada telefônica e digitar um código de verificação no teclado do telefone.

    Quando você se cadastra em uma Conta da AWS, um Usuário raiz da conta da AWS é criado. O usuário-raiz tem acesso a todos os Serviços da AWS e recursos na conta. Como uma prática recomendada de segurança, atribua o acesso administrativo para um usuário e use somente o usuário-raiz para executar tarefas que requerem o acesso de usuário-raiz.

A AWS envia um e-mail de confirmação depois que o processo de cadastramento é concluído. A qualquer momento, é possível visualizar as atividades da conta atual e gerenciar sua conta acessando https://aws.amazon.com/ e selecionando Minha conta.

Depois de se cadastrar em uma Conta da AWS, proteja seu Usuário raiz da conta da AWS, habilite o AWS IAM Identity Center e crie um usuário administrativo para não usar o usuário raiz em tarefas cotidianas.

Proteger seu Usuário raiz da conta da AWS
  1. Faça login no AWS Management Console como o proprietário da conta ao escolher a opção Usuário raiz e inserir o endereço de e-mail da Conta da AWS. Na próxima página, digite sua senha.

    Para obter ajuda ao fazer login usando o usuário-raiz, consulte Signing in as the root user (Fazer login como usuário-raiz) no Guia do usuário do Início de Sessão da AWS.

  2. Habilite a autenticação multifator (MFA) para o usuário-raiz.

    Para obter instruções, consulte Habilitar um dispositivo MFA virtual para o usuário-raiz de sua conta da Conta da AWS (console) no Guia do usuário do IAM.

Criar um usuário com acesso administrativo
  1. Habilitar o IAM Identity Center.

    Para obter instruções, consulte Habilitar AWS IAM Identity Center no Guia do usuário do AWS IAM Identity Center.

  2. No Centro de Identidade do IAM, conceda o acesso administrativo para um usuário.

    Para obter um tutorial sobre como usar o Diretório do Centro de Identidade do IAM como fonte de identidade, consulte Configurar o acesso dos usuários com o Diretório do Centro de Identidade do IAM padrão no Guia do usuário do AWS IAM Identity Center.

Iniciar sessão como o usuário com acesso administrativo
  • Para fazer login com seu usuário do Centro de Identidade do IAM, use a URL de login que foi enviada ao seu endereço de e-mail quando você criou o usuário do Centro do Usuário do IAM.

    Para obter ajuda com o login utilizando um usuário do Centro de Identidade do IAM, consulte Fazer login no portal de acesso da AWS, no Guia do usuário do Início de Sessão da AWS.

Atribuir acesso para usuários adicionais
  1. No Centro de Identidade do IAM, crie um conjunto de permissões que siga as práticas recomendadas de aplicação de permissões com privilégio mínimo.

    Para obter instruções, consulte Create a permission set no Guia do usuário do AWS IAM Identity Center.

  2. Atribua usuários a um grupo e, em seguida, atribua o acesso de autenticação única ao grupo.

    Para obter instruções, consulte Add groups no Guia do usuário do AWS IAM Identity Center.

Se você ainda não instalou a AWS Command Line Interface, siga as etapas em Instalar ou atualizar a versão mais recente da AWS CLI para instalá-la.

O tutorial requer um terminal de linha de comando ou um shell para executar os comandos. No Linux e no macOS, use o gerenciador de pacotes e de shell de sua preferência.

nota

No Windows, alguns comandos da CLI do Bash que você costuma usar com o Lambda (como zip) não são compatíveis com os terminais integrados do sistema operacional. Para obter uma versão do Ubuntu com o Bash integrada no Windows, instale o Subsistema do Windows para Linux.

Criação de uma política de permissões

Etapa 1: criação de uma política de permissões

Antes de ser possível criar uma função de execução para a função do Lambda, primeiro é necessário criar uma política de permissões para fornecer à sua função permissão para acessar os recursos da AWS necessários. Para este tutorial, a política permitirá que o Lambda execute operações de CRUD em uma tabela do DynamoDB e grave no Amazon CloudWatch Logs.

Para criar a política
  1. Abra a página Policies (Políticas) do console do IAM.

  2. Escolha Criar política.

  3. Escolha a guia JSON e cole a política personalizada a seguir no editor JSON.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1428341300017", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Effect": "Allow", "Resource": "*" }, { "Sid": "", "Resource": "*", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow" } ] }
  4. Escolha Próximo: etiquetas.

  5. Selecione Next: Review (Próximo: revisar).

  6. No campo Política de revisão, em Nome da política, insira lambda-apigateway-policy.

  7. Escolha Criar política.

Criar uma função de execução

Etapa 2: criação de um perfil de execução

Um perfil de execução é um perfil do AWS Identity and Access Management (IAM) que concede a uma função do Lambda permissão para acessar serviços e recursos da AWS. Para permitir que a função execute operações em uma tabela do DynamoDB, vincule a política de permissões criada na etapa anterior.

Para criar um perfil de execução e vincular a política de permissões personalizada
  1. Abra a página Roles (Funções) no console do IAM.

  2. Selecione Criar função.

  3. Para o tipo de entidade confiável, escolha Serviço da AWS e, em seguida, para o caso de uso, selecione Lambda.

  4. Escolha Próximo.

  5. Na caixa de pesquisa de política, insira lambda-apigateway-policy.

  6. Nos resultados da pesquisa, selecione a política que você criou (lambda-apigateway-policy) e, depois, escolha Next (Avançar).

  7. Em Role details (Detalhes do perfil), para Role name (Nome do perfil), insira lambda-apigateway-role e, em seguida, escolha Create role (Criar perfil).

Posteriormente no tutorial, você precisará do nome do recurso da Amazon (ARN) do perfil que acabou de criar. Na página Roles (Perfis) do console do IAM, escolha o nome do seu perfil (lambda-apigateway-role) e copie o Role ARN (ARN do perfil) exibido na página Summary (Resumo).

Criar a função

Etapa 3: criação da função

O exemplo de código a seguir recebe uma entrada de evento do API Gateway especificando uma operação a ser executada na tabela do DynamoDB que você criará e alguns dados de carga útil. Se os parâmetros recebidos pela função forem válidos, ela executará a operação solicitada na tabela.

Node.js
exemplo index.mjs
console.log('Loading function'); import { DynamoDBDocumentClient, PutCommand, GetCommand, UpdateCommand, DeleteCommand} from "@aws-sdk/lib-dynamodb"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; const ddbClient = new DynamoDBClient({ region: "us-west-2" }); const ddbDocClient = DynamoDBDocumentClient.from(ddbClient); // Define the name of the DDB table to perform the CRUD operations on const tablename = "lambda-apigateway"; /** * Provide an event that contains the following keys: * * - operation: one of 'create,' 'read,' 'update,' 'delete,' or 'echo' * - payload: a JSON object containing the parameters for the table item * to perform the operation on */ export const handler = async (event, context) => { const operation = event.operation; if (operation == 'echo'){ return(event.payload); } else { event.payload.TableName = tablename; switch (operation) { case 'create': await ddbDocClient.send(new PutCommand(event.payload)); break; case 'read': var table_item = await ddbDocClient.send(new GetCommand(event.payload)); console.log(table_item); break; case 'update': await ddbDocClient.send(new UpdateCommand(event.payload)); break; case 'delete': await ddbDocClient.send(new DeleteCommand(event.payload)); break; default: return ('Unknown operation: ${operation}'); } } };
nota

Neste exemplo, o nome da tabela do DynamoDB está definido como uma variável em seu código da função. Em uma aplicação real, a prática recomendada é transferir esse parâmetro como uma variável de ambiente e evitar codificar o nome da tabela. Para obter mais informações, consulte Usar variáveis de ambiente do AWS Lambda.

Para criar a função
  1. Salve o exemplo de código como um arquivo denominado index.mjs e, se necessário, edite a região da AWS especificada no código. A região especificada no código deve ser semelhante à região que você criará a tabela do DynamoDB, posteriormente, no tutorial.

  2. Crie um pacote de implantação usando o comando zip a seguir.

    zip function.zip index.mjs
  3. Crie uma função do Lambda com o comando create-function da AWS CLI. Para o parâmetro role, insira o nome do recurso da Amazon (ARN) do perfil de execução que você copiou anteriormente.

    aws lambda create-function \ --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip \ --handler index.handler \ --runtime nodejs20.x \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role
Python 3
exemplo LambdaFunctionOverHttps.py
import boto3 import json # define the DynamoDB table that Lambda will connect to tableName = "lambda-apigateway" # create the DynamoDB resource dynamo = boto3.resource('dynamodb').Table(tableName) print('Loading function') def lambda_handler(event, context): '''Provide an event that contains the following keys: - operation: one of the operations in the operations dict below - payload: a JSON object containing parameters to pass to the operation being performed ''' # define the functions used to perform the CRUD operations def ddb_create(x): dynamo.put_item(**x) def ddb_read(x): dynamo.get_item(**x) def ddb_update(x): dynamo.update_item(**x) def ddb_delete(x): dynamo.delete_item(**x) def echo(x): return x operation = event['operation'] operations = { 'create': ddb_create, 'read': ddb_read, 'update': ddb_update, 'delete': ddb_delete, 'echo': echo, } if operation in operations: return operations[operation](event.get('payload')) else: raise ValueError('Unrecognized operation "{}"'.format(operation))
nota

Neste exemplo, o nome da tabela do DynamoDB está definido como uma variável em seu código da função. Em uma aplicação real, a prática recomendada é transferir esse parâmetro como uma variável de ambiente e evitar codificar o nome da tabela. Para obter mais informações, consulte Usar variáveis de ambiente do AWS Lambda.

Para criar a função
  1. Salve o exemplo de código como um arquivo denominado LambdaFunctionOverHttps.py.

  2. Crie um pacote de implantação usando o comando zip a seguir.

    zip function.zip LambdaFunctionOverHttps.py
  3. Crie uma função do Lambda com o comando create-function da AWS CLI. Para o parâmetro role, insira o nome do recurso da Amazon (ARN) da função de execução que você copiou anteriormente.

    aws lambda create-function \ --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip \ --handler LambdaFunctionOverHttps.lambda_handler \ --runtime python3.12 \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role

Invocação da função usando a AWS CLI

Etapa 4: invocação da função usando a AWS CLI

Antes de integrar a função com o API Gateway, confirme se a implantação da função ocorreu com êxito. Crie um evento de teste contendo os parâmetros que a API do API Gateway enviará para o Lambda e use o comando invoke da AWS CLI para executar a função.

Para invocar a função do Lambda com a AWS CLI
  1. Salve o JSON a seguir como um arquivo denominado input.txt.

    { "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" } }
  2. Execute o comando invoke a seguir da AWS CLI.

    aws lambda invoke \ --function-name LambdaFunctionOverHttps \ --payload file://input.txt outputfile.txt \ --cli-binary-format raw-in-base64-out

    A opção cli-binary-format será necessária se você estiver usando a AWS CLI versão 2. Para que essa seja a configuração padrão, execute aws configure set cli-binary-format raw-in-base64-out. Para obter mais informações, consulte A AWS CLI comporta opções de linha de comando globais no Guia do usuário da AWS Command Line Interface versão 2.

    Você deverá ver a seguinte resposta:

    { "StatusCode": 200, "ExecutedVersion": "LATEST" }
  3. Confirme se a função executou a operação echo especificada no evento de teste JSON. Inspecione o arquivo outputfile.txt e verifique se ele contém o seguinte:

    {"somekey1": "somevalue1", "somekey2": "somevalue2"}

Criar uma API REST usando o API Gateway

Etapa 5: criação da API

Nesta etapa, você cria a API REST do API Gateway que usará para invocar a função do Lambda.

Para criar a API
  1. Abra o console do API Gateway.

  2. Selecione Create API (Criar API).

  3. Na caixa do API REST, escolha Construir.

  4. Em Detalhes da API, deixe a opção Nova API selecionada e, em Nome da API, insiraDynamoDBOperations.

  5. Selecione Criar API.

Criação de um recurso na API REST

Etapa 6: criação do recurso da API

Para adicionar um método HTTP à API, primeiro é necessário criar um recurso no qual esse método possa operar. Aqui você cria o recurso para gerenciar a tabela do DynamoDB.

Para criar o recurso
  1. No Console do API Gateway, na página Recursos da sua API, escolha Criar recurso.

  2. Em Detalhes do recurso, em Nome do recurso, insira DynamoDBManager.

  3. Escolha Create Resource (Criar recurso).

Criação de um método HTTP POST

Etapa 7: criação do método HTTP POST

Nesta etapa, você cria um método (POST) para o recurso DynamoDBManager. Você vincula esse método POST à função do Lambda para que, quando o método receber uma solicitação HTTP, o API Gateway invoque sua função do Lambda.

nota

Para a finalidade deste tutorial, um método HTTP (POST) será usado para invocar uma única função do Lambda que executa todas as operações em sua tabela do DynamoDB. Em uma aplicação real, a prática recomendada é usar diferentes funções do Lambda e métodos HTTP para cada operação. Para obter mais informações, consulte The Lambda monolith no Serverless Land.

Para criar o método POST
  1. Na página Recursos da API, certifique-se de que o recurso /DynamoDBManager esteja realçado. Em seguida, no painel Métodos, escolha Criar método.

  2. Em Tipo de método, escolha POST.

  3. Em Tipo de integração, mantenha a opção Função do Lambda selecionada.

  4. Em Função do Lambda, escolha o nome do recurso da Amazon (ARN) para sua função (LambdaFunctionOverHttps).

  5. Escolha Criar método.

Criar uma tabela do DynamoDB

Etapa 8: criação de uma tabela do DynamoDB

Crie uma tabela do DynamoDB em branco na qual a função do Lambda executará as operações de CRUD.

Para criar uma tabela do DynamoDB
  1. Abra a página Tables (Tabelas) no console do DynamoDB.

  2. Escolha Create table.

  3. Em Detalhes da tabela, faça o seguinte:

    1. Em Table name (Nome da tabela), insira lambda-apigateway.

    2. Para a Chave de partição, insira id e mantenha o tipo de dados definido como String.

  4. Em Table settings (Configurações da tabela), mantenha Default settings (Configurações padrões).

  5. Escolha Create table.

Teste da integração do API Gateway, do Lambda e do DynamoDB

Etapa 9: teste da integração do API Gateway, do Lambda e do DynamoDB

Agora está tudo pronto para que ocorra o teste da integração do método de API do API Gateway com a função do Lambda e a tabela do DynamoDB. Ao usar o console do API Gateway, você envia solicitações diretamente para o método POST usando a função de teste do console. Nesta etapa, primeiro você usa uma operação create para adicionar um novo item à tabela do DynamoDB e, em seguida, usa uma operação update para modificar o item.

Teste 1: para criar um novo item na tabela do DynamoDB
  1. No API Gateway console (Console do API Gateway), escolha a sua API (DynamoDBOperations).

  2. No recurso DynamoDBManager, escolha o método POST.

    No recurso DynamoDBManager, escolha o método POST.
  3. Selecione a guia Testar. Talvez seja necessário selecionar o botão de seta para a direita para mostrar a guia.

  4. Em Método de teste, mantenha as opções Strings de consulta e Cabeçalhos vazias. Em Corpo da solicitação, cole o seguinte JSON:

    { "operation": "create", "payload": { "Item": { "id": "1234ABCD", "number": 5 } } }
  5. Escolha Testar.

    Os resultados que são exibidos quando o teste é concluído devem mostrar status 200. Esse código de status indica que a operação create ocorreu com êxito.

    Para confirmar, verifique se a tabela do DynamoDB passou a conter o novo item.

  6. Abra a página Tables (Tabelas) do console do DynamoDB e escolha a tabela lambda-apigateway.

  7. Escolha Explore table items (Explorar itens da tabela). No painel Itens retornados, você verá um item com o id 1234ABCD e o número 5.

Teste 2: para atualizar o item na tabela do DynamoDB
  1. No Console do API Gateway, retorne para a guia Teste do seu método POST.

  2. Em Método de teste, mantenha as opções Strings de consulta e Cabeçalhos vazias. Em Corpo da solicitação, cole o seguinte JSON:

    { "operation": "update", "payload": { "Key": { "id": "1234ABCD" }, "AttributeUpdates": { "number": { "Value": 10 } } } }
  3. Escolha Testar.

    Os resultados que são exibidos quando o teste é concluído devem mostrar status 200. Esse código de status indica que a operação update ocorreu com êxito.

    Para confirmar, verifique se o item na tabela do DynamoDB foi modificado.

  4. Abra a página Tables (Tabelas) do console do DynamoDB e escolha a tabela lambda-apigateway.

  5. Escolha Explore table items (Explorar itens da tabela). No painel Itens retornados, você verá um item com o id 1234ABCD e o número 10.

Implantar a API

Etapa 10: implantação da API

Para que um cliente chame a API, você deve criar uma implantação e um estágio associado. Um estágio representa um snapshot da API, incluindo seus métodos e integrações.

Para implantar a API
  1. Abra a página APIs do API Gateway console (Console do API Gateway) e escolha a API DynamoDBOperations.

  2. Na página Recursos da sua API, escolha Implantar API.

  3. Em Estágio, escolha *Novo estágio* e, em seguida, em Nome do estágio, insira test.

  4. Escolha Implantar.

  5. No painel Detalhes do estágio copie o URL de invocação. Você usará isso na próxima etapa para invocar a função usando uma solicitação HTTP.

Uso de curl para invocar a função usando solicitações HTTP

Etapa 11: invocação da função com uma solicitação HTTP

Agora é possível invocar a função do Lambda ao emitir uma solicitação HTTP para a API. Nesta etapa, você criará um novo item na tabela do DynamoDB e o excluirá.

Para invocar a função do Lambda usando curl
  1. Execute o comando curl usando o URL de invocação que você copiou na etapa anterior. Quando você usa curl com a opção -d (dados), o método HTTP POST é usado automaticamente.

    curl https://l8togsqxd8.execute-api.us-west-2.amazonaws.com/test/DynamoDBManager \ -d '{"operation": "create", "payload": {"Item": {"id": "5678EFGH", "number": 15}}}'
  2. Para verificar se a operação de criação ocorreu com êxito, faça o seguinte:

    1. Abra a página Tables (Tabelas) do console do DynamoDB e escolha a tabela lambda-apigateway.

    2. Escolha Explore table items (Explorar itens da tabela). No painel Itens retornados, você verá um item com o id 5678EFGH e o número 15.

  3. Execute o comando curl a seguir para excluir o item que você acabou de criar. Use seu próprio URL de invocação.

    curl https://l8togsqxd8.execute-api.us-west-2.amazonaws.com/test/DynamoDBManager \ -d '{"operation": "delete", "payload": {"Key": {"id": "5678EFGH"}}}'
  4. Confirme se a operação de exclusão ocorreu com êxito. No painel Items returned (Itens retornados) da página Explore items (Explorar itens) do console do DynamoDB, verifique se o item com o id 5678EFGH não está mais na tabela.

Limpeza dos recursos (opcional)

Agora você pode excluir os recursos criados para este tutorial, a menos que queira mantê-los. Excluindo os recursos da AWS que você não está mais usando, você evita cobranças desnecessárias em sua Conta da AWS.

Como excluir a função do Lambda
  1. Abra a página Functions (Funções) no console do Lambda.

  2. Selecione a função que você criou.

  3. Escolha Ações, Excluir.

  4. Digite delete no campo de entrada de texto e escolha Delete (Excluir).

Para excluir a função de execução
  1. Abra a página Roles (Funções) no console do IAM.

  2. Selecione a função de execução que você criou.

  3. Escolha Excluir.

  4. Insira o nome do perfil no campo de entrada de texto e escolha Delete (Excluir).

Para excluir a API
  1. Abra a página APIs do console do API Gateway.

  2. Selecione a API que você criou.

  3. Escolha Ações, Excluir.

  4. Escolha Excluir.

Para excluir uma tabela do DynamoDB
  1. Abra a página Tables (Tabelas) no console do DynamoDB.

  2. Selecione a tabela que você criou.

  3. Escolha Excluir.

  4. Digite delete na caixa de texto.

  5. Selecione Delete table (Excluir tabela).