LoginSignup
1
2

More than 5 years have passed since last update.

Lambda Functionの一覧を取得する

Posted at

Lambda Functionの一覧を取得する

Lambda Functionの一覧を取得したい時があります。
SDKがデフォルトで、50個しか返してきませんので、再帰的に検索する必要があります。
SDKのレスポンス中に、「NextMarker」プロパティが存在した場合は、返せなかったリストが残っているのでlistFunctionsの引数に、「NextMarker」プロパティを渡す事で、残りのリストを取得する事ができます。

全てのリストを取得するサンプル

const AWS = require('aws-sdk');
const _ = require('lodash');

const lambda = new AWS.Lambda({
  maxRetries: 10,
  retryDelayOptions: {
    base: 1000,
  },
});

/**
 * 全てのlambda関数名を取得します。
 * Lambda.listFunctionsは一度に取得できるデータが限られるため、
 * NextMarkerが無くなるまで再帰的に処理を行います。
 *
 * @param lambda AWS.Lambda
 * @param prefix フィルタするプレフィックス文字列
 * @param nextmarker 取得可能な関数名が残っている場合に利用する、ページング用トークン
 * @return array of string FunctionName
 * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#listFunctions-property
 */
function listFunctionsAll(lambda, nextmarker) {
  const params = nextmarker ? { Marker: nextmarker } : {};

  const p1 = lambda.listFunctions(params).promise();
  return p1.then((returnData) => {
    console.info('Functions.length:', returnData.Functions.length);
    console.info('NextMarker:', returnData.NextMarker);
    // これ以上取得できるデータがない場合、配列を整形して返す。
    if (!returnData.NextMarker) {
      return returnData.Functions.map(f => f.FunctionName);
    }

    // 一度で取得できなかった場合、NextMarkerが無くなるまで再帰的に取得する。
    const p2 = listFunctionsAll(lambda, returnData.NextMarker);

    // 取得したデータを整形し、再帰的に取得したデータと結合する。
    return p2.then(returnData2 =>
      _.concat(returnData.Functions.map(f => f.FunctionName), returnData2));
  });
}

/**
 * Lambda関数の検索結果を配列で返します。
 * Lambda関数名を全て取得した後、prefixでフィルタリングします。
 *
 * @param lambda AWS.Lambda
 * @param prefix フィルタするプレフィックス文字列
 * @return array of string FunctionName filterd by prefix
 */
function listFunctions(lambda, prefix) {
  const exclude = [
    process.env.AWS_LAMBDA_FUNCTION_NAME,
  ];
  const result = listFunctionsAll(lambda);
  return result.then(data =>
    data.filter(f => f.startsWith(prefix) && !exclude.includes(f)));
}

listFunctions(lambda, prefix)
    .then((res) => {
    console.info(res);
  })
  .catch((err) => {
    console.error(err);
  });
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2