Python (Boto3) AWS Lambda 関数が、"unknown service"、"parameter validation failed"、"object has no attribute" というエラーを返します。
簡単な説明
最新バージョンの Boto3 を使用していない Python (Boto3) Lambda 関数は、次のエラーのいずれかを返す可能性があります。
- unknown service
- parameter validation failed
- object has no attribute
これらのエラーは、関数が最新バージョンの Boto3 を必要とする AWS サービスまたは AWS API を呼び出したときに発生します。
この問題を解決するには、最新バージョンの Boto3 を使用する Lambda レイヤーを作成します。Lambda レイヤーは手動で作成するか、Docker を使用して作成することができます。Docker を使用して Lambda Layer をアップグレードし、Lambda オペレーティングシステムに適切なバイナリでであることを確認するのがベストプラクティスです。
重要: 以下の手順は、Botocore の最新バージョンがインストールされていることを前提としています。最新バージョンの 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 のウェブサイトで「インストール」を参照してください。
- 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: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 ."
注: public.ecr.aws/lambda/python:3.9.2023.03.21.20 は、お使いの Python バージョンのベースイメージに置き換えます。boto3-mylayer は、パッケージのカスタマイズされた名前に置き換えます。
コマンドが正常に完了すると、現在のディレクトリに boto3-mylayer.zip などのパッケージ名が付いたファイルが表示されます。
-
次のコマンドを実行し、Lambda レイヤーを作成または更新します。
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
-
次のコマンドを実行し、レイヤーを公開します。
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 関数の設定に新しいレイヤーを追加します。
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 のバージョンを確認します。
関連情報
Python で Lambda 関数をビルドする
Python Lambda 関数で .zip ファイルアーカイブを使用する