quidproquo-deploy-awscdk 0.0.80 → 0.0.82

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.
@@ -54,6 +54,11 @@ class Function extends QpqConstructBlock_1.QpqConstructBlock {
54
54
  actions: ['apigateway:GET'],
55
55
  resources: ['*'],
56
56
  }));
57
+ // Let lambdas invalidate cache for cloud front
58
+ this.lambdaFunction.addToRolePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
59
+ actions: ['cloudfront:CreateInvalidation'],
60
+ resources: ['*'],
61
+ }));
57
62
  }
58
63
  }
59
64
  exports.Function = Function;
@@ -31,6 +31,7 @@ const path_1 = __importDefault(require("path"));
31
31
  const aws_cdk_lib_1 = require("aws-cdk-lib");
32
32
  const cdk = __importStar(require("aws-cdk-lib"));
33
33
  const quidproquo_webserver_1 = require("quidproquo-webserver");
34
+ const quidproquo_actionprocessor_awslambda_1 = require("quidproquo-actionprocessor-awslambda");
34
35
  const QpqConstructBlock_1 = require("../../../base/QpqConstructBlock");
35
36
  const qpqDeployAwsCdkUtils = __importStar(require("../../../../utils"));
36
37
  class QpqWebserverWebEntryConstruct extends QpqConstructBlock_1.QpqConstructBlock {
@@ -104,6 +105,19 @@ class QpqWebserverWebEntryConstruct extends QpqConstructBlock_1.QpqConstructBloc
104
105
  enableAcceptEncodingGzip: true,
105
106
  enableAcceptEncodingBrotli: true,
106
107
  });
108
+ const mustRevalidate = false;
109
+ const responseHeaderPolicy = new aws_cdk_lib_1.aws_cloudfront.ResponseHeadersPolicy(this, `dist-rhp`, {
110
+ responseHeadersPolicyName: this.resourceName(props.webEntryConfig.name),
111
+ customHeadersBehavior: {
112
+ customHeaders: [
113
+ {
114
+ header: 'Cache-Control',
115
+ value: `max-age=${props.webEntryConfig.cache.maxTTLInSeconds}${props.webEntryConfig.cache.mustRevalidate ? ', must-revalidate' : ''}`,
116
+ override: true,
117
+ },
118
+ ],
119
+ },
120
+ });
107
121
  // Create a CloudFront distribution using the S3 bucket as the origin
108
122
  const distributionOrigin = new aws_cdk_lib_1.aws_cloudfront_origins.S3Origin(originBucket);
109
123
  const distribution = new aws_cdk_lib_1.aws_cloudfront.Distribution(this, 'MyDistribution', {
@@ -111,6 +125,8 @@ class QpqWebserverWebEntryConstruct extends QpqConstructBlock_1.QpqConstructBloc
111
125
  origin: distributionOrigin,
112
126
  cachePolicy: cachePolicy,
113
127
  viewerProtocolPolicy: aws_cdk_lib_1.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
128
+ compress: props.webEntryConfig.compressFiles,
129
+ responseHeadersPolicy: responseHeaderPolicy,
114
130
  },
115
131
  domainNames: [deployDomain],
116
132
  certificate: myCertificate,
@@ -122,11 +138,7 @@ class QpqWebserverWebEntryConstruct extends QpqConstructBlock_1.QpqConstructBloc
122
138
  responsePagePath: '/',
123
139
  })),
124
140
  });
125
- props.webEntryConfig.ignoreCache.forEach((pathPattern) => {
126
- distribution.addBehavior(pathPattern, distributionOrigin, {
127
- cachePolicy: aws_cdk_lib_1.aws_cloudfront.CachePolicy.CACHING_DISABLED,
128
- });
129
- });
141
+ qpqDeployAwsCdkUtils.exportStackValue(this, quidproquo_actionprocessor_awslambda_1.awsNamingUtils.getCFExportNameDistributionIdArnFromConfig(props.webEntryConfig.name, props.qpqConfig), distribution.distributionId);
130
142
  // TODO: Fix this when they add l2 support for origin access control settings
