AWS Lambda
Guia do desenvolvedor

Pacote de implantação do AWS Lambda no Python

Um pacote de implantação é um arquivo ZIP que contém as dependências e o código da função. Você precisará criar um pacote de implantação se usar a API do Lambda para gerenciar funções ou se for necessário incluir bibliotecas e dependências diferentes do AWS SDK. Você pode fazer upload do pacote diretamente no Lambda ou pode usar um bucket do Amazon S3 e fazer upload dele no Lambda. Se o pacote de implantação for maior do que 50 MB, você deverá usar Amazon S3.

Se você usar o editor do console do Lambda para criar a função, o console gerenciará o pacote de implantação. Você pode usar esse método, desde que não precise adicionar bibliotecas. Você também pode usá-lo para atualizar uma função que já tem bibliotecas no pacote de implantação, desde que o tamanho total não exceda 3 MB.

nota

Você pode usar o build comando da CLI do AWS SAM para criar um pacote de implantação para o seu código de função Python e dependências. A CLI do AWS SAM também oferece uma opção para criar seu pacote de implantação dentro de uma imagem do Docker compatível com o ambiente de execução do Lambda. Consulte Criação de aplicativos com dependências no Guia do desenvolvedor do AWS SAM para obter instruções.

Pré-requisitos

Estas instruções supõem que você já tenha uma função. Se ainda não tiver criado uma função, consulte Criação de funções do Lambda com Python.

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.

Atualização de uma função sem dependências

Para criar ou atualizar uma função com a API do Lambda, crie um arquivo que contém o código da função e faça upload dele com a AWS CLI.

Como atualizar uma função do Python sem dependências

  1. Crie um arquivo ZIP.

    ~/my-function$ zip function.zip function.py
  2. Use o comando update-function-code para fazer upload do pacote.

    ~/my-function$ aws lambda update-function-code --function-name python37 --zip-file fileb://function.zip { "FunctionName": "python37", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:python37", "Runtime": "python3.7", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSize": 815, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2018-11-20T20:41:16.647+0000", "CodeSha256": "GcZ05oeHoJi61VpQj7vCLPs8DwCXmX5sE/fE2IHsizc=", "Version": "$LATEST", "VpcConfig": { "SubnetIds": [], "SecurityGroupIds": [], "VpcId": "" }, "TracingConfig": { "Mode": "Active" }, "RevisionId": "d1e983e3-ca8e-434b-8dc1-7add83d72ebd" }

Atualização de uma função com dependências adicionais

Se a sua função depende de bibliotecas que não sejam SDK para Python (boto3), instale-as em um diretório local com pip e as inclua em seu pacote de implantação.

Como atualizar uma função do Python com dependências

  1. Instale bibliotecas em um novo diretório package local do projeto com a opção --target do pip.

    ~/my-function$ pip install --target ./package Pillow Collecting Pillow Using cached https://files.pythonhosted.org/packages/62/8c/230204b8e968f6db00c765624f51cfd1ecb6aea57b25ba00b240ee3fb0bd/Pillow-5.3.0-cp37-cp37m-manylinux1_x86_64.whl Installing collected packages: Pillow Successfully installed Pillow-5.3.0

    nota

    Para que --target trabalhe em sistemas baseados em Debian, como Ubuntu, também pode ser necessário passar o sinalizador --system para evitar erros distutils.

  2. Crie um arquivo ZIP com as dependências.

    ~/my-function$ cd package ~/my-function/package$ zip -r9 ${OLDPWD}/function.zip . adding: PIL/ (stored 0%) adding: PIL/.libs/ (stored 0%) adding: PIL/.libs/libfreetype-7ce95de6.so.6.16.1 (deflated 65%) adding: PIL/.libs/libjpeg-3fe7dfc0.so.9.3.0 (deflated 72%) adding: PIL/.libs/liblcms2-a6801db4.so.2.0.8 (deflated 67%) ...
  3. Adicione o código da sua função ao arquivo.

    ~/my-function/package$ cd $OLDPWD ~/my-function$ zip -g function.zip function.py adding: function.py (deflated 56%)
  4. Atualize o código da função.

    ~/my-function$ aws lambda update-function-code --function-name python37 --zip-file fileb://function.zip { "FunctionName": "python37", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:python37", "Runtime": "python3.7", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSize": 2269409, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2018-11-20T20:51:35.871+0000", "CodeSha256": "GcZ05oeHoJi61VpQj7vCLPs8DwCXmX5sE/fE2IHsizc=", "Version": "$LATEST", "VpcConfig": { "SubnetIds": [], "SecurityGroupIds": [], "VpcId": "" }, "TracingConfig": { "Mode": "Active" }, "RevisionId": "a9c05ffd-8ad6-4d22-b6cd-d34a00c1702c" }

