簡體   English   中英

AWS Lambda 上的 Python:不推薦使用來自 botocore.vendored 的“請求”,但“請求”不可用

[英]Python at AWS Lambda: `requests` from botocore.vendored deprecated, but `requests` not available

我有一個用於 AWS Lambda function 的 Python 腳本,它對另一個端點執行 Z293C9EA246FF9985DC6ZF626 請求。 Since Python's urllib2.request , https://docs.python.org/2/library/urllib2.html , can only handle data in the standard application/x-www-form-urlencoded format and I want to post JSON data, I使用了請求庫https://pypi.org/project/requests/2.7.0/

該 Requests 庫在 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不可用? 以及如何使用/導入它?

我使用urllib3庫成功發送了 HTTP POST 請求,該庫可在 AWS Lambda 獲得,無需額外安裝說明。

import urllib3

http = urllib3.PoolManager()

response = http.request('POST',
                        url,
                        body = json.dumps(some_data_structure),
                        headers = {'Content-Type': 'application/json'},
                        retries = False)

在此處查看說明: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies

您需要做的就是在本地下載請求模塊,然后將其包含在 Lambda function 部署 package(ZIP 存檔)中。

示例(如果您的所有 Lambda function 由單個 Python 模塊 + 請求模塊組成):

$ 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

回答2020-06-18

我找到了一種在 AWS Lambda 函數中使用requests的好方法!

打開此鏈接並找到您的 function 正在使用的區域:
https://github.com/keithrozario/Klayers/tree/master/deployments/python3.8/arns

打開與您所在地區相關的.csv並搜索requests行。
這是與requests庫相關的ARN
arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-requests:6

所以現在在你的 lambda function 中,使用找到的 ARN 添加一個層。
觀察確保您的 Python lambda function 運行時是python3.8

如果您使用的是無服務器框架

serverless.yml中指定插件

plugins:
- serverless-python-requirements

在目錄根目錄下創建文件requirements.txt

要求.txt

requests==2.22.0

這將安裝提到的請求和包。

requests 不是核心 python 的一部分。 請參閱https://docs.aws.amazon.com/en_pv/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html關於打包具有外部依賴項的 Z04A7DA3C5B04CAD88BZDA1 庫的 Z04A7DA3C5B04CAD88BZDA1EE )

Amazon 的無服務器應用程序 Model (SAM) 提供了一個構建命令,可以將任意 python 依賴項捆綁到部署工件中。

為了能夠在您的代碼中使用requests package,請將依賴項添加到您的 requirements.txt 文件中:

requests==2.22.0

然后運行sam build以獲得供應商requests的工件。 默認情況下,您的工件將保存到.aws-sam/build目錄,但可以使用--build-dir選項指定另一個目標目錄。

有關更多信息,請參閱 SAM 的文檔

這是我使用 AWS Lambda 層與任何庫一起使用的鄉巴佬解決方案:

這樣做的好處是您不必信任任何 3rd 方層,因為您可以輕松地自己制作。

  1. Go 到本地 python 的 Lib/site-packages(python 安裝位置或您的 venv)
  2. 將您需要的任何庫(例如“請求”)復制到名為“python”的文件夾中
  3. Zip 這個文件夾
  4. 創建 AWS Lambda 層,並將 zip 上傳到其中
  5. 在您的 lambda function 中添加這一層
  6. 像往常一樣導入你的庫,並像什么都沒發生一樣繼續編碼

pip install requests
接着
import requests
使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM