Come faccio a risolvere gli errori "unknown service" (servizio sconosciuto), "parameter validation failed" (convalida dei parametri non riuscita) o "object has no attribute" (l'oggetto non ha attributi) restituiti da una funzione Lambda in Python (Boto3)?

4 minuti di lettura
0

La mia funzione AWS Lambda in Python (Boto3) restituisce gli errori "unknown service" (servizio sconosciuto), "parameter validation failed" (convalida dei parametri non riuscita) o "object has no attribute" (l'oggetto non ha attributi).

Breve descrizione

Una funzione Lambda Python (Boto3) che non utilizza la versione più recente di Boto3 può restituire gli errori seguenti:

  • unknown service (servizio sconosciuto)
  • convalida dei parametri non riuscita
  • object has no attribute (l'oggetto non ha attributi)

Questi errori si verificano quando la funzione chiama un servizio AWS o un'API AWS che richiede la versione più recente di Boto3.

Per risolvere questo problema, crea un livello Lambda che utilizza l'ultima versione di Boto3. Puoi creare un livello Lambda manualmente o con Docker. È consigliabile aggiornare il livello Lambda tramite Docker per assicurarsi che i file binari siano corretti per il sistema operativo Lambda.

Importante: le procedure seguenti presuppongono che tu disponga della versione più recente di Botocore. Se non hai la versione più recente di Botocore, devi aggiornarlo prima di poter eseguire l'aggiornamento alla versione più recente di Boto3. Per ulteriori informazioni, consulta botocore sul sito web di GitHub.

Risoluzione

Nota: se si verificano errori durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta Troubleshooting errors for the AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

È consigliabile creare un livello Lambda sullo stesso sistema operativo su cui si basa il runtime Lambda. Ad esempio, le versioni 3.8 e 3.9 di Python sono basate su un'Amazon Machine Image (AMI) Amazon Linux 2. Tuttavia, Python 3.7 e Python 3.6 sono basati sull'AMI Amazon Linux.

Prerequisiti:

  • Installa il pacchetto pip3 per Python 3. Oppure, se hai una versione precedente di pip, aggiornala. Per ulteriori informazioni, consulta Installation sul sito web di pip.
  • Installa o aggiorna l'AWS CLI con pip3.

Nota: L'ultima versione dell'interfaccia a riga di comando di AWS include il modello API Lambda Layers.

Usa Docker per creare o aggiornare un livello Lambda che utilizza l'ultima versione di Boto3

Prerequisito: installa Docker sul tuo sistema. Per scaricare la versione più recente di Docker, consulta Installing Docker.

Crea e applica il tuo livello

Completa i passaggi seguenti:

  1. Accedi alla directory in cui desideri creare il file di livello.

  2. Esegui questo comando nella CLI del tuo 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 ."

    Nota: sostituisci public.ecr.aws/lambda/python:3.9.2023.03.21.20 con l'immagine di base per la tua versione di Python. Sostituisci boto3-mylayer con un nome personalizzato per il tuo pacchetto.
    Dopo il corretto completamento del comando, verrà visualizzato un file con il nome del pacchetto nella directory corrente, ad esempio boto3-mylayer.zip.

  3. Per creare o aggiornare il tuo livello Lambda, esegui questo comando:

    aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb://boto3-mylayer.zip --compatible-runtimes python3.9 --region REGION_NAME

    Nota: Sostituisci boto3-mylayer con il nome del tuo pacchetto. Sostituisci REGION_NAME con la tua regione AWS. Inoltre, includi i runtime compatibili che hai specificato in precedenza.

Crea manualmente un livello Lambda che utilizza l'ultima versione di Boto3

I seguenti comandi dell'interfaccia della linea di comando AWS sono validi per i sistemi operativi Linux, Unix e macOS.

Nota: in ogni comando, assicurati di sostituire boto3-mylayer con il nome che hai scelto per la cartella lib e il livello Lambda.

Completa i passaggi seguenti:

  1. Crea una cartella lib:

    LIB_DIR=boto3-mylayer/pythonmkdir
  2. Installa la libreria in LIB_DIR:

    pip3 install boto3 -t $LIB_DIR
  3. Per comprimere tutte le dipendenze in /tmp/boto3-mylayer.zip, esegui questo comando:

    cd boto3-mylayer
    zip -r /tmp/boto3-mylayer.zip
  4. Per pubblicare il livello, esegui questo comando:

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

    Il comando restituirà il nome della risorsa Amazon (ARN) del nuovo livello.
    Output di esempio:

    arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1

Aggiungi il nuovo livello alla configurazione della tua funzione Lambda

Per aggiungere il nuovo livello alla configurazione della tua funzione Lambda, esegui questo comando:

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

Nota: sostituisci MY_FUNCTION con il nome della tua funzione. Sostituisci LAYER_ARN con l'ARN del tuo layer.

Tutti i servizi e gli argomenti AWS saranno ora disponibili per la tua funzione Lambda.

Per verificare la versione di Boto3 e Botocore, usa print(boto3.__version__) and print(botocore.__version__) nel codice della funzione.

Informazioni correlate

Building Lambda functions with Python

Working with .zip file archives for Python Lambda functions

AWS UFFICIALE
AWS UFFICIALEAggiornata 3 mesi fa