我写了一个简单的 AWS Serverless ASP Net Core 2.0 WebAPI
这将连接到 MongoDB Atlas 数据库。 但它不起作用。 它正在超时。
我在本地测试,它有效。 我发布到 Azure it Works。
我怀疑这是由 AWS CloudFormation firewall 引起的。
当我发布到 AWS Serverless 时,它给出了错误:
502错误的网关
{
"message": "内部服务器错误"
}
我检查了日志,
Unhandled Exception: System.TimeoutException: A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "ReplicaSet", Type : "ReplicaSet", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/cluster0-shard-00-00-3lmjx.mongodb.net:27017" }", EndPoint: "Unspecified/cluster0-shard-00-00-3lmjq.mongodb.net:27017", State: "Disconnected", Type: "Unknown" }, { ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/cluster0-shard-00-01-3lmjx.mongodb.net:27017" }", EndPoint: "Unspecified/cluster0-shard-00-01-3lmjx.mongodb.net:27017", State: "Disconnected", Type: "Unknown" }, { ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/cluster0-shard-00-02-3lmjq.mongodb.net:27017" }", EndPoint: "Unspecified/cluster0-shard-00-02-3lmjq.mongodb.net:27017", State: "Disconnected", Type: "Unknown" }] }.
如何调试和解决这个问题?
我的 serverless.template
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Transform" : "AWS::Serverless-2016-10-31",
"Description" : "An AWS Serverless Application that uses the ASP.NET Core framework running in Amazon Lambda.",
"Parameters" : {
"ShouldCreateBucket" : {
"Type" : "String",
"AllowedValues" : ["true", "false"],
"Description" : "If true then the S3 bucket that will be proxied will be created with the CloudFormation stack."
},
"BucketName" : {
"Type" : "String",
"Description" : "Name of S3 bucket that will be proxied. If left blank a new table will be created.",
"MinLength" : "0"
}
},
"Conditions" : {
"CreateS3Bucket" : {"Fn::Equals" : [{"Ref" : "ShouldCreateBucket"}, "true"]},
"BucketNameGenerated" : {"Fn::Equals" : [{"Ref" : "BucketName"}, ""]}
},
"Resources" : {
"ProxyFunction" : {
"Type" : "AWS::Serverless::Function",
"Properties": {
"Handler": "AWSServerless1::AWSServerless1.LambdaEntryPoint::FunctionHandlerAsync",
"Runtime": "dotnetcore2.0",
"CodeUri": "",
"MemorySize": 256,
"Timeout": 30,
"Role": null,
"Policies": [ "AWSLambdaFullAccess" ],
"Environment" : {
"Variables" : {
"AppS3Bucket" : { "Fn::If" : ["CreateS3Bucket", {"Ref":"Bucket"}, { "Ref" : "BucketName" } ] }
}
},
"Events": {
"PutResource": {
"Type": "Api",
"Properties": {
"Path": "/{proxy+}",
"Method": "ANY"
}
}
}
}
},
"Bucket" : {
"Type" : "AWS::S3::Bucket",
"Condition" : "CreateS3Bucket",
"Properties" : {
"BucketName" : { "Fn::If" : ["BucketNameGenerated", {"Ref" : "AWS::NoValue" }, { "Ref" : "BucketName" } ] }
}
}
},
"Outputs" : {
"S3ProxyBucket" : {
"Value" : { "Fn::If" : ["CreateS3Bucket", {"Ref":"Bucket"}, { "Ref" : "BucketName" } ] }
}
}
}
@TonyHenrique ,如果您的 lambda 设置为无法访问您的数据库资源,这似乎是您的 lambda 正在运行的角色,因为角色在您的无服务器模板中为 null,它会随机生成它。 您需要转到 IAM 并更改策略以访问 Mongodb,同时确保将 lambda 设置为正确的 VPC。
我检查了 IAM,但在服务中找不到 MongoDB 选项,是否有一篇博客文章展示了如何从 AWS Lambda ASP Net Core 2.0 连接到 MongoDB Atlas?
或者如何编辑此文件以允许此传出连接?
@TonyHenrique不确定 MongoDB(可能是出站互联网连接),但基本上对于 Dynamo,您只需提供 dynamoDb: * 即可访问 dynamo 的所有资源。
目前已经在 Mongo DB 上开发了应用程序 Data,
并且需要访问 *.mongodb.net 上的端口 27017
@TonyHenrique您能否验证 lambda 是否具有出站互联网连接,然后可能会查看到 mongodb 的传入流量?
我将相同的项目发布到 Azure 并且它有效。
在 AWS 上,它似乎被防火墙阻止。
如何在防火墙上启用地址/端口,以便我可以连接到 Mongo Atlas?
lambda 函数和 mongo 数据库是同时托管在 vpc 中还是同时托管在 EC2 classic 中?
不。我将 ASP Net Core 发布到 AWS Lambda,
但是 MongoDB 托管在 Mongo Atlas Service (https://www.mongodb.com/cloud/atlas) 上
所以我的 ASP NET 需要访问
*.mongodb.net 上的端口 27017
如何编辑 My serveless.template 以允许此传出连接?
你的 lambda 是在没有互联网访问的 vpc 中吗? 你能访问www.google.com 吗?
我从未尝试过 mongo atlas。
@TonyHenrique看起来像是连接字符串问题,但我已要求团队成员确认
@TonyHenrique我确认它看起来像一个连接字符串问题。 您在代码中在哪里配置它,更重要的是,您为它分配了哪个值? (如果您打算将其粘贴到此处,则应屏蔽该连接字符串中的身份验证凭据)。
"Unspecified/cluster0-shard-00-00-3lmjx.mongodb.net:27017"
值是此处的危险信号,因此我们必须知道您的 Lambda 函数从何处检索此信息。 我建议您在加入我们的社区 Slack 网络后直接在 Slack 上 ping 我,网址为
该连接不包含“未指定”
它仅出现在 AWS 错误上。 我也知道这不是错误的连接,因为它可以在本地工作,也可以在 Azure 上工作。 仅在 AWS 上会出现此错误。
该错误是超时错误。 看起来像是防火墙问题。
@TonyHenrique建议您使用提到的https://jira.mongodb.org
您是否在 Atlas 中为您的 lambda 连接打开了白名单?
这不是 MongoDB 问题,它在 Azure 和本地上运行良好。
只有在从 AWS Lambda 启动时才会阻止连接。
我还检查了 MongoDB IP 白名单:
0.0.0.0/0 (includes your current IP address)
@TonyHenrique def 加入松懈 - 我们会看看我们是否可以与您交谈。
我在 Mongo DB 文档中注意到,它说 .NET Core 上的 C# 驱动程序无法连接到 Linux 中的免费层和其他几个集群配置。 Lambda 是一个 Linux 环境,所以这可能是问题所在吗?
因缺乏活动而关闭
有没有解决方案@normj @jaydestro ? 我现在正在遇到这个问题。
同样在这里。 尝试在 AWS 中运行 lambda 以通过公共 IP 连接到免费层。 不起作用。 看起来 lambda 正在 linux 上运行我的函数。
是的,我也遇到这个问题。 修复会很好:-)
同上。 在 Atlas 的 Azure 上一切正常,但是当我们在上周末迁移到 Atlas 的 AWS 时,我们看到了同样的问题发生。
任何决议? 同样的事情——Azure 工作正常,但 AWS 返回:
502 Bad Gateway
{
"message": "Internal server error"
}
而且这个特定的 api 方法不使用数据库,所以这不是问题。
我收到这个错误。
我意识到这个问题是因为没有来自 lambda 的出站流量。
我将它修改为在允许出站流量的 VPC 中,并且与 Mongo 的连接开始工作。
我在 Azure 中遇到了这个问题,我解决了! 我正在使用 MongoDB 图集的免费层。
通过转到控制台并键入:“Curl -o output.txt icanhazip.com”然后键入“cat output.txt”,将 IP 列入白名单。 将此条目添加到您的 Mongolabs IP 地址白名单。
最有用的评论
同样在这里。 尝试在 AWS 中运行 lambda 以通过公共 IP 连接到免费层。 不起作用。 看起来 lambda 正在 linux 上运行我的函数。