无法从 Lambda 连接到 AWS/RDS
Unable to connect to AWS/RDS from Lambda
我有一个 Node.js Express 应用程序,它使用 Sequelize 连接到数据库。我想在 Lambda 上部署我的应用程序(使用 API 网关)并使用 RDS Postgres 数据库(无服务器)
我创建了一个 RDS 实例和一个无服务器设置。从 EC2 实例,我能够毫无问题地连接到 RDS 实例和无服务器数据库。
但是,当我在 Lambda 上部署相同的代码时,我无法连接到任何一个数据库实例。事实上,我在任何地方都没有看到任何错误消息。
sequelize = new Sequelize(process.env.POSTGRES_DBNAME, process.env.POSTGRES_USERNAME, process.env.POSTGRES_PASSWORD, {
host: process.env.POSTGRES_HOST,
dialect: 'postgres',
logging: false,
operatorsAliases: false
});
// Test connection
(async function() {
try {
console.log('Connecting to: ', process.env.POSTGRES_DBNAME, process.env.POSTGRES_USERNAME, process.env.POSTGRES_PASSWORD, process.env.POSTGRES_HOST);
await sequelize.authenticate();
console.log('Connection has been established successfully.');
} catch (error) {
console.error('Unable to connect to the database:', error);
}
})();
我什至尝试将 MySQL 实例与 RDS 代理一起使用,但它是一样的 - 测试连接部分没有执行,日志中既没有出现成功消息也没有出现错误消息。我想知道我是否遗漏了什么。数据库已配置为可从外部访问。
我的猜测是您没有正确配置 Lambda IAM 权限。为了让 Lambda 能够访问 RDS,您可以使用 AWSLambdaVPCAccessExecutionRole
,为了使 CloudWatch 日志正常工作,您可以将 AWSLambdaBasicExecutionRole
添加到您的 Lambda 函数。
AWS Lambda 开发人员指南中有一个 tutorial 给出了如何完成此操作的示例。
有关详细信息,请阅读开发人员指南中的 Configuring a Lambda function to access resources in a VPC 章节。
要从 Lambda 函数连接到 Amazon RDS 实例,请参阅此 Amazon 文档:How do I configure a Lambda function to connect to an RDS instance?。
原来是我的快递包裹有问题。我的 AWS 配置是正确的,并且用 vanilla DB 连接替换 Lambda 入口代码并打印值列表有效,但是用 Express 代码插入它有效。我不确定是什么问题 - 我发现升级 express 版本解决了我的问题。
谢谢大家抽出时间来回答我的问题
我有一个 Node.js Express 应用程序,它使用 Sequelize 连接到数据库。我想在 Lambda 上部署我的应用程序(使用 API 网关)并使用 RDS Postgres 数据库(无服务器)
我创建了一个 RDS 实例和一个无服务器设置。从 EC2 实例,我能够毫无问题地连接到 RDS 实例和无服务器数据库。
但是,当我在 Lambda 上部署相同的代码时,我无法连接到任何一个数据库实例。事实上,我在任何地方都没有看到任何错误消息。
sequelize = new Sequelize(process.env.POSTGRES_DBNAME, process.env.POSTGRES_USERNAME, process.env.POSTGRES_PASSWORD, {
host: process.env.POSTGRES_HOST,
dialect: 'postgres',
logging: false,
operatorsAliases: false
});
// Test connection
(async function() {
try {
console.log('Connecting to: ', process.env.POSTGRES_DBNAME, process.env.POSTGRES_USERNAME, process.env.POSTGRES_PASSWORD, process.env.POSTGRES_HOST);
await sequelize.authenticate();
console.log('Connection has been established successfully.');
} catch (error) {
console.error('Unable to connect to the database:', error);
}
})();
我什至尝试将 MySQL 实例与 RDS 代理一起使用,但它是一样的 - 测试连接部分没有执行,日志中既没有出现成功消息也没有出现错误消息。我想知道我是否遗漏了什么。数据库已配置为可从外部访问。
我的猜测是您没有正确配置 Lambda IAM 权限。为了让 Lambda 能够访问 RDS,您可以使用 AWSLambdaVPCAccessExecutionRole
,为了使 CloudWatch 日志正常工作,您可以将 AWSLambdaBasicExecutionRole
添加到您的 Lambda 函数。
AWS Lambda 开发人员指南中有一个 tutorial 给出了如何完成此操作的示例。 有关详细信息,请阅读开发人员指南中的 Configuring a Lambda function to access resources in a VPC 章节。
要从 Lambda 函数连接到 Amazon RDS 实例,请参阅此 Amazon 文档:How do I configure a Lambda function to connect to an RDS instance?。
原来是我的快递包裹有问题。我的 AWS 配置是正确的,并且用 vanilla DB 连接替换 Lambda 入口代码并打印值列表有效,但是用 Express 代码插入它有效。我不确定是什么问题 - 我发现升级 express 版本解决了我的问题。
谢谢大家抽出时间来回答我的问题