131
143
  // Currently distribution don't have support for origin access control settings
132
144
  // So we manually add it.
@@ -184,6 +196,9 @@ class QpqWebserverWebEntryConstruct extends QpqConstructBlock_1.QpqConstructBloc
184
196
  const wildcardPath = seo.path.replaceAll(/{(.+?)}/g, '*');
185
197
  distribution.addBehavior(wildcardPath, distributionOrigin, {
186
198
  cachePolicy: seoCachePolicy,
199
+ viewerProtocolPolicy: aws_cdk_lib_1.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
200
+ compress: props.webEntryConfig.compressFiles,
201
+ responseHeadersPolicy: responseHeaderPolicy,
187
202
  edgeLambdas: [
188
203
  {
189
204
  functionVersion: edgeFunctionVR.currentVersion,
@@ -197,6 +212,26 @@ class QpqWebserverWebEntryConstruct extends QpqConstructBlock_1.QpqConstructBloc
197
212
  });
198
213
  }
199
214
  }
215
+ const ignoreCacheResponseHeaderPolicy = new aws_cdk_lib_1.aws_cloudfront.ResponseHeadersPolicy(this, `dist-rhp-ignore`, {
216
+ responseHeadersPolicyName: this.qpqResourceName(props.webEntryConfig.name, 'ignore'),
217
+ customHeadersBehavior: {
218
+ customHeaders: [
219
+ {
220
+ header: 'Cache-Control',
221
+ value: `max-age=300, must-revalidate`,
222
+ override: true,
223
+ },
224
+ ],
225
+ },
226
+ });
227
+ props.webEntryConfig.ignoreCache.forEach((pathPattern) => {
228
+ distribution.addBehavior(pathPattern, distributionOrigin, {
229
+ cachePolicy: aws_cdk_lib_1.aws_cloudfront.CachePolicy.CACHING_DISABLED,
230
+ viewerProtocolPolicy: aws_cdk_lib_1.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
231
+ compress: props.webEntryConfig.compressFiles,
232
+ responseHeadersPolicy: ignoreCacheResponseHeaderPolicy,
233
+ });
234
+ });
200
235
  }
201
236
  }
202
237
  exports.QpqWebserverWebEntryConstruct = QpqWebserverWebEntryConstruct;
package/lib/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './qpqApp';
1
+ export * from './QPQApp';
2
2
  export * from './constructs';
3
3
  export * from './stacks';
4
4
  export * as qpqDeployAwsCdkUtils from './utils';
package/lib/index.js CHANGED
@@ -27,7 +27,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.qpqDeployAwsCdkUtils = void 0;
30
- __exportStar(require("./qpqApp"), exports);
30
+ __exportStar(require("./QPQApp"), exports);
31
31
  __exportStar(require("./constructs"), exports);
32
32
  __exportStar(require("./stacks"), exports);
33
33
  exports.qpqDeployAwsCdkUtils = __importStar(require("./utils"));
