Я написал простой 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" } ] }
}
}
}
@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?
Это не проблема MongoDB, она отлично работает в Azure и локально.
Подключение блокируется только при запуске из AWS Lambda.
Я также проверил белый список IP-адресов MongoDB:
0.0.0.0/0 (includes your current IP address)
@TonyHenrique def присоединяйтесь к
В документах Mongo DB я заметил, что для драйвера C # в .NET Core он не может подключиться к бесплатному уровню и нескольким другим конфигурациям кластера в Linux. Lambda - это среда Linux, может быть, в этом проблема?
Закрытие из-за отсутствия активности
Было ли когда-нибудь решение @normj @jaydestro ? Я столкнулся с этой проблемой прямо сейчас.
То же самое. Попытка запустить лямбда-выражение в AWS для подключения через общедоступный IP-адрес к бесплатному уровню. Не работает. Похоже, лямбда запускает мою функцию в Linux.
Да, у меня тоже возникает эта проблема. Исправить было бы неплохо :-)
То же и здесь. В Azure Atlas все работало отлично, но когда мы в минувшие выходные перешли на AWS Atlas, мы наблюдали ту же проблему.
Любое разрешение? То же самое и здесь - Azure работает нормально, но возвращает AWS:
502 Bad Gateway
{
"message": "Internal server error"
}
И этот конкретный метод api не использует базу данных, так что это не проблема.
Я получал эту ошибку.
Я понял, что проблема связана с отсутствием исходящего трафика от лямбды.
Я изменил его так, чтобы он находился в VPC, который разрешал исходящий трафик, и соединение с Mongo начало работать.
У меня была эта проблема в Azure, и я ее решил! Я использовал бесплатный уровень атласа MongoDB.
Внесите IP-адрес в белый список, перейдя в консоль и набрав: «Curl -o output.txt icanhazip.com», затем «cat output.txt». Добавьте эту запись в белый список IP-адресов Mongolabs.
Самый полезный комментарий
То же самое. Попытка запустить лямбда-выражение в AWS для подключения через общедоступный IP-адрес к бесплатному уровню. Не работает. Похоже, лямбда запускает мою функцию в Linux.