大佬教程收集整理的这篇文章主要介绍了为什么我的 AWS Lambda 节点 JS 应用程序无法访问我的 MongoDB Atlas 集群?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
上下文:
我刚刚创建了一个 Node.Js 应用程序,并在 AWS Lambda 上使用无服务器框架部署了它。
问题:
我希望该应用程序能够访问我的(免费套餐)MongoDB Atlas 集群。为此,我使用 @H_315_13@mongoose。
设置:
我有一个具有管理员访问权限的 IAM 用户。此用户已在我的 MongoDB 集群上获得授权。
我正在使用 authMechanism=MONGODB-AWS
,因此使用该 IAM 用户的令牌和秘密。密码已正确“url编码”。
const uri = "mongodb+srv://myIAMtoken:myIAMsecret@cluster0.tfws6.mongodb.net/DBname?authsource=%24external&authMechanism=MONGODB-AWS&retryWrites=true&w=majority"
mongoose.connect(uri,{useNewUrlParser: true,useUnifIEdtopology: true })
当我在笔记本电脑上运行此代码时,连接已建立,我可以检索所需的数据。 但是,当我在 AWS Lambda(通过无服务器)上部署完全相同的代码时,我得到了这个响应:
message "Internal server error"
ClouDWatch 上的跟踪如下所示:
{
"errorType": "Runtime.UnhandledPromiseRejection","errormessage": "MongoError: bad auth : aws sts call has response 403","reason": {
"errorType": "MongoError","errormessage": "bad auth : aws sts call has response 403","code": 8000,"ok": 0,"codename": "AtlasError","name": "MongoError","stack": [
"MongoError: bad auth : aws sts call has response 403"," at messageStream.messageHandler (/var/task/node_modules/mongodb/lib/cmap/connection.Js:268:20)"," at messageStream.emit (events.Js:314:20)"," at processIncomingData (/var/task/node_modules/mongodb/lib/cmap/message_stream.Js:144:12)"," at messageStream._write (/var/task/node_modules/mongodb/lib/cmap/message_stream.Js:42:5)"," at doWrite (_stream_writable.Js:403:12)"," at writeOrBuffer (_stream_writable.Js:387:5)"," at messageStream.Writable.write (_stream_writable.Js:318:11)"," at TLSSocket.ondata (_stream_readable.Js:718:22)"," at TLSSocket.emit (events.Js:314:20)"," at addChunk (_stream_readable.Js:297:12)"," at readableAddChunk (_stream_readable.Js:272:9)"," at TLSSocket.Readable.push (_stream_readable.Js:213:10)"," at TLSWrap.onStreamRead (internal/stream_base_commons.Js:188:23)"
]
},"promise": {},"stack": [
"Runtime.UnhandledPromiseRejection: MongoError: bad auth : aws sts call has response 403"," at process.<anonymous> (/var/runtime/index.Js:35:15)"," at process.emit (events.Js:314:20)"," at processpromiseRejections (internal/process/promises.Js:209:33)"," at processticksAndRejections (internal/process/task_queues.Js:98:32)"
]
}
我认为这是来自 AWS 的网络访问问题,所以我尝试获取 "http://Google.com" ,没问题,我的节点应用程序可以访问该页面并提供响应。我的应用程序可以访问互联网,但无法访问我的 MongoDB 云实例。可以从任何 IP 地址访问我的 MongoDB 集群。
这已经达到了我的知识极限:-)
如果您使用的是 iam 类型的 mongodb 用户,则连接字符串中不需要用户名 + 密码。
const uri = "mongodb+srv://cluster0.tfws6.mongodb.net/DBNAME?authsource=$external&authMechanism=MONGODB-AWS&retryWrites=true&w=majority"
当您调用连接到 mongodb 集群的 lambda 时,它将使用的 iam 角色将是 lambda 的执行角色
"arn:aws:iam::account_ID:role/SLS_service_name-ENVIRONMENT-AWS_REGION-lambdaRole"
"arn:aws:iam::123456789012:role/awesome-service-dev-us-east-1-lambdaRole"
检查 sls 框架的默认 iam 部分: https://www.serverless.com/framework/docs/providers/aws/guide/iam/#the-default-iam-role
以上是大佬教程为你收集整理的为什么我的 AWS Lambda 节点 JS 应用程序无法访问我的 MongoDB Atlas 集群?全部内容,希望文章能够帮你解决为什么我的 AWS Lambda 节点 JS 应用程序无法访问我的 MongoDB Atlas 集群?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。