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-mylayerlib フォルダと 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__) を使用します。