Получить параметр AWS ssm навалом

Как можно получить параметры из AWS Systems Manager (хранилище параметров) оптом (или несколькими параметрами) одновременно? Используя aws-sdk, ниже приведен код Node.js, который я написал для получения параметра SSM из хранилища параметров:

      const ssm = new (require('aws-sdk/clients/ssm'))()

      const getSSMKey = async params => {
          const {Parameter: {Value: APIKey}} = await ssm.getParameter(params).promise()
          return APIKey
    }

    const [param1, param2, param3] = await Promise.all([
      getSSMKey({ Name: '/data/param/PARAM1', WithDecryption: true }),
      getSSMKey({ Name: '/data/param/PARAM2', WithDecryption: true }),
      getSSMKey({ Name: '/data/param/PARAM3', WithDecryption: true })
    ])
    console.log(param1, param2, param3)

Но с этим кодом я отправляю 3 запроса на получение 3 параметров, что неэффективно в случае большого количества параметров. Есть ли способ получить более одного параметра в одном запросе. если метод ssm.getParameters() - это способ сделать это, приведите пример (в частности, параметр для этого метода). Я пытался, но ничего не получил.

1 ответ

Согласно документу AWS, GetParameter получает значение для одного параметра, тогда как GetParameters получает значение для нескольких.

Их использование тоже очень похоже. Когда используешь GetParameters чтобы получить несколько значений, передайте несколько имен в виде списка для Namesвместо передачи одного имени в виде строки для Name,

Пример кода для получения параметров с именами "foo" и "bar" в регионе "us-west-1":

const AWS = require('aws-sdk');
AWS.config.update({ region: "us-west-1" });

const SSM = require('aws-sdk/clients/ssm');
const ssm = new SSM()
const query = {
    "Names": ["foo", "bar"],
    "WithDecryption": true
}
let param = ssm.getParameters(query, (err, data) => {
    console.log('error = %o', err);
    console.log('raw data = %o', data);
})

Наконец-то это сработало для меня. Ниже приведен код:

        const ssmConfig = async () => {
          const data = await ssm.getParameters({ Names: ['/data/param/PARAM1', '/data/param/PARAM2', '/bronto/rest//data/param/PARAM3'],
WithDecryption: true }).promise()
          const config = {}
          for (const i of data.Parameters) {
            if (i.Name === '/data/param/PARAM1') {
              config.param1 = i.Value
            }
            if (i.Name === '/data/param/PARAM2') {
              config.rest.clientId param2 = i.Value
            }
            if (i.Name === '/data/param/PARAM3') {
              config.param3 = i.Value
            }
          }
          return config
        }

Это то, что я сделал, чтобы получить все параметры по определенному пути.

**your SSM function  client :**
'use strict';
const SSM = require('aws-sdk/clients/ssm');
let ssmclient;
module.exports.init = () => {
    const region = process.env.REGION === undefined ? 'us-east-1' : process.env.REGION ;
    ssmclient = new SSM({region: region});
}
module.exports.getParameters = async (path) => {
    try {
        let params = {
            Path: path,
            WithDecryption: true
        };
        let allParameters = [];
        let data =  await ssmclient.getParametersByPath(params).promise();
        allParameters.push.apply(allParameters, data.Parameters);
        while(data.NextToken) {
            params.NextToken = data.NextToken;
            data =  await ssmclient.getParametersByPath(params).promise();
            allParameters.push.apply(allParameters, data.Parameters);
        }
        return allParameters;
    } catch (err) {
        return Promise.reject(err);
    }
}
calling this client:

const ssm = require("yourssmclinet");
ssm.init();
// you call only once to retrieve everything which falls under /data/param
const parameters = await getParameters("/data/param");
//from here you can fetch parameters['what ever needed'].

По сути, у вас есть два варианта массового получения параметров.

Один из них - это метод, предоставляемый @user1032613, а другой - использование встроенной функции getParametersByPath().

Пример кода Lambda в узле со всеми тремя методами можно увидеть ниже. Каждый метод может принимать разные параметры, например, путь, по которому вы можете создавать фильтры и т. Д., Чтобы получить точные значения, которые вам нужны, см. Документацию.

'use strict';
const AWS = require('aws-sdk');
const SSM = new AWS.SSM();

exports.handler = async (event) => {
    //Example get single item
    const singleParam = { Name: 'myParam' };
    const getSingleParam = await SSM.getParameter(singleParam).promise();

    //Example: Get Multiple values
    const multiParams = {
        Names: [ 'myParam1', 'myParam2', 'myParam3' ],
        WithDecryption: true
    };

    const getMultiParams = await SSM(multiParams).promise();

    //Example: Get all values in a path
    const pathParams = { Path: '/myPath/', WithDecryption: true };
    const getPathParams = await SSM.getParametersByPath(pathParams).promise();

    return 'Success';
};

Помните, что вы также можете использовать переменные среды. Например, вы можете написать singleParam следующим образом:

const singleParam = { Name: process.env.PARAM }

Таким образом, у вас может быть код, извлекающий код из DEV, PROD и т. Д. В зависимости от стадии.

Другие вопросы по тегам