@sls-next/aws-lambda
Version:
Deploy Lambda functions to AWS in seconds with [Serverless Components](https://github.com/serverless/components). Utilizes layers for dependency management and S3 accelerated uploads for maximum upload speeds.
76 lines (69 loc) • 2.01 kB
text/typescript
// Cleanup Lambda code adapted from https://github.com/davidmenger/cleanup-lambda-versions/blob/master/src/cleanupVersions.js
import AWS from "aws-sdk";
import {
FunctionConfiguration,
ListVersionsByFunctionResponse
} from "aws-sdk/clients/lambda";
async function listLambdaVersions(
lambda: AWS.Lambda,
fnName: string
): Promise<ListVersionsByFunctionResponse> {
return await lambda
.listVersionsByFunction({
FunctionName: fnName,
MaxItems: 50
})
.promise();
}
async function removeLambdaVersion(
lambda: AWS.Lambda,
fnName: string,
version: string
): Promise<unknown> {
return await lambda
.deleteFunction({ FunctionName: fnName, Qualifier: version })
.promise();
}
async function getLambdaFunction(
lambda: AWS.Lambda,
fnName: string
): Promise<FunctionConfiguration> {
return await lambda
.getFunctionConfiguration({ FunctionName: fnName })
.promise();
}
/**
* Clean up old lambda versions, up to 50 at a time.
* Currently it just removes the version that's not the current version,
* but if needed we could add support for preserving the latest X versions.
* @param context
* @param fnName
* @param region
*/
export async function removeLambdaVersions(
context: any,
fnName: string,
region: string
) {
const lambda: AWS.Lambda = new AWS.Lambda({ region });
const fnConfig = await getLambdaFunction(lambda, fnName);
const versions = await listLambdaVersions(lambda, fnConfig.FunctionName);
for (const version of versions.Versions ?? []) {
if (version.Version && version.Version !== fnConfig.Version) {
try {
context.debug(
`Removing function: ${fnConfig.FunctionName} - ${version.Version}`
);
await removeLambdaVersion(
lambda,
fnConfig.FunctionName,
version.Version
);
} catch (e) {
context.debug(
`Remove failed (${fnConfig.FunctionName} - ${version.Version}): ${e.message}`
);
}
}
}
}