当前位置: 首页 > 知识库问答 >
问题:

将Python boto3超时到本地DynamoDB表

魏英勋
2023-03-14

我试图通过触发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实例?

共有2个答案

邬安邦
2023-03-14

在这里找到了问题的解决方案:将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://

晏炳
2023-03-14

运行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写)。然后在每次测试之前,我会启动它,用运行,测试结束后

  • 我在完成,以下是我尝试过的: 以下是我得到的: 这就解决了问题: