Python (Boto3) AWS Lambda 関数が、"unknown service"、"parameter validation failed"、"object has no attribute" というエラーを返します。
簡単な説明
これらのエラーは、関数が最新バージョンの Boto3 を必要とする AWS サービスまたは AWS API を呼び出したときに発生します。
この問題を解決するには、最新バージョンの Boto3 を使用する Lambda レイヤーを作成します。その後、Lambda 関数の設定に新しいレイヤーを追加します。Lambda レイヤーは手動で作成するか、Docker を使用して作成することができます。Docker を使用して Lambda レイヤーを作成または更新し、バイナリが正しいことを確認するのがベストプラクティスです。
重要: 最新バージョンの Botocore を入手していない場合は、最新の Boto3 バージョンにアップグレードする前に Botocore をアップグレードする必要があります。詳細は、GitHub のウェブサイトで botocore について参照してください。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Lambda ランタイムの基盤であるオペレーティングシステムと同じオペレーティングシステムで Lambda レイヤーを作成するのがベストプラクティスです。例えば、Python バージョン 3.8 と 3.9 は、Amazon Linux 2 Amazon マシンイメージ (AMI) を基盤としています。Python 3.7 と Python 3.6 の基盤は Amazon Linux AMI です。
前提条件:
- pip3 for Python 3 パッケージをインストールします。または、以前のバージョンの pip を使用している場合は、アップグレードします。詳細については、pip のウェブサイトで「Installation」(インストール) を参照してください。
- pip3 を使用して AWS CLI をインストールまたは更新します。
注: AWS CLI の最新バージョンには、Lambda Layers API モデルが含まれています。
Docker を使用して、最新の Boto3 バージョンを使用する Lambda レイヤーを作成または更新する
前提条件: システムに Docker をインストールします。最新バージョンの Docker のダウンロード方法については、「Docker のインストール」を参照してください。
次の手順を実行します。
-
レイヤーファイルを作成するディレクトリに移動します。
-
お使いのシステムの CLI で次のコマンドを実行します。
docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/python:[IP_ADDRESS]" /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 ."
注: public.ecr.aws/lambda/python:[IP_ADDRESS] は、お使いの Python バージョンのベースイメージに置き換えます。boto3-mylayer は、パッケージのカスタマイズされた名前に置き換えます。コマンドが正常に完了すると、現在のディレクトリに boto3-mylayer.zip などのパッケージ名が付いたファイルが表示されます。
-
Lambda レイヤーを作成または更新するには、次の publish-layer-version コマンドを実行します。
aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb://boto3-mylayer.zip --compatible-runtimes python3.9 --region REGION_NAME
注: boto3-mylayer を自分のパッケージ名に置き換えます。REGION_NAME を自分の AWS リージョンに置き換えます。また、以前に指定した互換性のあるランタイムも含めます。
最新の Boto3 バージョンを使用する Lambda レイヤーを手動で作成する
次の AWS CLI コマンドは、Linux、Unix、macOS オペレーティングシステムで機能します。
注: 各コマンドで、boto3-mylayer を目的の lib フォルダー名と Lambda レイヤー名に置き換えてください。
次の手順を実行します。
-
lib フォルダーを作成します。
LIB_DIR=boto3-mylayer/pythonmkdir
-
ライブラリを LIB_DIR にインストールします。
pip3 install boto3 -t $LIB_DIR
-
次のコマンドを実行し、すべての依存関係を /tmp/boto3-mylayer.zip に圧縮します。
cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip .
-
次の publish-layer-version コマンドを実行し、レイヤーを発行します。
aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip
上記のコマンドは、新しいレイヤーの Amazon リソースネーム (ARN) を返します。
出力例:
arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1
Lambda 関数の設定に新しいレイヤーを追加する
Lambda 関数の設定に新しいレイヤーを追加するには、次の update-function-configuration コマンドを実行します。
aws lambda update-function-configuration --function-name MY_FUNCTION --layers LAYER_ARN
注: MY_FUNCTION は、実際の関数名に置き換えます。LAYER_ARN は、実際のレイヤーの ARN に置き換えます。
完了すると、すべての AWS サービスと引数を Lambda 関数で使用できるようになります。
関数コードで print(boto3.__version__) と print(botocore.__version__) を実行し、Boto3 と Botocore のバージョンを確認します。これらのコマンドを使用する前に、boto3 および botocore ライブラリをインポートしてください。
関連情報
Python による Lambda 関数の構築
Python Lambda 関数で .zip ファイルアーカイブを使用する