@@ -45,7 +45,7 @@ const getAPIGatewayEventExecutor = (dynamicModuleLoader, getCustomActionProcesso
45
45
  const cdkConfig = yield (0, lambdaConfig_1.getLambdaConfigs)();
46
46
  // Build a processor for the session and stuff
47
47
  // Remove the non route ones ~ let the story execute action add them
48
- const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getAPIGatewayEventActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
48
+ const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getAPIGatewayEventActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
49
49
  const logger = (result) => __awaiter(void 0, void 0, void 0, function* () {
50
50
  // addResult(
51
51
  // envConfig.appName,
@@ -30,7 +30,7 @@ const getEventBridgeEventExecutor = (dynamicModuleLoader, getCustomActionProcess
30
30
  const lambdaRuntimeConfig = JSON.parse(process.env.lambdaRuntimeConfig || '{}');
31
31
  // Build a processor for the session and stuff
32
32
  // Remove the non event ones
33
- const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getEventBridgeEventActionProcessor)(lambdaRuntimeConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
33
+ const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getEventBridgeEventActionProcessor)(lambdaRuntimeConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
34
34
  const logger = (result) => __awaiter(void 0, void 0, void 0, function* () { });
35
35
  // Run the callback
36
36
  const resolveStory = (0, quidproquo_core_1.createRuntime)({}, storyActionProcessor, getDateNow, logger, quidproquo_actionprocessor_awslambda_1.awsLambdaUtils.randomGuid);
@@ -30,7 +30,7 @@ const getOriginRequestEventExecutor = (dynamicModuleLoader, getCustomActionProce
30
30
  const cdkConfig = yield (0, lambdaConfig_1.getLambdaConfigs)();
31
31
  // Build a processor for the session and stuff
32
32
  // Remove the non route ones ~ let the story execute action add them
33
- const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getCloudFrontOriginRequestEventActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
33
+ const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getCloudFrontOriginRequestEventActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
34
34
  const logger = (result) => __awaiter(void 0, void 0, void 0, function* () { });
35
35
  // Run the callback
36
36
  const resolveStory = (0, quidproquo_core_1.createRuntime)({}, storyActionProcessor, getDateNow, logger, quidproquo_actionprocessor_awslambda_1.awsLambdaUtils.randomGuid);
@@ -28,7 +28,7 @@ const getStoryActionRuntime = (dynamicModuleLoader, getCustomActionProcessors =
28
28
  const cdkConfig = yield (0, lambdaConfig_1.getLambdaConfigs)();
29
29
  // Build a processor for the session and stuff
30
30
  // Remove the non route ones ~ let the story execute action add them
31
- const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getSQSEventRecordActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
31
+ const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getSQSEventRecordActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
32
32
  const logger = (result) => __awaiter(void 0, void 0, void 0, function* () { });
33
33
  // Run the callback
34
34
  const resolveStory = (0, quidproquo_core_1.createRuntime)({}, storyActionProcessor, getDateNow, logger, quidproquo_actionprocessor_awslambda_1.awsLambdaUtils.randomGuid);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quidproquo-deploy-awscdk",
3
- "version": "0.0.80",
3
+ "version": "0.0.82",
4
4
  "description": "",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.js",
@@ -1,5 +1,5 @@
1
- import * as cdk from 'aws-cdk-lib';
2
-
3
- export const createQPQApp = (): cdk.App => {
4
- return new cdk.App();
5
- };
1
+ import * as cdk from 'aws-cdk-lib';
2
+
3
+ export const createQPQApp = (): cdk.App => {
4
+ return new cdk.App();
5
+ };
@@ -57,5 +57,13 @@ export class Function extends QpqConstructBlock {
57
57
  resources: ['*'],
58
58
  }),
59
59
  );
60
+
61
+ // Let lambdas invalidate cache for cloud front
62
+ this.lambdaFunction.addToRolePolicy(
63
+ new aws_iam.PolicyStatement({
64
+ actions: ['cloudfront:CreateInvalidation'],
65
+ resources: ['*'],
66
+ }),
67
+ );
60
68
  }
61
69
  }
@@ -18,6 +18,9 @@ import {
18
18
  qpqWebServerUtils,
19
19
  qpqHeaderIsBot,
20
20
  } from 'quidproquo-webserver';
21
+
22
+ import { awsNamingUtils } from 'quidproquo-actionprocessor-awslambda';
23
+
21
24
  import { QpqConstructBlock, QpqConstructBlockProps } from '../../../base/QpqConstructBlock';
22
25
  import { Construct } from 'constructs';
23
26
 
@@ -125,6 +128,23 @@ export class QpqWebserverWebEntryConstruct extends QpqConstructBlock {
125
128
  enableAcceptEncodingBrotli: true,
126
129
  });
127
130
 
131
+ const mustRevalidate = false;
132
+
133
+ const responseHeaderPolicy = new aws_cloudfront.ResponseHeadersPolicy(this, `dist-rhp`, {
134
+ responseHeadersPolicyName: this.resourceName(props.webEntryConfig.name),
135
+ customHeadersBehavior: {
136
+ customHeaders: [
137
+ {
138
+ header: 'Cache-Control',
139
+ value: `max-age=${props.webEntryConfig.cache.maxTTLInSeconds}${
140
+ props.webEntryConfig.cache.mustRevalidate ? ', must-revalidate' : ''
141
+ }`,
142
+ override: true,
143
+ },
144
+ ],
145
+ },
146
+ });
147
+
128
148
  // Create a CloudFront distribution using the S3 bucket as the origin
129
149
  const distributionOrigin = new aws_cloudfront_origins.S3Origin(originBucket);
130
150
  const distribution = new aws_cloudfront.Distribution(this, 'MyDistribution', {
@@ -132,7 +152,10 @@ export class QpqWebserverWebEntryConstruct extends QpqConstructBlock {
132
152
  origin: distributionOrigin,
133
153
  cachePolicy: cachePolicy,
134
154
  viewerProtocolPolicy: aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
155
+ compress: props.webEntryConfig.compressFiles,
156
+ responseHeadersPolicy: responseHeaderPolicy,
135
157
  },
158
+
136
159
  domainNames: [deployDomain],
137
160
  certificate: myCertificate,
138
161
  defaultRootObject: props.webEntryConfig.indexRoot,
@@ -145,11 +168,14 @@ export class QpqWebserverWebEntryConstruct extends QpqConstructBlock {
145
168
  })),
146
169
  });
