bam-lambda
Version:
Serverless framework for AWS Lambda and API Gateway
90 lines (75 loc) • 2.57 kB
JavaScript
const { asyncLambdaCreateFunction } = require('./awsFunctions');
const { zipper } = require('../util/zipper');
const installLambdaDependencies = require('../util/installLambdaDependencies');
const bamBam = require('../util/bamBam');
const bamSpinner = require('../util/spinner');
const getDescription = require('../util/getDescription');
const {
bamLog,
bamWarn,
msgAfterAction,
} = require('../util/logger');
const {
createDirectory,
readConfig,
copyDir,
copyFile,
readFile,
rename,
getStagingPath,
exists,
} = require('../util/fileUtils');
const cwd = process.cwd();
module.exports = async function deployLambda(lambdaName, path, roleName, dir) {
const stagingPath = getStagingPath(path);
const config = await readConfig(path);
const { accountNumber } = config;
const role = roleName || config.role;
const renameLambdaFileToIndexJs = async () => {
await rename(`${stagingPath}/${lambdaName}/${lambdaName}.js`,
`${stagingPath}/${lambdaName}/index.js`);
};
const createDeploymentPackageFromDir = async () => {
await copyDir(`${cwd}/${lambdaName}`, `${stagingPath}/${lambdaName}`);
const lambdaNameJSExists = await exists(`${stagingPath}/${lambdaName}/${lambdaName}.js`);
if (lambdaNameJSExists) await renameLambdaFileToIndexJs();
};
const createDeploymentPackage = async () => {
if (dir) {
await createDeploymentPackageFromDir();
} else {
await createDirectory(lambdaName, stagingPath);
await copyFile(`${cwd}/${lambdaName}.js`, `${stagingPath}/${lambdaName}/index.js`);
}
};
bamSpinner.start();
await createDeploymentPackage();
await installLambdaDependencies(lambdaName, path);
const description = await getDescription(lambdaName, path);
const zippedFileName = await zipper(lambdaName, path);
const zipContents = await readFile(zippedFileName);
const createAwsLambda = async () => {
const createFunctionParams = {
Code: {
ZipFile: zipContents,
},
FunctionName: lambdaName,
Handler: 'index.handler',
Role: `arn:aws:iam::${accountNumber}:role/${role}`,
Runtime: 'nodejs22.x',
Description: description,
};
const data = await bamBam(asyncLambdaCreateFunction, {
asyncFuncParams: [createFunctionParams],
});
return data;
};
const data = await createAwsLambda();
if (data) {
bamSpinner.stop();
bamLog(msgAfterAction('lambda', lambdaName, 'created'));
return data;
}
bamSpinner.stop();
bamWarn(msgAfterAction('lambda', lambdaName, 'exists', 'already'));
};