Minha função do AWS Lambda no Python (Boto3) retorna erros de “serviço desconhecido”, “falha na validação do parâmetro” ou “objeto não tem atributo”.
Breve descrição
Uma função do Lambda no Python Boto3 que não usa a versão mais recente do Boto3 pode retornar qualquer um dos seguintes erros:
- serviço desconhecido
- falha na validação do parâmetro
- objeto sem atributo
Esses erros ocorrem quando a função chama um serviço da AWS ou uma AWS API que requer a versão mais recente do Boto3.
Para resolver esse problema, crie uma camada do Lambda que usa a versão mais recente do Boto3. Você pode criar uma camada do Lambda manualmente ou com o Docker. É uma prática recomendada atualizar sua camada do Lambda por meio do Docker para garantir que seus binários estejam corretos para o sistema operacional Lambda.
Importante: os procedimentos a seguir pressupõem que você tenha a versão mais recente do Botocore. Se você não tiver a versão mais recente do Botocore, deverá atualizar o Botocore antes de poder atualizar para a versão mais recente do Boto3. Para obter mais informações, consulte botocore no site do GitHub.
Resolução
Observação: Se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
É uma prática recomendada criar uma camada do Lambda no mesmo sistema operacional em que seu runtime do Lambda se baseia. Por exemplo, as versões 3.8 e 3.9 do Python são baseadas em uma imagem de máquina da Amazon (AMI) do Amazon Linux 2. No entanto, o Python 3.7 e o Python 3.6 são baseados na AMI do Amazon Linux.
Pré-requisitos:
- Instale o pacote pip3 para Python 3. Ou, se você tiver uma versão anterior do pip, atualize-a. Para obter mais informações, consulte Instalação no site do pip.
- Instale ou atualize o AWS CLI com pip3.
Observação: a versão mais recente da AWS CLI inclui o modelo de API de camadas do Lambda.
Usar o Docker para criar ou atualizar uma camada do Lambda que usa a versão mais recente do Boto3
Pré-requisito: instalar o Docker em seu sistema. Para baixar a versão mais recente do Docker, consulte Instalar o Docker.
Criar e aplicar sua camada
Conclua as etapas a seguir:
-
Navegue até o diretório em que deseja criar o arquivo de camada.
-
Execute o seguinte comando na CLI do seu sistema:
docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/python:3.9.2023.03.21.20" /bin/sh -c "mkdir -p /tmp/python && pip3 install boto3 -t /tmp/python && cd /tmp && yum install -y zip && zip -r /var/task/boto3-mylayer.zip ."
Observação: substitua public.ecr.aws/lambda/python:3.9.2023.03.21.20 pela imagem base da sua versão do Python. Você pode substituir boto3-mylayer por um nome personalizado para seu pacote.
Quando ele for concluído com êxito, você verá um arquivo com o nome do pacote no diretório atual, como boto3-mylayer.zip.
-
Para criar ou atualizar sua camada do Lambda, execute o seguinte comando:
aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb://boto3-mylayer.zip --compatible-runtimes python3.9 --region REGION_NAME
Observação: substitua boto3-mylayer pelo nome do seu pacote. Substitua REGION_NAME pela sua região da AWS. Além disso, inclua os runtime compatíveis que você especificou anteriormente.
Crie manualmente uma camada do Lambda que usa a versão mais recente do Boto3
Os seguintes comandos da AWS CLI funcionam para sistemas operacionais Linux, Unix e macOS.
Observação: em cada comando, certifique-se de substituir boto3-mylayer pelo seu nome preferido para a pasta lib e a camada do Lambda.
Conclua as etapas a seguir:
-
Crie uma pasta lib:
LIB_DIR=boto3-mylayer/pythonmkdir
-
Instale a biblioteca em LIB_DIR.
pip3 install boto3 -t $LIB_DIR
-
Para compactar todas as dependências em /tmp/boto3-mylayer.zip, execute o seguinte comando.
cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip
-
Para publicar a camada, execute o comando a seguir.
aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip
O comando retorna o Amazon Resource Name (ARN) da nova camada.
Exemplo de saída:
arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1
Adicionar a nova camada à configuração da sua função do Lambda
Para adicionar a nova camada à configuração da sua função do Lambda, execute o seguinte comando:
aws lambda update-function-configuration --function-name MY_FUNCTION --layers LAYER_ARN
Observação: substitua MY_FUNCTION pelo nome da sua função. Substitua LAYER_ARN pelo ARN da sua camada.
Todos os serviços e argumentos da AWS agora estão disponíveis para sua função do Lambda.
Para confirmar a versão do Boto3 e do Botocore, use print(boto3.__version__) e print(botocore.__version__) no código da função.
Informações relacionadas
Como criar funções do Lambda com Python
Trabalhando com arquivos compactados .zip para funções do Lambda Python