【问题标题】:Retrieve AWS ssm parameter in bulk批量检索 AWS ssm 参数
【发布时间】:2018-10-17 16:11:57
【问题描述】:

如何一次从 AWS Systems Manager(参数存储)中批量(或多个参数)检索参数?使用 aws-sdk,以下是我编写的用于从参数存储中检索 SSM 参数的 Node.js 代码:

      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() 是这样做的方法,那么请举一个例子(特别是该方法的参数)。我试过了,但什么也没收到。

【问题讨论】:

    标签: node.js amazon-web-services ssm


    【解决方案1】:

    根据AWS documentGetParameter获取一个参数的值,而GetParameters获取多个参数的值。

    它们的用法也非常相似。当使用GetParameters 获取多个值时,将多个名称作为Names 的列表传递,而不是将单个名称作为Name 的字符串传递。

    代码示例,获取“us-west-1”区域中名为“foo”和“bar”的参数:

    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);
    })
    

    【讨论】:

      【解决方案2】:

      这是我从特定路径检索所有参数的操作。

      **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'].
      

      【讨论】:

        【解决方案3】:

        最后它对我有用。以下是代码:

                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
                }
        

        【讨论】:

        • 如果有人想知道,您也可以将其放入 try/catch 块中,但您必须在获取参数语句的末尾加上 .promise
        • 值得注意的是,参数在结果中的顺序与输入中的顺序是不一样的。如图所示,需要循环遍历结果或类似的东西。如果只是几个参数,您可能希望使用 GetParameterconst [parm1, parm2, etc] = Promise.all([...]) 来简化您的代码。
        【解决方案4】:

        您基本上有两种选择来批量获取参数。

        一种是@user1032613提供的方法,另一种是使用内置函数getParametersByPath()。

        节点中包含所有三种方法的 Lambda 代码示例如下所示。每种方法都可以采用不同的参数,例如使用您可以制作过滤器的路径等来获得您需要的确切值,请参阅the documentation

        '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 等中提取代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-07
          • 2021-09-24
          • 2020-02-26
          • 2019-02-19
          • 2018-07-20
          • 2021-11-28
          相关资源
          最近更新 更多