我试图通过触发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本地启动api”
首先是我的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
不幸的是,在运行时,如果我碰到触发此方法的endpoint,我会得到一个像这样记录的超时
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的调用,那么打印方法将被成功html" target="_blank">调用。
我在Stack Overflow上看到过类似的问题,比如这个lambda python Dynamodb写得到超时错误,说明问题是我使用的是本地数据库,但是如果我把它指向我的本地数据库,我不应该仍然能够用boto3写到本地数据库本地运行的Dynamodb实例?
在这里找到了问题的解决方案:将AWS SAM Local与docker中的dynamodb连接提问者注意到,他在网上看到,他可能需要使用以下方式连接到同一docker网络:
docker网络创建lambda本地
因此,创建了此网络,然后更新了我的sam命令和docker命令以使用此网络,如下所示:
docker-run——名称dynamodb-p8000:8000——网络=本地lambda-amazon/dynamodb-local
sam本地启动api——docker网络本地lambda
此后,我不再遇到超时问题。我仍在努力弄清楚这到底是为什么
不过,公平地说,使用dynamodb容器名称作为bot3资源调用的主机也很重要。因此,最终,正是上述解决方案和“Reto Aebersold”提供的答案的组合创造了最终解决方案
dynamodb=boto3.resource('dynamodb',endpoint_url=“http://
运行Lambda函数的Docker容器无法到达位于127.0.0.1
的DynamoDB。请尝试使用DynamoDB本地docker容器的名称作为endpoint的主机名:
dynamodb = boto3.resource('dynamodb', endpoint_url="http://<DynamoDB_LOCAL_NAME>:8000")
您可以使用docker ps
查找
docker run --name dynamodb amazon/dynamodb-local
然后连接:
dynamodb = boto3.resource('dynamodb', endpoint_url="http://dynamodb:8000")
尽管Amazon提供了关于如何使用Java、PHP和.Net连接到dynamoDB local的文档,但没有描述如何使用Python连接到localhost:8000。web上的现有文档指向在boto.dynamodb2.layer1中使用dynamoDB连接方法,但这会在使用boto3协议管理dynamoDB的实时和测试环境之间造成不兼容。 在boto3中,您可以使用以下构造函数和设置到环境中的
我已经使用aws sam local设置了一个api网关/aws lambda对,并确认运行后可以成功调用它 sam本地启动api 然后,我在docker容器中添加了一个本地Dynamodb实例,并使用aws cli在其上创建了一个表 但是,在将代码添加到lambda以写入我收到的Dynamodb实例之后: 2018-02-22T11:13:16.172Z ed9ab38e-fb54-18a4-0
我已经在本地运行了DynamoDB,并使用shell(localhost:8000/shell/)创建了一个表。 [Mon Decc 14 11:22:48.266930 2015][:错误][pid 12][client 10.0.2.2:58042]PHP致命错误:未捕获AWS\DynamODB\Exception\ResourceNotFoundException:AWS错误代码:Resou
我正在着手建立一个非常简单的全堆栈web应用程序,可以处理用户注册和登录。为此,我使用作为本地数据库来存储用户注册后的信息。这是工作了很长一段时间,但我最近运行了我的应用程序,在一个星期后,它发生了这样的事情: 作为参考,这是我的文件的一个非常精简的版本: 这是我的: 非常简单,而且,一周前工作得很好。有人知道这是怎么回事吗?谢谢你的回答!
我正在使用DynamoDB local进行单元测试。这并不坏,但也有一些缺点。明确地: 在测试运行之前,您必须以某种方式启动服务器 服务器在每次测试之前不会启动和停止,因此测试会变得相互依赖,除非在每次测试之后添加代码删除所有表等 所有开发者都需要安装它 我想做的是把DynamoDB本地jar和它所依赖的其他jar放在我的目录中(我用Java写)。然后在每次测试之前,我会启动它,用运行,测试结束后
我创建了“快速启动:Web后端”AWS SAM项目,其中包含一个使用的DynamoDB表。 按照自述文件中的说明,当我尝试构建并调用引用Dynamo表的lambda函数时: 我得到一个错误: 示例项目包含3个lambda函数,它们调用DynamoDb后端(为清晰起见进行了修剪): 我的假设是DynamoDB表不是在AWS测试docker容器中本地创建的。在本地测试DynamoDB时,是否还缺少其他