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 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 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. Consulte Criação de aplicativos com dependências no Guia do desenvolvedor do AWS SAM para obter instruções.

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. Crie um diretório para dependências.

    ~/my-function$ mkdir package
  2. Instale bibliotecas no diretório do pacote com a opção --target.

    ~/my-function$ cd package ~/my-function/package$ pip install Pillow --target . 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
  3. Crie um arquivo ZIP.

    package$ zip -r9 ../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%) ...
  4. Adicione o código da sua função ao arquivo.

    ~/my-function/package$ cd ../ ~/my-function$ zip -g function.zip function.py adding: function.py (deflated 56%)
  5. 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.
  2. Ative o ambiente.

    ~/my-function$ source v-env/bin/activate (v-env) ~/my-function$

    Para a linha de comando do Windows, o script de ativação está no diretório Scripts.

    > v-env\Scripts\activate.bat
  3. Instale as bibliotecas com o pip.

    ~/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 ../../../../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 ../../../../ ~/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" }