Tutorial: criar um runtime personalizado - AWS Lambda

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Tutorial: criar um runtime personalizado

Neste tutorial, você criará uma função do Lambda com um runtime personalizado. Você começa incluindo o runtime 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 runtime com o mundo atualizando sua política de permissões com base em recursos.

Pré-requisitos

Este tutorial presume que você tenha algum conhecimento de operações básicas do Lambda e do console do Lambda. Caso ainda não tenha feito isso, siga as instruções em Criar uma função do Lambda com o console para criar sua primeira função do Lambda.

Para concluir as etapas a seguir, a AWS Command Line Interface (AWS CLI) versão 2 será necessária. Os comandos e a saída esperada são mostrados em blocos separados:

aws --version

A seguinte saída deverá ser mostrada:

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

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.

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. Os exemplos de comandos da CLI neste guia usam a formatação Linux. Os comandos que incluem documentos JSON em linha deverão ser reformatados se você estiver usando a CLI do Windows.

Você precisa de uma função do IAM para criar uma função do Lambda. A função precisa de permissão para enviar registros ao CloudWatch Logs e acessar os AWS serviços que sua função usa. Se você ainda não tiver uma função para o desenvolvimento de funções, crie uma agora.

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

  2. Selecione Create role (Criar função).

  3. Crie uma função com as propriedades a seguir.

    • Entidade confiávelLambda.

    • PermissõesAWSLambdaBasicExecutionRole.

    • Role name (Nome da função): lambda-role.

    A AWSLambdaBasicExecutionRolepolítica tem as permissões que a função precisa para gravar registros em CloudWatch Logs.

Criar uma função

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

  1. Crie um diretório para o projeto e depois mude para esse diretório.

    mkdir runtime-tutorial cd runtime-tutorial
  2. Crie um novo arquivo chamado bootstrap. Esse é o runtime personalizado.

    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. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done

    O runtime 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.

    Depois que o runtime carrega o script da função, ele usa a API de runtime 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 runtime 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 runtimes têm responsabilidades adicionais, incluindo o processamento de erros e o fornecimento de informações de contexto para o manipulador. Para obter detalhes, consulte Requisitos.

  3. Crie um script para a função. O exemplo de script a seguir define uma função do manipulador que usa dados de eventos, os registra no log stderr e os retorna.

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

    Agora, diretório runtime-tutorial será desta forma:

    runtime-tutorial ├ bootstrap └ function.sh
  4. Torne os arquivos executáveis e os adicione a um arquivo .zip. Esse é o pacote de implantação.

    chmod 755 function.sh bootstrap zip function.zip function.sh bootstrap
  5. Crie uma função chamada bash-runtime. Para --role, insira o ARN do seu perfil de execução do Lambda.

    aws lambda create-function --function-name bash-runtime \ --zip-file fileb://function.zip --handler function.handler --runtime provided.al2023 \ --role arn:aws:iam::123456789012:role/lambda-role
  6. Invoque a função.

    aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.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ê obterá uma resposta parecida com esta:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }
  7. Verifique a resposta.

    cat response.txt

    Você obterá uma resposta parecida com esta:

    Echoing request: '{"text":"Hello"}'

Criar uma camada

Para separar o código do runtime do código da função, crie uma camada que contenha apenas o runtime. 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. Para ter mais informações, consulte Trabalhar com camadas do Lambda.

  1. Crie um arquivo .zip que contenha o arquivo bootstrap.

    zip runtime.zip bootstrap
  2. Crie uma camada com o comando publish-layer-version.

    aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip

    Isso cria a primeira versão da camada.

Atualizar a função

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

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

    aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:1

    Isso adiciona o runtime à função no diretório /opt. Para garantir que o Lambda use o runtime na camada, você precisa remover o boostrap do pacote de implantação da função, conforme mostrado nas próximas duas etapas.

  2. Crie um arquivo .zip que contenha o código da função.

    zip function-only.zip function.sh
  3. Atualize o código da função para incluir apenas o script do manipulador.

    aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip
  4. Invoque a função para confirmar se ela funciona com a camada de runtime.

    aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.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ê obterá uma resposta parecida com esta:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }
  5. Verifique a resposta.

    cat response.txt

    Você obterá uma resposta parecida com esta:

    Echoing request: '{"text":"Hello"}'

Atualizar o runtime

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

    exemplo bootstrap
    #!/bin/sh set -euo pipefail # Configure runtime to output environment variables echo "## Environment variables:" env # Load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done
  2. Crie um arquivo .zip que contenha a nova versão do arquivo bootstrap.

    zip runtime.zip bootstrap
  3. Crie uma nova versão da camada bash-runtime.

    aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
  4. Configure a função para usar a nova versão da camada.

    aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2

Compartilhar a camada

Para conceder permissão de uso de camadas a outra conta, adicione uma instrução à política de permissões da versão da camada usando o comando add-layer-version-permission. Em cada instrução, você pode conceder permissão a uma única conta, a todas as contas ou a uma organização.

O exemplo a seguir concede à conta 111122223333 acesso à versão 2 da camada bash-runtime.

aws lambda add-layer-version-permission --layer-name bash-runtime --statement-id xaccount \ --action lambda:GetLayerVersion --principal 111122223333 --version-number 2 --output text

Você deve ver saída semelhante a:

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}

As permissões se aplicam apenas a uma única versão de camada. Repita o processo sempre que criar uma nova versão da camada.

Limpeza

Exclua cada versão da camada.

aws lambda delete-layer-version --layer-name bash-runtime --version-number 1 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, precisará especificar uma nova versão ou omitir a camada excluída.

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

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