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 requests
をimport 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のドキュメント を参照してください。
こちらの手順を確認してください: 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