aws rds 代理从 nodejs12.x 抛出超时错误
aws rds proxy throws timeout error from nodejs12.x
当我尝试连接到 mysql rds 代理时出现连接超时。我关注了这个 tutorial
这是我的代码
import mysql2 from 'mysql2';
import AWS from 'aws-sdk';
const getConnection = async () => {
const signer = new AWS.RDS.Signer({
username: 'my-user-name',
hostname: 'proxy-name.proxy-someid.us-east-1.rds.amazonaws.com',
port: 3306
});
console.info('Connecting to MySQL proxy via IAM authentication');
const rdsSignerAuth = () => () => {
console.info('CALL rdsSignerAuth');
return signer.getAuthToken({
username: 'my-user-name',
region: 'us-east-1',
hostname: 'proxy-name.proxy-someid.us-east-1.rds.amazonaws.com',
port: 3306
});
};
let connection;
try {
connection = await mysql2.createConnection({
host: 'proxy-name.proxy-someid.us-east-1.rds.amazonaws.com',
user: 'my-user-name',
database: 'database-name',
connectTimeout: 60000,
ssl: { rejectUnauthorized: false },
authPlugins: { mysql_clear_password: rdsSignerAuth },
});
console.info('Connected');
}
catch (e) {
console.error(`MySQL connection error: ${e}`);
throw e;
}
return connection;
};
const mysql2Impl = async () => {
const connection = await getConnection();
//console.info({ type: 'connection', connection });
const result = await connection.promise().query('select * from destiny;');
console.info({ type: 'result', result });
};
export async function testRdsProxy(event, context){
console.info(JSON.stringify({ event, context }));
await mysql2Impl();
return 200;
}
这是回复
Error {
code: 'ETIMEDOUT',
errno: undefined,
message: 'connect ETIMEDOUT',
sqlState: undefined,
}
我已经检查过我的 lambda 函数对“*”资源有一个策略 "rds-db:connect"。此外,我检查了我的代理是否与我的 rds 数据库位于同一 VPC 和子网中。保存 RDS 凭据的秘密是可以的。我做错了什么?
文档指出无法访问 RDS 代理 public,因此您的 lambda 函数需要与 rds 代理位于同一安全组中。
请注意,当您将 lambda 制作成 vpc 时,您的 lambda 可能会失去访问互联网的能力。
谢谢。
如果您通过了IAM认证
检查用户名(mysql 用户)是否具有执行 [INVOKE LAMBDA] 权限
如果 IAM 身份验证失败
您应该让代理设置向导自动创建如下所示的 IAM
连接 > IAM 角色 > 创建 IAM 角色
> IAM 身份验证 > 必需
您甚至可以在 VPC 外部连接 RDS 代理,方法是从相同或不同的帐户进行 VPC 对等连接。我为其中一个项目做到了
当我尝试连接到 mysql rds 代理时出现连接超时。我关注了这个 tutorial
这是我的代码
import mysql2 from 'mysql2';
import AWS from 'aws-sdk';
const getConnection = async () => {
const signer = new AWS.RDS.Signer({
username: 'my-user-name',
hostname: 'proxy-name.proxy-someid.us-east-1.rds.amazonaws.com',
port: 3306
});
console.info('Connecting to MySQL proxy via IAM authentication');
const rdsSignerAuth = () => () => {
console.info('CALL rdsSignerAuth');
return signer.getAuthToken({
username: 'my-user-name',
region: 'us-east-1',
hostname: 'proxy-name.proxy-someid.us-east-1.rds.amazonaws.com',
port: 3306
});
};
let connection;
try {
connection = await mysql2.createConnection({
host: 'proxy-name.proxy-someid.us-east-1.rds.amazonaws.com',
user: 'my-user-name',
database: 'database-name',
connectTimeout: 60000,
ssl: { rejectUnauthorized: false },
authPlugins: { mysql_clear_password: rdsSignerAuth },
});
console.info('Connected');
}
catch (e) {
console.error(`MySQL connection error: ${e}`);
throw e;
}
return connection;
};
const mysql2Impl = async () => {
const connection = await getConnection();
//console.info({ type: 'connection', connection });
const result = await connection.promise().query('select * from destiny;');
console.info({ type: 'result', result });
};
export async function testRdsProxy(event, context){
console.info(JSON.stringify({ event, context }));
await mysql2Impl();
return 200;
}
这是回复
Error {
code: 'ETIMEDOUT',
errno: undefined,
message: 'connect ETIMEDOUT',
sqlState: undefined,
}
我已经检查过我的 lambda 函数对“*”资源有一个策略 "rds-db:connect"。此外,我检查了我的代理是否与我的 rds 数据库位于同一 VPC 和子网中。保存 RDS 凭据的秘密是可以的。我做错了什么?
文档指出无法访问 RDS 代理 public,因此您的 lambda 函数需要与 rds 代理位于同一安全组中。 请注意,当您将 lambda 制作成 vpc 时,您的 lambda 可能会失去访问互联网的能力。 谢谢。
如果您通过了IAM认证
检查用户名(mysql 用户)是否具有执行 [INVOKE LAMBDA] 权限如果 IAM 身份验证失败
您应该让代理设置向导自动创建如下所示的 IAM
连接 > IAM 角色 > 创建 IAM 角色
> IAM 身份验证 > 必需
您甚至可以在 VPC 外部连接 RDS 代理,方法是从相同或不同的帐户进行 VPC 对等连接。我为其中一个项目做到了