簡単なAWSサーバーレスASPNet Core 2.0WebAPIを作成しました
これは、MongoDBAtlasデータベースに接続します。 しかし、それは機能していません。 タイムアウトを与えています。
私はローカルでテストし、それは動作します。 Azure itWorksに公開します。
これはAWSCloudFormationファイアウォールが原因であると思われます。
AWS Serverlessに公開すると、エラーが発生します。
502不正なゲートウェイ
{{
"メッセージ": "内部サーバーエラー"
}
ログを確認しましたが、
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 、これは、ラムダがデータベースリソースにアクセスできない場合に実行しているロールのよう
IAMを確認しましたが、サービスでMongoDBオプションが見つかりませんでした。AWSLambdaASPNet Core2.0からMongoDBAtlasに接続する方法を示すブログ投稿はありますか?
または、このファイルを編集してこの発信接続を許可するにはどうすればよいですか?
@TonyHenrique MongoDB(おそらくアウトバウンドインターネット接続)では
現時点では、アプリケーションデータはすでにMongoDBで開発されています。
* .mongodb.netのポート27017にアクセスする必要があります
@TonyHenriqueラムダにアウトバウンドインターネット接続があるかどうかを確認してから、mongodbへのインバウンドトラフィックを
同じプロジェクトをAzureに公開しましたが、機能します。
AWSでは、ファイアウォールがブロックされているようです。
Mongo Atlasに接続できるように、ファイアウォールでアドレス/ポートを有効にする方法は?
ラムダ関数とmongoデータベースは両方ともvpcでホストされていますか、それとも両方ともEC2クラシックでホストされていますか?
いいえ。ASPNetCoreをAWSLambdaに公開しました。
ただし、MongoDBはMongo Atlas Service(https://www.mongodb.com/cloud/atlas)でホストされています。
したがって、私のASPNETはアクセスする必要があります
* .mongodb.netのポート27017
この発信接続を許可するようにservless.templateを編集するにはどうすればよいですか?
あなたのラムダはインターネットにアクセスできないvpcにありますか? www.google.comにアクセスできます
私はmongoアトラスを試したことがありません。
@TonyHenrique接続文字列の問題のようですが、チームメンバーに確認を依頼しました
@TonyHenrique接続文字列の問題のように見えることを確認しました。 コードのどこで構成しましたか?さらに重要なことに、どの値を割り当てましたか? (ここに貼り付ける場合は、その接続文字列の認証クレデンシャルをマスクする必要があります)。
"Unspecified/cluster0-shard-00-00-3lmjx.mongodb.net:27017"
値はここでは危険信号であるため、Lambda関数がこの情報をどこから取得しているかを知る必要があります。 https://community-slack.mongodb.comのCommunitySlack Networkに参加した後、Slackで直接pingを実行することをお勧めします
接続にその「未指定」が含まれていません
AWSエラーでのみ表示されます。 また、ローカルでもAzureでも機能するため、接続が間違っていないこともわかっています。 AWSでのみ、このエラーが表示されます。
エラーはタイムアウトエラーです。 ファイアウォールの問題のようです。
これはMongoDBの問題ではなく、AzureとLocalで正常に機能します。
接続は、AWSLambdaから開始された場合にのみブロックされます。
MongoDBIPホワイトリストも確認しました。
0.0.0.0/0 (includes your current IP address)
@TonyHenriquedefがスラックに加わります-それを通してあなたに話すことができるかどうかを確認します。
Mongo DBのドキュメントで、.NET CoreのC#ドライバーの場合、Linuxの無料利用枠と他のいくつかのクラスター構成に接続できないことがわかりました。 LambdaはLinux環境なので、それが問題になる可能性がありますか?
活動不足のため閉会
@normj @jaydestroという解決策はありましたか? 私は今この問題に直面しています。
こっちも一緒。 AWSでラムダを実行してパブリックIP経由で無料利用枠に接続しようとしています。 動作しません。 ラムダがLinuxで私の関数を実行しているようです。
ええ、私もこの問題を抱えています。 修正するといいでしょう:-)
ここに同上。 AtlasのAzureではすべてがうまく機能していましたが、先週末にAtlasのAWSに移行したときに、同じ問題が発生していることがわかりました。
解決策はありますか? ここでも同じことが言えます-Azureは正常に動作しますが、AWSは次のように返します。
502 Bad Gateway
{
"message": "Internal server error"
}
そして、この特定のapiメソッドはデータベースを使用しないので、それは問題ではありません。
このエラーが発生していました。
この問題は、ラムダからのアウトバウンドトラフィックがないことが原因であることに気付きました。
アウトバウンドトラフィックを許可するVPCにあるように変更すると、Mongoへの接続が機能し始めました。
Azureでこの問題が発生し、解決しました。 私はMongoDBアトラスの無料利用枠を使用していました。
コンソールに移動して「Curl-ooutput.txt icanhazip.com」、「cat output.txt」と入力して、IPをホワイトリストに登録します。 このエントリをMongolabsIPアドレスホワイトリストに追加します。
最も参考になるコメント
こっちも一緒。 AWSでラムダを実行してパブリックIP経由で無料利用枠に接続しようとしています。 動作しません。 ラムダがLinuxで私の関数を実行しているようです。