cdk-nuxt 0.2.10 → 0.3.2
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/README.md +3 -12
- package/index.d.ts +1 -0
- package/index.js +2 -1
- package/lib/cli/deploy.js +34 -17
- package/lib/functions/assets_cleanup/index.js +2 -2
- package/lib/functions/assets_cleanup/package.json +2 -2
- package/lib/functions/assets_cleanup/yarn.lock +2 -2
- package/lib/stack/app-stack-props.d.ts +16 -0
- package/lib/stack/app-stack-props.js +1 -1
- package/lib/stack/app-stack-props.ts +19 -0
- package/lib/stack/nuxt-app-assets-cleanup-stack.d.ts +37 -6
- package/lib/stack/nuxt-app-assets-cleanup-stack.js +38 -25
- package/lib/stack/nuxt-app-assets-cleanup-stack.ts +55 -32
- package/lib/stack/nuxt-app-stack.d.ts +149 -9
- package/lib/stack/nuxt-app-stack.js +117 -31
- package/lib/stack/nuxt-app-stack.ts +199 -38
- package/lib/stack/nuxt-app-static-assets.d.ts +24 -4
- package/lib/stack/nuxt-app-static-assets.js +99 -94
- package/lib/stack/nuxt-app-static-assets.ts +124 -98
- package/lib/stack/nuxt-config.d.ts +10 -0
- package/lib/stack/nuxt-config.js +3 -0
- package/lib/stack/nuxt-config.ts +12 -0
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,14 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Easy Nuxt deployments on AWS via CDK
|
|
2
2
|
|
|
3
|
-
This
|
|
3
|
+
This package allows deployments of Nuxt applications via CDK on AWS by using Route53, API Gateway, Cloudfront, Lambda and S3.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## Useful commands
|
|
8
|
-
|
|
9
|
-
* `npm run build` compile typescript to js
|
|
10
|
-
* `npm run watch` watch for changes and compile
|
|
11
|
-
* `npm run test` perform the jest unit tests
|
|
12
|
-
* `cdk deploy` deploy this stack to your default AWS account/region
|
|
13
|
-
* `cdk diff` compare deployed stack with current state
|
|
14
|
-
* `cdk synth` emits the synthesized CloudFormation template
|
|
5
|
+
This package is currently in development and will be published with a full Readme shortly.
|
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NuxtAppAssetsCleanupStack = exports.NuxtAppStack = void 0;
|
|
3
4
|
var nuxt_app_stack_1 = require("./lib/stack/nuxt-app-stack");
|
|
4
5
|
Object.defineProperty(exports, "NuxtAppStack", { enumerable: true, get: function () { return nuxt_app_stack_1.NuxtAppStack; } });
|
|
5
6
|
var nuxt_app_assets_cleanup_stack_1 = require("./lib/stack/nuxt-app-assets-cleanup-stack");
|
|
6
7
|
Object.defineProperty(exports, "NuxtAppAssetsCleanupStack", { enumerable: true, get: function () { return nuxt_app_assets_cleanup_stack_1.NuxtAppAssetsCleanupStack; } });
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2REFBMEU7QUFBbEUsOEdBQUEsWUFBWSxPQUFBO0FBQ3BCLDJGQUE4RztBQUF0RywwSUFBQSx5QkFBeUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7QXBwU3RhY2tQcm9wc30gZnJvbSBcIi4vbGliL3N0YWNrL2FwcC1zdGFjay1wcm9wc1wiXG5leHBvcnQge051eHRBcHBTdGFjaywgTnV4dEFwcFN0YWNrUHJvcHN9IGZyb20gXCIuL2xpYi9zdGFjay9udXh0LWFwcC1zdGFja1wiXG5leHBvcnQge051eHRBcHBBc3NldHNDbGVhbnVwU3RhY2ssIE51eHRBcHBBc3NldHNDbGVhbnVwUHJvcHN9IGZyb20gXCIuL2xpYi9zdGFjay9udXh0LWFwcC1hc3NldHMtY2xlYW51cC1zdGFja1wiIl19
|
package/lib/cli/deploy.js
CHANGED
|
@@ -3,54 +3,71 @@
|
|
|
3
3
|
const shell = require("shelljs");
|
|
4
4
|
const path = require("path");
|
|
5
5
|
|
|
6
|
+
const logPrefix = 'Nuxt Deployment';
|
|
7
|
+
|
|
8
|
+
shell.echo(`${logPrefix}: Starting deployment...`);
|
|
9
|
+
|
|
6
10
|
const deploymentFolder = '.nuxt/cdk-deployment';
|
|
7
11
|
const deploymentSourceFolder = `${deploymentFolder}/src`;
|
|
8
12
|
const deploymentLayerFolder = `${deploymentFolder}/layer/nodejs`;
|
|
13
|
+
const rootFolder = process.cwd();
|
|
9
14
|
|
|
10
|
-
// Refresh the
|
|
11
|
-
shell.echo(
|
|
15
|
+
// Refresh the cdk output folder to have a clean state and prevent persisting outdated outputs
|
|
16
|
+
shell.echo(`${logPrefix}: Deleting outdated CDK files...`);
|
|
17
|
+
shell.rm('-rf', 'cdk.out');
|
|
18
|
+
|
|
19
|
+
// Refresh the deployment folder to have a clean state
|
|
20
|
+
shell.echo(`${logPrefix}: Refreshing deployment folder [${deploymentFolder}]...`);
|
|
12
21
|
shell.rm('-rf', deploymentFolder);
|
|
13
22
|
shell.mkdir('-p', `${deploymentSourceFolder}/.nuxt/dist`);
|
|
14
23
|
shell.mkdir('-p', deploymentLayerFolder);
|
|
15
24
|
|
|
16
25
|
// Preparing the assets cleanup lambda function
|
|
17
|
-
shell.echo(
|
|
26
|
+
shell.echo(`${logPrefix}: Installing the assets cleanup lambda function...`);
|
|
18
27
|
shell.cd(path.join(__dirname, '../functions/assets_cleanup'));
|
|
19
28
|
if (shell.exec('yarn install --frozen-lockfile && yarn install-layer').code !== 0) {
|
|
20
|
-
shell.echo(
|
|
29
|
+
shell.echo(`${logPrefix} Error: Installation of assets cleanup lambda function failed.`);
|
|
21
30
|
shell.exit(1);
|
|
22
31
|
}
|
|
32
|
+
shell.echo(`${logPrefix}: Building the assets cleanup lambda function...`);
|
|
23
33
|
if (shell.exec('yarn build').code !== 0) {
|
|
24
|
-
shell.echo(
|
|
34
|
+
shell.echo(`${logPrefix} Error: Build of assets cleanup lambda function failed.`);
|
|
25
35
|
shell.exit(1);
|
|
26
36
|
}
|
|
27
|
-
shell.cd(
|
|
37
|
+
shell.cd(rootFolder);
|
|
28
38
|
|
|
29
39
|
// Copy our files required for SSR
|
|
30
|
-
shell.echo(
|
|
40
|
+
shell.echo(`${logPrefix}: Copying ssr files to deployment folder...`);
|
|
31
41
|
shell.cp('-r', '.nuxt/dist/server', `${deploymentSourceFolder}/.nuxt/dist`);
|
|
32
42
|
shell.cp(path.join(__dirname, '../functions/app/index.js'), deploymentSourceFolder);
|
|
33
43
|
|
|
44
|
+
// Copy the config files
|
|
45
|
+
shell.echo(`${logPrefix}: Copying config files to deployment folder...`);
|
|
46
|
+
shell.cp('.env', deploymentSourceFolder);
|
|
47
|
+
shell.cp('nuxt.config.js', deploymentSourceFolder);
|
|
48
|
+
|
|
34
49
|
// Prepare the Lambda layer for the node_modules required for SSR of the Nuxt app
|
|
35
|
-
shell.echo(
|
|
50
|
+
shell.echo(`${logPrefix}: Preparing the node_modules lambda layer in deployment folder...`);
|
|
36
51
|
shell.cp('package.json', deploymentLayerFolder);
|
|
37
52
|
shell.cp('yarn.lock', deploymentLayerFolder);
|
|
53
|
+
shell.cp('.yarnclean', deploymentLayerFolder);
|
|
38
54
|
shell.cd(deploymentLayerFolder);
|
|
55
|
+
|
|
56
|
+
// We do not want to install any dependencies listed under 'devDendencies'
|
|
57
|
+
// Usually the --production flag should do the trick but somehow still installs more dependencies as required
|
|
58
|
+
shell.exec('sed -i \'\' \'/\\"devDependencies\\"/,/}/ d\' package.json')
|
|
39
59
|
if (shell.exec('yarn install --production --frozen-lockfile').code !== 0) {
|
|
40
|
-
shell.echo(
|
|
60
|
+
shell.echo(`${logPrefix} Error: Installation of lambda layer failed.`);
|
|
41
61
|
shell.exit(1);
|
|
42
62
|
}
|
|
43
|
-
shell.cd(
|
|
44
|
-
|
|
45
|
-
// Copy the config files
|
|
46
|
-
shell.echo('Copying config files...');
|
|
47
|
-
shell.cp('.env', deploymentSourceFolder);
|
|
48
|
-
shell.cp('nuxt.config.js', deploymentSourceFolder);
|
|
63
|
+
shell.cd(rootFolder);
|
|
49
64
|
|
|
50
65
|
// Run the deployment
|
|
66
|
+
shell.echo(`${logPrefix}: Running deployment to AWS via CDK...`);
|
|
51
67
|
if (shell.exec('yarn cdk deploy --require-approval never --all --app="yarn ts-node stack/index.ts"').code !== 0) {
|
|
52
|
-
shell.echo(
|
|
68
|
+
shell.echo(`${logPrefix} Error: CDK deployment failed.`);
|
|
53
69
|
shell.exit(1);
|
|
54
70
|
}
|
|
55
71
|
|
|
56
|
-
shell.echo(
|
|
72
|
+
shell.echo(`${logPrefix}: CDK deployment successful.`);
|
|
73
|
+
|
|
@@ -15,7 +15,7 @@ exports.handler = async (event, context) => {
|
|
|
15
15
|
// As we don't have hundreds of deployments per week, there's no need for pagination
|
|
16
16
|
const deploymentFolders = await client.send(new client_s3_1.ListObjectsV2Command({
|
|
17
17
|
Bucket: bucketName,
|
|
18
|
-
Delimiter: '/',
|
|
18
|
+
Delimiter: '/', // Only retrieve the top level folders
|
|
19
19
|
}));
|
|
20
20
|
// The result is a list of objects containing the keys with a trailing slash
|
|
21
21
|
const folderNames = (_a = deploymentFolders.CommonPrefixes) === null || _a === void 0 ? void 0 : _a.map(folder => { var _a; return (_a = folder.Prefix) === null || _a === void 0 ? void 0 : _a.slice(0, -1); });
|
|
@@ -79,4 +79,4 @@ exports.handler = async (event, context) => {
|
|
|
79
79
|
console.error('### unexpected runtime error ###', error);
|
|
80
80
|
}
|
|
81
81
|
};
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQUF3RjtBQUV4RixNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFekQsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBVSxFQUFFLE9BQVksRUFBRSxFQUFFOztJQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFFdEUsSUFBSTtRQUNBLE1BQU0sTUFBTSxHQUFHLElBQUksb0JBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztRQUVwRCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1NBQy9FO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLHdCQUF3QixDQUFDLENBQUM7UUFFeEUsb0ZBQW9GO1FBQ3BGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUN2QyxJQUFJLGdDQUFvQixDQUFDO1lBQ3JCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLFNBQVMsRUFBRSxHQUFHLEVBQUUsc0NBQXNDO1NBQ3pELENBQUMsQ0FDTCxDQUFDO1FBRUYsNEVBQTRFO1FBQzVFLE1BQU0sV0FBVyxHQUFHLE1BQUEsaUJBQWlCLENBQUMsY0FBYywwQ0FBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBQyxPQUFBLE1BQUEsTUFBTSxDQUFDLE1BQU0sMENBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FB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LENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7S0FDekQ7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDNUQ7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlbGV0ZU9iamVjdHNDb21tYW5kLCBMaXN0T2JqZWN0c1YyQ29tbWFuZCwgUzNDbGllbnR9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcblxuY29uc3QgT05FX1dFRUtfSU5fTUlMTElTRUNPTkRTID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIDc7XG5cbmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIChldmVudDogYW55LCBjb250ZXh0OiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmxvZygnU3RhcnRpbmcgY2xlYW51cCBvZiBzdGF0aWMgYXNzZXRzIG9sZGVyIHRoYW4gMSB3ZWVrLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBuZXcgUzNDbGllbnQoe3JlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTn0pO1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gcHJvY2Vzcy5lbnYuU1RBVElDX0FTU0VUU19CVUNLRVQ7XG5cbiAgICAgICAgaWYgKCFidWNrZXROYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0aWMgYXNzZXQncyBidWNrZXQgbmFtZSBub3Qgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbGV0ZU9sZGVyVGhhbiA9IG5ldyBEYXRlKERhdGUubm93KCkgLSBPTkVfV0VFS19JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICAgIC8vIEFzIHdlIGRvbid0IGhhdmUgaHVuZHJlZHMgb2YgZGVwbG95bWVudHMgcGVyIHdlZWssIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBkZXBsb3ltZW50Rm9sZGVycyA9IGF3YWl0IGNsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgRGVsaW1pdGVyOiAnLycsIC8vIE9ubHkgcmV0cmlldmUgdGhlIHRvcCBsZXZlbCBmb2xkZXJzXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoZSByZXN1bHQgaXMgYSBsaXN0IG9mIG9iamVjdHMgY29udGFpbmluZyB0aGUga2V5cyB3aXRoIGEgdHJhaWxpbmcgc2xhc2hcbiAgICAgICAgY29uc3QgZm9sZGVyTmFtZXMgPSBkZXBsb3ltZW50Rm9sZGVycy5Db21tb25QcmVmaXhlcz8ubWFwKGZvbGRlciA9PiBmb2xkZXIuUHJlZml4Py5zbGljZSgwLCAtMSkpXG4gICAgICAgIGlmICghZm9sZGVyTmFtZXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDYW5jZWxlZCBzdGF0aWMgYXNzZXRzIGNsZWFudXAgYXMgZm9sZGVyIGlzIGVtcHR5LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2Ugc29ydCB0aGUgZm9sZGVycyBieSB0aGVpciBjcmVhdGlvbiBkYXRhIGFuZCByZW1vdmUgdGhlIGxhdGVzdCBvbmUgYXMgdGhpcyBpcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBvbmUgdXNlZCBpbiBwcm9kdWN0aW9uXG4gICAgICAgIGNvbnN0IGxlZ2FjeUZvbGRlck5hbWVzID0gZm9sZGVyTmFtZXMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBjcmVhdGlvbkRhdGVBID0gbmV3IERhdGUoYSk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBjcmVhdGlvbkRhdGVCID0gbmV3IERhdGUoYik7XG5cbiAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGVBLmdldFRpbWUoKSA8IGNyZWF0aW9uRGF0ZUIuZ2V0VGltZSgpID8gLTEgOiAxO1xuICAgICAgICB9KVxuICAgICAgICBjb25zdCBhY3RpdmVGb2xkZXJOYW1lID0gbGVnYWN5Rm9sZGVyTmFtZXMucG9wKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBEZXRlY3RlZCBhc3NldHMgZm9sZGVyIFwiJHthY3RpdmVGb2xkZXJOYW1lfVwiIGFzIGN1cnJlbnQgcHJvZHVjdGlvbiBmb2xkZXIuLi5gKTtcblxuICAgICAgICAvLyBXZSB3YW50IHRvIGdldCBhbGwgb3V0ZGF0ZWQgZm9sZGVycyBvZiBvdXIgbGVnYWN5IChub3QgcHJvZHVjdGl2ZWx5IHVzZWQpIGZvbGRlcnMgZm9yIGRlbGV0aW9uXG4gICAgICAgIGNvbnN0IG91dGRhdGVkRm9sZGVyTmFtZXMgPSBsZWdhY3lGb2xkZXJOYW1lcy5maWx0ZXIoZm9sZGVyTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKGZvbGRlck5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGUuZ2V0VGltZSgpIDwgZGVsZXRlT2xkZXJUaGFuLmdldFRpbWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIW91dGRhdGVkRm9sZGVyTmFtZXMgfHwgb3V0ZGF0ZWRGb2xkZXJOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBvdXRkYXRlZCBhc3NldCBmb2xkZXJzIGZvdW5kLicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nICR7b3V0ZGF0ZWRGb2xkZXJOYW1lcy5sZW5ndGh9IG91dGRhdGVkIGZvbGRlcnMuLi5gKTtcblxuICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSBpdCdzIG5vdCBwb3NzaWJsZSB0byBkZWxldGUgZm9sZGVycyByZWN1cnNpdmVseSDwn5mEXG4gICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHF1ZXJ5IGFsbCB0aGUgY29udGVudHMgaW4gb3JkZXIgdG8gZGVsZXRlIHRoZW1cbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlcyA9IG91dGRhdGVkRm9sZGVyTmFtZXMubWFwKGZvbGRlck5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLnNlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVmaXg6IGZvbGRlck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKG91dGRhdGVkQXNzZXRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVsZXRlT2JqZWN0c0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0czogb3V0ZGF0ZWRBc3NldHMuQ29udGVudHM/Lm1hcChvdXRkYXRlZEFzc2V0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge0tleTogb3V0ZGF0ZWRBc3NldC5LZXl9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nUHJvbWlzZXMpO1xuICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5FcnJvcnMgJiYgcmVzdWx0LkVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSAnRmFpbGVkIHRvIGRlbGV0ZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzLic7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JNc2csIHJlc3VsdC5FcnJvcnMpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ0NsZWFudXAgb2Ygb2xkIHN0YXRpYyBhc3NldHMgZmluaXNoZWQuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignIyMjIHVuZXhwZWN0ZWQgcnVudGltZSBlcnJvciAjIyMnLCBlcnJvcik7XG4gICAgfVxufTsiXX0=
|
|
@@ -909,7 +909,7 @@ make-error@^1.1.1:
|
|
|
909
909
|
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
|
|
910
910
|
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
|
|
911
911
|
|
|
912
|
-
ts-node@^10.
|
|
912
|
+
ts-node@^10.5.0:
|
|
913
913
|
version "10.5.0"
|
|
914
914
|
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.5.0.tgz#618bef5854c1fbbedf5e31465cbb224a1d524ef9"
|
|
915
915
|
integrity sha512-6kEJKwVxAJ35W4akuiysfKwKmjkbYxwQMTBaAxo9KKAx/Yd26mPUyhGz3ji+EsJoAgrLqVsYHNuuYwQe22lbtw==
|
|
@@ -938,7 +938,7 @@ tslib@^2.3.0:
|
|
|
938
938
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
|
|
939
939
|
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
|
|
940
940
|
|
|
941
|
-
typescript@^4.
|
|
941
|
+
typescript@^4.5.5:
|
|
942
942
|
version "4.5.5"
|
|
943
943
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
|
|
944
944
|
integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import { StackProps } from "aws-cdk-lib";
|
|
2
|
+
/**
|
|
3
|
+
* Defines the common props required for the individual stacks
|
|
4
|
+
* of our Nuxt CDK app.
|
|
5
|
+
*/
|
|
2
6
|
export interface AppStackProps extends StackProps {
|
|
7
|
+
/**
|
|
8
|
+
* A string identifier for the project the Nuxt app is part of.
|
|
9
|
+
* A project might have multiple different services.
|
|
10
|
+
*/
|
|
3
11
|
readonly project: string;
|
|
12
|
+
/**
|
|
13
|
+
* A string identifier for the project's service the Nuxt app is created for.
|
|
14
|
+
* This can be seen as the name of the Nuxt app.
|
|
15
|
+
*/
|
|
4
16
|
readonly service: string;
|
|
17
|
+
/**
|
|
18
|
+
* A string to identify the environment of the Nuxt app. This enables us
|
|
19
|
+
* to deploy multiple different environments of the same Nuxt app, e.g., production and development.
|
|
20
|
+
*/
|
|
5
21
|
readonly environment: string;
|
|
6
22
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0YWNrLXByb3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLXN0YWNrLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1N0YWNrUHJvcHN9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIGNvbW1vbiBwcm9wcyByZXF1aXJlZCBmb3IgdGhlIGluZGl2aWR1YWwgc3RhY2tzXG4gKiBvZiBvdXIgTnV4dCBDREsgYXBwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0IHRoZSBOdXh0IGFwcCBpcyBwYXJ0IG9mLlxuICAgICAqIEEgcHJvamVjdCBtaWdodCBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCBzZXJ2aWNlcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdCdzIHNlcnZpY2UgdGhlIE51eHQgYXBwIGlzIGNyZWF0ZWQgZm9yLlxuICAgICAqIFRoaXMgY2FuIGJlIHNlZW4gYXMgdGhlIG5hbWUgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgTnV4dCBhcHAuIFRoaXMgZW5hYmxlcyB1c1xuICAgICAqIHRvIGRlcGxveSBtdWx0aXBsZSBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIG9mIHRoZSBzYW1lIE51eHQgYXBwLCBlLmcuLCBwcm9kdWN0aW9uIGFuZCBkZXZlbG9wbWVudC5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbnZpcm9ubWVudDogc3RyaW5nO1xufSJdfQ==
|
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
import {StackProps} from "aws-cdk-lib";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Defines the common props required for the individual stacks
|
|
5
|
+
* of our Nuxt CDK app.
|
|
6
|
+
*/
|
|
3
7
|
export interface AppStackProps extends StackProps {
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A string identifier for the project the Nuxt app is part of.
|
|
11
|
+
* A project might have multiple different services.
|
|
12
|
+
*/
|
|
4
13
|
readonly project: string;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A string identifier for the project's service the Nuxt app is created for.
|
|
17
|
+
* This can be seen as the name of the Nuxt app.
|
|
18
|
+
*/
|
|
5
19
|
readonly service: string;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A string to identify the environment of the Nuxt app. This enables us
|
|
23
|
+
* to deploy multiple different environments of the same Nuxt app, e.g., production and development.
|
|
24
|
+
*/
|
|
6
25
|
readonly environment: string;
|
|
7
26
|
}
|
|
@@ -2,21 +2,52 @@ import { IBucket } from "aws-cdk-lib/aws-s3";
|
|
|
2
2
|
import { Stack } from "aws-cdk-lib";
|
|
3
3
|
import { AppStackProps } from "./app-stack-props";
|
|
4
4
|
import { Construct } from "constructs";
|
|
5
|
+
/**
|
|
6
|
+
* Defines the props required for the {@see NuxtAppAssetsCleanupStack}.
|
|
7
|
+
*/
|
|
5
8
|
export interface NuxtAppAssetsCleanupProps extends AppStackProps {
|
|
9
|
+
/**
|
|
10
|
+
* The S3 bucket where the static assets of the Nuxt app are located.
|
|
11
|
+
*/
|
|
6
12
|
readonly staticAssetsBucket: IBucket;
|
|
7
|
-
readonly sentryDsn: string;
|
|
8
13
|
}
|
|
9
14
|
/**
|
|
10
|
-
*
|
|
15
|
+
* Creates a scheduled lambda function that deletes outdated static assets of the Nuxt app from S3
|
|
16
|
+
* to keep it nice without any outdated files that aren't used anymore.
|
|
11
17
|
*/
|
|
12
18
|
export declare class NuxtAppAssetsCleanupStack extends Stack {
|
|
19
|
+
/**
|
|
20
|
+
* The identifier prefix of the resources created by the stack.
|
|
21
|
+
*
|
|
22
|
+
* @private
|
|
23
|
+
*/
|
|
13
24
|
private readonly resourceIdPrefix;
|
|
14
|
-
|
|
15
|
-
|
|
25
|
+
/**
|
|
26
|
+
* A reference to the created lambda function that cleanups the outdated static assets of the Nuxt app.
|
|
27
|
+
*
|
|
28
|
+
* @private
|
|
29
|
+
*/
|
|
16
30
|
private readonly lambdaFunction;
|
|
17
|
-
private scheduledRule;
|
|
18
31
|
constructor(scope: Construct, id: string, props: NuxtAppAssetsCleanupProps);
|
|
19
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Creates the lambda function that cleanups the outdated static assets of the Nuxt app.
|
|
34
|
+
*
|
|
35
|
+
* @param props
|
|
36
|
+
* @private
|
|
37
|
+
*/
|
|
20
38
|
private createLambdaFunction;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a lambda layer for the cleanup function that holds the required node_modules.
|
|
41
|
+
*
|
|
42
|
+
* @private
|
|
43
|
+
*/
|
|
44
|
+
private createNodeModulesLayer;
|
|
45
|
+
/**
|
|
46
|
+
* Creates a scheduled rule that runs every tuesday at 03:30 AM GMT to trigger
|
|
47
|
+
* our cleanup lamda function.
|
|
48
|
+
*
|
|
49
|
+
* @param props
|
|
50
|
+
* @private
|
|
51
|
+
*/
|
|
21
52
|
private createRule;
|
|
22
53
|
}
|
|
@@ -8,58 +8,71 @@ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
|
|
8
8
|
const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
|
|
9
9
|
const path = require("path");
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Creates a scheduled lambda function that deletes outdated static assets of the Nuxt app from S3
|
|
12
|
+
* to keep it nice without any outdated files that aren't used anymore.
|
|
12
13
|
*/
|
|
13
14
|
class NuxtAppAssetsCleanupStack extends aws_cdk_lib_1.Stack {
|
|
14
15
|
constructor(scope, id, props) {
|
|
15
16
|
super(scope, id, props);
|
|
16
|
-
// Note, that this stack can't be tagged independently of the NuxtAppStack, as both are sharing the
|
|
17
|
-
// same scope (CDK App). This would overwrite previous set tags for the CDK App (last one wins).
|
|
18
17
|
this.resourceIdPrefix = `${props.project}-${props.service}-${props.environment}`;
|
|
19
|
-
this.staticAssetsBucket = props.staticAssetsBucket;
|
|
20
|
-
this.layer = this.createLayer();
|
|
21
18
|
this.lambdaFunction = this.createLambdaFunction(props);
|
|
22
|
-
this.
|
|
23
|
-
}
|
|
24
|
-
createLayer() {
|
|
25
|
-
const layerName = `${this.resourceIdPrefix}-layer`;
|
|
26
|
-
return new aws_lambda_1.LayerVersion(this, layerName, {
|
|
27
|
-
layerVersionName: layerName,
|
|
28
|
-
code: aws_lambda_1.Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/layer')),
|
|
29
|
-
compatibleRuntimes: [aws_lambda_1.Runtime.NODEJS_14_X],
|
|
30
|
-
});
|
|
19
|
+
this.createRule(props);
|
|
31
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates the lambda function that cleanups the outdated static assets of the Nuxt app.
|
|
23
|
+
*
|
|
24
|
+
* @param props
|
|
25
|
+
* @private
|
|
26
|
+
*/
|
|
32
27
|
createLambdaFunction(props) {
|
|
33
28
|
const functionName = `${this.resourceIdPrefix}-function`;
|
|
34
29
|
const result = new aws_lambda_1.Function(this, functionName, {
|
|
35
30
|
functionName: functionName,
|
|
31
|
+
description: `Auto-deletes the outdated static assets in the ${props.staticAssetsBucket.bucketName} S3 bucket.`,
|
|
36
32
|
runtime: aws_lambda_1.Runtime.NODEJS_14_X,
|
|
37
33
|
architecture: aws_lambda_1.Architecture.ARM_64,
|
|
38
|
-
layers: [this.
|
|
34
|
+
layers: [this.createNodeModulesLayer()],
|
|
39
35
|
handler: 'index.handler',
|
|
40
36
|
code: aws_lambda_1.Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/app')),
|
|
41
37
|
timeout: aws_cdk_lib_1.Duration.minutes(1),
|
|
42
38
|
memorySize: 128,
|
|
43
39
|
logRetention: aws_logs_1.RetentionDays.TWO_WEEKS,
|
|
44
40
|
environment: {
|
|
45
|
-
STATIC_ASSETS_BUCKET:
|
|
46
|
-
SENTRY_DSN: props.sentryDsn,
|
|
41
|
+
STATIC_ASSETS_BUCKET: props.staticAssetsBucket.bucketName,
|
|
47
42
|
ENVIRONMENT: props.environment,
|
|
48
43
|
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
|
|
49
44
|
NODE_OPTIONS: '--enable-source-maps',
|
|
50
45
|
},
|
|
51
46
|
});
|
|
52
47
|
// grant function access to S3 bucket
|
|
53
|
-
|
|
54
|
-
|
|
48
|
+
props.staticAssetsBucket.grantRead(result);
|
|
49
|
+
props.staticAssetsBucket.grantDelete(result);
|
|
55
50
|
return result;
|
|
56
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Creates a lambda layer for the cleanup function that holds the required node_modules.
|
|
54
|
+
*
|
|
55
|
+
* @private
|
|
56
|
+
*/
|
|
57
|
+
createNodeModulesLayer() {
|
|
58
|
+
return new aws_lambda_1.LayerVersion(this, `${this.resourceIdPrefix}-layer`, {
|
|
59
|
+
layerVersionName: `${this.resourceIdPrefix}-layer`,
|
|
60
|
+
code: aws_lambda_1.Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/layer')),
|
|
61
|
+
compatibleRuntimes: [aws_lambda_1.Runtime.NODEJS_14_X],
|
|
62
|
+
description: `Provides the node_modules required for the ${this.resourceIdPrefix} lambda function.`
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates a scheduled rule that runs every tuesday at 03:30 AM GMT to trigger
|
|
67
|
+
* our cleanup lamda function.
|
|
68
|
+
*
|
|
69
|
+
* @param props
|
|
70
|
+
* @private
|
|
71
|
+
*/
|
|
57
72
|
createRule(props) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
ruleName,
|
|
62
|
-
description: `Triggers a cleanup of outdated static assets of the ${props.project} app.`,
|
|
73
|
+
new aws_events_1.Rule(this, `${this.resourceIdPrefix}-scheduler-rule`, {
|
|
74
|
+
ruleName: `${this.resourceIdPrefix}-scheduler`,
|
|
75
|
+
description: `Triggers a cleanup of the outdated static assets at the ${props.staticAssetsBucket.bucketName} S3 bucket.`,
|
|
63
76
|
enabled: true,
|
|
64
77
|
schedule: aws_events_1.Schedule.cron({ weekDay: '3', hour: '3', minute: '30' }),
|
|
65
78
|
targets: [new aws_events_targets_1.LambdaFunction(this.lambdaFunction)],
|
|
@@ -67,4 +80,4 @@ class NuxtAppAssetsCleanupStack extends aws_cdk_lib_1.Stack {
|
|
|
67
80
|
}
|
|
68
81
|
}
|
|
69
82
|
exports.NuxtAppAssetsCleanupStack = NuxtAppAssetsCleanupStack;
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC1hcHAtYXNzZXRzLWNsZWFudXAtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudXh0LWFwcC1hc3NldHMtY2xlYW51cC1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2Q0FBNEM7QUFFNUMsdURBQTJGO0FBQzNGLHVEQUFzRDtBQUV0RCxtREFBbUQ7QUFDbkQsdUVBQThEO0FBQzlELDZCQUE2QjtBQVk3Qjs7O0dBR0c7QUFDSCxNQUFhLHlCQUEwQixTQUFRLG1CQUFLO0lBZ0JoRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakYsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxvQkFBb0IsQ0FBQyxLQUFnQztRQUN6RCxNQUFNLFlBQVksR0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsV0FBVyxDQUFDO1FBRWpFLE1BQU0sTUFBTSxHQUFhLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ3RELFlBQVksRUFBRSxZQUFZO1lBQzFCLFdBQVcsRUFBRSxrREFBa0QsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsYUFBYTtZQUMvRyxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLFlBQVksRUFBRSx5QkFBWSxDQUFDLE1BQU07WUFDakMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDdkMsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHVDQUF1QyxDQUFDLENBQUM7WUFDbkYsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM1QixVQUFVLEVBQUUsR0FBRztZQUNmLFlBQVksRUFBRSx3QkFBYSxDQUFDLFNBQVM7WUFDckMsV0FBVyxFQUFFO2dCQUNULG9CQUFvQixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVO2dCQUN6RCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQzlCLG1DQUFtQyxFQUFFLEdBQUc7Z0JBQ3hDLFlBQVksRUFBRSxzQkFBc0I7YUFDdkM7U0FDSixDQUFDLENBQUM7UUFFSCxxQ0FBcUM7UUFDckMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssc0JBQXNCO1FBQzFCLE9BQU8sSUFBSSx5QkFBWSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsUUFBUSxFQUFFO1lBQzVELGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixRQUFRO1lBQ2xELElBQUksRUFBRSxpQkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO1lBQ3JGLGtCQUFrQixFQUFFLENBQUMsb0JBQU8sQ0FBQyxXQUFXLENBQUM7WUFDekMsV0FBVyxFQUFFLDhDQUE4QyxJQUFJLENBQUMsZ0JBQWdCLG1CQUFtQjtTQUN0RyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssVUFBVSxDQUFDLEtBQWdDO1FBQy9DLElBQUksaUJBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGlCQUFpQixFQUFFO1lBQ3RELFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsWUFBWTtZQUM5QyxXQUFXLEVBQUUsMkRBQTJELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLGFBQWE7WUFDeEgsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUscUJBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDO1lBQ2hFLE9BQU8sRUFBRSxDQUFDLElBQUksbUNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDckQsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBekZELDhEQXlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SUJ1Y2tldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHtEdXJhdGlvbiwgU3RhY2t9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi9hcHAtc3RhY2stcHJvcHNcIjtcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBDb2RlLCBMYXllclZlcnNpb24sIFJ1bnRpbWUsIEZ1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtSdWxlLCBTY2hlZHVsZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtSZXRlbnRpb25EYXlzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7TGFtYmRhRnVuY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBwcm9wcyByZXF1aXJlZCBmb3IgdGhlIHtAc2VlIE51eHRBcHBBc3NldHNDbGVhbnVwU3RhY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51eHRBcHBBc3NldHNDbGVhbnVwUHJvcHMgZXh0ZW5kcyBBcHBTdGFja1Byb3BzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCBhcmUgbG9jYXRlZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBzdGF0aWNBc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBsYW1iZGEgZnVuY3Rpb24gdGhhdCBkZWxldGVzIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIGZyb20gUzNcbiAqIHRvIGtlZXAgaXQgbmljZSB3aXRob3V0IGFueSBvdXRkYXRlZCBmaWxlcyB0aGF0IGFyZW4ndCB1c2VkIGFueW1vcmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdXh0QXBwQXNzZXRzQ2xlYW51cFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJlZml4IG9mIHRoZSByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgbGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOdXh0QXBwQXNzZXRzQ2xlYW51cFByb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgICAgIHRoaXMucmVzb3VyY2VJZFByZWZpeCA9IGAke3Byb3BzLnByb2plY3R9LSR7cHJvcHMuc2VydmljZX0tJHtwcm9wcy5lbnZpcm9ubWVudH1gO1xuICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlUnVsZShwcm9wcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgbGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUxhbWJkYUZ1bmN0aW9uKHByb3BzOiBOdXh0QXBwQXNzZXRzQ2xlYW51cFByb3BzKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWU6IHN0cmluZyA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZnVuY3Rpb25gO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdDogRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24odGhpcywgZnVuY3Rpb25OYW1lLCB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQXV0by1kZWxldGVzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGluIHRoZSAke3Byb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBsYXllcnM6IFt0aGlzLmNyZWF0ZU5vZGVNb2R1bGVzTGF5ZXIoKV0sXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZnVuY3Rpb25zL2Fzc2V0c19jbGVhbnVwL2J1aWxkL2FwcCcpKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBTVEFUSUNfQVNTRVRTX0JVQ0tFVDogcHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgRU5WSVJPTk1FTlQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZ3JhbnQgZnVuY3Rpb24gYWNjZXNzIHRvIFMzIGJ1Y2tldFxuICAgICAgICBwcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnRSZWFkKHJlc3VsdCk7XG4gICAgICAgIHByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudERlbGV0ZShyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxhbWJkYSBsYXllciBmb3IgdGhlIGNsZWFudXAgZnVuY3Rpb24gdGhhdCBob2xkcyB0aGUgcmVxdWlyZWQgbm9kZV9tb2R1bGVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU5vZGVNb2R1bGVzTGF5ZXIoKTogTGF5ZXJWZXJzaW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXllclZlcnNpb24odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1sYXllcmAsIHtcbiAgICAgICAgICAgIGxheWVyVmVyc2lvbk5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbGF5ZXJgLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2Z1bmN0aW9ucy9hc3NldHNfY2xlYW51cC9idWlsZC9sYXllcicpKSxcbiAgICAgICAgICAgIGNvbXBhdGlibGVSdW50aW1lczogW1J1bnRpbWUuTk9ERUpTXzE0X1hdLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBQcm92aWRlcyB0aGUgbm9kZV9tb2R1bGVzIHJlcXVpcmVkIGZvciB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IGxhbWJkYSBmdW5jdGlvbi5gXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2hlZHVsZWQgcnVsZSB0aGF0IHJ1bnMgZXZlcnkgdHVlc2RheSBhdCAwMzozMCBBTSBHTVQgdG8gdHJpZ2dlclxuICAgICAqIG91ciBjbGVhbnVwIGxhbWRhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVJ1bGUocHJvcHM6IE51eHRBcHBBc3NldHNDbGVhbnVwUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgbmV3IFJ1bGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zY2hlZHVsZXItcnVsZWAsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlcmAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFRyaWdnZXJzIGEgY2xlYW51cCBvZiB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBhdCB0aGUgJHtwcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZX0gUzMgYnVja2V0LmAsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmNyb24oe3dlZWtEYXk6ICczJywgaG91cjogJzMnLCBtaW51dGU6ICczMCd9KSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5sYW1iZGFGdW5jdGlvbildLFxuICAgICAgICB9KTtcbiAgICB9XG59Il19
|
|
@@ -8,61 +8,66 @@ import {RetentionDays} from "aws-cdk-lib/aws-logs";
|
|
|
8
8
|
import {LambdaFunction} from "aws-cdk-lib/aws-events-targets";
|
|
9
9
|
import * as path from "path";
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Defines the props required for the {@see NuxtAppAssetsCleanupStack}.
|
|
13
|
+
*/
|
|
11
14
|
export interface NuxtAppAssetsCleanupProps extends AppStackProps {
|
|
15
|
+
/**
|
|
16
|
+
* The S3 bucket where the static assets of the Nuxt app are located.
|
|
17
|
+
*/
|
|
12
18
|
readonly staticAssetsBucket: IBucket;
|
|
13
|
-
readonly sentryDsn: string;
|
|
14
19
|
}
|
|
15
20
|
|
|
16
21
|
/**
|
|
17
|
-
*
|
|
22
|
+
* Creates a scheduled lambda function that deletes outdated static assets of the Nuxt app from S3
|
|
23
|
+
* to keep it nice without any outdated files that aren't used anymore.
|
|
18
24
|
*/
|
|
19
25
|
export class NuxtAppAssetsCleanupStack extends Stack {
|
|
20
26
|
|
|
27
|
+
/**
|
|
28
|
+
* The identifier prefix of the resources created by the stack.
|
|
29
|
+
*
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
21
32
|
private readonly resourceIdPrefix: string;
|
|
22
|
-
|
|
23
|
-
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A reference to the created lambda function that cleanups the outdated static assets of the Nuxt app.
|
|
36
|
+
*
|
|
37
|
+
* @private
|
|
38
|
+
*/
|
|
24
39
|
private readonly lambdaFunction: Function;
|
|
25
|
-
private scheduledRule: Rule;
|
|
26
40
|
|
|
27
41
|
constructor(scope: Construct, id: string, props: NuxtAppAssetsCleanupProps) {
|
|
28
42
|
super(scope, id, props);
|
|
29
43
|
|
|
30
|
-
// Note, that this stack can't be tagged independently of the NuxtAppStack, as both are sharing the
|
|
31
|
-
// same scope (CDK App). This would overwrite previous set tags for the CDK App (last one wins).
|
|
32
|
-
|
|
33
44
|
this.resourceIdPrefix = `${props.project}-${props.service}-${props.environment}`;
|
|
34
|
-
this.staticAssetsBucket = props.staticAssetsBucket;
|
|
35
|
-
this.layer = this.createLayer();
|
|
36
45
|
this.lambdaFunction = this.createLambdaFunction(props);
|
|
37
|
-
this.
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private createLayer(): LayerVersion {
|
|
41
|
-
const layerName = `${this.resourceIdPrefix}-layer`;
|
|
42
|
-
|
|
43
|
-
return new LayerVersion(this, layerName, {
|
|
44
|
-
layerVersionName: layerName,
|
|
45
|
-
code: Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/layer')),
|
|
46
|
-
compatibleRuntimes: [Runtime.NODEJS_14_X],
|
|
47
|
-
});
|
|
46
|
+
this.createRule(props);
|
|
48
47
|
}
|
|
49
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Creates the lambda function that cleanups the outdated static assets of the Nuxt app.
|
|
51
|
+
*
|
|
52
|
+
* @param props
|
|
53
|
+
* @private
|
|
54
|
+
*/
|
|
50
55
|
private createLambdaFunction(props: NuxtAppAssetsCleanupProps): Function {
|
|
51
56
|
const functionName: string = `${this.resourceIdPrefix}-function`;
|
|
52
57
|
|
|
53
58
|
const result: Function = new Function(this, functionName, {
|
|
54
59
|
functionName: functionName,
|
|
60
|
+
description: `Auto-deletes the outdated static assets in the ${props.staticAssetsBucket.bucketName} S3 bucket.`,
|
|
55
61
|
runtime: Runtime.NODEJS_14_X,
|
|
56
62
|
architecture: Architecture.ARM_64,
|
|
57
|
-
layers: [this.
|
|
63
|
+
layers: [this.createNodeModulesLayer()],
|
|
58
64
|
handler: 'index.handler',
|
|
59
65
|
code: Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/app')),
|
|
60
66
|
timeout: Duration.minutes(1),
|
|
61
67
|
memorySize: 128,
|
|
62
68
|
logRetention: RetentionDays.TWO_WEEKS,
|
|
63
69
|
environment: {
|
|
64
|
-
STATIC_ASSETS_BUCKET:
|
|
65
|
-
SENTRY_DSN: props.sentryDsn,
|
|
70
|
+
STATIC_ASSETS_BUCKET: props.staticAssetsBucket.bucketName,
|
|
66
71
|
ENVIRONMENT: props.environment,
|
|
67
72
|
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
|
|
68
73
|
NODE_OPTIONS: '--enable-source-maps',
|
|
@@ -70,19 +75,37 @@ export class NuxtAppAssetsCleanupStack extends Stack {
|
|
|
70
75
|
});
|
|
71
76
|
|
|
72
77
|
// grant function access to S3 bucket
|
|
73
|
-
|
|
74
|
-
|
|
78
|
+
props.staticAssetsBucket.grantRead(result);
|
|
79
|
+
props.staticAssetsBucket.grantDelete(result);
|
|
75
80
|
|
|
76
81
|
return result;
|
|
77
82
|
}
|
|
78
83
|
|
|
79
|
-
|
|
80
|
-
|
|
84
|
+
/**
|
|
85
|
+
* Creates a lambda layer for the cleanup function that holds the required node_modules.
|
|
86
|
+
*
|
|
87
|
+
* @private
|
|
88
|
+
*/
|
|
89
|
+
private createNodeModulesLayer(): LayerVersion {
|
|
90
|
+
return new LayerVersion(this, `${this.resourceIdPrefix}-layer`, {
|
|
91
|
+
layerVersionName: `${this.resourceIdPrefix}-layer`,
|
|
92
|
+
code: Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/layer')),
|
|
93
|
+
compatibleRuntimes: [Runtime.NODEJS_14_X],
|
|
94
|
+
description: `Provides the node_modules required for the ${this.resourceIdPrefix} lambda function.`
|
|
95
|
+
});
|
|
96
|
+
}
|
|
81
97
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
98
|
+
/**
|
|
99
|
+
* Creates a scheduled rule that runs every tuesday at 03:30 AM GMT to trigger
|
|
100
|
+
* our cleanup lamda function.
|
|
101
|
+
*
|
|
102
|
+
* @param props
|
|
103
|
+
* @private
|
|
104
|
+
*/
|
|
105
|
+
private createRule(props: NuxtAppAssetsCleanupProps): void {
|
|
106
|
+
new Rule(this, `${this.resourceIdPrefix}-scheduler-rule`, {
|
|
107
|
+
ruleName: `${this.resourceIdPrefix}-scheduler`,
|
|
108
|
+
description: `Triggers a cleanup of the outdated static assets at the ${props.staticAssetsBucket.bucketName} S3 bucket.`,
|
|
86
109
|
enabled: true,
|
|
87
110
|
schedule: Schedule.cron({weekDay: '3', hour: '3', minute: '30'}),
|
|
88
111
|
targets: [new LambdaFunction(this.lambdaFunction)],
|