Implantar funções do Lambda em Python com arquivos .zip - AWS Lambda

Implantar funções do Lambda em Python com arquivos .zip

nota

O término do suporte para o tempo de execução do Python 2.7 começou em 15 de julho de 2021. Para mais informações, consulte Política de descontinuação de tempo de execução.

O código da função do AWS Lambda consiste em scripts ou programas compilados e as dependências deles. Você usa umpacote de implantaçãopara implantar seu código de função no Lambda. O Lambda é compatível com dois tipos de pacotes de implantação: imagens de contêiner e arquivos .zip.

Para criar um pacote de implantação compactado em um arquivo .zip, você pode usar um utilitário compactação em arquivo .zip integrado ou qualquer outro utilitário semelhante (como o 7zip) para sua ferramenta de linha de comando. Lembre-se de dos seguintes requisitos para usar um arquivo .zip como seu pacote de implantação:

  • O arquivo .zip contém o código da sua função e quaisquer dependências usadas para executá-lo (se aplicável) no Lambda. Se sua função depender apenas de bibliotecas padrão ou de bibliotecas do SDK do AWS, você não precisará inclui-las em seu arquivo .zip. Essas bibliotecas são incluídas nos ambientes de tempo de execução do Lambda suportados.

  • Se o arquivo.zip for maior que 50 MB, recomendamos enviá-lo para sua função a partir de um bucket do Amazon Simple Storage Service (Amazon S3).

  • Se o pacote de implantação contiver bibliotecas nativas, você poderá criar o pacote de implantação com o AWS Serverless Application Model (AWS SAM). É possível usar o comando sam build da CLI do AWS SAM com --use-container para criar seu pacote de implantação. Essa opção cria um pacote de implantação dentro de uma imagem do Docker compatível com o ambiente de execução do Lambda.

    Para obter mais informações, consulte sam build no Guia do desenvolvedor do AWS Serverless Application Model.

  • É necessário criar o pacote de implantação para ser compatível com esta arquitetura de conjunto de instruções da função.

  • O Lambda usa permissões de arquivo POSIX, então pode ser necessário definir permissões para a pasta do pacote de implantação antes de criar o arquivo .zip.

nota

Um pacote python pode conter código de inicialização no arquivo __init__.py. Antes do Python 3.9, o Lambda não executava o código __init__.py para pacotes no diretório do manipulador de funções ou diretórios pai. No Python 3.9 e em versões posteriores, o Lambda executa o código init para pacotes nesses diretórios durante a inicialização.

O Lambda executa o código de inicialização somente quando o ambiente de execução é inicializado pela primeira vez, e não para cada invocação de função nesse ambiente inicializado.

Pré-requisitos

Você precisa do AWS Command Line Interface (AWS CLI) para chamar operações da API de serviço. Para instalar a AWS CLI, consulte Installing the AWS CLI no Manual do usuário do AWS Command Line Interface.

O que é uma dependência de runtime?

Um pacote de implantação é necessário para a criação ou a atualização de uma função do Lambda com ou sem dependências de tempo de execução. O pacote de implantação atuará como o pacote de origem para a execução do código e das dependências (se aplicável) da sua função no Lambda.

Uma dependência pode ser qualquer pacote, módulo ou outra dependência de assembly que não esteja incluída com oTempo de execução do Lambdapara o código da sua função.

O exemplo a seguir descreve uma função do Lambda sem dependências de tempo de execução:

  • Se o código da sua função estiver em Python 3.8 ou posterior e depender apenas das bibliotecas padrão de matemática e registro em log do Python, você não precisará inclui-las em seu arquivo .zip. Essas bibliotecas estão incluídas no tempo de execução do Python.

  • Se o código da sua função depender do AWS SDK for Python (Boto3), você não precisará incluir a biblioteca boto3 em seu arquivo .zip. Essas bibliotecas estão incluídas no tempo de execução do Python 3.8 e posterior.

Observação: o Lambda atualiza automaticamente as bibliotecas Boto3 para habilitar o conjunto de recursos e atualizações de segurança mais recentes. Para ter controle total das dependências usadas por sua função, empacote todas as dependências em seu pacote de implantação.

Pacote de implantação sem dependências

Criar o arquivo .zip para seu pacote de implantação.

