Help us understand the problem. What is going on with this article?

Lambda Functionの一覧を取得する

More than 1 year has passed since last update.

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);
  });
kaihei777
「ここでの投稿は個人のものであって所属する企業や団体の見解を示すものではありません。」
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away