在 aws lambda 中通过 pymongo 连接 documentdb 时任务超时
Task timed out when connecting documentdb through pymongo in aws lambda
我正在尝试从 AWS 文档数据库集群中获取我的预订集合。我使用 AWS Secret Manager 维护凭证并将它们传递给连接。但是,它给了我 900 秒的任务超时错误。 (我将时间限制增加到 15 分钟,因为它在更短的时间内给出了相同的错误)
错误是这样的:
{
"errorMessage": "2021-08-19T09:05:22.872Z a96e95cb-4c42-4880-b339-9cb29e83c1ec Task timed out after 900.10 seconds"
}
代码片段:
def lambda_handler(event, context):
db = create_mongo_connection()
print(db)
print("aaaaa") # this gets printed -- debugging
bookings = db.bookings.find({}) # bookings collection not fetched
print("bbbbb") # this does not get printed -- debugging
#configuration settings maintained in environment variables
mongoconfig = os.environ['mongoconfig']
def create_mongo_connection():
try :
secretsmanager = get_secret()
SecretString = json.loads(secretsmanager)
username = SecretString['username']
password = SecretString['password']
host = SecretString['host']
port = SecretString['port']
mongoclient = MongoClient(host, port, username=username, password=password,
authSource='admin', ssl_ca_certs='rds-combined-ca-bundle.pem',retryWrites='false')
dbname = mongoconfig['db_name']
print(dbname)
return mongoclient[dbname]
except Exception as e:
print("Exception : ", e, "\nTraceback : ", format_exc())
Secrets Manager 的 API 端点存在于 Internet 上。听起来 Lambda 函数无法访问互联网。
当 AWS Lambda 函数连接到 VPC 时,它可以访问 VPC 中的资源。但是,要访问互联网:
- Lambda 函数 必须在私有子网中,和
- NAT 网关 必须在 public 子网中
如果 Lambda 函数不需要访问 VPC 中的资源,则只需断开 Lambda 函数与 VPC 的连接,然后它将自动获得 Internet 访问权限。
还有另一种选择,即 Use Secrets Manager with VPC endpoints - AWS Secrets Manager,它会在 VPC 和 Secrets Manager 之间创建隧道。
我正在尝试从 AWS 文档数据库集群中获取我的预订集合。我使用 AWS Secret Manager 维护凭证并将它们传递给连接。但是,它给了我 900 秒的任务超时错误。 (我将时间限制增加到 15 分钟,因为它在更短的时间内给出了相同的错误)
错误是这样的:
{ "errorMessage": "2021-08-19T09:05:22.872Z a96e95cb-4c42-4880-b339-9cb29e83c1ec Task timed out after 900.10 seconds" }
代码片段:
def lambda_handler(event, context):
db = create_mongo_connection()
print(db)
print("aaaaa") # this gets printed -- debugging
bookings = db.bookings.find({}) # bookings collection not fetched
print("bbbbb") # this does not get printed -- debugging
#configuration settings maintained in environment variables
mongoconfig = os.environ['mongoconfig']
def create_mongo_connection():
try :
secretsmanager = get_secret()
SecretString = json.loads(secretsmanager)
username = SecretString['username']
password = SecretString['password']
host = SecretString['host']
port = SecretString['port']
mongoclient = MongoClient(host, port, username=username, password=password,
authSource='admin', ssl_ca_certs='rds-combined-ca-bundle.pem',retryWrites='false')
dbname = mongoconfig['db_name']
print(dbname)
return mongoclient[dbname]
except Exception as e:
print("Exception : ", e, "\nTraceback : ", format_exc())
Secrets Manager 的 API 端点存在于 Internet 上。听起来 Lambda 函数无法访问互联网。
当 AWS Lambda 函数连接到 VPC 时,它可以访问 VPC 中的资源。但是,要访问互联网:
- Lambda 函数 必须在私有子网中,和
- NAT 网关 必须在 public 子网中
如果 Lambda 函数不需要访问 VPC 中的资源,则只需断开 Lambda 函数与 VPC 的连接,然后它将自动获得 Internet 访问权限。
还有另一种选择,即 Use Secrets Manager with VPC endpoints - AWS Secrets Manager,它会在 VPC 和 Secrets Manager 之间创建隧道。