Aws-lambda-dotnet: 无法连接到 MongoDB Atlas

创建于 2018-03-16  ·  24评论  ·  资料来源: aws/aws-lambda-dotnet

我写了一个简单的 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" } ] }
    }
  }
}
guidance

最有用的评论

同样在这里。 尝试在 AWS 中运行 lambda 以通过公共 IP 连接到免费层。 不起作用。 看起来 lambda 正在 linux 上运行我的函数。

所有24条评论

@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 连接打开了白名单?

https://docs.atlas.mongodb.com/security-whitelist/

这不是 MongoDB 问题,它在 Azure 和本地上运行良好。
只有在从 AWS Lambda 启动时才会阻止连接。

我还检查了 MongoDB IP 白名单:

0.0.0.0/0 (includes your current IP address)

image

@TonyHenrique def 加入松懈 - 我们会看看我们是否可以与您交谈。

我在 Mongo DB 文档中注意到,它说 .NET Core 上的 C# 驱动程序无法连接到 Linux 中的免费层和其他几个集群配置。 Lambda 是一个 Linux 环境,所以这可能是问题所在吗?

image

因缺乏活动而关闭

有没有解决方案@normj @jaydestro ? 我现在正在遇到这个问题。

同样在这里。 尝试在 AWS 中运行 lambda 以通过公共 IP 连接到免费层。 不起作用。 看起来 lambda 正在 linux 上运行我的函数。

是的,我也遇到这个问题。 修复会很好:-)

同上。 在 Atlas 的 Azure 上一切正常,但是当我们在上周末迁移到 Atlas 的 AWS 时,我们看到了同样的问题发生。

任何决议? 同样的事情——Azure 工作正常,但 AWS 返回:

502 Bad Gateway { "message": "Internal server error" }

而且这个特定的 api 方法不使用数据库,所以这不是问题。

我收到这个错误。

image

我意识到这个问题是因为没有来自 lambda 的出站流量。

我将它修改为在允许出站流量的 VPC 中,并且与 Mongo 的连接开始工作。

我在 Azure 中遇到了这个问题,我解决了! 我正在使用 MongoDB 图集的免费层。

通过转到控制台并键入:“Curl -o output.txt icanhazip.com”然后键入“cat output.txt”,将 IP 列入白名单。 将此条目添加到您的 Mongolabs IP 地址白名单。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

pandaedward picture pandaedward  ·  6评论

briancullinan picture briancullinan  ·  7评论

ghost picture ghost  ·  3评论

Kralizek picture Kralizek  ·  3评论

jakejscott picture jakejscott  ·  6评论