代码之家  ›  专栏  ›  技术社区  ›  Vladimir Venegas

来自nodejs12.x的aws-rds代理thorw超时错误

  •  0
  • Vladimir Venegas  · 技术社区  · 4 年前

    当我尝试连接到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凭据的秘密没问题。我做错了什么?

    0 回复  |  直到 4 年前
        1
  •  7
  •   ninjjshd    4 年前

    该文档指出,RDS代理不能公开访问,因此您的lambda函数需要与RDS代理位于同一安全组中。 请注意,当您将lambda转换为vpc时,您的lambda可能会失去访问互联网的能力。 非常感谢。

        2
  •  1
  •   harshal bhavsar    4 年前

    您可以从相同或不同的帐户进行VPC对等连接,甚至可以在VPC之外连接RDS代理。我这样做是为了其中一个项目

        3
  •  0
  •   Hyper    4 年前
    • 如果您通过IAM认证
      检查用户名(mysql用户)是否具有执行[INVOKE LAMBDA]权限

    • 如果IAM身份验证失败
      您应该让代理设置向导自动创建IAM,如下所示
      连接性>IAM角色> 创建IAM角色
      >IAM身份验证> 要求的