使用Python从AWS Lambda连接到DocumentDB

使用Python从AWS Lambda连接到DocumentDB,python,mongodb,aws-lambda,pymongo,aws-documentdb,Python,Mongodb,Aws Lambda,Pymongo,Aws Documentdb,我正在尝试从Lambda函数连接到DocumentDB 我已经按照此配置了DocumentDB,可以通过cloud9命令提示符访问它 documentDB集群是两个安全组的一部分。第一个安全组称为demoDocDB,第二个安全组称为default,是vpc defulat安全组 demoDocDB的入站规则将请求从cloud9实例转发到运行my documentDB数据库的端口27017 defualt安全组的入站规则指定所有通信量、所有端口范围和自身的源。VPC ID是默认的VPC设置 在la

我正在尝试从Lambda函数连接到DocumentDB

我已经按照此配置了DocumentDB,可以通过cloud9命令提示符访问它

documentDB集群是两个安全组的一部分。第一个安全组称为
demoDocDB
,第二个安全组称为
default
,是vpc defulat安全组

demoDocDB
的入站规则将请求从cloud9实例转发到运行my documentDB数据库的端口27017

defualt
安全组的入站规则指定所有通信量、所有端口范围和自身的源。VPC ID是默认的VPC设置

在lambda中编辑VPC详细信息时,我输入了:

  • 专有网络-解散专有网络
  • 子网-选择所有可用的3个子网
  • 安全组-专有网络的
    默认
    安全组
  • 该函数在向数据库写入时已工作了两次,其余时间已超时,Lambda函数的超时时间为2分钟,但在达到该时间之前,它将抛出超时错误

    [ERROR] ServerSelectionTimeoutError: MY_DATABASE_URL:27017: [Errno -2] Name or service not known
    
    下面的代码片段是要执行的,函数永远不会到达
    打印(“插入的数据”)
    它在insert语句中超时

    def getDBConnection():
        client = pymongo.MongoClient(***MY_URL***) 
    
        ##Specify the database to be used
        db = client.test
        print("GOT CONNECTION",db)
    
        ##Specify the collection to be used
        col = db.myTestCollection
        print("GOT COL",col)
    
        ##Insert a single document
        col.insert_one({'hello':'Amazon DocumentDB'})
        print("INSERTED DATA")
    
        ##Find the document that was previously written
        x = col.find_one({'hello':'Amazon DocumentDB'})
    
        ##Print the result to the screen
        print("RETRIEVED DATA",x)
    
        ##Close the connection
        client.close()
    
    
    我已经尝试过改变pymongo的版本,但是没有帮助

  • 确保Lambda函数不在公共子网中,否则它将无法工作。因此,这意味着您需要返回Lambda控制台,并从VPC可编辑部分删除公共子网

  • 确保您有专门用于Lambda函数的安全组,如下所示:

    Type            Protocol      Port Range       Source
    Custom TCP      TCP           27017            Lambda Security Group
    
  • Lambda安全组出站规则:

    Type            Protocol      Port Range       Destination
    All Traffic     All           All              0.0.0.0/0
    
    如果愿意,还可以将此限制为端口80/443上的HTTP/HTTPS

    2.检查DocumentDB群集的安全组,查看其是否设置了入站规则,如下所示:

    Type            Protocol      Port Range       Source
    Custom TCP      TCP           27017            Lambda Security Group
    
  • 您的Lambda函数需要具有正确的权限,这些权限是:
  • 托管策略AWSLambdaBasicExecutionRole
  • 托管策略AWSLambdaVPCAccessExecutionRole
  • 完成此操作后,VPC部分应如下所示: 1.专有网络-默认专有网络 2.子网-选择2个子网(均为专用) 3.Lambda函数的安全组。不是默认的安全组


    这应该对你有好处。如果它不起作用,请告诉我,我将尝试帮助您排除故障。

    嘿,谢谢您的回复,不幸的是服务器仍然超时。我如何知道子网是否是私有的?没有任何指示?我也尝试过这样做,但没有运气好,所以您的路由表中有正确的路由,并且您遵循了IGW和NATGW。此外,您还可以通过从Lambda控制台复制子网ID,然后转到VPC控制台中的子网部分来检查子网。但是,如果在创建子网时未命名/标记子网,则必须检查路由表。如果是这种情况,则公共子网将与包含IGW的路由表关联,而私有子网将与NATGW关联。已经存在一个已解除的路由表,并将其标记为VPC的
    Main
    ,其中有0.0.0.0/0目标和目标IGW,但没有子网关联。您是否更改了默认的路由表,还是像那个教程中那样不使用它,而是创建了两个新的路由表?没有,只是根据我从AWS工作中获得的知识从头开始构建了所有内容。我没有学习任何教程或类似的内容。我认为你的问题出在人际网络的某个地方。我现在正在做一个项目,从API中提取数据,利用DocumentDB作为数据存储并记录所有数据。因此,当我完成后,我将以这种方式在这里发布链接,如果您仍然无法使自己的工作正常,您可以查看我所做的并复制它。应该在星期天之前完成。让我知道如果你明白了这个问题,我会在这里发表评论,如果我想到其他任何事情