#!/usr/bin/env node 'use strict' const path = require('path') const dotenv = require('dotenv') dotenv.load() const lambda = require(path.join(__dirname, '..', 'lib', 'main.js')) const program = require('commander') const fs = require('fs') const packageJson = fs.existsSync(path.join(process.cwd(), 'package.json')) ? require(path.join(process.cwd(), 'package.json')) : {} const packageJsonName = packageJson.name || 'UnnamedFunction' const AWS_ENVIRONMENT = process.env.AWS_ENVIRONMENT || '' const AWS_ENDPOINT = process.env.AWS_ENDPOINT || '' const CONFIG_FILE = process.env.CONFIG_FILE || '' const EVENT_SOURCE_FILE = process.env.EVENT_SOURCE_FILE || '' const EXCLUDE_GLOBS = process.env.EXCLUDE_GLOBS || '' const AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID const AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY const AWS_PROFILE = process.env.AWS_PROFILE || '' const AWS_SESSION_TOKEN = process.env.AWS_SESSION_TOKEN || '' const AWS_REGION = process.env.AWS_REGION || 'us-east-1,us-west-2,eu-west-1' const AWS_FUNCTION_NAME = process.env.AWS_FUNCTION_NAME || packageJsonName const AWS_HANDLER = process.env.AWS_HANDLER || 'index.handler' const AWS_ROLE = process.env.AWS_ROLE_ARN || process.env.AWS_ROLE || 'missing' const AWS_MEMORY_SIZE = process.env.AWS_MEMORY_SIZE || 128 const AWS_TIMEOUT = process.env.AWS_TIMEOUT || 60 const AWS_RUN_TIMEOUT = process.env.AWS_RUN_TIMEOUT || 3 const AWS_DESCRIPTION = process.env.AWS_DESCRIPTION || packageJson.description || '' const AWS_RUNTIME = process.env.AWS_RUNTIME || 'nodejs8.10' const AWS_PUBLISH = process.env.AWS_PUBLISH || false const AWS_FUNCTION_VERSION = process.env.AWS_FUNCTION_VERSION || '' const AWS_VPC_SUBNETS = process.env.AWS_VPC_SUBNETS || '' const AWS_VPC_SECURITY_GROUPS = process.env.AWS_VPC_SECURITY_GROUPS || '' const AWS_TRACING_CONFIG = process.env.AWS_TRACING_CONFIG || '' const AWS_LOGS_RETENTION_IN_DAYS = process.env.AWS_LOGS_RETENTION_IN_DAYS || '' const EVENT_FILE = process.env.EVENT_FILE || 'event.json' const PACKAGE_DIRECTORY = process.env.PACKAGE_DIRECTORY const CONTEXT_FILE = process.env.CONTEXT_FILE || 'context.json' const PREBUILT_DIRECTORY = process.env.PREBUILT_DIRECTORY || '' const SRC_DIRECTORY = process.env.SRC_DIRECTORY || '' const DEPLOY_TIMEOUT = process.env.DEPLOY_TIMEOUT || 120000 const DOCKER_IMAGE = process.env.DOCKER_IMAGE || '' const DEPLOY_ZIPFILE = process.env.DEPLOY_ZIPFILE || '' const DEPLOY_USE_S3 = process.env.DEPLOY_USE_S3 || false const AWS_KMS_KEY_ARN = process.env.AWS_KMS_KEY_ARN || '' const AWS_DLQ_TARGET_ARN = (() => { // You can clear the setting by passing an empty string // when executing updateFunctionConfiguration if (process.env.AWS_DLQ_TARGET_ARN !== undefined) { return process.env.AWS_DLQ_TARGET_ARN } return undefined })() const PROXY = process.env.PROXY || process.env.http_proxy || '' const ENABLE_RUN_MULTIPLE_EVENTS = true program .command('deploy') .description('Deploy your application to Amazon Lambda') .option('-e, --environment [AWS_ENVIRONMENT]', 'Choose environment {dev, staging, production}', AWS_ENVIRONMENT) .option('-E, --endpoint [AWS_ENDPOINT]', 'Choose endpoint (e.g. localstack, "http://127.0.0.1:4574")', AWS_ENDPOINT) .option('-a, --accessKey [AWS_ACCESS_KEY_ID]', 'AWS Access Key', AWS_ACCESS_KEY_ID) .option('-s, --secretKey [AWS_SECRET_ACCESS_KEY]', 'AWS Secret Key', AWS_SECRET_ACCESS_KEY) .option('-P, --profile [AWS_PROFILE]', 'AWS Profile', AWS_PROFILE) .option('-k, --sessionToken [AWS_SESSION_TOKEN]', 'AWS Session Token', AWS_SESSION_TOKEN) .option('-r, --region [AWS_REGION]', 'AWS Region', AWS_REGION) .option('-n, --functionName [AWS_FUNCTION_NAME]', 'Lambda FunctionName', AWS_FUNCTION_NAME) .option('-H, --handler [AWS_HANDLER]', 'Lambda Handler {index.handler}', AWS_HANDLER) .option('-o, --role [AWS_ROLE]', 'Amazon Role ARN', AWS_ROLE) .option('-m, --memorySize [AWS_MEMORY_SIZE]', 'Lambda Memory Size', AWS_MEMORY_SIZE) .option('-t, --timeout [AWS_TIMEOUT]', 'Lambda Timeout', AWS_TIMEOUT) .option('-d, --description [AWS_DESCRIPTION]', 'Lambda Description', AWS_DESCRIPTION) .option('-u, --runtime [AWS_RUNTIME]', 'Lambda Runtime', AWS_RUNTIME) .option('-p, --publish [AWS_PUBLISH]', 'Lambda Publish', AWS_PUBLISH) .option('-L, --lambdaVersion [AWS_FUNCTION_VERSION]', 'Lambda Function Version', AWS_FUNCTION_VERSION) .option('-b, --vpcSubnets [AWS_VPC_SUBNETS]', 'Lambda Function VPC Subnets', AWS_VPC_SUBNETS) .option('-g, --vpcSecurityGroups [AWS_VPC_SECURITY_GROUPS]', 'Lambda VPC Security Group', AWS_VPC_SECURITY_GROUPS) .option('-K, --kmsKeyArn [AWS_KMS_KEY_ARN]', 'Lambda KMS Key ARN', AWS_KMS_KEY_ARN) .option('-Q, --deadLetterConfigTargetArn [AWS_DLQ_TARGET_ARN]', 'Lambda DLQ resource', AWS_DLQ_TARGET_ARN) .option('-c, --tracingConfig [AWS_TRACING_CONFIG]', 'Lambda tracing settings', AWS_TRACING_CONFIG) .option('-R, --retentionInDays [AWS_LOGS_RETENTION_IN_DAYS]', 'CloudWatchLogs retentionInDays settings', AWS_LOGS_RETENTION_IN_DAYS) .option('-A, --packageDirectory [PACKAGE_DIRECTORY]', 'Local Package Directory', PACKAGE_DIRECTORY) .option('-G, --sourceDirectory [SRC_DIRECTORY]', 'Path to lambda source Directory (e.g. "./some-lambda")', SRC_DIRECTORY) .option('-I, --dockerImage [DOCKER_IMAGE]', 'Docker image for npm install', DOCKER_IMAGE) .option('-f, --configFile [CONFIG_FILE]', 'Path to file holding secret environment variables (e.g. "deploy.env")', CONFIG_FILE) .option('-S, --eventSourceFile [EVENT_SOURCE_FILE]', 'Path to file holding event source mapping variables (e.g. "event_sources.json")', EVENT_SOURCE_FILE) .option('-x, --excludeGlobs [EXCLUDE_GLOBS]', 'Space-separated glob pattern(s) for additional exclude files (e.g. "event.json dotenv.sample")', EXCLUDE_GLOBS) .option('-D, --prebuiltDirectory [PREBUILT_DIRECTORY]', 'Prebuilt directory', PREBUILT_DIRECTORY) .option('-T, --deployTimeout [DEPLOY_TIMEOUT]', 'Deploy Timeout', DEPLOY_TIMEOUT) .option('-z, --deployZipfile [DEPLOY_ZIPFILE]', 'Deploy zipfile', DEPLOY_ZIPFILE) .option('-B, --deployUseS3 [DEPLOY_USE_S3]', 'Use S3 to deploy.', DEPLOY_USE_S3) .option('-y, --proxy [PROXY]', 'Proxy server', PROXY) .action((prg) => lambda.deploy(prg)) program .command('package') .alias('zip') .description('Create zipped package for Amazon Lambda deployment') .option('-A, --packageDirectory [PACKAGE_DIRECTORY]', 'Local Package Directory', PACKAGE_DIRECTORY) .option('-I, --dockerImage [DOCKER_IMAGE]', 'Docker image for npm install', DOCKER_IMAGE) .option('-n, --functionName [AWS_FUNCTION_NAME]', 'Lambda FunctionName', AWS_FUNCTION_NAME) .option('-H, --handler [AWS_HANDLER]', 'Lambda Handler {index.handler}', AWS_HANDLER) .option('-e, --environment [AWS_ENVIRONMENT]', 'Choose environment {dev, staging, production}', AWS_ENVIRONMENT) .option('-x, --excludeGlobs [EXCLUDE_GLOBS]', 'Space-separated glob pattern(s) for additional exclude files (e.g. "event.json dotenv.sample")', EXCLUDE_GLOBS) .option('-D, --prebuiltDirectory [PREBUILT_DIRECTORY]', 'Prebuilt directory', PREBUILT_DIRECTORY) .action((prg) => lambda.package(prg)) program .command('run') .alias('execute') .description('Run your Amazon Lambda application locally') .option('-H, --handler [AWS_HANDLER]', 'Lambda Handler {index.handler}', AWS_HANDLER) .option('-j, --eventFile [EVENT_FILE]', 'Event JSON File', EVENT_FILE) .option('-u, --runtime [AWS_RUNTIME]', 'Lambda Runtime', AWS_RUNTIME) .option('-t, --timeout [AWS_RUN_TIMEOUT]', 'Lambda Timeout', AWS_RUN_TIMEOUT) .option('-f, --configFile [CONFIG_FILE]', 'Path to file holding secret environment variables (e.g. "deploy.env")', CONFIG_FILE) .option('-x, --contextFile [CONTEXT_FILE]', 'Context JSON File', CONTEXT_FILE) .option('-M, --enableRunMultipleEvents [ENABLE_RUN_MULTIPLE_EVENTS]', 'Enable run multiple events', ENABLE_RUN_MULTIPLE_EVENTS) .option('-y, --proxy [PROXY]', 'Proxy server', PROXY) .action((prg) => lambda.run(prg)) program .command('setup') .description('Sets up the .env file.') .option('-j, --eventFile [EVENT_FILE]', 'Event JSON File', EVENT_FILE) .option('-x, --contextFile [CONTEXT_FILE]', 'Context JSON File', CONTEXT_FILE) .action((prg) => lambda.setup(prg)) program .version(lambda.version) .parse(process.argv) if (!process.argv.slice(2).length) { program.outputHelp() }