Aws-lambda-dotnet: Не удается подключиться к MongoDB Atlas

Созданный на 16 мар. 2018  ·  24Комментарии  ·  Источник: aws/aws-lambda-dotnet

Я написал простой AWS Serverless ASP Net Core 2.0 WebAPI
Это подключается к базе данных MongoDB Atlas. Но это не работает. Это дает тайм-аут.
Я тестирую локально, и он работает. Публикую в Azure it Works.

Я подозреваю, что это вызвано межсетевым экраном AWS CloudFormation.

Когда я публикую в 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" }] }.

Как отладить и решить это?

Мой serveless.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 для подключения через общедоступный IP-адрес к бесплатному уровню. Не работает. Похоже, лямбда запускает мою функцию в Linux.

Все 24 Комментарий

@TonyHenrique , это похоже на роль, которую выполняет ваша лямбда, если для нее установлено значение, не имеющее доступа к ресурсам вашей базы данных, поскольку роль в бессерверном шаблоне yoir равна нулю, она генерирует ее случайным образом. Вам нужно будет перейти в IAM и изменить политику, чтобы иметь доступ к Mongodb. Также убедитесь, что вы устанавливаете лямбда-выражение на правильный VPC.

Я проверил IAM и не смог найти опцию MongoDB в сервисах. Есть ли запись в блоге, показывающая, как подключиться к MongoDB Atlas из AWS Lambda ASP Net Core 2.0?

Или как я могу отредактировать этот файл, чтобы разрешить исходящее соединение?

@TonyHenrique Не уверен в MongoDB (возможно, исходящее интернет-соединение), но, по сути, для Dynamo вы бы просто дали DynamoDb: * для доступа ко всем ресурсам для Dynamo.

На данный момент приложение Data уже было разработано на Mongo DB,
и необходимо получить доступ к порту 27017 на * .mongodb.net

@TonyHenrique, можете ли вы проверить, есть ли у лямбда исходящее интернет-соединение, а затем, возможно, изучить входящий трафик на mongodb?

Я опубликовал тот же проект в Azure, и он работает.
На AWS похоже, что брандмауэр заблокирован.

Как включить адрес / порты в брандмауэре, чтобы я мог подключиться к Mongo Atlas?

Являются ли лямбда-функция и база данных mongo как в vpc, так и в классическом EC2?

Нет. Я опубликовал ASP Net Core для AWS Lambda,
но MongoDB размещается в службе Mongo Atlas (https://www.mongodb.com/cloud/atlas)

Итак, моя ASP NET требует доступа
порт 27017 на * .mongodb.net

Как я могу отредактировать My serveless.template, чтобы разрешить это исходящее соединение?

Ваша лямбда находится в vpc без доступа в Интернет? Можете ли вы попасть на www.google.com?

Я никогда не пробовал атлас монго.

@TonyHenrique, похоже, проблема со строкой подключения, но я попросил члена команды подтвердить

@TonyHenrique Я подтверждаю, что это похоже на проблему со строкой подключения. Где вы настроили его в своем коде и, что более важно, какое значение вы ему присвоили? (вы должны замаскировать учетные данные аутентификации в этой строке подключения, если вы планируете вставить ее сюда).

Значение "Unspecified/cluster0-shard-00-00-3lmjx.mongodb.net:27017" является красным флажком, поэтому нам нужно знать, откуда ваша лямбда-функция получает эту информацию. Я предлагаю вам связаться со мной напрямую в Slack после того, как вы присоединитесь к нашей сети сообщества Slack по адресу https://community-slack.mongodb.com.

Соединение не содержит этого "Не указано"

Появляется только при ошибке AWS. Также я знаю, что это не неправильное подключение, потому что оно работает локально, а также в Azure. Только на AWS эта ошибка появляется.

Ошибка является ошибкой тайм-аута. Похоже, проблема с брандмауэром.

@TonyHenrique рекомендует вам перейти на упомянутый Slack @rlondner или открыть jira с поддержкой MongoDB https://jira.mongodb.org

Вы открыли белый список для своего лямбда-соединения в Atlas?

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

Это не проблема MongoDB, она отлично работает в Azure и локально.
Подключение блокируется только при запуске из AWS Lambda.

Я также проверил белый список IP-адресов MongoDB:

0.0.0.0/0 (includes your current IP address)

image

@TonyHenrique def присоединяйтесь к

В документах Mongo DB я заметил, что для драйвера C # в .NET Core он не может подключиться к бесплатному уровню и нескольким другим конфигурациям кластера в Linux. Lambda - это среда Linux, может быть, в этом проблема?

image

Закрытие из-за отсутствия активности

Было ли когда-нибудь решение @normj @jaydestro ? Я столкнулся с этой проблемой прямо сейчас.

То же самое. Попытка запустить лямбда-выражение в AWS для подключения через общедоступный IP-адрес к бесплатному уровню. Не работает. Похоже, лямбда запускает мою функцию в Linux.

Да, у меня тоже возникает эта проблема. Исправить было бы неплохо :-)

То же и здесь. В Azure Atlas все работало отлично, но когда мы в минувшие выходные перешли на AWS Atlas, мы наблюдали ту же проблему.

Любое разрешение? То же самое и здесь - Azure работает нормально, но возвращает AWS:

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

И этот конкретный метод api не использует базу данных, так что это не проблема.

Я получал эту ошибку.

image

Я понял, что проблема связана с отсутствием исходящего трафика от лямбды.

Я изменил его так, чтобы он находился в VPC, который разрешал исходящий трафик, и соединение с Mongo начало работать.

У меня была эта проблема в Azure, и я ее решил! Я использовал бесплатный уровень атласа MongoDB.

Внесите IP-адрес в белый список, перейдя в консоль и набрав: «Curl -o output.txt icanhazip.com», затем «cat output.txt». Добавьте эту запись в белый список IP-адресов Mongolabs.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги