Python (Boto 3) Lambda 関数で「不明のサービス」、「パラメータの検証が失敗しました」、または「オブジェクトに属性がありません」というエラーが発生するのはなぜですか?

最終更新日: 2019 年 9 月 26 日

Python で記述された AWS Lambda 関数を実行すると、「不明のサービス」、「パラメータの検証が失敗しました」、または「オブジェクトに属性がありません」といったエラーが発生します。これらのエラーを修正するにはどうすればよいですか?

簡単な説明

これらのエラーは、Python 向けの Lambda ランタイムのひとつを使用するように Lambda 関数が設定されており、関数が新しい AWS サービスまたは最新バージョンの AWS API を呼び出そうとする場合に発生することがあります。Lambda の実行環境で提供されている AWS SDK for Python (Boto 3) のバージョンは最新バージョンではありません。これには、一部の AWS サービスおよび API の引数がない可能性があります。

最新バージョンの Boto 3 を使用するレイヤーを作成してから、関数の設定にレイヤーを追加します。

解決方法

注意: これらの手順はガイドラインとして提供されており、新しい作業ディレクトリがあることを前提としています。既存の作業ディレクトリについては、Boto 3 にアップグレードするために botocore をアップグレードする必要がある場合があります。これらのステップは、特定のオペレーティングシステムと Python の設定のために、必要に応じて調整してください。

pip と AWS CLI をインストールする

1.    まだインストールしていない場合は、Python 3 パッケージ用の pip3 をインストールします。以前のバージョンの pip がある場合は、アップグレードしてください

2.    pip3 を使用して AWS コマンドラインインターフェイス (AWS CLI) をインストールまたはアップグレードします。AWS CLI の最新バージョンには、Lambda Layers API モデルが含まれています。

Layer を作成して Lambda 関数に追加する

注意: これらのコマンドは 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 に圧縮します。

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) を返します。

arn:aws:lambda:region:$ACC_ID:layer:boto3-mylayer:1

5.    このコマンドを実行して、Lambda 関数の設定にレイヤーを追加します。

注意: myfunction は、お使いの関数の名前に置き換えてください。arn:aws:lambda:region:ACC_ID:layer:boto3-mylayer:1 は、お使いのレイヤーの ARN に置き換えてください。

aws lambda update-function-configuration --function-name myfunction --layers arn:aws:lambda:region:ACC_ID:layer:boto3-mylayer:1

これですべての AWS サービスと引数/キーワード引数が Lambda 関数で使用できるようになりました。

ヒント: Boto 3 と Botocore のバージョンを確認するには、関数コードで print(boto3.__version__) および print(botocore.__version__) を使用します。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合