serverless-plugin-warmup 6.0.0 → 7.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +2 -1
- package/README.md +6 -4
- package/package.json +4 -4
- package/src/config.js +7 -4
- package/src/index.js +40 -21
- package/src/schema.js +82 -60
- package/src/warmer.js +4 -0
package/.eslintignore
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
coverage
|
|
1
|
+
coverage
|
|
2
|
+
test_integration
|
package/README.md
CHANGED
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
[![Serverless][serverless-badge]](serverless-badge-url)
|
|
3
3
|
[![npm version][npm-version-badge]][npm-version-badge-url]
|
|
4
4
|
[![npm monthly downloads][npm-downloads-badge]][npm-version-badge-url]
|
|
5
|
-
[](https://github.com/juanjoDiaz/serverless-plugin-warmup/actions/workflows/on-push.yaml)
|
|
6
6
|
[![Coverage Status][coveralls-badge]][coveralls-badge-url]
|
|
7
7
|
[](https://raw.githubusercontent.com/juanjoDiaz/serverless-plugin-warmup/master/LICENSE)
|
|
8
8
|
|
|
9
9
|
Keep your lambdas warm during winter.
|
|
10
10
|
|
|
11
11
|
**Requirements:**
|
|
12
|
-
*
|
|
12
|
+
* Node *v14.x* or higher
|
|
13
|
+
* Serverless *v3.x* or higher
|
|
13
14
|
* AWS provider
|
|
14
15
|
|
|
15
16
|
## How it works
|
|
@@ -43,6 +44,7 @@ custom:
|
|
|
43
44
|
events:
|
|
44
45
|
- schedule: cron(0/5 8-17 ? * MON-FRI *)
|
|
45
46
|
concurrency: 10
|
|
47
|
+
logRetentionInDays: 10
|
|
46
48
|
outOfOfficeHoursWarmer:
|
|
47
49
|
enabled: true
|
|
48
50
|
events:
|
|
@@ -68,6 +70,7 @@ The options are the same for all the warmers:
|
|
|
68
70
|
* **timeout** How many seconds until the warmer lambda times out. (defaults to `10`)
|
|
69
71
|
* **environment** Can be used to set environment variables in the warmer lambda. You can also unset variables configured at the provider by setting them to undefined. However, you should almost never have to change the default. (defaults to unset all package level environment variables. )
|
|
70
72
|
* **tracing** Specify whether to enable/disable tracing at the function level. When tracing is enabled, warmer functions will use NPM to install the X-Ray client and use it to trace requests (It takes any of the values supported by serverless as `boolean`, `Active`or `PassThrough` and defaults to the provider-level setting)
|
|
73
|
+
* **logRetentionInDays** Set the retention time in days for the log group associated to this warmer lamba
|
|
71
74
|
* **prewarm** If set to true, it warms up your lambdas right after deploying (defaults to `false`)
|
|
72
75
|
|
|
73
76
|
There are also some options which can be set under `custom.warmup.<yourWarmer>` to be applied to all your lambdas or under `yourLambda.warmup.<yourWarmer>` to overridde the global configuration for that particular lambda. Keep in mind that in order to configure a warmer at the function level, it needed to be previously configured at the `custom` section or the pluging will error.
|
|
@@ -103,6 +106,7 @@ custom:
|
|
|
103
106
|
- ./**
|
|
104
107
|
timeout: 20
|
|
105
108
|
tracing: true
|
|
109
|
+
logRetentionInDays: 10
|
|
106
110
|
prewarm: true # Run WarmUp immediately after a deploymentlambda
|
|
107
111
|
clientContext:
|
|
108
112
|
source: my-custom-source
|
|
@@ -600,8 +604,6 @@ This software is released under the MIT license. See [the license file](LICENSE)
|
|
|
600
604
|
[npm-version-badge]: https://badge.fury.io/js/serverless-plugin-warmup.svg
|
|
601
605
|
[npm-version-badge-url]: https://www.npmjs.com/package/serverless-plugin-warmup
|
|
602
606
|
[npm-downloads-badge]: https://img.shields.io/npm/dm/serverless-plugin-warmup.svg
|
|
603
|
-
[travis-badge]: https://travis-ci.org/juanjoDiaz/serverless-plugin-warmup.svg
|
|
604
|
-
[travis-badge-url]: https://travis-ci.org/juanjoDiaz/serverless-plugin-warmup
|
|
605
607
|
[coveralls-badge]: https://coveralls.io/repos/juanjoDiaz/serverless-plugin-warmup/badge.svg?branch=master
|
|
606
608
|
[coveralls-badge-url]: https://coveralls.io/r/juanjoDiaz/serverless-plugin-warmup?branch=master
|
|
607
609
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "serverless-plugin-warmup",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.1",
|
|
4
4
|
"description": "Keep your lambdas warm during winter.",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"homepage": "https://github.com/juanjoDiaz/serverless-plugin-warmup",
|
|
32
32
|
"dependencies": {},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"eslint": "^
|
|
35
|
-
"eslint-config-airbnb-base": "^
|
|
34
|
+
"eslint": "^8.5.0",
|
|
35
|
+
"eslint-config-airbnb-base": "^15.0.0",
|
|
36
36
|
"eslint-plugin-import": "^2.24.2",
|
|
37
37
|
"husky": "^7.0.2",
|
|
38
|
-
"jest": "^27.
|
|
38
|
+
"jest": "^27.5.0"
|
|
39
39
|
}
|
|
40
40
|
}
|
package/src/config.js
CHANGED
|
@@ -41,6 +41,9 @@ function getWarmerConfig(config, defaultOpts) {
|
|
|
41
41
|
? config.environment
|
|
42
42
|
: defaultOpts.environment,
|
|
43
43
|
tracing: (config.tracing !== undefined) ? config.tracing : defaultOpts.tracing,
|
|
44
|
+
logRetentionInDays: (config.logRetentionInDays !== undefined)
|
|
45
|
+
? config.logRetentionInDays
|
|
46
|
+
: defaultOpts.logRetentionInDays,
|
|
44
47
|
prewarm: (config.prewarm !== undefined) ? config.prewarm : defaultOpts.prewarm,
|
|
45
48
|
};
|
|
46
49
|
/* eslint-enable no-nested-ternary */
|
|
@@ -79,7 +82,7 @@ function getFunctionConfig(config, defaultOpts) {
|
|
|
79
82
|
*
|
|
80
83
|
* @return {Array} - List of functions to be warmed up and their specific configs
|
|
81
84
|
* */
|
|
82
|
-
function getFunctionsByWarmer(service, stage, configsByWarmer) {
|
|
85
|
+
function getFunctionsByWarmer(service, stage, configsByWarmer, serverlessClasses) {
|
|
83
86
|
const functions = service.getAllFunctions()
|
|
84
87
|
.map((name) => service.getFunction(name))
|
|
85
88
|
.map((config) => {
|
|
@@ -97,7 +100,7 @@ function getFunctionsByWarmer(service, stage, configsByWarmer) {
|
|
|
97
100
|
const unknownWarmers = Object.keys(config.warmup)
|
|
98
101
|
.filter((warmerName) => configsByWarmer[warmerName] === undefined);
|
|
99
102
|
if (unknownWarmers.length > 0) {
|
|
100
|
-
throw new Error(`WarmUp: Invalid function-level warmup configuration (${unknownWarmers.join(', ')}) in function ${config.name}. Every warmer should be declared in the custom section.`);
|
|
103
|
+
throw new serverlessClasses.Error(`WarmUp: Invalid function-level warmup configuration (${unknownWarmers.join(', ')}) in function ${config.name}. Every warmer should be declared in the custom section.`);
|
|
101
104
|
}
|
|
102
105
|
|
|
103
106
|
return {
|
|
@@ -134,7 +137,7 @@ function getFunctionsByWarmer(service, stage, configsByWarmer) {
|
|
|
134
137
|
*
|
|
135
138
|
* @return {Object} - Configuration options to be used by the plugin
|
|
136
139
|
* */
|
|
137
|
-
function getConfigsByWarmer(service, stage) {
|
|
140
|
+
function getConfigsByWarmer({ service, classes }, stage) {
|
|
138
141
|
const getWarmerDefaultOpts = (warmerName) => ({
|
|
139
142
|
folderName: path.join('.warmup', warmerName),
|
|
140
143
|
cleanFolder: true,
|
|
@@ -167,7 +170,7 @@ function getConfigsByWarmer(service, stage) {
|
|
|
167
170
|
},
|
|
168
171
|
}), {});
|
|
169
172
|
|
|
170
|
-
const functionsByWarmer = getFunctionsByWarmer(service, stage, configsByWarmer);
|
|
173
|
+
const functionsByWarmer = getFunctionsByWarmer(service, stage, configsByWarmer, classes);
|
|
171
174
|
|
|
172
175
|
return Object.entries(configsByWarmer).reduce((warmers, [warmerName, warmerConfig]) => ({
|
|
173
176
|
...warmers,
|
package/src/index.js
CHANGED
|
@@ -28,12 +28,13 @@ class WarmUp {
|
|
|
28
28
|
* @constructor
|
|
29
29
|
*
|
|
30
30
|
* @param {!Object} serverless - Serverless object
|
|
31
|
-
* @param {!Object}
|
|
31
|
+
* @param {!Object} cliOptions - Serverless cliOptions
|
|
32
32
|
* */
|
|
33
|
-
constructor(serverless,
|
|
33
|
+
constructor(serverless, cliOptions, { log }) {
|
|
34
34
|
/** Serverless variables */
|
|
35
35
|
this.serverless = serverless;
|
|
36
|
-
this.
|
|
36
|
+
this.cliOptions = cliOptions;
|
|
37
|
+
this.log = log;
|
|
37
38
|
|
|
38
39
|
this.provider = this.serverless.getProvider('aws');
|
|
39
40
|
|
|
@@ -46,7 +47,7 @@ class WarmUp {
|
|
|
46
47
|
cleanupTempDir: { lifecycleEvents: ['cleanup'] },
|
|
47
48
|
prewarm: {
|
|
48
49
|
lifecycleEvents: ['start', 'end'],
|
|
49
|
-
|
|
50
|
+
cliOptions: {
|
|
50
51
|
warmers: {
|
|
51
52
|
shortcut: 'w',
|
|
52
53
|
usage: 'Comma-separated list of warmer names to prewarm.',
|
|
@@ -70,8 +71,8 @@ class WarmUp {
|
|
|
70
71
|
'warmup:cleanupTempDir:cleanup': this.cleanUp.bind(this),
|
|
71
72
|
'before:warmup:prewarm:start': this.configPlugin.bind(this),
|
|
72
73
|
'warmup:prewarm:start': this.prewarmFunctions.bind(this),
|
|
73
|
-
// Workaround webpack/bundle plugins
|
|
74
|
-
'before:package:createDeploymentArtifacts': this.
|
|
74
|
+
// Workaround webpack/bundle plugins and serverless_sdk
|
|
75
|
+
'before:package:createDeploymentArtifacts': this.resetWarmerConfigs.bind(this),
|
|
75
76
|
};
|
|
76
77
|
|
|
77
78
|
// Fixed for issues in Serverles
|
|
@@ -85,7 +86,7 @@ class WarmUp {
|
|
|
85
86
|
configPlugin() {
|
|
86
87
|
this.stage = this.stage || this.provider.getStage();
|
|
87
88
|
this.configsByWarmer = this.configsByWarmer
|
|
88
|
-
|| getConfigsByWarmer(this.serverless
|
|
89
|
+
|| getConfigsByWarmer(this.serverless, this.stage);
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
/**
|
|
@@ -101,6 +102,23 @@ class WarmUp {
|
|
|
101
102
|
.map(([warmerName, warmerConfig]) => this.configureWarmer(warmerName, warmerConfig)));
|
|
102
103
|
}
|
|
103
104
|
|
|
105
|
+
/**
|
|
106
|
+
* @description Workaround webpack/bundle plugins and serverless_sdk.
|
|
107
|
+
* Reset the plugin and ignore changes
|
|
108
|
+
*
|
|
109
|
+
* @fulfil {} — Warm up set
|
|
110
|
+
* @reject {Error} Warm up error
|
|
111
|
+
*
|
|
112
|
+
* @return {Promise}
|
|
113
|
+
* */
|
|
114
|
+
async resetWarmerConfigs() {
|
|
115
|
+
await Promise.all(Object.entries(this.configsByWarmer)
|
|
116
|
+
.map(([
|
|
117
|
+
warmerName,
|
|
118
|
+
warmerConfig,
|
|
119
|
+
]) => addWarmUpFunctionToService(this.serverless.service, warmerName, warmerConfig)));
|
|
120
|
+
}
|
|
121
|
+
|
|
104
122
|
/**
|
|
105
123
|
* @description Warmup cleanup hook.
|
|
106
124
|
*
|
|
@@ -116,13 +134,13 @@ class WarmUp {
|
|
|
116
134
|
|
|
117
135
|
await Promise.all(foldersToClean.map(async (folderToClean) => {
|
|
118
136
|
try {
|
|
119
|
-
await fs.
|
|
137
|
+
await fs.rm(
|
|
120
138
|
path.join(this.serviceDir, folderToClean),
|
|
121
139
|
{ recursive: true },
|
|
122
140
|
);
|
|
123
141
|
} catch (err) {
|
|
124
142
|
if (err.code !== 'ENOENT') {
|
|
125
|
-
this.
|
|
143
|
+
this.log.error(`WarmUp: Couldn't clean up temporary folder ${folderToClean}.`);
|
|
126
144
|
}
|
|
127
145
|
}
|
|
128
146
|
}));
|
|
@@ -133,11 +151,11 @@ class WarmUp {
|
|
|
133
151
|
foldersToClean.some((folder) => folder.startsWith('.warmup'))
|
|
134
152
|
&& (await fs.readdir(defaultDir)).length === 0
|
|
135
153
|
) {
|
|
136
|
-
await fs.
|
|
154
|
+
await fs.rm(defaultDir, { recursive: true });
|
|
137
155
|
}
|
|
138
156
|
} catch (err) {
|
|
139
157
|
if (err.code !== 'ENOENT') {
|
|
140
|
-
this.
|
|
158
|
+
this.log.error('WarmUp: Couldn\'t clean up temporary folder .warmup.');
|
|
141
159
|
}
|
|
142
160
|
}
|
|
143
161
|
}
|
|
@@ -151,8 +169,8 @@ class WarmUp {
|
|
|
151
169
|
* @return {Promise}
|
|
152
170
|
* */
|
|
153
171
|
async prewarmFunctions() {
|
|
154
|
-
const warmerNames = (this.
|
|
155
|
-
? this.
|
|
172
|
+
const warmerNames = (this.cliOptions.warmers)
|
|
173
|
+
? this.cliOptions.warmers.split(',')
|
|
156
174
|
: Object.entries(this.configsByWarmer)
|
|
157
175
|
.filter(([, warmerConfig]) => warmerConfig.prewarm)
|
|
158
176
|
.map(([warmerName]) => warmerName);
|
|
@@ -160,7 +178,7 @@ class WarmUp {
|
|
|
160
178
|
await Promise.all(warmerNames.map(async (warmerName) => {
|
|
161
179
|
const warmerConfig = this.configsByWarmer[warmerName];
|
|
162
180
|
if (!warmerConfig) {
|
|
163
|
-
throw new Error(`Warmer names ${warmerName} doesn't exist.`);
|
|
181
|
+
throw new this.serverless.classes.Error(`Warmer names ${warmerName} doesn't exist.`);
|
|
164
182
|
}
|
|
165
183
|
addWarmUpFunctionToService(this.serverless.service, warmerName, warmerConfig);
|
|
166
184
|
await this.invokeWarmer(warmerName, warmerConfig);
|
|
@@ -173,12 +191,13 @@ class WarmUp {
|
|
|
173
191
|
* */
|
|
174
192
|
async configureWarmer(warmerName, warmerConfig) {
|
|
175
193
|
if (warmerConfig.functions.length === 0) {
|
|
176
|
-
this.
|
|
194
|
+
this.log.warning(`WarmUp: Skipping warmer "${warmerName}" creation. No functions to warm up.`);
|
|
177
195
|
return;
|
|
178
196
|
}
|
|
179
197
|
|
|
180
|
-
this.
|
|
181
|
-
|
|
198
|
+
this.log.notice(`WarmUp: Creating warmer "${warmerName}" to warm up ${warmerConfig.functions.length} function${warmerConfig.functions.length === 1 ? '' : 's'}`);
|
|
199
|
+
this.log.info(':');
|
|
200
|
+
warmerConfig.functions.forEach((func) => this.log.info(` * ${func.name}`));
|
|
182
201
|
|
|
183
202
|
const handlerFolder = path.join(this.serviceDir, warmerConfig.folderName);
|
|
184
203
|
|
|
@@ -203,11 +222,11 @@ class WarmUp {
|
|
|
203
222
|
|
|
204
223
|
async invokeWarmer(warmerName, warmerConfig) {
|
|
205
224
|
if (warmerConfig.functions.length === 0) {
|
|
206
|
-
this.
|
|
225
|
+
this.log.warning(`WarmUp: Skipping prewarming using warmer "${warmerName}". No functions to warm up.`);
|
|
207
226
|
return;
|
|
208
227
|
}
|
|
209
228
|
|
|
210
|
-
this.
|
|
229
|
+
this.log.notice(`WarmUp: Prewarming up your functions using warmer "${warmerName}".`);
|
|
211
230
|
|
|
212
231
|
try {
|
|
213
232
|
const { SERVERLESS_ALIAS } = this.serverless.service.getFunction(`warmUpPlugin${capitalize(warmerName)}`).environment || {};
|
|
@@ -220,9 +239,9 @@ class WarmUp {
|
|
|
220
239
|
};
|
|
221
240
|
|
|
222
241
|
await this.provider.request('Lambda', 'invoke', params);
|
|
223
|
-
this.
|
|
242
|
+
this.log.notice(`WarmUp: Warmer "${warmerName}" successfully prewarmed your functions.`);
|
|
224
243
|
} catch (err) {
|
|
225
|
-
this.
|
|
244
|
+
this.log.error(`WarmUp: Error while prewarming your functions using warmer "${warmerName}".`, err);
|
|
226
245
|
}
|
|
227
246
|
}
|
|
228
247
|
}
|
package/src/schema.js
CHANGED
|
@@ -5,7 +5,7 @@ function extendServerlessSchema(serverless) {
|
|
|
5
5
|
// Most of these are taken from
|
|
6
6
|
// https://github.com/serverless/serverless/blob/master/lib/configSchema.js
|
|
7
7
|
// https://github.com/serverless/serverless/blob/master/lib/plugins/aws/provider.js
|
|
8
|
-
// https://github.com/serverless/serverless/blob/master/lib/plugins/aws/package/compile/events/schedule
|
|
8
|
+
// https://github.com/serverless/serverless/blob/master/lib/plugins/aws/package/compile/events/schedule.js
|
|
9
9
|
|
|
10
10
|
const rateSyntax = '^rate\\((?:1 (?:minute|hour|day)|(?:1\\d+|[2-9]\\d*) (?:minute|hour|day)s)\\)$';
|
|
11
11
|
const cronSyntax = '^cron\\(\\S+ \\S+ \\S+ \\S+ \\S+ \\S+\\)$';
|
|
@@ -27,59 +27,71 @@ function extendServerlessSchema(serverless) {
|
|
|
27
27
|
type: 'array',
|
|
28
28
|
items: {
|
|
29
29
|
type: 'object',
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
properties: {
|
|
31
|
+
schedule: {
|
|
32
|
+
anyOf: [
|
|
33
|
+
{ type: 'string', pattern: scheduleSyntax },
|
|
34
|
+
{
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
rate: {
|
|
38
|
+
type: 'array',
|
|
39
|
+
minItems: 1,
|
|
40
|
+
items: {
|
|
41
|
+
type: 'string',
|
|
42
|
+
pattern: scheduleSyntax,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
enabled: { type: 'boolean' },
|
|
46
|
+
name: {
|
|
47
|
+
type: 'string', minLength: 1, maxLength: 64, pattern: '[\\.\\-_A-Za-z0-9]+',
|
|
48
|
+
},
|
|
49
|
+
description: { type: 'string', maxLength: 512 },
|
|
50
|
+
input: {
|
|
51
|
+
anyOf: [
|
|
52
|
+
{ type: 'string', maxLength: 8192 },
|
|
53
|
+
{
|
|
54
|
+
type: 'object',
|
|
55
|
+
oneOf: [
|
|
56
|
+
{
|
|
57
|
+
properties: {
|
|
58
|
+
body: { type: 'string', maxLength: 8192 },
|
|
59
|
+
},
|
|
60
|
+
required: ['body'],
|
|
61
|
+
additionalProperties: false,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
not: {
|
|
65
|
+
required: ['body'],
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
inputPath: { type: 'string', maxLength: 256 },
|
|
73
|
+
inputTransformer: {
|
|
74
|
+
type: 'object',
|
|
75
|
+
properties: {
|
|
76
|
+
inputTemplate: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
minLength: 1,
|
|
79
|
+
maxLength: 8192,
|
|
80
|
+
},
|
|
81
|
+
inputPathsMap: { type: 'object' },
|
|
82
|
+
},
|
|
83
|
+
required: ['inputTemplate'],
|
|
84
|
+
additionalProperties: false,
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
required: ['rate'],
|
|
88
|
+
additionalProperties: false,
|
|
40
89
|
},
|
|
41
|
-
|
|
42
|
-
// input: {
|
|
43
|
-
// anyOf: [
|
|
44
|
-
// { type: 'string', maxLength: 8192 },
|
|
45
|
-
// {
|
|
46
|
-
// type: 'object',
|
|
47
|
-
// oneOf: [
|
|
48
|
-
// {
|
|
49
|
-
// properties: {
|
|
50
|
-
// body: { type: 'string', maxLength: 8192 },
|
|
51
|
-
// },
|
|
52
|
-
// required: ['body'],
|
|
53
|
-
// additionalProperties: false,
|
|
54
|
-
// },
|
|
55
|
-
// {
|
|
56
|
-
// not: {
|
|
57
|
-
// required: ['body'],
|
|
58
|
-
// },
|
|
59
|
-
// },
|
|
60
|
-
// ],
|
|
61
|
-
// },
|
|
62
|
-
// ],
|
|
63
|
-
// },
|
|
64
|
-
// inputPath: { type: 'string', maxLength: 256 },
|
|
65
|
-
// inputTransformer: {
|
|
66
|
-
// type: 'object',
|
|
67
|
-
// properties: {
|
|
68
|
-
// inputTemplate: {
|
|
69
|
-
// type: 'string',
|
|
70
|
-
// minLength: 1,
|
|
71
|
-
// maxLength: 8192,
|
|
72
|
-
// },
|
|
73
|
-
// inputPathsMap: { type: 'object' },
|
|
74
|
-
// },
|
|
75
|
-
// required: ['inputTemplate'],
|
|
76
|
-
// additionalProperties: false,
|
|
77
|
-
// },
|
|
78
|
-
},
|
|
79
|
-
required: ['rate'],
|
|
80
|
-
additionalProperties: false,
|
|
90
|
+
],
|
|
81
91
|
},
|
|
82
|
-
|
|
92
|
+
},
|
|
93
|
+
required: ['schedule'],
|
|
94
|
+
additionalProperties: false,
|
|
83
95
|
},
|
|
84
96
|
},
|
|
85
97
|
package: {
|
|
@@ -95,6 +107,10 @@ function extendServerlessSchema(serverless) {
|
|
|
95
107
|
timeout: { $ref: '#/definitions/awsLambdaTimeout' },
|
|
96
108
|
environment: { $ref: '#/definitions/awsLambdaEnvironment' },
|
|
97
109
|
tracing: { $ref: '#/definitions/awsLambdaTracing' },
|
|
110
|
+
logRetentionInDays: {
|
|
111
|
+
type: 'number',
|
|
112
|
+
enum: [1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653],
|
|
113
|
+
},
|
|
98
114
|
prewarm: { type: 'boolean' },
|
|
99
115
|
};
|
|
100
116
|
|
|
@@ -123,10 +139,13 @@ function extendServerlessSchema(serverless) {
|
|
|
123
139
|
serverless.configSchemaHandler.defineCustomProperties({
|
|
124
140
|
properties: {
|
|
125
141
|
warmup: {
|
|
126
|
-
'
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
142
|
+
type: 'object',
|
|
143
|
+
patternProperties: {
|
|
144
|
+
'.*': {
|
|
145
|
+
type: 'object',
|
|
146
|
+
properties: { ...globalConfigSchemaProperties, ...functionConfigSchemaProperties },
|
|
147
|
+
additionalProperties: false,
|
|
148
|
+
},
|
|
130
149
|
},
|
|
131
150
|
},
|
|
132
151
|
},
|
|
@@ -138,10 +157,13 @@ function extendServerlessSchema(serverless) {
|
|
|
138
157
|
type: 'object',
|
|
139
158
|
properties: {
|
|
140
159
|
warmup: {
|
|
141
|
-
'
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
160
|
+
type: 'object',
|
|
161
|
+
patternProperties: {
|
|
162
|
+
'.*': {
|
|
163
|
+
type: 'object',
|
|
164
|
+
properties: functionConfigSchemaProperties,
|
|
165
|
+
additionalProperties: false,
|
|
166
|
+
},
|
|
145
167
|
},
|
|
146
168
|
},
|
|
147
169
|
},
|
package/src/warmer.js
CHANGED
|
@@ -225,9 +225,13 @@ function addWarmUpFunctionToService(service, warmerName, warmerConfig) {
|
|
|
225
225
|
? { environment: warmerConfig.environment }
|
|
226
226
|
: {}),
|
|
227
227
|
...(warmerConfig.tracing !== undefined ? { tracing: warmerConfig.tracing } : {}),
|
|
228
|
+
...(warmerConfig.logRetentionInDays !== undefined
|
|
229
|
+
? { logRetentionInDays: warmerConfig.logRetentionInDays }
|
|
230
|
+
: {}),
|
|
228
231
|
...(warmerConfig.role ? { role: warmerConfig.role } : {}),
|
|
229
232
|
...(warmerConfig.tags ? { tags: warmerConfig.tags } : {}),
|
|
230
233
|
...(warmerConfig.vpc ? { vpc: warmerConfig.vpc } : {}),
|
|
234
|
+
layers: [],
|
|
231
235
|
};
|
|
232
236
|
}
|
|
233
237
|
|