使用 Python 从 AWS Lambda 连接到 DocumentDB
问题:使用 Python 从 AWS Lambda 连接到 DocumentDB
我正在尝试从 Lambda 函数连接到 DocumentDB。
我已经按照这个教程配置了我的 DocumentDB,并且可以通过 cloud9 命令提示符访问它。
documentDB 集群是两个安全组的一部分。第一个安全组称为demoDocDB,第二个称为default,是 vpc defulat 安全组。
demoDocDB的入站规则将来自 cloud9 实例的请求转发到我的 documentDB 数据库运行的端口 27017。
defualt安全组的入站规则指定所有流量、所有端口范围和自身的来源。 VPC ID 是默认的 VPC 设置。
在 lambda 中编辑 VPC 详细信息时,我输入了:
-
VPC - 默认 VPC
-
子网 - 选择所有可用的 3 个子网
-
安全组 - VPC 的
default安全组
该函数在写入数据库时工作了两次,其余时间超时,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()
我已经尝试更改 pymongo 的版本,因为这个线程建议但是它没有帮助。
解答
-
确保您的 Lambda 函数不在公有子网中,否则将无法正常工作。因此,这意味着您需要返回 Lambda 控制台并从 VPC 可编辑部分中删除公有子网。
-
确保您有一个专门针对您的 Lambda 函数的安全组,如下所示:
Lambda 安全组出站规则:
Type Protocol Port Range Destination
All Traffic All All 0.0.0.0/0
如果您愿意,您还可以将其限制为端口 80/443 上的 HTTP/HTTPS。
2.检查您的 DocumentDB Cluster 的安全组,看看它是否设置了入站规则,如下所示:
Type Protocol Port Range Source
Custom TCP TCP 27017 Lambda Security Group
-
您的 Lambda 函数需要具有正确的权限,即:
-
托管策略 AWSLambdaBasicExecutionRole
-
托管策略 AWSLambdaVPCAccessExecutionRole
完成此操作后,您的 VPC 部分应如下所示: 1. VPC - 默认 VPC 2. 子网 - 选择 2 个子网(均为私有) 3. Lambda 函数的安全组。不是默认安全组
那应该为你做。如果它不起作用,请告诉我,我会尽力帮助您解决问题。
更多推荐
所有评论(0)