如何修复 AttributeError: module 'botocore.vendored.requests' has no attribute 'Post' Traceback。

11

我正在尝试让我的 LexBot 与 Lambda 进行通信,所以我按照创建请求、签名和其他必要步骤的过程进行操作。但是我不确定是否需要从 Python 导入某些东西。当我准备发布消息时,它失败了。签名已经创建以及身份验证头文件。

请大家给予建议,任何帮助都将不胜感激!

我使用了以下文章作为指南: https://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html

https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html

print ('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++')
print ('Request URL = ' + endpoint)
print('\n' + authorization_header)
print('\nX-Amz-content-Sha256 header is' + payload_hash)

r = requests.Post ('myendpoint'+ canonical_uri, data=payload, 
headers=headers)
data = r.json()
lex_message = data['message']
print ('' + lex_message)

所以我认为我的问题来自于这段代码,注意,我删除了我的端点。

同时也不确定请求中的数据是什么。


2
今天我升级了aws cli,然后开始出现这个错误。找到了你的帖子,但是很遗憾没有解决方案。你最终解决了这个问题吗? - TheRotag
3个回答

10
我遇到了同样的错误,但是是在使用Python3.8进行GET操作时发生。在Python3.8中,botocore.vendored.requests已经删除了对GET/POST的支持。为了解决这个问题,您可以使用Python3.7来运行Lambda函数,并且该方法仍然有效一段时间。不过需要注意的是,您会收到一个警告:该支持将在2020年3月31日被移除。
DeprecationWarning: You are using the put() function from 'botocore.vendored.requests'.  This dependency was removed from Botocore and will be removed from Lambda after 2020/03/31. https://aws.amazon.com/blogs/developer/removing-the-vendored-version-of-requests-from-botocore/. Install the requests package, 'import requests' directly, and use the requests.put() function instead.

因此,我们没有太多的选择,只能使用 pip 获取 requests 包,或者按照下面链接中所示使用层。

更多信息可以在AWS Lambda中Python SDK的即将到来的更改中找到。


我也遇到了同样的问题。即使添加了 botocore.vendored import requests,这个问题如何解决? - cloudbud
@cloudbud,你需要将requests打包到你的部署包中,可以参考我答案中提供的链接。 - Marcin
我该如何在我的Lambda函数中使用pip方法,只需添加该语句即可? - cloudbud
1
@cloudbud,您可以使用3.8版本。请查看此链接。我使用了pip install requests -t ./命令来安装requests模块。 - Marcin
1
@cloudbud 很抱歉我不知道有这样的可能性。我认为你必须准备新的部署包含“请求”,并用新的代码库更新现有的包。 - Marcin
显示剩余3条评论

4

这里有一个来自AWS的示例,展示了如何使用urllib3库来实现相同的功能https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html

为了防止链接失效,将相关部分放在这里:


import urllib3
...

http = urllib3.PoolManager()


responseBody = { 'foo': 'bar' }

json_responseBody = json.dumps(responseBody)

headers = { ... }

try:
    response = http.request('PUT', responseUrl, headers=headers, body=json_responseBody)

    print("Status code:", response.status)


except Exception as e:

    handle error

顺便说一句,我已经测试过了,这段代码可以直接在Python 3.9 Lambda Runtime中运行,无需安装额外的包。


我使用的AWS快速入门示例是为Python 3.6运行时设置的(AWS现已停止支持)。根据这个答案进行更改后,可以在Python 3.10上运行。 - Edward Moffett
确认这个解决方案在 Python 3.8 上运行,在 Lambda 上与 boto3 包一起使用。 - SRi

4

2
@cloudbud,你安装了请求库吗? https://requests.readthedocs.io/en/master/user/install/ - Fgblanch
这对我来说非常有效。我认为它应该在Python 3.7上“开箱即用”。 - Peter Arboleda
5
这在 Python 3.9 运行时上无法工作。结果是: "errorMessage": "无法导入模块 'lambda_function': 没有名为 'requests' 的模块" - Mike Dalrymple

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接