Com um ambiente virtual

Em alguns casos, pode ser necessário usar um ambiente virtual para instalar as dependências da sua função. Isso pode ocorrer se sua função ou as dependências dela tiver dependências em bibliotecas nativas, ou se você tiver usado o Homebrew para instalar o Python.

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

  1. Crie um ambiente virtual.

    ~/my-function$ virtualenv v-env Using base prefix '~/.local/python-3.7.0' New python executable in v-env/bin/python3.7 Also creating executable in v-env/bin/python Installing setuptools, pip, wheel... done.

    nota

    Para Python 3.3 e mais recente, você pode usar o módulo venv integrado para criar um ambiente virtual, em vez de instalar o virtualenv.

    ~/my-function$ python3 -m venv v-env
  2. Ative o ambiente.

    ~/my-function$ source v-env/bin/activate (v-env) ~/my-function$
  3. Instale as bibliotecas com o pip.

    (v-env) ~/my-function$ pip install Pillow Collecting Pillow Using cached https://files.pythonhosted.org/packages/62/8c/230204b8e968f6db00c765624f51cfd1ecb6aea57b25ba00b240ee3fb0bd/Pillow-5.3.0-cp37-cp37m-manylinux1_x86_64.whl Installing collected packages: Pillow Successfully installed Pillow-5.3.0
  4. Desative o ambiente virtual.

    (v-env) ~/my-function$ deactivate
  5. Crie um arquivo ZIP com o conteúdo da biblioteca.

    ~/my-function$ cd v-env/lib/python3.7/site-packages ~/my-function/v-env/lib/python3.7/site-packages$ zip -r9 ${OLDPWD}/function.zip . adding: easy_install.py (deflated 17%) adding: PIL/ (stored 0%) adding: PIL/.libs/ (stored 0%) adding: PIL/.libs/libfreetype-7ce95de6.so.6.16.1 (deflated 65%) adding: PIL/.libs/libjpeg-3fe7dfc0.so.9.3.0 (deflated 72%) ...

    Dependendo da biblioteca, as dependências podem ser exibidas em site-packages ou dist-packages, e a primeira pasta no ambiente virtual pode ser lib ou lib64. Use o comando pip show para localizar um pacote específico.

  6. Adicione o código da sua função ao arquivo.

    ~/my-function/v-env/lib/python3.7/site-packages$ cd $OLDPWD ~/my-function$ zip -g function.zip function.py adding: function.py (deflated 56%)
  7. Atualize o código da função.

    ~/my-function$ aws lambda update-function-code --function-name python37 --zip-file fileb://function.zip { "FunctionName": "python37", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:python37", "Runtime": "python3.7", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSize": 5912988, "Description": "", "Timeout": 3, "MemorySize": 128, "LastModified": "2018-11-20T21:08:26.326+0000", "CodeSha256": "A2P0NUWq1J+LtSbkuP8tm9uNYqs1TAa3M76ptmZCw5g=", "Version": "$LATEST", "VpcConfig": { "SubnetIds": [], "SecurityGroupIds": [], "VpcId": "" }, "TracingConfig": { "Mode": "Active" }, "RevisionId": "5afdc7dc-2fcb-4ca8-8f24-947939ca707f" }