【问题标题】:Getting values from parameter store in AWS从 AWS 中的参数存储中获取值
【发布时间】:2018-12-30 10:37:57
【问题描述】:

这是我的代码:

const AWS = require('aws-sdk');
const { Client } = require('pg');

function main() {
    AWS.config.update({region:'eu-west-2'});

    let db_user = {
        Name: "postgres_db_user",
        WithDecryption: false
    };

    let db_host = {
        Name: "postgres_db_host",
        WithDecryption: false
    };

    let db_database = {
        Name: "postgres_db_name",
        WithDecryption: false
    };

    let db_password = {
        Name: "postgres_db_password",
        WithDecryption: true
    };

    let db_port = {
        Name: "postgres_db_port",
        WithDecryption: false
    };

    let database_user_name;
    let database_host;
    let database_name;
    let database_port;
    let database_password;

    let ssm = new AWS.SSM();
    ssm.getParameter(db_user, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            database_user_name = data;
        }
    });

    ssm.getParameter(db_host, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            database_host = data;
        }
    });

    ssm.getParameter(db_database, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            database_name = data;
        }
    });

    ssm.getParameter(db_password, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            database_password = data;
        }
    });

    ssm.getParameter(db_port, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
           database_port = data;
        }
    });

    console.log(database_user_name);
    console.log(database_host);
    console.log(database_name);
    console.log(database_password);
    console.log(database_port);

    let client = new Client({
        user: database_user_name,
        host: database_host,
        database: database_name,
        password: database_password,
        port: database_port,
    });
}

main();

问题是当我打印变量时它们是未定义的,我不知道为什么。 SSM getParameter 函数正在工作,因为如果我使用调试器,我会看到值,但由于某种奇怪的原因,它似乎没有将数据变量保存在变量中。

如果有人可以帮助我了解为什么此代码会为变量打印 undefined,我将不胜感激。

【问题讨论】:

  • @WaynePhipps 抱歉延迟回复。是的,从 CLI 获取参数非常有效。
  • 这可能是由于 Node.js 的回调特性。在异步 ssm.getParameter() 调用完成之前,您正在使用 console.log()。我不熟悉 Node,但显然你应该使用 waterfall 方法来按顺序运行调用,而不是纯粹的 async
  • @JohnRotenstein 感谢您的评论。你说的对。这是我的第一个 Node.js 应用程序,所以我没有意识到它是异步代码(我应该更仔细地阅读文档)。

标签: javascript node.js amazon-web-services aws-sdk


【解决方案1】:

约翰评论时我正在起草我的答案:)。

getParameter 是异步函数,它在您使用属性初始化客户端时执行。

这是一些编码初始化的示例方法。(不完美,但你可以理解)。

var AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });
var ssm = new AWS.SSM();

function getParameter(param) {
  return new Promise(function (success, reject) {
    ssm.getParameter(param, function (err, data) {
      if (err) {
        reject(err);
      } else {
        success(data);
      }
    });
  });
};

function main() {
  let db_user = {
    Name: "postgres_db_user",
    WithDecryption: false
  };
  let database_user_name;
  var promises = [];
  promises.push(getParameter(db_user));

  Promise.all(promises)
    .then(function (result) {
      database_user_name = result[0].Parameter.Value;
      console.log(database_user_name);
      let client = new Client({
        user: database_user_name
        //rest of the properties
      });
      //rest of the main() function code
    })
    .catch(function (err) {
      console.log(err);
    });
}
main();

参考 - https://stackoverflow.com/a/44868681/5030709

【讨论】:

  • 非常感谢。在我做任何其他事情之前,我将更详细地阅读有关 Promise 的内容。
  • 当然。查看参考答案以获取有关如何检索不同承诺下的所有参数并通过迭代加入它们的更多详细信息。
猜你喜欢
  • 2021-01-04
  • 2020-06-05
  • 2020-03-15
  • 2020-03-31
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
相关资源
最近更新 更多