Como resolvo erros de “serviço desconhecido”, “falha na validação do parâmetro” e “objeto não tem atributo” de uma função do Lambda no Python (Boto3)?

5 minuto de leitura
0

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 não tem atributo

Esses erros ocorrem quando a função tenta chamar 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 fazer isso manualmente ou usar o Docker. É mais eficiente atualizar sua camada do Lambda por meio do Docker, e isso garante que seus binários estejam corretos para o sistema operacional do Lambda.

Importante: Os procedimentos a seguir pressupõem que você tenha a versão mais recente do Botocore (no GitHub). 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. Implemente a resolução conforme necessário para sua configuração específica e do Python.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), verifique se está utilizando a versão mais recente.

É 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 Amazon Linux AMI.

(Pré-requisitos) Instale o pip3 e a versão mais recente da AWS CLI

1.    Se ainda não o fez, instale o pacote pip3 para Python 3 do site do pip. 

-ou-

Se você tiver uma versão anterior do pip, atualize-a no site do pip.

2.    Instale ou atualize a AWS CLI usando 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é-requisitos) Instalar o Docker

Verifique se você instalou o Docker em seu sistema e se ele está em execução. Para baixar a versão mais recente do Docker, consulte Instalar o Docker.

Criar e aplique sua camada

1.    Navegue até o diretório em que deseja criar o arquivo de camada.

2.    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.

3.    Aguarde a conclusão do comando. Quando ele for concluído com êxito, você verá um arquivo com o nome do pacote no diretório atual, como boto3-mylayer.zip.

4.    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

Importante: Os seguintes comandos da AWS CLI funcionam para sistemas operacionais Linux, Unix e macOS. Em cada comando, certifique-se de substituir boto3-mylayer pelo seu nome preferido para a pasta lib e a camada do Lambda.

1.    Crie uma pasta lib:

LIB_DIR=boto3-mylayer/python
mkdir -p $LIB_DIR

2.    Instale a biblioteca em LIB_DIR:

pip3 install boto3 -t $LIB_DIR

3.    Compacte todas as dependências em /tmp/boto3-mylayer.zip:

cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip .

4.    Publique a camada:

aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip

O comando retorna o nome do recurso da Amazon (ARN) da nova camada.

Exemplo de ARN da camada do Lambda

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:

Importante: Substitua MY_FUNCTION pelo nome da sua função. Substitua LAYER_ARN pelo ARN da sua camada.

aws lambda update-function-configuration --function-name MY_FUNCTION --layers LAYER_ARN

Todos os serviços e argumentos da AWS agora estão disponíveis para sua função do Lambda.

Dica: 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

Construir funções do Lambda com Python

Runtime do Lambda

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

AWS OFICIAL
AWS OFICIALAtualizada há um ano