Python (Boto3) Lambda 関数の「不明なサービス」、「parameter validation failed」、「object has no attribute」というエラーを解決するにはどうすればよいですか?

所要時間2分
0

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 バージョンをインストールする

  1. Python 3 パッケージ用の pip3 をインストールしていない場合は、pip ウェブサイトからインストールしてください。

-または-

以前のバージョンの pip をお持ちの場合は、pip のウェブサイトでアップグレードを行ってください。

  1. pip3 を使用して AWS CLI をインストールまたはアップグレードします

注: AWS CLI の最新バージョンには、Lambda Layers API モデルが含まれています。

Docker を使用して、最新の Boto3 バージョンを使用する Lambda レイヤーを作成または更新する

(前提条件) Docker のインストール

システムに Docker がインストールされていて、実行中であることを確認してください。最新バージョンの Docker をダウンロードするには、「Installing Docker」を参照してください。

レイヤーの作成と適用

  1. レイヤーファイルを作成するディレクトリに移動します。

  2. システムの 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 をパッケージのカスタマイズされた名前に置き換えることができます。

  1. コマンドが完了するまでお待ちください。正常に完了すると、現在のディレクトリに boto3-mylayer.zip などのパッケージ名が付いたファイルが表示されます。

  2. 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 レイヤー名に置き換えます。

  1. lib フォルダーを作成します。
LIB_DIR=boto3-mylayer/python
mkdir -p $LIB_DIR
  1. ライブラリを LIB_DIR にインストールします。
pip3 install boto3 -t $LIB_DIR
  1. すべての依存関係を /tmp/boto3-mylayer.zip に圧縮します。
cd boto3-mylayer
zip -r /tmp/boto3-mylayer.zip .
  1. レイヤーを公開します。
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

AWS公式
AWS公式更新しました 1年前