web-dev-qa-db-ja.com

Python at AWS Lambda:botocore.vendoredからの `requests`は廃止予定ですが、` requests`は利用できません

HTTPを実行するAWS Lambda関数のPythonスクリプトPOST別のエンドポイントへのリクエスト。Pythonのurllib2.request以降、 https://docs.python.org/2/library/urllib2.html 、標準のapplication/x-www-form-urlencoded形式のデータのみを処理でき、JSONデータを投稿したいので、リクエストライブラリを使用しました- https://pypi.org/project/requests/2.7.0/

そのリクエストライブラリは、Pythonランタイム環境のAWS Lambdaでは利用できなかったため、from botocore.vendored import requestsを介してインポートする必要がありました。これまでのところ、とても良いです。

今日、私はそれについて非推奨の警告を受け取ります:

DeprecationWarning: You are using the post() function from 'botocore.vendored.requests'.
This is not a public API in botocore and will be removed in the future.
Additionally, this version of requests is out of date. We recommend you install the
requests package, 'import requests' directly, and use the requests.post() function instead.

これはAWSからのこのブログ投稿でも言及されていました: https://aws.Amazon.com/blogs/developer/removing-the-vendored-version-of-requests-from-botocore/

残念ながら、from botocore.vendored import requestsimport requestsに変更すると、次のエラーが発生します。

No module named 'requests'

AWS LambdaのPythonランタイムでrequestsを使用できないのはなぜですか?それをどのように使用/インポートできますか?

Amazonのサーバーレスアプリケーションモデル(SAM)は、任意のpython依存関係をデプロイメントアーティファクトにバンドルできるビルドコマンドを提供します。

コードでrequestsパッケージを使用できるようにするには、requirements.txtファイルに依存関係を追加します。

requests==2.22.0

次に sam build を実行して、requestsをベンダーするアーティファクトを取得します。デフォルトでは、アーティファクトは.aws-sam/buildディレクトリに保存されますが、--build-dirオプションで別の宛先ディレクトリを指定できます。

詳細は SAMのドキュメント を参照してください。

1
Esteban

こちらの手順を確認してください: https://docs.aws.Amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies

必要なのは、リクエストモジュールをローカルにダウンロードして、それをLambda関数デプロイパッケージ(Zipアーカイブ)に含めることだけです。

例(すべてのLambda関数で構成されている場合、単一のPython module + requests module)でした:)

$ pip install --target ./package requests
$ cd package
$ Zip -r9 ${OLDPWD}/function.Zip .
$ cd $OLDPWD
$ Zip -g function.Zip lambda_function.py
$ aws lambda update-function-code --function-name my-function --Zip-file fileb://function.Zip
1
Mark