Posted at

Lambda Functionの一覧を取得する


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