aws-lambda - 使用 Python boto3 放入本地 DynamoDB 表超时
问题描述
我正在尝试通过触发 Python lambda 表达式以编程方式将数据放入本地运行的 DynamoDB 容器中。
我正在尝试遵循此处提供的模板:https : //docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.03.html 我正在使用您可以在此处下载的 amazon/dynamodb-local:https://hub.docker.com/r/amazon/dynamodb-local
使用 Ubuntu 18.04.2 LTS 运行容器和 lambda 服务器 AWS Sam CLI 运行我的 Lambda api Docker 版本 18.09.4 Python 3.6(您可以在下面的 sam 日志中看到这一点)python lambda 的启动命令只是“sam local start-接口"
首先是我的 Lambda 代码
import json
import boto3
def lambda_handler(event, context):
print("before grabbing dynamodb")
# dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000",region_name='us-west-2',AWS_ACCESS_KEY_ID='RANDOM',AWS_SECRET_ACCESS_KEY='RANDOM')
dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")
table = dynamodb.Table('ContactRequests')
try:
response = table.put_item(
Item={
'id': "1234",
'name': "test user",
'email': "testEmail@gmail.com"
}
)
print("response: " + str(response))
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world"
}),
}
我知道我应该在 localhost:8000 有这个表 ContactRequests,因为我可以运行这个脚本来查看我的 docker 容器 dynamodb 表我已经用 boto.resource 调用中的各种值测试了这个表,以包括访问密钥、区域名称和密钥,结果没有改善
dev@ubuntu:~/Projects$ aws dynamodb list-tables --endpoint-url http://localhost:8000
{
"TableNames": [
"ContactRequests"
]
}
我还能够成功访问 dynamodb 提供的 localhost:8000/shell
不幸的是,在运行时,如果我点击触发此方法的端点,我会得到一个像这样记录的超时
Fetching lambci/lambda:python3.6 Docker container image......
2019-04-09 15:52:08 Mounting /home/dev/Projects/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro inside runtime container
2019-04-09 15:52:12 Function 'HelloWorldFunction' timed out after 3 seconds
2019-04-09 15:52:13 Function returned an invalid response (must include one of: body, headers or statusCode in the response object). Response received:
2019-04-09 15:52:13 127.0.0.1 - - [09/Apr/2019 15:52:13] "GET /hello HTTP/1.1" 502 -
请注意,我的任何打印方法都没有被触发,如果我删除对 table.put 的调用,则打印方法被成功调用。
我在 Stack Overflow 上看到过类似的问题,例如这个lambda python dynamodb write gets timeout error指出问题是我正在使用本地数据库,但我不应该仍然能够使用 boto3 写入本地数据库,如果我将它指向我本地运行的 dynamodb 实例?
解决方案
在这里找到了问题的解决方案:connecting AWS SAM Local with dynamodb in docker 提问者指出,他在网上看到他可能需要使用以下方法连接到同一个 docker 网络:
docker network create lambda-local
所以创建了这个网络,然后更新了我的 sam 命令和我的 docker 命令来使用这个网络,如下所示:
docker run --name dynamodb -p 8000:8000 --network=local-lambda amazon/dynamodb-local
sam local start-api --docker-network local-lambda
之后,我不再遇到超时问题。我仍在努力了解为什么会出现这个问题
公平地说,我也使用 dynamodb 容器名称作为我的 boto3 资源调用的主机,这一点很重要。所以最后,是上面的解决方案和“Reto Aebersold”提供的答案相结合,创造了最终的解决方案
dynamodb = boto3.resource('dynamodb', endpoint_url="http://<DynamoDB_LOCAL_NAME>:8000")
推荐阅读
- android - 无法在 Android Studio 上生成签名包
- python - 最后一次观察一年后的前向填充列
- paypal - 无法执行成功的 Paypal webhook 验证
- javascript - CSS/JavaScript - 用户开始滚动时的滚动捕捉
- php - 在 MacOS 上为 PHPStorm 安装 Xdebug
- pandas - 如何使用 zorder 更改这些图的顺序?
- javascript - 无法读取值为 0 或 null 的未定义 ChartistJs 的属性“_index”
- dictionary - 从 TCL 中的嵌套字典访问值
- node.js - 无服务器部署错误L 环境变量iamRoleStatements 必须包含字符串
- c# - 生物识别验证匹配卡