serverless-plugin-warmup 8.2.1 → 8.4.0

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/src/warmer.js CHANGED
@@ -10,109 +10,92 @@ const execAsync = util.promisify(exec);
10
10
  * @description Add warmer role to service
11
11
  * */
12
12
  function addWarmUpFunctionRoleToResources(service, stage, warmerName, warmerConfig) {
13
- // eslint-disable-next-line no-param-reassign
14
- warmerConfig.role = `WarmUpPlugin${capitalize(warmerName)}Role`;
15
- if (typeof service.resources !== 'object') {
16
- // eslint-disable-next-line no-param-reassign
17
- service.resources = {};
18
- }
19
- if (typeof service.resources.Resources !== 'object') {
20
- // eslint-disable-next-line no-param-reassign
21
- service.resources.Resources = {};
22
- }
23
-
24
- // eslint-disable-next-line no-param-reassign
25
- service.resources.Resources[warmerConfig.role] = {
26
- Type: 'AWS::IAM::Role',
27
- Properties: {
28
- Path: '/',
29
- RoleName: warmerConfig.roleName || {
30
- 'Fn::Join': [
31
- '-',
32
- [
33
- service.service,
34
- stage,
35
- { Ref: 'AWS::Region' },
36
- warmerName.toLowerCase(),
37
- 'role',
38
- ],
39
- ],
40
- },
41
- AssumeRolePolicyDocument: {
42
- Version: '2012-10-17',
43
- Statement: [
44
- {
45
- Effect: 'Allow',
46
- Principal: {
47
- Service: [
48
- 'lambda.amazonaws.com',
49
- ],
50
- },
51
- Action: 'sts:AssumeRole',
52
- },
53
- ],
54
- },
55
- Policies: [
56
- {
57
- PolicyName: {
58
- 'Fn::Join': [
59
- '-',
60
- [
61
- service.service,
62
- stage,
63
- 'warmer',
64
- warmerName.toLowerCase(),
65
- 'policy',
66
- ],
67
- ],
68
- },
69
- PolicyDocument: {
70
- Version: '2012-10-17',
71
- Statement: [
72
- {
73
- Effect: 'Allow',
74
- Action: [
75
- 'logs:CreateLogGroup',
76
- 'logs:CreateLogStream',
77
- ],
78
- Resource: [{
79
- 'Fn::Sub': `arn:\${AWS::Partition}:logs:\${AWS::Region}:\${AWS::AccountId}:log-group:/aws/lambda/${warmerConfig.name}:*`,
80
- }],
81
- },
82
- {
83
- Effect: 'Allow',
84
- Action: [
85
- 'logs:PutLogEvents',
86
- ],
87
- Resource: [{
88
- 'Fn::Sub': `arn:\${AWS::Partition}:logs:\${AWS::Region}:\${AWS::AccountId}:log-group:/aws/lambda/${warmerConfig.name}:*:*`,
89
- }],
90
- },
91
- {
92
- Effect: 'Allow',
93
- Action: [
94
- 'lambda:InvokeFunction',
95
- ],
96
- Resource: warmerConfig.functions.map((fn) => ({
97
- 'Fn::Sub': `arn:\${AWS::Partition}:lambda:\${AWS::Region}:\${AWS::AccountId}:function:${fn.name}*`,
98
- })),
99
- },
100
- {
101
- Effect: 'Allow',
102
- Action: [
103
- 'ec2:CreateNetworkInterface',
104
- 'ec2:DescribeNetworkInterfaces',
105
- 'ec2:DetachNetworkInterface',
106
- 'ec2:DeleteNetworkInterface',
107
- ],
108
- Resource: '*',
109
- },
110
- ],
111
- },
112
- },
113
- ],
114
- },
115
- };
13
+ // eslint-disable-next-line no-param-reassign
14
+ warmerConfig.role = `WarmUpPlugin${capitalize(warmerName)}Role`;
15
+ if (typeof service.resources !== 'object') {
16
+ // eslint-disable-next-line no-param-reassign
17
+ service.resources = {};
18
+ }
19
+ if (typeof service.resources.Resources !== 'object') {
20
+ // eslint-disable-next-line no-param-reassign
21
+ service.resources.Resources = {};
22
+ }
23
+
24
+ // eslint-disable-next-line no-param-reassign
25
+ service.resources.Resources[warmerConfig.role] = {
26
+ Type: 'AWS::IAM::Role',
27
+ Properties: {
28
+ Path: '/',
29
+ RoleName: warmerConfig.roleName || {
30
+ 'Fn::Join': [
31
+ '-',
32
+ [service.service, stage, { Ref: 'AWS::Region' }, warmerName.toLowerCase(), 'role'],
33
+ ],
34
+ },
35
+ AssumeRolePolicyDocument: {
36
+ Version: '2012-10-17',
37
+ Statement: [
38
+ {
39
+ Effect: 'Allow',
40
+ Principal: {
41
+ Service: ['lambda.amazonaws.com'],
42
+ },
43
+ Action: 'sts:AssumeRole',
44
+ },
45
+ ],
46
+ },
47
+ Policies: [
48
+ {
49
+ PolicyName: {
50
+ 'Fn::Join': [
51
+ '-',
52
+ [service.service, stage, 'warmer', warmerName.toLowerCase(), 'policy'],
53
+ ],
54
+ },
55
+ PolicyDocument: {
56
+ Version: '2012-10-17',
57
+ Statement: [
58
+ {
59
+ Effect: 'Allow',
60
+ Action: ['logs:CreateLogGroup', 'logs:CreateLogStream'],
61
+ Resource: [
62
+ {
63
+ 'Fn::Sub': `arn:\${AWS::Partition}:logs:\${AWS::Region}:\${AWS::AccountId}:log-group:/aws/lambda/${warmerConfig.name}:*`,
64
+ },
65
+ ],
66
+ },
67
+ {
68
+ Effect: 'Allow',
69
+ Action: ['logs:PutLogEvents'],
70
+ Resource: [
71
+ {
72
+ 'Fn::Sub': `arn:\${AWS::Partition}:logs:\${AWS::Region}:\${AWS::AccountId}:log-group:/aws/lambda/${warmerConfig.name}:*:*`,
73
+ },
74
+ ],
75
+ },
76
+ {
77
+ Effect: 'Allow',
78
+ Action: ['lambda:InvokeFunction'],
79
+ Resource: warmerConfig.functions.map((fn) => ({
80
+ 'Fn::Sub': `arn:\${AWS::Partition}:lambda:\${AWS::Region}:\${AWS::AccountId}:function:${fn.name}*`,
81
+ })),
82
+ },
83
+ {
84
+ Effect: 'Allow',
85
+ Action: [
86
+ 'ec2:CreateNetworkInterface',
87
+ 'ec2:DescribeNetworkInterfaces',
88
+ 'ec2:DetachNetworkInterface',
89
+ 'ec2:DeleteNetworkInterface',
90
+ ],
91
+ Resource: '*',
92
+ },
93
+ ],
94
+ },
95
+ },
96
+ ],
97
+ },
98
+ };
116
99
  }