147
170
 
148
- props.webEntryConfig.ignoreCache.forEach((pathPattern) => {
149
- distribution.addBehavior(pathPattern, distributionOrigin, {
150
- cachePolicy: aws_cloudfront.CachePolicy.CACHING_DISABLED,
151
- });
152
- });
171
+ qpqDeployAwsCdkUtils.exportStackValue(
172
+ this,
173
+ awsNamingUtils.getCFExportNameDistributionIdArnFromConfig(
174
+ props.webEntryConfig.name,
175
+ props.qpqConfig,
176
+ ),
177
+ distribution.distributionId,
178
+ );
153
179
 
154
180
  // TODO: Fix this when they add l2 support for origin access control settings
155
181
 
@@ -250,6 +276,9 @@ export class QpqWebserverWebEntryConstruct extends QpqConstructBlock {
250
276
  const wildcardPath = seo.path.replaceAll(/{(.+?)}/g, '*');
251
277
  distribution.addBehavior(wildcardPath, distributionOrigin, {
252
278
  cachePolicy: seoCachePolicy,
279
+ viewerProtocolPolicy: aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
280
+ compress: props.webEntryConfig.compressFiles,
281
+ responseHeadersPolicy: responseHeaderPolicy,
253
282
  edgeLambdas: [
254
283
  {
255
284
  functionVersion: edgeFunctionVR.currentVersion,
@@ -263,5 +292,31 @@ export class QpqWebserverWebEntryConstruct extends QpqConstructBlock {
263
292
  });
264
293
  }
265
294
  }
295
+
296
+ const ignoreCacheResponseHeaderPolicy = new aws_cloudfront.ResponseHeadersPolicy(
297
+ this,
298
+ `dist-rhp-ignore`,
299
+ {
300
+ responseHeadersPolicyName: this.qpqResourceName(props.webEntryConfig.name, 'ignore'),
301
+ customHeadersBehavior: {
302
+ customHeaders: [
303
+ {
304
+ header: 'Cache-Control',
305
+ value: `max-age=300, must-revalidate`,
306
+ override: true,
307
+ },
308
+ ],
309
+ },
310
+ },
311
+ );
312
+
313
+ props.webEntryConfig.ignoreCache.forEach((pathPattern) => {
314
+ distribution.addBehavior(pathPattern, distributionOrigin, {
315
+ cachePolicy: aws_cloudfront.CachePolicy.CACHING_DISABLED,
316
+ viewerProtocolPolicy: aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
317
+ compress: props.webEntryConfig.compressFiles,
318
+ responseHeadersPolicy: ignoreCacheResponseHeaderPolicy,
319
+ });
320
+ });
266
321
  }
267
322
  }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './qpqApp';
