【问题标题】:configure knexfile.js using aws secret manager使用 aws secret manager 配置 knexfile.js
【发布时间】:2018-12-09 06:55:40
【问题描述】:

我需要使用从秘密管理器中检索到的秘密来配置 knexfile.js。 我从秘密管理器中检索秘密并将其存储在秘密变量中并在配置中使用它。

var AWS = require('aws-sdk'),
endpoint = "abcd",
region = "us-east-1",
secretName = "abcd",
secret,
binarySecretData;

var client = new AWS.SecretsManager({
endpoint: endpoint,
region: region
});
client.getSecretValue({
SecretId: secretName
}, function (err, data) {
if (err) {
if (err.code === 'ResourceNotFoundException')
    console.log("The requested secret " + secretName + " was not found");
else if (err.code === 'InvalidRequestException')
    console.log("The request was invalid due to: " + err.message);
else if (err.code === 'InvalidParameterException')
    console.log("The request had invalid params: " + err.message);
} else {
if (data.SecretString !== "") {
    secret = data.SecretString;
} else {
    binarySecretData = data.SecretBinary;
}
}
});
module.exports = {
development: {
    client: secret.localClient,
    connection: {
        host: secret.localHost,
        user: secret.localUser,
        password: secret.localPassword,
        database: secret.localDatabase,
        charset: "utf8"
    }
},
};

但它显示一个错误 TypeError:无法读取未定义的属性“localClient”

【问题讨论】:

    标签: javascript node.js amazon-web-services knex.js aws-secrets-manager


    【解决方案1】:

    获取秘密是异步操作,因此当您尝试从 knexfile.js 导出时,您的变量 secret 尚不存在。

    您可能应该首先在启动虚拟机时获取要存储在本地某处的秘密,然后在 knexfile.js 中同步读取它,例如从本地文件中读取。

    【讨论】:

    • 谢谢Mikael,但是如何同步调用client.getSecretValue()函数呢?
    • 在为实际应用程序运行 npm start 之前,我会在单独的初始化脚本中执行此操作。
    • 我也遇到了同样的问题。但我最大的问题是我将它与无服务器 lambda 一起使用。我想没有解决方案支持从 aws secret manager 加载配置,特别是如果我们需要从 Knex cmd 运行迁移:(
    • 在这种情况下,您需要将迁移客户端包装到脚本中,该脚本首先获取机密/knex 配置,然后才尝试运行迁移。
    【解决方案2】:

    这现在可以在 Knex 中实现。您可以将异步函数传递给configuration

    async function getConfig() {
      return new Promise((resolve, reject) => {
       client.getSecretValue({ SecretId: 'SECRETID' }, function(
        err,
        data
      ) {
        if (err) {
          console.log('secretsErr', err);
          reject(err);
        } else {
          console.log('Secrets Manager call successful');
          if ('SecretString' in data) {
            let secret = data.SecretString;
            secret = JSON.parse(secret);
            const config = {
              user: secret.DbUser,
              password: secret.DbPassword,
              server: secret.DbServer,
              database: secret.DbDatabase,
              expirationChecker: () => false,
              options: {
                encrypt: true,
                enableArithAbort: true
              }
            };
            resolve(config);
          } else {
            console.log('no secret found');
            reject();
          }
        }
      });
    }
    
    let knex = require('knex')({
      client: 'mssql',
      connection: async function() {
        return await getConfig();
      }
    });
    

    【讨论】:

      猜你喜欢
      • 2021-06-01
      • 2020-12-25
      • 2020-08-16
      • 2020-02-28
      • 2019-06-11
      • 2021-06-29
      • 2020-03-31
      • 2020-07-07
      • 2020-06-18
      相关资源
      最近更新 更多