117
100
 
118
101
  /**
@@ -126,18 +109,25 @@ function addWarmUpFunctionRoleToResources(service, stage, warmerName, warmerConf
126
109
  * @return {Promise}
127
110
  * */
128
111
  async function createWarmUpFunctionArtifact(functions, tracing, verbose, region, handlerFolder) {
129
- const warmUpFunction = `'use strict';
130
-
112
+ const warmUpFunction = `
131
113
  /** Generated by Serverless WarmUp Plugin **/
132
114
 
133
- ${tracing
134
- ? `const AWSXRay = require('aws-xray-sdk-core');
135
- const AWS = AWSXRay.captureAWS(require('@aws-sdk/client-lambda'));`
136
- : 'const AWS = require(\'@aws-sdk/client-lambda\')'};
137
- const lambda = new AWS.Lambda({
115
+ import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda';
116
+ import { NodeHttpHandler } from '@smithy/node-http-handler';
117
+
118
+ const uninstrumentedLambdaClient = new LambdaClient({
138
119
  apiVersion: '2015-03-31',
139
- region: '${region}'
120
+ region: '${region}',
121
+ requestHandler: new NodeHttpHandler({ connectionTimeout: 1000 }),
140
122
  });
123
+
124
+ ${
125
+ tracing
126
+ ? `import * as AWSXRay from 'aws-xray-sdk';
127
+ const lambdaClient = AWSXRay.captureAWSv3Client(uninstrumentedLambdaClient);`
128
+ : 'const lambdaClient = uninstrumentedLambdaClient;'
129
+ }
130
+
141
131
  const functions = ${JSON.stringify(functions, null, ' ')};
142
132
 
143
133
  function logVerbose(str) {
@@ -164,7 +154,7 @@ function getConcurrency(func, envVars) {
164
154
  return concurrency;
165
155
  }
166
156
 
167
- module.exports.warmUp = async (event, context) => {
157
+ export const warmUp = async (event, context) => {
168
158
  logVerbose('Warm Up Start');
169
159
 
170
160
  const invokes = await Promise.all(functions.map(async (func) => {
@@ -174,7 +164,7 @@ module.exports.warmUp = async (event, context) => {
174
164
  ? func.config.clientContext
175
165
  : func.config.payload;
176
166
 
177
- const params = {
167
+ const invokeCommand = new InvokeCommand({
178
168
  ClientContext: clientContext
179
169
  ? Buffer.from(\`{"custom":\${clientContext}}\`).toString('base64')
180
170
  : undefined,
@@ -183,10 +173,10 @@ module.exports.warmUp = async (event, context) => {
183
173
  LogType: 'None',
184
174
  Qualifier: func.config.alias || process.env.SERVERLESS_ALIAS,
185
175
  Payload: func.config.payload
186
- };
176
+ });
187
177
 
188
178
  try {
189
- await Promise.all(Array(concurrency).fill(0).map(async () => await lambda.invoke(params)));
179
+ await Promise.all(Array(concurrency).fill(0).map(async () => await lambdaClient.send(invokeCommand)));
190
180
  logVerbose(\`Warm Up Invoke Success: \${func.name}\`);
191
181
  return true;
192
182
  } catch (e) {
@@ -198,48 +188,48 @@ module.exports.warmUp = async (event, context) => {
198
188
  logVerbose(\`Warm Up Finished with \${invokes.filter(r => !r).length} invoke errors\`);
199
189
  }`;
200
190
 
201
- /** Write warm up file */
202
- await fs.mkdir(handlerFolder, { recursive: true });
203
- await fs.writeFile(path.join(handlerFolder, 'index.js'), warmUpFunction);
191
+ /** Write warm up file */
192
+ await fs.mkdir(handlerFolder, { recursive: true });
193
+ await fs.writeFile(path.join(handlerFolder, 'index.mjs'), warmUpFunction);
204
194
 
205
- if (tracing) {
206
- await execAsync('npm init -y', { cwd: handlerFolder });
207
- await execAsync('npm install --save aws-xray-sdk-core', { cwd: handlerFolder });
208
- }
195
+ if (tracing) {
196
+ await execAsync('npm init -y', { cwd: handlerFolder });
197
+ await execAsync('npm install --save aws-xray-sdk-core', { cwd: handlerFolder });
198
+ }
209
199
  }
210
200
 
211
201
  /**
212
202
  * @description Add warmer function to service
213
203
  * */
214
204
  function addWarmUpFunctionToService(service, warmerName, warmerConfig) {
215
- // eslint-disable-next-line no-param-reassign
216
- service.functions[`warmUpPlugin${capitalize(warmerName)}`] = {
217
- description: `Serverless WarmUp Plugin (warmer "${warmerName}")`,
218
- events: warmerConfig.events,
219
- handler: warmerConfig.pathHandler.split(path.sep).join(path.posix.sep),
220
- memorySize: warmerConfig.memorySize,
221
- name: warmerConfig.name,
222
- ...(warmerConfig.architecture ? { architecture: warmerConfig.architecture } : {}),
223
- runtime: 'nodejs18.x',
224
- package: warmerConfig.package,
225
- timeout: warmerConfig.timeout,
226
- ...(Object.keys(warmerConfig.environment).length
227
- ? { environment: warmerConfig.environment }
228
- : {}),
229
- ...(warmerConfig.tracing !== undefined ? { tracing: warmerConfig.tracing } : {}),
230
- ...(warmerConfig.logRetentionInDays !== undefined
231
- ? { logRetentionInDays: warmerConfig.logRetentionInDays }
232
- : {}),
233
- ...(warmerConfig.roleName ? { roleName: warmerConfig.roleName } : {}),
234
- ...(warmerConfig.role ? { role: warmerConfig.role } : {}),
235
- ...(warmerConfig.tags ? { tags: warmerConfig.tags } : {}),
236
- ...(warmerConfig.vpc ? { vpc: warmerConfig.vpc } : {}),
237
- layers: [],
238
- };
205
+ // eslint-disable-next-line no-param-reassign
206
+ service.functions[`warmUpPlugin${capitalize(warmerName)}`] = {
207
+ description: `Serverless WarmUp Plugin (warmer "${warmerName}")`,
208
+ events: warmerConfig.events,
209
+ handler: warmerConfig.pathHandler.split(path.sep).join(path.posix.sep),
210
+ memorySize: warmerConfig.memorySize,
211
+ name: warmerConfig.name,
212
+ ...(warmerConfig.architecture ? { architecture: warmerConfig.architecture } : {}),
213
+ runtime: 'nodejs24.x',
214
+ package: warmerConfig.package,
215
+ timeout: warmerConfig.timeout,
216
+ ...(Object.keys(warmerConfig.environment).length
217
+ ? { environment: warmerConfig.environment }
218
+ : {}),
219
+ ...(warmerConfig.tracing !== undefined ? { tracing: warmerConfig.tracing } : {}),
220
+ ...(warmerConfig.logRetentionInDays !== undefined
221
+ ? { logRetentionInDays: warmerConfig.logRetentionInDays }
222
+ : {}),
223
+ ...(warmerConfig.roleName ? { roleName: warmerConfig.roleName } : {}),
224
+ ...(warmerConfig.role ? { role: warmerConfig.role } : {}),
225
+ ...(warmerConfig.tags ? { tags: warmerConfig.tags } : {}),
226
+ ...(warmerConfig.vpc ? { vpc: warmerConfig.vpc } : {}),
227
+ layers: [],
228
+ };
239
229
  }
240
230
 
241
231
  module.exports = {
242
- addWarmUpFunctionRoleToResources,
243
- createWarmUpFunctionArtifact,
244
- addWarmUpFunctionToService,
232
+ addWarmUpFunctionRoleToResources,
233
+ createWarmUpFunctionArtifact,
234
+ addWarmUpFunctionToService,
245
235
  };
package/.eslintignore DELETED
@@ -1,2 +0,0 @@
1
- coverage
2
- test_integration
package/.eslintrc.js DELETED
@@ -1,9 +0,0 @@
1
- module.exports = {
2
- extends: 'airbnb-base',
3
- parserOptions: {
4
- ecmaVersion: 10,
5
- },
6
- env: {
7
- node: true,
8
- },
9
- };