AWS Lambda
Guia do desenvolvedor

Pacote de implantação do AWS Lambda no Python

A deployment package is a ZIP archive that contains your function code and dependencies. You need to create a deployment package if you use the Lambda API to manage functions, or if your code uses libraries other than the AWS SDK. Other libraries and dependencies need to be included in the deployment package. You can upload the package directly to Lambda, or you can use an Amazon S3 bucket, and then upload it to Lambda.

If you use the Lambda console editor to author your function, the console manages the deployment package. You can use this method as long as you don't need to add any libraries. You can also use it to update a function that already has libraries in the deployment package, as long as the total size doesn't exceed 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.

Sem dependências adicionais

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" }

Com dependências adicionais

Se a sua função depende de bibliotecas que não são 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" }