Python (Boto 3) Lambda 関数からの「不明なサービス」、「パラメータの検証に失敗しました」、「オブジェクトには属性がありません」というエラーを解決するにはどうすればよいですか?
最終更新日: 2021 年 11 月 29 日
Python (Boto 3) AWS Lambda 関数は、「不明なサービス」、「パラメータの検証に失敗しました」、または「オブジェクトに属性がありません」というエラーを返します。関数がこれらのエラーを返すのはなぜですか? また、問題を解決するにはどうすればよいですか?
簡単な説明
最新バージョンの Boto 3 を使用していない Python (Boto 3) Lambda 関数は、次のいずれかのエラーを返す可能性があります。
- 不明なサービス
- パラメータの検証に失敗しました
- オブジェクトには属性がありません
これらのエラーは、最新バージョンの Boto 3 を必要とする AWS のサービスまたは AWS API を関数が呼び出そうとしたときに発生します。
この問題を解決するには、最新バージョンの Boto 3 を使用する Lambda レイヤーを作成します。その後、レイヤーを関数の設定に追加します。
重要: 以下の手順は、Botocore の最新バージョンを使用していることを前提としています。Botocore の最新バージョンを使用していない場合は、最新バージョンの Boto 3 にアップグレードする前に Botocore をアップグレードする必要があります。実行するステップは、特定のオペレーティングシステムと Python の設定に合わせて、必要に応じて調整してください。
解決方法
注: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください。
Lambda ランタイムのベースと同じオペレーティングシステムで Lambda レイヤーを作成するのがベストプラクティスです。たとえば、Python 3.8 は Amazon Linux 2 Amazon マシンイメージ (AMI) に基づいています。ただし、Python 3.7 と Python 3.6 は Amazon Linux AMI に基づいています。
(前提条件) pip3 と最新の AWS CLI バージョンをインストールする
1. Python 3 パッケージングのために pip3 をインストールしてください (まだインストールしていない場合)。-または- pip の以前のバージョンがある場合は、それをアップグレードしてください。
2. pip3 を使用して AWS CLI をインストールまたはアップグレードします。注: AWS CLI の最新バージョンには、Lambda Layers API モデルが含まれています。
最新の Boto 3 バージョンを使用する Lambda レイヤーを作成する
重要: 次の AWS CLI コマンドは、Linux、Unix、および macOS オペレーティングシステムで機能します。各コマンドで、boto3-mylayer を lib フォルダと Lambda レイヤーの任意の名前に置き換えてください。
1. 以下のコマンドを実行して lib フォルダを作成します。
LIB_DIR=boto3-mylayer/python
mkdir -p $LIB_DIR
2. 以下のコマンドを実行して、ライブラリを LIB_DIR にインストールします。
pip3 install boto3 -t $LIB_DIR
3. 以下のコマンドを実行して、すべての依存関係を /tmp/boto3-mylayer.zip に zip します。
cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip .
4. 次のコマンドを実行して、レイヤーを発行します。
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 関数の設定に新しいレイヤーを追加するには、次のコマンドを実行します。
重要: myfunction をご利用の関数の名前に置き換えてください。<layer ARN> をレイヤーの ARN に置き換えます。
aws lambda update-function-configuration --function-name myfunction --layers <layer ARN>
すべての AWS のサービスと引数が Lambda 関数で利用できるようになりました。
ヒント: Boto 3 と Botocore のバージョンを確認するには、関数コードで print(boto3.__version__) および print(botocore.__version__) を使用します。