@capraconsulting/webapp-deploy-lambda 2.2.6 → 2.3.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/README.md CHANGED
@@ -8,14 +8,14 @@ threshold.
8
8
  What it does:
9
9
 
10
10
  1. Fetch deployment log from S3
11
- 1. Fetch bundled artifact and extract locally with optional filtering
12
- 1. Upload all non-html files to S3
13
- 1. Upload html files to S3
14
- 1. Add uploaded items to deployment log
15
- 1. Delete old items from S3
16
- 1. Prune old deployments from deployment log
17
- 1. Store deployment log to S3 for next run
18
- 1. Optionally invalidate CloudFront distribution
11
+ 2. Fetch bundled artifact and extract locally with optional filtering
12
+ 3. Upload all non-html files to S3
13
+ 4. Upload html files to S3
14
+ 5. Add uploaded items to deployment log
15
+ 6. Delete old items from S3
16
+ 7. Prune old deployments from deployment log
17
+ 8. Store deployment log to S3 for next run
18
+ 9. Optionally invalidate CloudFront distribution
19
19
 
20
20
  ## Preserving old files
21
21
 
@@ -44,7 +44,7 @@ aws lambda invoke \
44
44
  --payload '{
45
45
  "ResourceProperties": {
46
46
  "artifactS3Url": "s3://my-bucket/my-release.tgz"
47
- },
47
+ },
48
48
  "RequestType": "Update"
49
49
  }' \
50
50
  /tmp/out.log
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@capraconsulting/webapp-deploy-lambda",
3
- "version": "2.2.6",
3
+ "version": "2.3.0",
4
4
  "description": "CDK construct for deploying a webapp release to S3 and CloudFront",
5
+ "type": "module",
5
6
  "repository": {
6
7
  "type": "git",
7
8
  "url": "https://github.com/capralifecycle/webapp-deploy-lambda"
@@ -39,26 +40,27 @@
39
40
  },
40
41
  "devDependencies": {
41
42
  "@aws-cdk/assert": "2.68.0",
42
- "@commitlint/cli": "19.5.0",
43
- "@commitlint/config-conventional": "19.5.0",
44
- "@types/jest": "29.5.13",
45
- "@types/node": "20.16.10",
46
- "@typescript-eslint/eslint-plugin": "8.8.0",
47
- "@typescript-eslint/parser": "8.8.0",
48
- "aws-cdk-lib": "2.161.1",
49
- "constructs": "10.3.0",
50
- "eslint": "8.57.1",
43
+ "@commitlint/cli": "19.6.0",
44
+ "@commitlint/config-conventional": "19.6.0",
45
+ "@eslint/eslintrc": "3.2.0",
46
+ "@eslint/js": "9.16.0",
47
+ "@types/jest": "29.5.14",
48
+ "@types/node": "22.10.2",
49
+ "@typescript-eslint/eslint-plugin": "8.18.0",
50
+ "@typescript-eslint/parser": "8.18.0",
51
+ "aws-cdk-lib": "2.173.0",
52
+ "constructs": "10.4.2",
53
+ "eslint": "9.16.0",
51
54
  "eslint-config-prettier": "9.1.0",
52
- "eslint-plugin-deprecation": "3.0.0",
53
55
  "eslint-plugin-prettier": "5.2.1",
54
- "husky": "9.1.6",
56
+ "husky": "9.1.7",
55
57
  "jest": "29.7.0",
56
58
  "jest-cdk-snapshot": "2.2.5",
57
- "prettier": "3.3.3",
58
- "semantic-release": "24.1.2",
59
+ "prettier": "3.4.2",
60
+ "semantic-release": "24.2.0",
59
61
  "ts-jest": "29.2.5",
60
- "ts-node": "10.9.2",
61
- "typescript": "5.6.2"
62
+ "tsx": "4.19.2",
63
+ "typescript": "5.7.2"
62
64
  },
