Python (Boto3) AWS Lambda 関数が「不明なサービス」、「parameter validation failed」、または「object has no attribute」というエラーを返します。
簡単な説明
最新バージョンの Boto3 を使用していない Python (Boto3) Lambda 関数は、次のエラーのいずれかを返す可能性があります。
- 不明なサービス
- parameter validation failed
- object has no attribute
これらのエラーは、関数が最新バージョンの Boto3 を必要とする AWS サービスまたは AWS API を呼び出そうとしたときに発生します。
この問題を解決するには、最新バージョンの Boto3 を使用する Lambda レイヤーを作成します。これは手動で行うことも、Docker を使用して行うこともできます。Docker を使用して Lambda レイヤーをアップグレードする方が効率的なほか、バイナリが Lambda オペレーティングシステムに適していることも確認できます。
重要: 以下の手順は、Botocore の最新バージョン (GitHub にあり) がインストールされていることを前提としています。最新バージョンの Botocore をお持ちでない場合は、最新の Boto3 バージョンにアップグレードする前に Botocore をアップグレードする必要があります。特定の Python 構成に必要な解決方法を実施してください。
解決方法
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用しているかどうかを確認してください。
Lambda ランタイムを実行する基盤となるオペレーティングシステムと同じオペレーティングシステムで Lambda レイヤーを作成するのがベストプラクティスです。例えば、Amazon Linux 2 の Amazon マシンイメージ (AMI) は、Python バージョン 3.8 と 3.9 を実行する基盤となるオペレーティングシステムです。ただし、Python 3.7 と Python 3.6 を実行する場合の基盤オペレーティングシステムは、Amazon Linux AMI です。
(前提条件) pip3 と最新の AWS CLI バージョンをインストールする
- Python 3 パッケージ用の pip3 をインストールしていない場合は、pip ウェブサイトからインストールしてください。
-または-
以前のバージョンの pip をお持ちの場合は、pip のウェブサイトでアップグレードを行ってください。
- pip3 を使用して AWS CLI をインストールまたはアップグレードします。
注: AWS CLI の最新バージョンには、Lambda Layers API モデルが含まれています。
Docker を使用して、最新の Boto3 バージョンを使用する Lambda レイヤーを作成または更新する
(前提条件) Docker のインストール
システムに Docker がインストールされていて、実行中であることを確認してください。最新バージョンの Docker をダウンロードするには、「Installing 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/python
mkdir -p $LIB_DIR
- ライブラリを 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) を返します。
Lambda レイヤー ARN の例
arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1
Lambda 関数の設定に新しいレイヤーを追加する
Lambda 関数の設定に新しいレイヤーを追加するには、次のコマンドを実行します。
重要: MY\ _FUNCTION を自分の関数の名前に置き換えます。LAYER_ARN を自分のレイヤーの ARN に置き換えます。
aws lambda update-function-configuration --function-name MY_FUNCTION --layers LAYER_ARN
これで、すべての AWS サービスと引数を Lambda 関数で使用できるようになりました。
ヒント: Boto3 と Botocore のバージョンを確認するには、関数コード内で print(boto3.__version__) と print(botocore.__version__) を使用してください。
関連情報
Building Lambda functions with Python
Lambda runtimes
Deploy Python Lambda functions with .zip file archives