web-dev-qa-db-ja.com

AWS ssmパラメーターを一括で取得する

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つの要求を送信しています。これは、パラメーターが多数ある場合に非効率です。 1つのリクエストで複数のパラメータを取得する方法はありますか? ssm.getParameters()がそのためのメソッドである場合は、例を示してください(特にそのメソッドのパラメーター)。試しましたが何も届きません。

6
ahadcse

AWSドキュメント によると、GetParameterは1つのパラメーターの値を取得し、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
user1032613

基本的に、パラメーターを一括で取得する2つのオプションがあります。

1つは@ user1032613によって提供されるメソッドですが、もう1つは組み込み関数getParametersByPath()を使用することです。

3つすべてのメソッドを含むノードの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などからコードを抽出するコードを作成できます。

0
Simon

やっとうまくいった。コードは次のとおりです。

        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
        }
0
ahadcse

これは、特定のパスからすべてのパラメーターを取得するために行ったものです。

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