63
65
  "peerDependencies": {
64
66
  "aws-cdk-lib": "^2.0.0",
package/lib/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export { ISource, Source, SourceConfig } from "./source";
2
- export { WebappDeploy, WebappDeployProps } from "./webapp-deploy";
package/lib/index.js DELETED
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebappDeploy = exports.Source = void 0;
4
- var source_1 = require("./source");
5
- Object.defineProperty(exports, "Source", { enumerable: true, get: function () { return source_1.Source; } });
6
- var webapp_deploy_1 = require("./webapp-deploy");
7
- Object.defineProperty(exports, "WebappDeploy", { enumerable: true, get: function () { return webapp_deploy_1.WebappDeploy; } });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXdEO0FBQXRDLGdHQUFBLE1BQU0sT0FBQTtBQUN4QixpREFBaUU7QUFBeEQsNkdBQUEsWUFBWSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgSVNvdXJjZSwgU291cmNlLCBTb3VyY2VDb25maWcgfSBmcm9tIFwiLi9zb3VyY2VcIlxuZXhwb3J0IHsgV2ViYXBwRGVwbG95LCBXZWJhcHBEZXBsb3lQcm9wcyB9IGZyb20gXCIuL3dlYmFwcC1kZXBsb3lcIlxuIl19
package/lib/source.d.ts DELETED
@@ -1,58 +0,0 @@
1
- import * as constructs from "constructs";
2
- import * as iam from "aws-cdk-lib/aws-iam";
3
- import * as s3 from "aws-cdk-lib/aws-s3";
4
- import * as s3Assets from "aws-cdk-lib/aws-s3-assets";
5
- export interface SourceConfig {
6
- /**
7
- * The source bucket to deploy from.
8
- */
9
- readonly bucket: s3.IBucket;
10
- /**
11
- * An S3 object key in the source bucket that points to a zip file.
12
- */
13
- readonly zipObjectKey: string;
14
- }
15
- /**
16
- * Bind context for ISources
17
- */
18
- export interface SourceContext {
19
- /**
20
- * The role for the handler
21
- *
22
- * @default - no policy is modified
23
- */
24
- readonly handlerRole?: iam.IRole;
25
- }
26
- /**
27
- * Represents a source for bucket deployments.
28
- */
29
- export interface ISource {
30
- /**
31
- * Binds the source to a bucket deployment.
32
- */
33
- bind(scope: constructs.Construct, context?: SourceContext): SourceConfig;
34
- }
35
- /**
36
- * Specifies bucket deployment source.
37
- *
38
- * Usage:
39
- *
40
- * Source.bucket(bucket, key)
41
- * Source.asset('/local/path/to/directory')
42
- * Source.asset('/local/path/to/a/file.zip')
43
- *
44
- */
45
- export declare class Source {
46
- /**
47
- * Uses a .zip file stored in an S3 bucket as the source for the destination bucket contents.
48
- * @param bucket The S3 Bucket
49
- * @param zipObjectKey The S3 object key of the zip file with contents
50
- */
51
- static bucket(bucket: s3.IBucket, zipObjectKey: string): ISource;
52
- /**
53
- * Uses a local asset as the deployment source.
54
- * @param path The path to a local .zip file or a directory
55
- */
56
- static asset(path: string, options?: s3Assets.AssetOptions): ISource;
57
- private constructor();
58
- }
package/lib/source.js DELETED
@@ -1,69 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Source = void 0;
4
- const s3Assets = require("aws-cdk-lib/aws-s3-assets");
5
- /**
6
- * Specifies bucket deployment source.
7
- *
8
- * Usage:
9
- *
10
- * Source.bucket(bucket, key)
11
- * Source.asset('/local/path/to/directory')
12
- * Source.asset('/local/path/to/a/file.zip')
13
- *
14
- */
15
- class Source {
16
- /**
17
- * Uses a .zip file stored in an S3 bucket as the source for the destination bucket contents.
18
- * @param bucket The S3 Bucket
19
- * @param zipObjectKey The S3 object key of the zip file with contents
20
- */
21
- static bucket(bucket, zipObjectKey) {
22
- return {
23
- bind: (_, context) => {
24
- if (!context) {
25
- throw new Error("To use a Source.bucket(), context must be provided");
26
- }
27
- if (context.handlerRole) {
28
- bucket.grantRead(context.handlerRole);
29
- }
30
- return { bucket, zipObjectKey };
31
- },
32
- };
33
- }
34
- /**
35
- * Uses a local asset as the deployment source.
36
- * @param path The path to a local .zip file or a directory
37
- */
38
- static asset(path, options) {
39
- return {
40
- bind(scope, context) {
41
- if (!context) {
42
- throw new Error("To use a Source.asset(), context must be provided");
43
- }
44
- let id = 1;
45
- while (scope.node.tryFindChild(`Asset${id}`)) {
46
- id++;
47
- }
48
- const asset = new s3Assets.Asset(scope, `Asset${id}`, {
49
- path,
50
- ...options,
51
- });
52
- if (!asset.isZipArchive) {
53
- throw new Error("Asset path must be either a .zip file or a directory");
54
- }
55
- if (context.handlerRole) {
56
- asset.grantRead(context.handlerRole);
57
- }
58
- return {
59
- bucket: asset.bucket,
60
- zipObjectKey: asset.s3ObjectKey,
61
- };
62
- },
63
- };
64
- }
65
- // eslint-disable-next-line @typescript-eslint/no-empty-function
66
- constructor() { }
67
- }
68
- exports.Source = Source;
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxzREFBcUQ7QUFzQ3JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsTUFBTTtJQUNqQjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFrQixFQUFFLFlBQW9CO1FBQzNELE9BQU87WUFDTCxJQUFJLEVBQUUsQ0FBQyxDQUF1QixFQUFFLE9BQXVCLEVBQUUsRUFBRTtnQkFDekQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQTtnQkFDdkUsQ0FBQztnQkFFRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQ3ZDLENBQUM7Z0JBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQTtZQUNqQyxDQUFDO1NBQ0YsQ0FBQTtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQVksRUFBRSxPQUErQjtRQUMvRCxPQUFPO1lBQ0wsSUFBSSxDQUFDLEtBQTJCLEVBQUUsT0FBdUI7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7Z0JBQ3RFLENBQUM7Z0JBRUQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUNWLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQzdDLEVBQUUsRUFBRSxDQUFBO2dCQUNOLENBQUM7Z0JBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO29CQUNwRCxJQUFJO29CQUNKLEdBQUcsT0FBTztpQkFDWCxDQUFDLENBQUE7Z0JBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDYixzREFBc0QsQ0FDdkQsQ0FBQTtnQkFDSCxDQUFDO2dCQUVELElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN4QixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtnQkFDdEMsQ0FBQztnQkFFRCxPQUFPO29CQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtvQkFDcEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxXQUFXO2lCQUNoQyxDQUFBO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLGdCQUF1QixDQUFDO0NBQ3pCO0FBN0RELHdCQTZEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuaW1wb3J0ICogYXMgczNBc3NldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zMy1hc3NldHNcIlxuXG4vLyBUaGlzIGlzIG1vc3RseSBiYXNlZCBvbiBhd3MtczMtZGVwbG95bWVudCBmcm9tIGF3cy1jZGsuXG5cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgYnVja2V0IHRvIGRlcGxveSBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0XG5cbiAgLyoqXG4gICAqIEFuIFMzIG9iamVjdCBrZXkgaW4gdGhlIHNvdXJjZSBidWNrZXQgdGhhdCBwb2ludHMgdG8gYSB6aXAgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHppcE9iamVjdEtleTogc3RyaW5nXG59XG5cbi8qKlxuICogQmluZCBjb250ZXh0IGZvciBJU291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUNvbnRleHQge1xuICAvKipcbiAgICogVGhlIHJvbGUgZm9yIHRoZSBoYW5kbGVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcG9saWN5IGlzIG1vZGlmaWVkXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyUm9sZT86IGlhbS5JUm9sZVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzb3VyY2UgZm9yIGJ1Y2tldCBkZXBsb3ltZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU291cmNlIHtcbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBzb3VyY2UgdG8gYSBidWNrZXQgZGVwbG95bWVudC5cbiAgICovXG4gIGJpbmQoc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBjb250ZXh0PzogU291cmNlQ29udGV4dCk6IFNvdXJjZUNvbmZpZ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyBidWNrZXQgZGVwbG95bWVudCBzb3VyY2UuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogICAgIFNvdXJjZS5idWNrZXQoYnVja2V0LCBrZXkpXG4gKiAgICAgU291cmNlLmFzc2V0KCcvbG9jYWwvcGF0aC90by9kaXJlY3RvcnknKVxuICogICAgIFNvdXJjZS5hc3NldCgnL2xvY2FsL3BhdGgvdG8vYS9maWxlLnppcCcpXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU291cmNlIHtcbiAgLyoqXG4gICAqIFVzZXMgYSAuemlwIGZpbGUgc3RvcmVkIGluIGFuIFMzIGJ1Y2tldCBhcyB0aGUgc291cmNlIGZvciB0aGUgZGVzdGluYXRpb24gYnVja2V0IGNvbnRlbnRzLlxuICAgKiBAcGFyYW0gYnVja2V0IFRoZSBTMyBCdWNrZXRcbiAgICogQHBhcmFtIHppcE9iamVjdEtleSBUaGUgUzMgb2JqZWN0IGtleSBvZiB0aGUgemlwIGZpbGUgd2l0aCBjb250ZW50c1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBidWNrZXQoYnVja2V0OiBzMy5JQnVja2V0LCB6aXBPYmplY3RLZXk6IHN0cmluZyk6IElTb3VyY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBiaW5kOiAoXzogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGNvbnRleHQ/OiBTb3VyY2VDb250ZXh0KSA9PiB7XG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRvIHVzZSBhIFNvdXJjZS5idWNrZXQoKSwgY29udGV4dCBtdXN0IGJlIHByb3ZpZGVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5oYW5kbGVyUm9sZSkge1xuICAgICAgICAgIGJ1Y2tldC5ncmFudFJlYWQoY29udGV4dC5oYW5kbGVyUm9sZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJ1Y2tldCwgemlwT2JqZWN0S2V5IH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgYSBsb2NhbCBhc3NldCBhcyB0aGUgZGVwbG95bWVudCBzb3VyY2UuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGEgbG9jYWwgLnppcCBmaWxlIG9yIGEgZGlyZWN0b3J5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzc2V0KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHMzQXNzZXRzLkFzc2V0T3B0aW9ucyk6IElTb3VyY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBiaW5kKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgY29udGV4dD86IFNvdXJjZUNvbnRleHQpOiBTb3VyY2VDb25maWcge1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUbyB1c2UgYSBTb3VyY2UuYXNzZXQoKSwgY29udGV4dCBtdXN0IGJlIHByb3ZpZGVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaWQgPSAxXG4gICAgICAgIHdoaWxlIChzY29wZS5ub2RlLnRyeUZpbmRDaGlsZChgQXNzZXQke2lkfWApKSB7XG4gICAgICAgICAgaWQrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzc2V0ID0gbmV3IHMzQXNzZXRzLkFzc2V0KHNjb3BlLCBgQXNzZXQke2lkfWAsIHtcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIH0pXG4gICAgICAgIGlmICghYXNzZXQuaXNaaXBBcmNoaXZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJBc3NldCBwYXRoIG11c3QgYmUgZWl0aGVyIGEgLnppcCBmaWxlIG9yIGEgZGlyZWN0b3J5XCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQuaGFuZGxlclJvbGUpIHtcbiAgICAgICAgICBhc3NldC5ncmFudFJlYWQoY29udGV4dC5oYW5kbGVyUm9sZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYnVja2V0OiBhc3NldC5idWNrZXQsXG4gICAgICAgICAgemlwT2JqZWN0S2V5OiBhc3NldC5zM09iamVjdEtleSxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxufVxuIl19
@@ -1,64 +0,0 @@
1
- import * as constructs from "constructs";
2
- import * as cloudfront from "aws-cdk-lib/aws-cloudfront";
3
- import * as lambda from "aws-cdk-lib/aws-lambda";
4
- import * as s3 from "aws-cdk-lib/aws-s3";
5
- import * as cdk from "aws-cdk-lib";
6
- import { ISource } from "./source";
7
- export interface WebappDeployProps {
8
- /**
9
- * Optional S3 bucket that can be used for deployment from outside CDK.
10
- *
11
- * If specified a policy is added so the deploy function can read from
12
- * the bucket.
13
- *
14
- * @default - none
15
- */
16
- buildsBucket?: s3.IBucket;
17
- /**
18
- * CloudFront Distribution to be invalidated after deploy.
19
- *
20
- * @default - none
21
- */
22
- distribution?: cloudfront.IDistribution;
23
- /**
24
- * Regex for patterns of files to be discarded during deployment.
25
- *
26
- * Example: `\.map$` will exclude `js/myapp-1b22c248f.js.map`.
27
- *
28
- * @default - none
29
- */
30
- excludePattern?: string;
31
- /**
32
- * The time when a deployment is considered old and will be deleted
33
- * unless it is the newest old deployment.
34
- *
35
- * @default - 5 days
36
- */
37
- pruneDeploymentsOlderThan?: cdk.Duration;
38
- /**
39
- * Name of the lambda function to be created.
40
- *
41
- * @default cdk.PhysicalName.GENERATE_IF_NEEDED
42
- */
43
- functionName?: string;
44
- /**
45
- * Name of S3 bucket where the contents of the artifacts will be deployed.
46
- * The files will be deployed under the key "web", which is then expected
47
- * to be the origin for the CloudFront distribution
48
- */
49
- webBucket: s3.IBucket;
50
- /**
51
- * Specific artifact to be deployed to the bucket during CDK deployment.
52
- *
53
- * @default - none
54
- */
55
- source?: ISource;
56
- }
57
- /**
58
- * Resource to deploy a webapp from a build artifact into an existing
59
- * S3 Bucket and CloudFront Distribution.
60
- */
61
- export declare class WebappDeploy extends constructs.Construct {
62
- readonly deployFn: lambda.Function;
63
- constructor(scope: constructs.Construct, id: string, props: WebappDeployProps);
64
- }
@@ -1,68 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebappDeploy = void 0;
4
- const constructs = require("constructs");
5
- const iam = require("aws-cdk-lib/aws-iam");
6
- const lambda = require("aws-cdk-lib/aws-lambda");
7
- const cdk = require("aws-cdk-lib");
8
- const custom_resources_1 = require("aws-cdk-lib/custom-resources");
9
- const path = require("path");
10
- /**
11
- * Resource to deploy a webapp from a build artifact into an existing
12
- * S3 Bucket and CloudFront Distribution.
13
- */
14
- class WebappDeploy extends constructs.Construct {
15
- constructor(scope, id, props) {
16
- var _a, _b;
17
- super(scope, id);
18
- const environment = {
19
- DEPLOY_LOG_BUCKET_URL: `s3://${props.webBucket.bucketName}/deployments.log`,
20
- EXPIRE_SECONDS: ((_a = props.pruneDeploymentsOlderThan) !== null && _a !== void 0 ? _a : cdk.Duration.days(5))
21
- .toSeconds()
22
- .toString(),
23
- TARGET_BUCKET_URL: `s3://${props.webBucket.bucketName}/web`,
24
- };
25
- if (props.distribution != null) {
26
- environment.CF_DISTRIBUTION_ID = props.distribution.distributionId;
27
- }
28
- if (props.excludePattern != null) {
29
- environment.EXCLUDE_PATTERN = props.excludePattern;
30
- }
31
- this.deployFn = new lambda.Function(this, "WebappDeployResource", {
32
- code: lambda.Code.fromAsset(path.join(__dirname, "../dist")),
33
- environment,
34
- functionName: (_b = props.functionName) !== null && _b !== void 0 ? _b : cdk.PhysicalName.GENERATE_IF_NEEDED,
35
- handler: "webapp_deploy.main.handler",
36
- reservedConcurrentExecutions: 1,
37
- runtime: lambda.Runtime.PYTHON_3_12,
38
- timeout: cdk.Duration.minutes(2),
39
- initialPolicy: [
40
- new iam.PolicyStatement({
41
- actions: ["cloudfront:CreateInvalidation"],
42
- // Cannot be restricted
43
- resources: ["*"],
44
- }),
45
- ],
46
- });
47
- const provider = new custom_resources_1.Provider(this, "Provider", {
48
- onEventHandler: this.deployFn,
49
- });
50
- props.webBucket.grantReadWrite(this.deployFn);
51
- if (props.buildsBucket) {
52
- props.buildsBucket.grantRead(this.deployFn);
53
- }
54
- if (props.source) {
55
- const source = props.source.bind(this, {
56
- handlerRole: this.deployFn.role,
57
- });
58
- new cdk.CustomResource(this, "CustomResource", {
59
- serviceToken: provider.serviceToken,
60
- properties: {
61
- artifactS3Url: `s3://${source.bucket.bucketName}/${source.zipObjectKey}`,
62
- },
63
- });
64
- }
65
- }
66
- }
67
- exports.WebappDeploy = WebappDeploy;
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXBwLWRlcGxveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJhcHAtZGVwbG95LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUV4QywyQ0FBMEM7QUFDMUMsaURBQWdEO0FBRWhELG1DQUFrQztBQUNsQyxtRUFBdUQ7QUFDdkQsNkJBQTRCO0FBc0Q1Qjs7O0dBR0c7QUFDSCxNQUFhLFlBQWEsU0FBUSxVQUFVLENBQUMsU0FBUztJQUdwRCxZQUNFLEtBQTJCLEVBQzNCLEVBQVUsRUFDVixLQUF3Qjs7UUFFeEIsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixNQUFNLFdBQVcsR0FBMkI7WUFDMUMscUJBQXFCLEVBQUUsUUFBUSxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsa0JBQWtCO1lBQzNFLGNBQWMsRUFBRSxDQUFDLE1BQUEsS0FBSyxDQUFDLHlCQUF5QixtQ0FBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdEUsU0FBUyxFQUFFO2lCQUNYLFFBQVEsRUFBRTtZQUNiLGlCQUFpQixFQUFFLFFBQVEsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLE1BQU07U0FDNUQsQ0FBQTtRQUVELElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMvQixXQUFXLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUE7UUFDcEUsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNqQyxXQUFXLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUE7UUFDcEQsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUNoRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUQsV0FBVztZQUNYLFlBQVksRUFBRSxNQUFBLEtBQUssQ0FBQyxZQUFZLG1DQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsa0JBQWtCO1lBQ3ZFLE9BQU8sRUFBRSw0QkFBNEI7WUFDckMsNEJBQTRCLEVBQUUsQ0FBQztZQUMvQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEMsYUFBYSxFQUFFO2dCQUNiLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztvQkFDdEIsT0FBTyxFQUFFLENBQUMsK0JBQStCLENBQUM7b0JBQzFDLHVCQUF1QjtvQkFDdkIsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2lCQUNqQixDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUE7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLDJCQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUM5QyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDOUIsQ0FBQyxDQUFBO1FBRUYsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTdDLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM3QyxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNyQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFLO2FBQ2pDLENBQUMsQ0FBQTtZQUNGLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdDLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtnQkFDbkMsVUFBVSxFQUFFO29CQUNWLGFBQWEsRUFBRSxRQUFRLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7aUJBQ3pFO2FBQ0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpFRCxvQ0FpRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgczMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgeyBJU291cmNlIH0gZnJvbSBcIi4vc291cmNlXCJcblxuZXhwb3J0IGludGVyZmFjZSBXZWJhcHBEZXBsb3lQcm9wcyB7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBTMyBidWNrZXQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGVwbG95bWVudCBmcm9tIG91dHNpZGUgQ0RLLlxuICAgKlxuICAgKiBJZiBzcGVjaWZpZWQgYSBwb2xpY3kgaXMgYWRkZWQgc28gdGhlIGRlcGxveSBmdW5jdGlvbiBjYW4gcmVhZCBmcm9tXG4gICAqIHRoZSBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgYnVpbGRzQnVja2V0PzogczMuSUJ1Y2tldFxuICAvKipcbiAgICogQ2xvdWRGcm9udCBEaXN0cmlidXRpb24gdG8gYmUgaW52YWxpZGF0ZWQgYWZ0ZXIgZGVwbG95LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIGRpc3RyaWJ1dGlvbj86IGNsb3VkZnJvbnQuSURpc3RyaWJ1dGlvblxuICAvKipcbiAgICogUmVnZXggZm9yIHBhdHRlcm5zIG9mIGZpbGVzIHRvIGJlIGRpc2NhcmRlZCBkdXJpbmcgZGVwbG95bWVudC5cbiAgICpcbiAgICogRXhhbXBsZTogYFxcLm1hcCRgIHdpbGwgZXhjbHVkZSBganMvbXlhcHAtMWIyMmMyNDhmLmpzLm1hcGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgZXhjbHVkZVBhdHRlcm4/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRoZSB0aW1lIHdoZW4gYSBkZXBsb3ltZW50IGlzIGNvbnNpZGVyZWQgb2xkIGFuZCB3aWxsIGJlIGRlbGV0ZWRcbiAgICogdW5sZXNzIGl0IGlzIHRoZSBuZXdlc3Qgb2xkIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gNSBkYXlzXG4gICAqL1xuICBwcnVuZURlcGxveW1lbnRzT2xkZXJUaGFuPzogY2RrLkR1cmF0aW9uXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBsYW1iZGEgZnVuY3Rpb24gdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgY2RrLlBoeXNpY2FsTmFtZS5HRU5FUkFURV9JRl9ORUVERURcbiAgICovXG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogTmFtZSBvZiBTMyBidWNrZXQgd2hlcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcnRpZmFjdHMgd2lsbCBiZSBkZXBsb3llZC5cbiAgICogVGhlIGZpbGVzIHdpbGwgYmUgZGVwbG95ZWQgdW5kZXIgdGhlIGtleSBcIndlYlwiLCB3aGljaCBpcyB0aGVuIGV4cGVjdGVkXG4gICAqIHRvIGJlIHRoZSBvcmlnaW4gZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvblxuICAgKi9cbiAgd2ViQnVja2V0OiBzMy5JQnVja2V0XG4gIC8qKlxuICAgKiBTcGVjaWZpYyBhcnRpZmFjdCB0byBiZSBkZXBsb3llZCB0byB0aGUgYnVja2V0IGR1cmluZyBDREsgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICBzb3VyY2U/OiBJU291cmNlXG59XG5cbi8qKlxuICogUmVzb3VyY2UgdG8gZGVwbG95IGEgd2ViYXBwIGZyb20gYSBidWlsZCBhcnRpZmFjdCBpbnRvIGFuIGV4aXN0aW5nXG4gKiBTMyBCdWNrZXQgYW5kIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgV2ViYXBwRGVwbG95IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICByZWFkb25seSBkZXBsb3lGbjogbGFtYmRhLkZ1bmN0aW9uXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFdlYmFwcERlcGxveVByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIERFUExPWV9MT0dfQlVDS0VUX1VSTDogYHMzOi8vJHtwcm9wcy53ZWJCdWNrZXQuYnVja2V0TmFtZX0vZGVwbG95bWVudHMubG9nYCxcbiAgICAgIEVYUElSRV9TRUNPTkRTOiAocHJvcHMucHJ1bmVEZXBsb3ltZW50c09sZGVyVGhhbiA/PyBjZGsuRHVyYXRpb24uZGF5cyg1KSlcbiAgICAgICAgLnRvU2Vjb25kcygpXG4gICAgICAgIC50b1N0cmluZygpLFxuICAgICAgVEFSR0VUX0JVQ0tFVF9VUkw6IGBzMzovLyR7cHJvcHMud2ViQnVja2V0LmJ1Y2tldE5hbWV9L3dlYmAsXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmRpc3RyaWJ1dGlvbiAhPSBudWxsKSB7XG4gICAgICBlbnZpcm9ubWVudC5DRl9ESVNUUklCVVRJT05fSUQgPSBwcm9wcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uSWRcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZXhjbHVkZVBhdHRlcm4gIT0gbnVsbCkge1xuICAgICAgZW52aXJvbm1lbnQuRVhDTFVERV9QQVRURVJOID0gcHJvcHMuZXhjbHVkZVBhdHRlcm5cbiAgICB9XG5cbiAgICB0aGlzLmRlcGxveUZuID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCBcIldlYmFwcERlcGxveVJlc291cmNlXCIsIHtcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL2Rpc3RcIikpLFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLmZ1bmN0aW9uTmFtZSA/PyBjZGsuUGh5c2ljYWxOYW1lLkdFTkVSQVRFX0lGX05FRURFRCxcbiAgICAgIGhhbmRsZXI6IFwid2ViYXBwX2RlcGxveS5tYWluLmhhbmRsZXJcIixcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IDEsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM18xMixcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDIpLFxuICAgICAgaW5pdGlhbFBvbGljeTogW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogW1wiY2xvdWRmcm9udDpDcmVhdGVJbnZhbGlkYXRpb25cIl0sXG4gICAgICAgICAgLy8gQ2Fubm90IGJlIHJlc3RyaWN0ZWRcbiAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgXCJQcm92aWRlclwiLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogdGhpcy5kZXBsb3lGbixcbiAgICB9KVxuXG4gICAgcHJvcHMud2ViQnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuZGVwbG95Rm4pXG5cbiAgICBpZiAocHJvcHMuYnVpbGRzQnVja2V0KSB7XG4gICAgICBwcm9wcy5idWlsZHNCdWNrZXQuZ3JhbnRSZWFkKHRoaXMuZGVwbG95Rm4pXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnNvdXJjZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gcHJvcHMuc291cmNlLmJpbmQodGhpcywge1xuICAgICAgICBoYW5kbGVyUm9sZTogdGhpcy5kZXBsb3lGbi5yb2xlISxcbiAgICAgIH0pXG4gICAgICBuZXcgY2RrLkN1c3RvbVJlc291cmNlKHRoaXMsIFwiQ3VzdG9tUmVzb3VyY2VcIiwge1xuICAgICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGFydGlmYWN0UzNVcmw6IGBzMzovLyR7c291cmNlLmJ1Y2tldC5idWNrZXROYW1lfS8ke3NvdXJjZS56aXBPYmplY3RLZXl9YCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iXX0=