AWS Lambda
Guia do desenvolvedor

Tutorial – Publicando um tempo de execução personalizado

Neste tutorial, você criará uma função do Lambda com um tempo de execução personalizado. Você começa incluindo o tempo de execução no pacote de implantação da função. Em seguida, você o migra para uma camada gerenciada de forma independente da função. Por fim, você compartilha a camada de tempo de execução com o mundo atualizando sua política de permissões com base em recursos.

Pré-requisitos

Este tutorial pressupõe que você tenha algum conhecimento das operações básicas do Lambda e do console do Lambda. Caso ainda não tenha feito isso, siga as instruções em Conceitos básicos do AWS Lambda para criar sua primeira função do Lambda.

Para seguir os procedimentos neste manual, você precisa de um terminal de linha de comando ou de um shell para executar os comandos. Nas listagens, os comandos são mostrados precedidos por um símbolo de prompt ($) e pelo nome do diretório atual, quando apropriado:

~/lambda-project$ this is a command this is output

Para comandos longos, um caractere de escape (\) é usado para dividir um comando em várias linhas.

No Linux e no macOS, use seu gerenciador preferido de pacotes e de shell. No Windows 10, você pode instalar o Subsistema Windows para Linux para obter uma versão do Ubuntu integrada com o Windows e o Bash.

Você precisa de uma função do IAM para criar uma função do Lambda. A função precisa de permissão para enviar logs ao CloudWatch Logs e acessar os serviços da AWS que a função usa. Se você não tem uma função para o desenvolvimento da função, crie uma agora.

Para criar uma função de execução

  1. Abra a página Roles no console do IAM.

  2. Selecione Create role.

  3. Crie uma função com as seguintes propriedades.

    • Trusted entity (Entidade confiável)Lambda.

    • Permissions (Permissões)AWSLambdaBasicExecutionRole.

    • Nome da funçãolambda-role.

    A política AWSLambdaBasicExecutionRole tem as permissões necessárias para a função gravar logs no CloudWatch Logs.

Criar uma função

Criar uma função do Lambda com um tempo de execução personalizado. Este exemplo inclui dois arquivos, um arquivo bootstrap de tempo de execução e um manipulador de funções. Ambos são implementados em Bash.

O tempo de execução carrega um script de função do pacote de implantação. Ele usa duas variáveis para localizar o script. LAMBDA_TASK_ROOT informa onde o pacote foi extraído e _HANDLER inclui o nome do script.

exemplo bootstrap

#!/bin/sh set -euo pipefail # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Execute the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done

Depois de carregar o script, o tempo de execução processa eventos em um loop. Ele usa a API de tempo de execução para recuperar um evento de invocação do Lambda, transmite o evento para o manipulador e publica a resposta de volta no Lambda. Para obter o ID de solicitação, o tempo de execução salva os cabeçalhos na resposta da API em um arquivo temporário e lê o cabeçalho Lambda-Runtime-Aws-Request-Id do arquivo.

nota

Os tempo de execução têm responsabilidades adicionais, incluindo o processamento de erros e o fornecimento de informações de contexto para o manipulador. Para obter mais detalhes, consulte Criando um tempo de execução personalizado.

O script define uma função do manipulador que usa dados de eventos, os registra no stderr e os retorna.

exemplo function.sh

function handler () { EVENT_DATA=$1 echo "$EVENT_DATA" 1>&2; RESPONSE="Echoing request: '$EVENT_DATA'" echo $RESPONSE }

Salve os arquivos em um diretório do projeto denominado runtime-tutorial.

runtime-tutorial ├ bootstrap └ function.sh

Torne os arquivos executáveis e os adicione a um arquivo ZIP.

runtime-tutorial$ chmod 755 function.sh bootstrap runtime-tutorial$ zip function.zip function.sh bootstrap adding: function.sh (deflated 24%) adding: bootstrap (deflated 39%)

Crie uma função chamada bash-runtime.

runtime-tutorial$ aws lambda create-function --function-name bash-runtime \ --zip-file fileb://function.zip --handler function.handler --runtime provided \ --role arn:aws:iam::123456789012:role/lambda-role { "FunctionName": "bash-runtime", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:bash-runtime", "Runtime": "provided", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSize": 831, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2018-11-28T06:57:31.095+0000", "CodeSha256": "mv/xRv84LPCxdpcbKvmwuuFzwo7sLwUO1VxcUv3wKlM=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "2e1d51b0-6144-4763-8e5c-7d5672a01713" }

