Aws-lambda-dotnet: No se puede conectar a MongoDB Atlas

Creado en 16 mar. 2018  ·  24Comentarios  ·  Fuente: aws/aws-lambda-dotnet

Escribí una WebAPI simple de AWS Serverless ASP Net Core 2.0
Esto se conecta a una base de datos Atlas de MongoDB. Pero no está funcionando. Está dando tiempo de espera.
Pruebo localmente y funciona. Publico en Azure it Works.

Sospecho que esto es causado por el firewall de AWS CloudFormation.

Cuando publico en AWS Serverless, aparece un error:

502 Puerta de enlace no válida

{
"mensaje": "Error interno del servidor"
}

Revisé los registros

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" }] }.

¿Cómo depurar y resolver esto?

Mi plantilla sin servicio

{
  "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

Comentario más útil

Aquí igual. Intentando ejecutar una lambda en AWS para conectarse a través de una IP pública al nivel gratuito. No funciona. Parece que lambda está ejecutando mi función en Linux.

Todos 24 comentarios

@TonyHenrique , parece que el rol que está ejecutando su lambda si está configurado en no tiene acceso a los recursos de su base de datos, ya que el rol es nulo en su plantilla sin servidor, lo genera aleatoriamente. Deberá ir a IAM y cambiar la política para tener acceso a Mongodb. Asegúrese también de configurar lambda en la VPC correcta.

Revisé IAM y no pude encontrar una opción de MongoDB en los servicios, ¿hay alguna publicación de blog que muestre cómo conectarse a MongoDB Atlas desde AWS Lambda ASP Net Core 2.0?

¿O cómo puedo editar este archivo para permitir esta conexión saliente?

@TonyHenrique No estoy seguro en MongoDB (tal vez una conexión a Internet saliente) pero esencialmente para Dynamo, simplemente daría dynamoDb: * para acceder a todos los recursos de dynamo.

Por el momento, la aplicación Data ya estaba desarrollada en Mongo DB,
y necesita acceder al puerto 27017 en * .mongodb.net

@TonyHenrique, ¿ puede verificar si lambda tiene conexión a Internet saliente y luego quizás mirar el tráfico entrante en mongodb?

Publiqué el mismo proyecto en Azure y funciona.
En AWS, parece que el firewall está bloqueado.

¿Cómo habilitar la dirección / puertos en el firewall para poder conectarme a Mongo Atlas?

¿Están la función lambda y la base de datos mongo alojadas en vpc o ambas en EC2 classic?

No. Publiqué ASP Net Core en AWS Lambda,
pero MongoDB está alojado en Mongo Atlas Service (https://www.mongodb.com/cloud/atlas)

Entonces mi ASP NET necesita acceder
puerto 27017 en * .mongodb.net

¿Cómo puedo editar My serveless.template para permitir esta conexión saliente?

¿Está su lambda en un vpc sin acceso a Internet? ¿Puedes acceder a www.google.com?

Nunca probé el atlas de Mongo.

@TonyHenrique parece un problema de cadena de conexión, pero le pedí a un miembro del equipo que lo confirme

@TonyHenrique Confirmo que parece un problema de cadena de conexión. ¿Dónde lo configuró en su código y, lo que es más importante, qué valor le asignó? (debe enmascarar las credenciales de autenticación en esa cadena de conexión si planea pegarla aquí).

El "Unspecified/cluster0-shard-00-00-3lmjx.mongodb.net:27017" es la bandera roja aquí, por lo que tendríamos que saber de dónde está recuperando esta información su función Lambda. Le sugiero que me envíe un ping directamente en Slack después de unirse a nuestra Red comunitaria de Slack en https://community-slack.mongodb.com

La conexión no contiene ese "Sin especificar"

Aparece solo en un error de AWS. También sé que no es una conexión incorrecta, porque funciona localmente y también en Azure. Solo en AWS aparece este error.

El error es un error de tiempo de espera. Parece un problema de firewall.

@TonyHenrique te recomienda ir al slack @rlondner mencionado o abrir una jira con el soporte de MongoDB https://jira.mongodb.org

¿Abriste la lista blanca para tu conexión lambda en Atlas?

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

No es un problema de MongoDB, funciona bien en Azure y Local.
La conexión solo se bloquea cuando se inicia desde AWS Lambda.

También verifiqué la lista blanca de IP de MongoDB:

0.0.0.0/0 (includes your current IP address)

image

@TonyHenrique definitivamente únete a la holgura, veremos si podemos ayudarte.

Noté en los documentos de Mongo DB que dice que para el controlador C # en .NET Core no se puede conectar al nivel gratuito y un par de otras configuraciones de clúster en Linux. Lambda es un entorno Linux, ¿podría ser ese el problema?

image

Cierre por falta de actividad

¿Hubo alguna vez una solución @normj @jaydestro ? Me estoy encontrando con este problema en este momento.

Aquí igual. Intentando ejecutar una lambda en AWS para conectarse a través de una IP pública al nivel gratuito. No funciona. Parece que lambda está ejecutando mi función en Linux.

Sí, también tengo este problema. Una solución estaría bien :-)

Lo mismo ocurre aquí. Todo funcionaba muy bien en Atlas 'Azure, pero cuando migramos a Atlas' AWS el fin de semana pasado, vemos que ocurre el mismo problema.

¿Alguna resolución? Lo mismo aquí: Azure funciona bien, pero AWS devuelve:

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

Y este método de API en particular no usa la base de datos, por lo que eso no es un problema.

Recibí este error.

image

Me di cuenta de que el problema se debía a que no había tráfico saliente de lambda.

Lo modifiqué para que estuviera en la VPC que permitía el tráfico saliente y la conexión a Mongo comenzó a funcionar.

¡Tuve este problema en Azure y lo resolví! Estaba usando el nivel gratuito del atlas de MongoDB.

Incluya la IP en la lista blanca yendo a la consola y escriba: "Curl -o output.txt icanhazip.com" y luego "cat output.txt". Agregue esta entrada a su lista blanca de direcciones IP de Mongolabs.

¿Fue útil esta página
0 / 5 - 0 calificaciones