使用 Python 从 AWS Lambda 连接到 DocumentDB

Connecting to DocumentDB from AWS Lambda using Python

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

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

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

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

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

在lambda中编辑VPC详情时,我输入了:

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

函数写入数据库两次,其余时间超时,Lambda函数超时为2分钟,但在到达之前会抛出超时错误。

[ERROR] ServerSelectionTimeoutError: MY_DATABASE_URL:27017: [Errno -2] Name or service not known

下面的代码片段是试图执行的代码,该函数永远不会到达 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()

我已经尝试按照 thread 的建议更改 pymongo 的版本,但它没有帮助。

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

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

Lambda 安全组出站规则:

Type            Protocol      Port Range       Destination
All Traffic     All           All              0.0.0.0/0

如果您愿意,您也可以在端口 80/443 上将此限制为 HTTP/HTTPS。

2.Check你的DocumentDB集群的Security Group看是否设置了入站规则如下:

Type            Protocol      Port Range       Source
Custom TCP      TCP           27017            Lambda Security Group
  1. 您的 Lambda 函数需要具有正确的权限,它们是:
    1. 托管策略 AWSLambdaBasicExecutionRole
    2. 托管策略 AWSLambdaVPCAccessExecutionRole

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

这应该适合你。如果它不起作用,请告诉我,我会尽力帮助您解决问题。