Invoque a função e verifique a resposta.

runtime-tutorial$ aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt { "StatusCode": 200, "ExecutedVersion": "$LATEST" } runtime-tutorial$ cat response.txt Echoing request: '{"text":"Hello"}'

Criar uma layer

Para separar o código do tempo de execução do código da função, crie uma camada que contenha apenas o tempo de execução. As camadas permitem que você desenvolva dependências da sua função de forma independente e podem reduzir o uso de armazenamento quando você usa a mesma camada com várias funções.

Crie um arquivo de camada que contenha o arquivo bootstrap.

runtime-tutorial$ zip runtime.zip bootstrap adding: bootstrap (deflated 39%)

Crie uma camada com o comando publish-layer-version.

runtime-tutorial$ aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip { "Content": { "Location": "https://awslambda-us-west-2-layers.s3.us-west-2.amazonaws.com/snapshots/123456789012/bash-runtime-018c209b...", "CodeSha256": "bXVLhHi+D3H1QbDARUVPrDwlC7bssPxySQqt1QZqusE=", "CodeSize": 584, "UncompressedCodeSize": 0 }, "LayerArn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime", "LayerVersionArn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:1", "Description": "", "CreatedDate": "2018-11-28T07:49:14.476+0000", "Version": 1 }

Isso cria a primeira versão da camada.

Atualizar a função

Para usar a camada de tempo de execução com a função, configure a função para usar a camada e remova o código de tempo de execução da função.

Atualize a configuração de função para extrair na camada.

runtime-tutorial$ aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:1 { "FunctionName": "bash-runtime", "Layers": [ { "Arn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:1", "CodeSize": 584, "UncompressedCodeSize": 679 } ] ... }

Isso adiciona o tempo de execução à função no diretório /opt. O Lambda usa esse tempo de execução, mas somente se você o remover do pacote de implantação da função. Atualize o código da função para incluir apenas o script do manipulador.

runtime-tutorial$ zip function-only.zip function.sh adding: function.sh (deflated 24%) runtime-tutorial$ aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip { "FunctionName": "bash-runtime", "CodeSize": 270, "Layers": [ { "Arn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:7", "CodeSize": 584, "UncompressedCodeSize": 679 } ] ... }

Invoque a função para verificar se ela funciona com a camada de tempo de execução.

runtime-tutorial$ aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt { "StatusCode": 200, "ExecutedVersion": "$LATEST" } runtime-tutorial$ cat response.txt Echoing request: '{"text":"Hello"}'

Atualizar o tempo de execução

Para registrar informações sobre o ambiente de execução, atualize o script de tempo de execução para gerar variáveis de ambiente.

exemplo bootstrap

#!/bin/sh set -euo pipefail echo "## Environment variables:" env # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" ...

Crie uma segunda versão da camada com o novo código.

runtime-tutorial$ zip runtime.zip bootstrap updating: bootstrap (deflated 39%) runtime-tutorial$ aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip

Configure a função para usar a nova versão da camada.

runtime-tutorial$ aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:2

Compartilhar a camada

Adicione uma instrução de permissão à sua camada de tempo de execução para compartilhá-la com outras contas.

runtime-tutorial$ aws lambda add-layer-version-permission --layer-name bash-runtime --version-number 2 \ --principal "*" --statement-id publish --action lambda:GetLayerVersion { "Statement": "{\"Sid\":\"publish\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"lambda:GetLayerVersion\",\"Resource\":\"arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:2\"}", "RevisionId": "9d5fe08e-2a1e-4981-b783-37ab551247ff" }

Você pode adicionar várias instruções que concedam cada uma permissão a uma única conta, contas em uma organização ou todas as contas.

Limpeza

Exclua cada versão da camada.

runtime-tutorial$ aws lambda delete-layer-version --layer-name bash-runtime --version-number 1 runtime-tutorial$ aws lambda delete-layer-version --layer-name bash-runtime --version-number 2

Como a função contém uma referência à versão 2 da camada, ela ainda existe no Lambda. A função continua a funcionar, mas as funções não podem mais ser configuradas para usar a versão excluída. Se você modificar a lista de camadas na função, deverá especificar uma nova versão ou omitir a camada excluída.

Exclua a função do tutorial com o comando delete-function.

runtime-tutorial$ aws lambda delete-function --function-name bash-runtime