使用 Python 从 AWS Lambda 连接到 DocumentDB

WK1*_*123 2 python mongodb pymongo aws-lambda aws-documentdb

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

我已经按照本教程配置了 DocumentDB ,并且可以通过 cloud9 命令提示符访问它。

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

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

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

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

  1. VPC - 默认 VPC
  2. 子网 - 选择所有 3 个可用子网
  3. 安全组 - defaultVPC 的安全组

该函数在写入数据库时​​工作了两次,其余时间都超时了,Lambda 函数的超时时间为 2 分钟,但在达到该超时时间之前,它将抛出超时错误。

[ERROR] ServerSelectionTimeoutError: MY_DATABASE_URL:27017: [Errno -2] Name or service not known
Run Code Online (Sandbox Code Playgroud)

下面的代码片段是尝试执行的代码,该函数永远不会print("INSERTED DATA")在插入语句期间达到超时。

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()

Run Code Online (Sandbox Code Playgroud)

我尝试按照该线程的建议更改 pymongo 的版本,但没有帮助。

小智 7

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

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

Lambda 安全组出站规则:

Type            Protocol      Port Range       Destination
All Traffic     All           All              0.0.0.0/0
Run Code Online (Sandbox Code Playgroud)

如果您愿意,还可以将其限制为端口 80/443 上的 HTTP/HTTPS。

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

Type            Protocol      Port Range       Source
Custom TCP      TCP           27017            Lambda Security Group
Run Code Online (Sandbox Code Playgroud)
  1. 您的 Lambda 函数需要具有正确的权限,这些权限是:
    1. 托管策略 AWSLambdaBasicExecutionRole
    2. 托管策略 AWSLambdaVPCAccessExecutionRole

执行此操作后,您的 VPC 部分应如下所示: 1. VPC - 默认 VPC 2. 子网 - 选择 2 个子网(均为私有) 3. Lambda 函数的安全组。不是默认安全组

这应该适合你。如果它不起作用,请告诉我,我会尽力帮助您排除故障。