AWS Lambda/APIG - 新 Sequelize 的新 PostgresDialect 的新 ConnectionManager 出错

Posted

技术标签:

【中文标题】AWS Lambda/APIG - 新 Sequelize 的新 PostgresDialect 的新 ConnectionManager 出错【英文标题】:AWS Lambda/APIG - Error at new ConnectionManager at new PostgresDialect at new Sequelize 【发布时间】:2018-09-25 01:03:12 【问题描述】:

我正在使用 AWS Lambda 和使用 Nodejs 的 API Gateway 开发 Web 应用程序。当我通过无服务器离线(指向我的生产数据库,在 AWS RDS 上)使用 localhost 运行我的 api 时,一切正常。但是,当我部署到 AWS 时,我得到以下信息:

模块初始化错误:新 ConnectionManager 出错 (/var/task/node_modules/sequelize/lib/dialects/postgres/connection-manager.js:29:15) 在新的 Postgres 方言 (/var/task/node_modules/sequelize/lib/dialects/postgres/index.js:14:30) 在新的续集 (/var/task/node_modules/sequelize/lib/sequelize.js:239:20) 在 目的。 (/var/task/src/controllers/run-controller.js:4

我认为这意味着连接到数据库时出现了一些问题。我通过 localhost 使用邮递员访问它没有问题,但是使用我的 APIG url,上面的错误被抛出并显示在 cloudwatch 日志中。

请让我知道我可以提供哪些其他信息!

更新 进一步缩小范围,当我在 lambda 控制台中针对我的一个函数运行测试时,它显示以下内容:

"errorMessage": "Please install 'pg' module manually"

我的节点模块似乎不可用?就像我说的,我使用的是 Serverless,sls deploy 不包含节点模块吗?

更新 2 确实存在节点模块 pg 未包含在包中的问题。我已添加 pg 强制包含以下内容:

custom:
  webpackIncludeModules:
    forceInclude:
      - pg

这解决了上述需要手动安装 pg 的问题。但是,我现在只从我部署的函数中获得超时,但它们仍然在本地工作。

【问题讨论】:

您是否将策略附加到 lambda 以访问 RDS?如果没有,那肯定会导致连接失败。 facepalm 谢谢!这几乎肯定是问题所在,我正在考虑添加该政策。 @KimBurgaard - 除了上述更新之外,我还添加了一个带有以下语句的策略: "Effect": "Allow", "Action": [ "rds-db:connect" ], "资源": [ "arn:aws:rds-db:us-west-2::dbuser:*/" ] 我从文档中提取它:docs.aws.amazon.com/AmazonRDS/latest/UserGuide/…但是,上面写着 rds-db is not a recognized serviceconnect is not a recognized action... 有什么建议吗? 【参考方案1】:

我发现了问题所在。我不仅需要确保 pg 正确包含在 webpack 中,而且还需要在我的 serverless.yml 中的 provider 部分下设置 VPC 配置:

vpc:
  securityGroupIds:
    - sg-######
  subnetIds:
    - subnet-######
    - subnet-######
    - subnet-######

这为我的所有功能设置了配置,允许它们访问我的数据库。

【讨论】:

以上是关于AWS Lambda/APIG - 新 Sequelize 的新 PostgresDialect 的新 ConnectionManager 出错的主要内容,如果未能解决你的问题,请参考以下文章

Storyboard & Seque:展示的 VC 如何知道展示的 VC 啥时候解散自己?

故事板按钮不会推动 Seque

Disclosure Indicator 不调用 seque 而 Detail Disclosure 调用

iOS Swift 在 NSSUrlSession Completion Handler 之后在 Seque 中传递数据

在创建新的 AWS EC2 实例时运行 AWS Lambda 代码

AWS 创建新应用程序失败