Para criar o pacote de implantação

  1. Abra um prompt de comando e crie um diretório de projeto do my-math-function. Por exemplo, no macOS:

    mkdir my-math-function
  2. Navegue até o diretório de projeto do my-math-function.

    cd my-math-function
  3. Copie o conteúdo do código Python de exemplo do GitHub e salve-o em um novo arquivo chamado lambda_function.py. A estrutura do seu diretório deve ficar assim:

    my-math-function$ | lambda_function.py
  4. Adicione o arquivo lambda_function.py à raiz do arquivo .zip.

    zip my-deployment-package.zip lambda_function.py

    Isso gerará um arquivo my-deployment-package.zip no diretório do projeto. O comando produzirá a saída a seguir:

    adding: lambda_function.py (deflated 50%)

Pacote de implantação com dependências

Criar o arquivo .zip para seu pacote de implantação.

Para criar o pacote de implantação

  1. Abra um prompt de comando e crie um diretório de projeto do my-sourcecode-function. Por exemplo, no macOS:

    mkdir my-sourcecode-function
  2. Navegue até o diretório de projeto do my-sourcecode-function.

    cd my-sourcecode-function
  3. Copie o conteúdo do seguinte código Python de exemplo e salve-o em um novo arquivo chamado lambda_function.py:

    import requests def lambda_handler(event, context): response = requests.get("https://www.test.com/") print(response.text) return response.text

    A estrutura do seu diretório deve ficar assim:

    my-sourcecode-function$ | lambda_function.py
  4. Instale a biblioteca requests em um novo diretório do package.

    pip install --target ./package requests
  5. Crie um pacote de implantação com a biblioteca instalada na raiz.

    cd package zip -r ../my-deployment-package.zip .

    Isso gerará um arquivo my-deployment-package.zip no diretório do projeto. O comando produzirá a saída a seguir:

    adding: chardet/ (stored 0%) adding: chardet/enums.py (deflated 58%) ...
  6. Adicione o arquivo lambda_function.py à raiz do arquivo zip.

    cd .. zip -g my-deployment-package.zip lambda_function.py

Usar um ambiente virtual

Como atualizar uma função do Python com um ambiente virtual

  1. Ative o ambiente virtual. Por exemplo:

    ~/my-function$ source myvenv/bin/activate
  2. Instale as bibliotecas com o pip.

    (myvenv) ~/my-function$ pip install requests
  3. Desative o ambiente virtual.

    (myvenv) ~/my-function$ deactivate
  4. Crie um pacote de implantação com as bibliotecas instaladas na raiz.

    ~/my-function$cd myvenv/lib/python3.8/site-packages zip -r ../../../../my-deployment-package.zip .

    O último comando salva o pacote de implantação na raiz do diretório do my-function.

    dica

    Uma biblioteca pode aparecer emsite-packagesoudist-packagese a primeira pastaliboulib64. Use o comando pip show para localizar um pacote específico.

  5. Adicione arquivos de código de função à raiz do seu pacote de implantação.

    ~/my-function/myvenv/lib/python3.8/site-packages$ cd ../../../../ ~/my-function$ zip -g my-deployment-package.zip lambda_function.py

    Depois de concluir esta etapa, você deverá ter seguinte estrutura de diretórios:

    my-deployment-package.zip$ │ lambda_function.py │ __pycache__ │ certifi/ │ certifi-2020.6.20.dist-info/ │ chardet/ │ chardet-3.0.4.dist-info/ ...

Adicionar o arquivo .zip à função

Para implantar o novo código em sua função, você carrega o novo pacote de implantação de arquivo.zip. Você pode usar o console do Lambda para carregar um arquivo.zip para a função, ou você pode usar o comando UpdateFunctionCode da CLI.

O exemplo a seguir carrega um arquivo chamado my-deployment-package.zip. Use o prefixo fileb:// para carregar o arquivo .zip binário no Lambda.

~/my-function$ aws lambda update-function-code --function-name MyLambdaFunction --zip-file fileb://my-deployment-package.zip { "FunctionName": "mylambdafunction", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:mylambdafunction", "Runtime": "python3.8", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "lambda_function.lambda_handler", "CodeSize": 5912988, "CodeSha256": "A2P0NUWq1J+LtSbkuP8tm9uNYqs1TAa3M76ptmZCw5g=", "Version": "$LATEST", "RevisionId": "5afdc7dc-2fcb-4ca8-8f24-947939ca707f", ... }