使用 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详情时,我输入了:
- VPC - 默认 VPC
- 子网 - 选择所有 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 的版本,但它没有帮助。
确保您的 Lambda 函数不在 public 子网中,否则将无法运行。因此,这意味着您需要返回 Lambda 控制台并从 VPC 可编辑部分中删除 public 子网。
确保您有一个专门用于您的 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
- 您的 Lambda 函数需要具有正确的权限,它们是:
- 托管策略 AWSLambdaBasicExecutionRole
- 托管策略 AWSLambdaVPCAccessExecutionRole
完成此操作后,您的 VPC 部分应如下所示:
1.VPC——默认VPC
2. 子网 - 选择 2 个子网(均为私有)
3. Lambda 函数的安全组。不是默认安全组
这应该适合你。如果它不起作用,请告诉我,我会尽力帮助您解决问题。
我正在尝试从 Lambda 函数连接到 DocumentDB。
我已经按照此 tutorial 配置了我的 DocumentDB,并且可以通过 cloud9 命令提示符访问它。
documentDB 集群是两个安全组的一部分。第一个安全组称为 demoDocDB
,第二个称为 default
,是 vpc defulat 安全组。
demoDocDB
的入站规则将请求从 cloud9 实例转发到端口 27017,我的 documentDB 数据库是 运行。
defualt
安全组的入站规则指定所有流量、所有端口范围和其自身的来源。 VPC ID 是默认的 VPC 设置。
在lambda中编辑VPC详情时,我输入了:
- VPC - 默认 VPC
- 子网 - 选择所有 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 的版本,但它没有帮助。
确保您的 Lambda 函数不在 public 子网中,否则将无法运行。因此,这意味着您需要返回 Lambda 控制台并从 VPC 可编辑部分中删除 public 子网。
确保您有一个专门用于您的 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
- 您的 Lambda 函数需要具有正确的权限,它们是:
- 托管策略 AWSLambdaBasicExecutionRole
- 托管策略 AWSLambdaVPCAccessExecutionRole
完成此操作后,您的 VPC 部分应如下所示: 1.VPC——默认VPC 2. 子网 - 选择 2 个子网(均为私有) 3. Lambda 函数的安全组。不是默认安全组
这应该适合你。如果它不起作用,请告诉我,我会尽力帮助您解决问题。