代码之家  ›  专栏  ›  技术社区  ›  Armando

用户“db\u iamuser”的PAM身份验证失败

  •  0
  • Armando  · 技术社区  · 2 年前

    我在AWS RDS上有一个postgres实例。此实例允许您使用 IAM身份验证 。我还有一个lambda函数,它执行在函数实现的单独文件中定义的各种查询。此函数在调用API网关中定义的端点时执行。

    带查询的文件实现:

    const { Pool } = require("pg");
    const region = process.env.REGION;
    
    const signer = new aws.RDS.Signer({
      region: process.env.REGION,
      hostname: process.env.PG_HOST,
      port: 5432,
      username: "db_iamuser",
    });
    
    const pool = new Pool({
      user: "db_iamuser",
      host: process.env.PG_HOST,
      database: process.env.PG_DATABASE,
      port: 5432,
      ssl: {
        rejectUnauthorized: false,
      },
      password: () => signer.getAuthToken(),
    });
    
    async function destroy() {
      await pool.end().then(() => console.log("DB Connection ended"));
    }
    
    async function getInfo1() {
      const query = `SELECT field1, field2 FROM public.table1`;
      try {
        const response = await pool.query(query);
        return response.rows;
      } catch (error) {
        throw error;
      }
    }
    
    async function getInfo2() {
      const query = `SELECT field1, field2 FROM public.table2`;
      try {
        const response = await pool.query(query);
        return response.rows;
      } catch (error) {
        throw error;
      }
    }
    
    async function getInfo3() {
      const query = `SELECT field1, field2 FROM public.table3`;
      try {
        const response = await pool.query(query);
        return response.rows;
      } catch (error) {
        throw error;
      }
    }
    
    module.exports = {
      getInfo1,
      getInfo2,
      getInfo3,
    };

    在同一个函数中,我在AWS Cognito中创建了一个用户。

    const { Responses } = require("../../libs/response");
    const {
      getInfo1,
      getInfo2,
      getInfo3,
    } = require("../../libs/queries");
    const { CognitoService } = require("../../libs/cognito");
    
    exports.handler = async function (event, context) {
    
      const { Authorization } = event.headers;
      const user = JSON.parse(event.body);
      
      try {
        console.log("Getting Info1 ");
        const info1 = await getInfo1();
        console.log("Getting Info2 ");
        const info1 = await getInfo2();
        console.log("Getting Info3 ");
        const info1 = await getInfo3();
    
        //... Creating user in Cognito
        await provider
          .adminCreateUser(request)
          .promise();
    
    
        await provider
            .adminAddUserToGroup({ request, GroupName })
            .promise();
          
        return Responses._200({ });
        
      } catch (error) {
        console.log("Error ", error);
        throw error;
      }
    };

    当我调用执行lambda函数的端点时,查询的执行不会出现问题。

    但是,如果我再次调用,并且端点立即抛出此错误:

    PAM authentication failed for user \"db_iamuser\"
    

    注意:我将查询隔离在一个lambda函数中,该函数不会在Cognito中执行任何操作,并且每次调用它时它都会工作。

    请有人帮我理解为什么会发生这种情况。

    0 回复  |  直到 2 年前