1 | #!/usr/bin/env node
|
2 |
|
3 | 'use strict'
|
4 |
|
5 | const path = require('path')
|
6 | const dotenv = require('dotenv')
|
7 |
|
8 | dotenv.load()
|
9 |
|
10 | const lambda = require(path.join(__dirname, '..', 'lib', 'main.js'))
|
11 | const program = require('commander')
|
12 | const fs = require('fs')
|
13 | const packageJson = fs.existsSync(path.join(process.cwd(), 'package.json'))
|
14 | ? require(path.join(process.cwd(), 'package.json')) : {}
|
15 | const packageJsonName = packageJson.name || 'UnnamedFunction'
|
16 |
|
17 | const AWS_ENVIRONMENT = process.env.AWS_ENVIRONMENT || ''
|
18 | const AWS_ENDPOINT = process.env.AWS_ENDPOINT || ''
|
19 | const CONFIG_FILE = process.env.CONFIG_FILE || ''
|
20 | const EVENT_SOURCE_FILE = process.env.EVENT_SOURCE_FILE || ''
|
21 | const EXCLUDE_GLOBS = process.env.EXCLUDE_GLOBS || ''
|
22 | const AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID
|
23 | const AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY
|
24 | const AWS_PROFILE = process.env.AWS_PROFILE || ''
|
25 | const AWS_SESSION_TOKEN = process.env.AWS_SESSION_TOKEN || ''
|
26 | const AWS_REGION = process.env.AWS_REGION || 'us-east-1,us-west-2,eu-west-1'
|
27 | const AWS_FUNCTION_NAME = process.env.AWS_FUNCTION_NAME || packageJsonName
|
28 | const AWS_HANDLER = process.env.AWS_HANDLER || 'index.handler'
|
29 | const AWS_ROLE = process.env.AWS_ROLE_ARN || process.env.AWS_ROLE || 'missing'
|
30 | const AWS_MEMORY_SIZE = process.env.AWS_MEMORY_SIZE || 128
|
31 | const AWS_TIMEOUT = process.env.AWS_TIMEOUT || 60
|
32 | const AWS_RUN_TIMEOUT = process.env.AWS_RUN_TIMEOUT || 3
|
33 | const AWS_DESCRIPTION = process.env.AWS_DESCRIPTION || packageJson.description || ''
|
34 | const AWS_RUNTIME = process.env.AWS_RUNTIME || 'nodejs8.10'
|
35 | const AWS_PUBLISH = process.env.AWS_PUBLISH || false
|
36 | const AWS_FUNCTION_VERSION = process.env.AWS_FUNCTION_VERSION || ''
|
37 | const AWS_VPC_SUBNETS = process.env.AWS_VPC_SUBNETS || ''
|
38 | const AWS_VPC_SECURITY_GROUPS = process.env.AWS_VPC_SECURITY_GROUPS || ''
|
39 | const AWS_TRACING_CONFIG = process.env.AWS_TRACING_CONFIG || ''
|
40 | const AWS_LOGS_RETENTION_IN_DAYS = process.env.AWS_LOGS_RETENTION_IN_DAYS || ''
|
41 | const EVENT_FILE = process.env.EVENT_FILE || 'event.json'
|
42 | const PACKAGE_DIRECTORY = process.env.PACKAGE_DIRECTORY
|
43 | const CONTEXT_FILE = process.env.CONTEXT_FILE || 'context.json'
|
44 | const PREBUILT_DIRECTORY = process.env.PREBUILT_DIRECTORY || ''
|
45 | const SRC_DIRECTORY = process.env.SRC_DIRECTORY || ''
|
46 | const DEPLOY_TIMEOUT = process.env.DEPLOY_TIMEOUT || 120000
|
47 | const DOCKER_IMAGE = process.env.DOCKER_IMAGE || ''
|
48 | const DEPLOY_ZIPFILE = process.env.DEPLOY_ZIPFILE || ''
|
49 | const DEPLOY_USE_S3 = process.env.DEPLOY_USE_S3 || false
|
50 | const AWS_KMS_KEY_ARN = process.env.AWS_KMS_KEY_ARN || ''
|
51 | const AWS_DLQ_TARGET_ARN = (() => {
|
52 | // You can clear the setting by passing an empty string
|
53 | // when executing updateFunctionConfiguration
|
54 | if (process.env.AWS_DLQ_TARGET_ARN !== undefined) {
|
55 | return process.env.AWS_DLQ_TARGET_ARN
|
56 | }
|
57 | return undefined
|
58 | })()
|
59 | const PROXY = process.env.PROXY || process.env.http_proxy || ''
|
60 | const ENABLE_RUN_MULTIPLE_EVENTS = true
|
61 |
|
62 | program
|
63 | .command('deploy')
|
64 | .description('Deploy your application to Amazon Lambda')
|
65 | .option('-e, --environment [AWS_ENVIRONMENT]', 'Choose environment {dev, staging, production}',
|
66 | AWS_ENVIRONMENT)
|
67 | .option('-E, --endpoint [AWS_ENDPOINT]', 'Choose endpoint (e.g. localstack, "http://127.0.0.1:4574")',
|
68 | AWS_ENDPOINT)
|
69 | .option('-a, --accessKey [AWS_ACCESS_KEY_ID]', 'AWS Access Key', AWS_ACCESS_KEY_ID)
|
70 | .option('-s, --secretKey [AWS_SECRET_ACCESS_KEY]', 'AWS Secret Key', AWS_SECRET_ACCESS_KEY)
|
71 | .option('-P, --profile [AWS_PROFILE]', 'AWS Profile', AWS_PROFILE)
|
72 | .option('-k, --sessionToken [AWS_SESSION_TOKEN]', 'AWS Session Token', AWS_SESSION_TOKEN)
|
73 | .option('-r, --region [AWS_REGION]', 'AWS Region', AWS_REGION)
|
74 | .option('-n, --functionName [AWS_FUNCTION_NAME]', 'Lambda FunctionName', AWS_FUNCTION_NAME)
|
75 | .option('-H, --handler [AWS_HANDLER]', 'Lambda Handler {index.handler}', AWS_HANDLER)
|
76 | .option('-o, --role [AWS_ROLE]', 'Amazon Role ARN', AWS_ROLE)
|
77 | .option('-m, --memorySize [AWS_MEMORY_SIZE]', 'Lambda Memory Size', AWS_MEMORY_SIZE)
|
78 | .option('-t, --timeout [AWS_TIMEOUT]', 'Lambda Timeout', AWS_TIMEOUT)
|
79 | .option('-d, --description [AWS_DESCRIPTION]', 'Lambda Description', AWS_DESCRIPTION)
|
80 | .option('-u, --runtime [AWS_RUNTIME]', 'Lambda Runtime', AWS_RUNTIME)
|
81 | .option('-p, --publish [AWS_PUBLISH]', 'Lambda Publish', AWS_PUBLISH)
|
82 | .option('-L, --lambdaVersion [AWS_FUNCTION_VERSION]', 'Lambda Function Version', AWS_FUNCTION_VERSION)
|
83 | .option('-b, --vpcSubnets [AWS_VPC_SUBNETS]', 'Lambda Function VPC Subnets', AWS_VPC_SUBNETS)
|
84 | .option('-g, --vpcSecurityGroups [AWS_VPC_SECURITY_GROUPS]', 'Lambda VPC Security Group',
|
85 | AWS_VPC_SECURITY_GROUPS)
|
86 | .option('-K, --kmsKeyArn [AWS_KMS_KEY_ARN]', 'Lambda KMS Key ARN', AWS_KMS_KEY_ARN)
|
87 | .option('-Q, --deadLetterConfigTargetArn [AWS_DLQ_TARGET_ARN]', 'Lambda DLQ resource',
|
88 | AWS_DLQ_TARGET_ARN)
|
89 | .option('-c, --tracingConfig [AWS_TRACING_CONFIG]', 'Lambda tracing settings',
|
90 | AWS_TRACING_CONFIG)
|
91 | .option('-R, --retentionInDays [AWS_LOGS_RETENTION_IN_DAYS]', 'CloudWatchLogs retentionInDays settings',
|
92 | AWS_LOGS_RETENTION_IN_DAYS)
|
93 | .option('-A, --packageDirectory [PACKAGE_DIRECTORY]', 'Local Package Directory', PACKAGE_DIRECTORY)
|
94 | .option('-G, --sourceDirectory [SRC_DIRECTORY]', 'Path to lambda source Directory (e.g. "./some-lambda")', SRC_DIRECTORY)
|
95 | .option('-I, --dockerImage [DOCKER_IMAGE]', 'Docker image for npm install', DOCKER_IMAGE)
|
96 | .option('-f, --configFile [CONFIG_FILE]',
|
97 | 'Path to file holding secret environment variables (e.g. "deploy.env")', CONFIG_FILE)
|
98 | .option('-S, --eventSourceFile [EVENT_SOURCE_FILE]',
|
99 | 'Path to file holding event source mapping variables (e.g. "event_sources.json")', EVENT_SOURCE_FILE)
|
100 | .option('-x, --excludeGlobs [EXCLUDE_GLOBS]',
|
101 | 'Space-separated glob pattern(s) for additional exclude files (e.g. "event.json dotenv.sample")', EXCLUDE_GLOBS)
|
102 | .option('-D, --prebuiltDirectory [PREBUILT_DIRECTORY]', 'Prebuilt directory', PREBUILT_DIRECTORY)
|
103 | .option('-T, --deployTimeout [DEPLOY_TIMEOUT]', 'Deploy Timeout', DEPLOY_TIMEOUT)
|
104 | .option('-z, --deployZipfile [DEPLOY_ZIPFILE]', 'Deploy zipfile', DEPLOY_ZIPFILE)
|
105 | .option('-B, --deployUseS3 [DEPLOY_USE_S3]', 'Use S3 to deploy.', DEPLOY_USE_S3)
|
106 | .option('-y, --proxy [PROXY]', 'Proxy server', PROXY)
|
107 | .action((prg) => lambda.deploy(prg))
|
108 |
|
109 | program
|
110 | .command('package')
|
111 | .alias('zip')
|
112 | .description('Create zipped package for Amazon Lambda deployment')
|
113 | .option('-A, --packageDirectory [PACKAGE_DIRECTORY]', 'Local Package Directory', PACKAGE_DIRECTORY)
|
114 | .option('-I, --dockerImage [DOCKER_IMAGE]', 'Docker image for npm install', DOCKER_IMAGE)
|
115 | .option('-n, --functionName [AWS_FUNCTION_NAME]', 'Lambda FunctionName', AWS_FUNCTION_NAME)
|
116 | .option('-H, --handler [AWS_HANDLER]', 'Lambda Handler {index.handler}', AWS_HANDLER)
|
117 | .option('-e, --environment [AWS_ENVIRONMENT]', 'Choose environment {dev, staging, production}',
|
118 | AWS_ENVIRONMENT)
|
119 | .option('-x, --excludeGlobs [EXCLUDE_GLOBS]',
|
120 | 'Space-separated glob pattern(s) for additional exclude files (e.g. "event.json dotenv.sample")', EXCLUDE_GLOBS)
|
121 | .option('-D, --prebuiltDirectory [PREBUILT_DIRECTORY]', 'Prebuilt directory', PREBUILT_DIRECTORY)
|
122 | .action((prg) => lambda.package(prg))
|
123 |
|
124 | program
|
125 | .command('run')
|
126 | .alias('execute')
|
127 | .description('Run your Amazon Lambda application locally')
|
128 | .option('-H, --handler [AWS_HANDLER]', 'Lambda Handler {index.handler}', AWS_HANDLER)
|
129 | .option('-j, --eventFile [EVENT_FILE]', 'Event JSON File', EVENT_FILE)
|
130 | .option('-u, --runtime [AWS_RUNTIME]', 'Lambda Runtime', AWS_RUNTIME)
|
131 | .option('-t, --timeout [AWS_RUN_TIMEOUT]', 'Lambda Timeout', AWS_RUN_TIMEOUT)
|
132 | .option('-f, --configFile [CONFIG_FILE]',
|
133 | 'Path to file holding secret environment variables (e.g. "deploy.env")', CONFIG_FILE)
|
134 | .option('-x, --contextFile [CONTEXT_FILE]', 'Context JSON File', CONTEXT_FILE)
|
135 | .option('-M, --enableRunMultipleEvents [ENABLE_RUN_MULTIPLE_EVENTS]', 'Enable run multiple events',
|
136 | ENABLE_RUN_MULTIPLE_EVENTS)
|
137 | .option('-y, --proxy [PROXY]', 'Proxy server', PROXY)
|
138 | .action((prg) => lambda.run(prg))
|
139 |
|
140 | program
|
141 | .command('setup')
|
142 | .description('Sets up the .env file.')
|
143 | .option('-j, --eventFile [EVENT_FILE]', 'Event JSON File', EVENT_FILE)
|
144 | .option('-x, --contextFile [CONTEXT_FILE]', 'Context JSON File', CONTEXT_FILE)
|
145 | .action((prg) => lambda.setup(prg))
|
146 |
|
147 | program
|
148 | .version(lambda.version)
|
149 | .parse(process.argv)
|
150 |
|
151 | if (!process.argv.slice(2).length) {
|
152 | program.outputHelp()
|
153 | }
|