1
+ export * from './QPQApp';
2
2
  export * from './constructs';
3
3
  export * from './stacks';
4
4
 
@@ -10,6 +10,7 @@ import {
10
10
  getConfigGetParameterActionProcessor,
11
11
  getConfigGetParametersActionProcessor,
12
12
  getUserDirectoryActionProcessor,
13
+ getWebEntryActionProcessor,
13
14
  awsLambdaUtils,
14
15
  DynamicModuleLoader,
15
16
  } from 'quidproquo-actionprocessor-awslambda';
@@ -73,6 +74,7 @@ export const getAPIGatewayEventExecutor = (
73
74
  ...getQueueActionProcessor(cdkConfig.qpqConfig),
74
75
  ...getEventBusActionProcessor(cdkConfig.qpqConfig),
75
76
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
77
+ ...getWebEntryActionProcessor(cdkConfig.qpqConfig),
76
78
 
77
79
  ...getCustomActionProcessors(cdkConfig.qpqConfig),
78
80
  ...qpqCustomActionProcessors(),
@@ -6,6 +6,7 @@ import {
6
6
  getFileActionProcessor,
7
7
  getQueueActionProcessor,
8
8
  getEventBusActionProcessor,
9
+ getWebEntryActionProcessor,
9
10
  getUserDirectoryActionProcessor,
10
11
  getConfigGetSecretActionProcessor,
11
12
  getConfigGetParameterActionProcessor,
@@ -59,6 +60,7 @@ export const getEventBridgeEventExecutor = (
59
60
  ...getConfigActionProcessor(cdkConfig.qpqConfig),
60
61
  ...getQueueActionProcessor(cdkConfig.qpqConfig),
61
62
  ...getEventBusActionProcessor(cdkConfig.qpqConfig),
63
+ ...getWebEntryActionProcessor(cdkConfig.qpqConfig),
62
64
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
63
65
 
64
66
  ...getCustomActionProcessors(cdkConfig.qpqConfig),
@@ -8,6 +8,7 @@ import {
8
8
  getConfigGetSecretActionProcessor,
9
9
  getConfigGetParameterActionProcessor,
10
10
  getConfigGetParametersActionProcessor,
11
+ getWebEntryActionProcessor,
11
12
  awsLambdaUtils,
12
13
  DynamicModuleLoader,
13
14
  } from 'quidproquo-actionprocessor-awslambda';
@@ -53,6 +54,7 @@ export const getOriginRequestEventExecutor = (
53
54
  ...getSystemActionProcessor(dynamicModuleLoader),
54
55
  ...getFileActionProcessor(cdkConfig.qpqConfig),
55
56
  ...getConfigActionProcessor(cdkConfig.qpqConfig),
57
+ ...getWebEntryActionProcessor(cdkConfig.qpqConfig),
56
58
 
57
59
  // We probably don't want this?
58
60
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
@@ -12,6 +12,7 @@ import {
12
12
  getConfigGetParameterActionProcessor,
13
13
  getConfigGetParametersActionProcessor,
14
14
  getUserDirectoryActionProcessor,
15
+ getWebEntryActionProcessor,
15
16
  awsLambdaUtils,
16
17
  DynamicModuleLoader,
17
18
  } from 'quidproquo-actionprocessor-awslambda';
@@ -61,6 +62,7 @@ export const getStoryActionRuntime = async (
61
62
  ...getQueueActionProcessor(cdkConfig.qpqConfig),
62
63
  ...getEventBusActionProcessor(cdkConfig.qpqConfig),
63
64
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
65
+ ...getWebEntryActionProcessor(cdkConfig.qpqConfig),
64
66
 
65
67
  ...getCustomActionProcessors(cdkConfig.qpqConfig),
66
68
  ...qpqCustomActionProcessors(),
File without changes
File without changes