@webiny/pulumi-aws 5.26.0 → 5.27.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.
Files changed (95) hide show
  1. package/apps/admin/AdminApp.d.ts +1 -1
  2. package/apps/admin/AdminApp.js +20 -1
  3. package/apps/admin/AdminApp.js.map +1 -1
  4. package/apps/api/ApiApp.d.ts +11 -14
  5. package/apps/api/ApiApp.js +62 -67
  6. package/apps/api/ApiApp.js.map +1 -1
  7. package/apps/api/ApiApwScheduler.d.ts +0 -2
  8. package/apps/api/ApiApwScheduler.js +14 -8
  9. package/apps/api/ApiApwScheduler.js.map +1 -1
  10. package/apps/api/ApiCloudfront.js +2 -2
  11. package/apps/api/ApiCloudfront.js.map +1 -1
  12. package/apps/api/ApiFileManager.d.ts +1 -8
  13. package/apps/api/ApiFileManager.js +31 -32
  14. package/apps/api/ApiFileManager.js.map +1 -1
  15. package/apps/api/ApiGraphql.d.ts +0 -10
  16. package/apps/api/ApiGraphql.js +59 -39
  17. package/apps/api/ApiGraphql.js.map +1 -1
  18. package/apps/api/ApiHeadlessCMS.d.ts +0 -4
  19. package/apps/api/ApiHeadlessCMS.js +30 -20
  20. package/apps/api/ApiHeadlessCMS.js.map +1 -1
  21. package/apps/api/ApiPageBuilder.d.ts +0 -8
  22. package/apps/api/ApiPageBuilder.js +79 -60
  23. package/apps/api/ApiPageBuilder.js.map +1 -1
  24. package/apps/common/StorageOutput.d.ts +21 -0
  25. package/apps/common/StorageOutput.js +50 -0
  26. package/apps/common/StorageOutput.js.map +1 -0
  27. package/apps/common/VpcConfig.d.ts +8 -0
  28. package/apps/common/VpcConfig.js +37 -0
  29. package/apps/common/VpcConfig.js.map +1 -0
  30. package/apps/common/index.d.ts +2 -0
  31. package/apps/common/index.js +31 -0
  32. package/apps/common/index.js.map +1 -0
  33. package/apps/gateway/GatewayApi.d.ts +17 -0
  34. package/apps/gateway/GatewayApi.js +187 -0
  35. package/apps/gateway/GatewayApi.js.map +1 -0
  36. package/apps/gateway/GatewayApp.d.ts +25 -0
  37. package/apps/gateway/GatewayApp.js +85 -0
  38. package/apps/gateway/GatewayApp.js.map +1 -0
  39. package/apps/gateway/GatewayLambdas.d.ts +13 -0
  40. package/apps/gateway/GatewayLambdas.js +92 -0
  41. package/apps/gateway/GatewayLambdas.js.map +1 -0
  42. package/apps/gateway/GatewayReactApp.d.ts +17 -0
  43. package/apps/gateway/GatewayReactApp.js +163 -0
  44. package/apps/gateway/GatewayReactApp.js.map +1 -0
  45. package/apps/index.d.ts +1 -0
  46. package/apps/index.js +14 -0
  47. package/apps/index.js.map +1 -1
  48. package/apps/{api/ApiLambdaUtils.d.ts → lambdaUtils.d.ts} +6 -3
  49. package/apps/lambdaUtils.js +75 -0
  50. package/apps/lambdaUtils.js.map +1 -0
  51. package/apps/storage/StorageApp.d.ts +42 -5
  52. package/apps/storage/StorageApp.js +27 -9
  53. package/apps/storage/StorageApp.js.map +1 -1
  54. package/apps/storage/StorageElasticSearch.d.ts +15 -0
  55. package/apps/storage/StorageElasticSearch.js +242 -0
  56. package/apps/storage/StorageElasticSearch.js.map +1 -0
  57. package/apps/storage/StorageEventBus.d.ts +2 -0
  58. package/apps/{api/ApiLambdaUtils.js → storage/StorageEventBus.js} +15 -33
  59. package/apps/storage/StorageEventBus.js.map +1 -0
  60. package/apps/{api/ApiVpc.d.ts → storage/StorageVpc.d.ts} +4 -4
  61. package/apps/storage/StorageVpc.js +145 -0
  62. package/apps/storage/StorageVpc.js.map +1 -0
  63. package/apps/storage/index.d.ts +2 -0
  64. package/apps/storage/index.js +26 -0
  65. package/apps/storage/index.js.map +1 -1
  66. package/apps/utils.d.ts +5 -0
  67. package/apps/utils.js +14 -0
  68. package/apps/utils.js.map +1 -0
  69. package/apps/website/WebsiteApp.d.ts +33 -3
  70. package/apps/website/WebsiteApp.js +57 -5
  71. package/apps/website/WebsiteApp.js.map +1 -1
  72. package/apps/website/WebsiteHookRender.js +20 -22
  73. package/apps/website/WebsiteHookRender.js.map +1 -1
  74. package/apps/website/WebsitePrerendering.d.ts +31 -0
  75. package/apps/website/WebsitePrerendering.js +266 -0
  76. package/apps/website/WebsitePrerendering.js.map +1 -0
  77. package/apps/website/WebsiteUpload.d.ts +6 -0
  78. package/apps/website/WebsiteUpload.js +50 -0
  79. package/apps/website/WebsiteUpload.js.map +1 -0
  80. package/package.json +9 -8
  81. package/apps/api/ApiLambdaUtils.js.map +0 -1
  82. package/apps/api/ApiPrerendering.d.ts +0 -24
  83. package/apps/api/ApiPrerendering.js +0 -200
  84. package/apps/api/ApiPrerendering.js.map +0 -1
  85. package/apps/api/ApiVpc.js +0 -129
  86. package/apps/api/ApiVpc.js.map +0 -1
  87. package/apps/getStorageOutput.d.ts +0 -13
  88. package/apps/getStorageOutput.js +0 -29
  89. package/apps/getStorageOutput.js.map +0 -1
  90. package/apps/website/WebsiteHookUpdatePbSettings.d.ts +0 -5
  91. package/apps/website/WebsiteHookUpdatePbSettings.js +0 -80
  92. package/apps/website/WebsiteHookUpdatePbSettings.js.map +0 -1
  93. package/apps/website/WebsiteHookUpload.d.ts +0 -1
  94. package/apps/website/WebsiteHookUpload.js +0 -65
  95. package/apps/website/WebsiteHookUpload.js.map +0 -1
@@ -1,12 +1,42 @@
1
+ import * as pulumi from "@pulumi/pulumi";
1
2
  import * as aws from "@pulumi/aws";
2
- import { ApplicationContext } from "@webiny/pulumi-sdk";
3
+ import { ApplicationContext, ApplicationConfig } from "@webiny/pulumi-sdk";
3
4
  import { CustomDomainParams } from "../customDomain";
4
- import { ApplicationConfig } from "@webiny/pulumi-sdk";
5
+ import { AppInput } from "../utils";
5
6
  export interface WebsiteAppConfig {
6
7
  /** Custom domain configuration */
7
- domain?(ctx: ApplicationContext): CustomDomainParams;
8
+ domain?(ctx: ApplicationContext): CustomDomainParams | undefined | void;
9
+ /**
10
+ * Enables or disables VPC for the API.
11
+ * For VPC to work you also have to enable it in the `storage` application.
12
+ */
13
+ vpc?: AppInput<boolean | undefined>;
8
14
  }
9
15
  export declare const WebsiteApp: new (ctx: ApplicationContext) => import("@webiny/pulumi-sdk").PulumiApp<WebsiteAppConfig> & {
16
+ prerendering: {
17
+ subscriber: {
18
+ policy: pulumi.Output<aws.iam.Policy>;
19
+ role: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.iam.Role>;
20
+ lambda: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Function>;
21
+ eventRule: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.cloudwatch.EventRule>;
22
+ eventPermission: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Permission>;
23
+ eventTarget: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.cloudwatch.EventTarget>;
24
+ };
25
+ renderer: {
26
+ policy: pulumi.Output<aws.iam.Policy>;
27
+ role: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.iam.Role>;
28
+ lambda: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Function>;
29
+ eventSourceMapping: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.EventSourceMapping>;
30
+ };
31
+ flush: {
32
+ policy: pulumi.Output<aws.iam.Policy>;
33
+ role: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.iam.Role>;
34
+ lambda: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Function>;
35
+ eventRule: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.cloudwatch.EventRule>;
36
+ eventPermission: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Permission>;
37
+ eventTarget: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.cloudwatch.EventTarget>;
38
+ };
39
+ };
10
40
  app: {
11
41
  cloudfront: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.cloudfront.Distribution>;
12
42
  bucket: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.s3.Bucket>;
@@ -10,19 +10,25 @@ exports.createWebsiteApp = createWebsiteApp;
10
10
 
11
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
12
 
13
+ var pulumi = _interopRequireWildcard(require("@pulumi/pulumi"));
14
+
13
15
  var aws = _interopRequireWildcard(require("@pulumi/aws"));
14
16
 
15
17
  var _pulumiSdk = require("@webiny/pulumi-sdk");
16
18
 
17
19
  var _createAppBucket = require("../createAppBucket");
18
20
 
19
- var _WebsiteHookUpload = require("./WebsiteHookUpload");
21
+ var _WebsiteUpload = require("./WebsiteUpload");
20
22
 
21
- var _WebsiteHookRender = require("./WebsiteHookRender");
23
+ var _customDomain = require("../customDomain");
22
24
 
23
- var _WebsiteHookUpdatePbSettings = require("./WebsiteHookUpdatePbSettings");
25
+ var _WebsitePrerendering = require("./WebsitePrerendering");
24
26
 
25
- var _customDomain = require("../customDomain");
27
+ var _common = require("../common");
28
+
29
+ var _utils = require("../utils");
30
+
31
+ var _WebsiteHookRender = require("./WebsiteHookRender");
26
32
 
27
33
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
28
34
 
@@ -38,6 +44,12 @@ const WebsiteApp = (0, _pulumiSdk.defineApp)({
38
44
  config(app, config) {
39
45
  var _config$domain;
40
46
 
47
+ // Register storage output as a module available for all other modules
48
+ const storage = app.addModule(_common.StorageOutput); // Register VPC config module to be available to other modules
49
+
50
+ app.addModule(_common.VpcConfig, {
51
+ enabled: (0, _utils.getAppInput)(app, config.vpc)
52
+ });
41
53
  const appBucket = (0, _createAppBucket.createPublicAppBucket)(app, "app");
42
54
  const appCloudfront = app.addResource(aws.cloudfront.Distribution, {
43
55
  name: "app",
@@ -141,6 +153,16 @@ const WebsiteApp = (0, _pulumiSdk.defineApp)({
141
153
  }
142
154
  }
143
155
  });
156
+ const prerendering = (0, _WebsitePrerendering.createPrerenderingService)(app, {
157
+ env: {
158
+ DB_TABLE: storage.primaryDynamodbTableName,
159
+ DB_TABLE_ELASTICSEARCH: pulumi.interpolate`${storage.elasticsearchDynamodbTableName}`,
160
+ APP_URL: pulumi.interpolate`https://${appCloudfront.output.domainName}`,
161
+ DELIVERY_BUCKET: deliveryBucket.bucket.output.bucket,
162
+ DELIVERY_CLOUDFRONT: deliveryCloudfront.output.id,
163
+ DELIVERY_URL: pulumi.interpolate`https://${deliveryCloudfront.output.domainName}`
164
+ }
165
+ });
144
166
  const domain = (_config$domain = config.domain) === null || _config$domain === void 0 ? void 0 : _config$domain.call(config, app.ctx);
145
167
 
146
168
  if (domain) {
@@ -154,14 +176,44 @@ const WebsiteApp = (0, _pulumiSdk.defineApp)({
154
176
  appId: appCloudfront.output.id,
155
177
  appStorage: appBucket.bucket.output.id,
156
178
  appUrl: appCloudfront.output.domainName.apply(value => `https://${value}`),
179
+ appDomain: appCloudfront.output.domainName,
157
180
  // These are the Cloudfront and S3 bucket that will deliver static pages to the actual website visitors.
158
181
  // The static HTML snapshots delivered from them still rely on the app's S3 bucket
159
182
  // defined above, for serving static assets (JS, CSS, images).
160
183
  deliveryId: deliveryCloudfront.output.id,
161
184
  deliveryStorage: deliveryBucket.bucket.output.id,
185
+ deliveryDomain: deliveryCloudfront.output.domainName,
162
186
  deliveryUrl: deliveryCloudfront.output.domainName.apply(value => `https://${value}`)
163
187
  });
188
+ app.onAfterDeploy(async ({
189
+ outputs
190
+ }) => {
191
+ await (0, _WebsiteUpload.websiteUpload)({
192
+ appDir: app.ctx.appDir,
193
+ bucket: outputs["appStorage"]
194
+ });
195
+ }); // Update variant gateway configuration.
196
+
197
+ const variant = app.ctx.variant;
198
+
199
+ if (variant) {
200
+ app.onAfterDeploy(async ({
201
+ outputs
202
+ }) => {
203
+ // After deployment is made we update a static JSON file with a variant configuration.
204
+ // TODO: We should update WCP config instead of a static file here
205
+ await (0, _pulumiSdk.updateGatewayConfig)({
206
+ app: "website",
207
+ cwd: app.ctx.projectDir,
208
+ env: app.ctx.env,
209
+ variant: variant,
210
+ domain: outputs["deliveryDomain"]
211
+ });
212
+ });
213
+ }
214
+
164
215
  return {
216
+ prerendering,
165
217
  app: _objectSpread(_objectSpread({}, appBucket), {}, {
166
218
  cloudfront: appCloudfront
167
219
  }),
@@ -201,6 +253,6 @@ function createWebsiteApp(config) {
201
253
  onBeforeBuild: config === null || config === void 0 ? void 0 : config.onBeforeBuild,
202
254
  onAfterBuild: config === null || config === void 0 ? void 0 : config.onAfterBuild,
203
255
  onBeforeDeploy: config === null || config === void 0 ? void 0 : config.onBeforeDeploy,
204
- onAfterDeploy: (0, _pulumiSdk.mergeAppHooks)(_WebsiteHookUpload.websiteUpload, _WebsiteHookRender.websiteRender, _WebsiteHookUpdatePbSettings.websiteUpdatePbSettings, config === null || config === void 0 ? void 0 : config.onAfterDeploy)
256
+ onAfterDeploy: (0, _pulumiSdk.mergeAppHooks)(_WebsiteHookRender.websiteRender, config === null || config === void 0 ? void 0 : config.onAfterDeploy)
205
257
  });
206
258
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["WebsiteApp.ts"],"names":["WebsiteApp","name","config","app","appBucket","appCloudfront","addResource","aws","cloudfront","Distribution","enabled","waitForDeployment","origins","origin","defaultRootObject","defaultCacheBehavior","compress","targetOriginId","originId","viewerProtocolPolicy","allowedMethods","cachedMethods","forwardedValues","cookies","forward","queryString","minTtl","defaultTtl","maxTtl","priceClass","customErrorResponses","errorCode","responseCode","responsePagePath","restrictions","geoRestriction","restrictionType","viewerCertificate","cloudfrontDefaultCertificate","deliveryBucket","deliveryCloudfront","originRequestPolicyId","orderedCacheBehaviors","headers","pathPattern","domain","ctx","addOutputs","appId","output","id","appStorage","bucket","appUrl","domainName","apply","value","deliveryId","deliveryStorage","deliveryUrl","delivery","createWebsiteApp","description","cli","watch","deploy","setup","onBeforeBuild","onAfterBuild","onBeforeDeploy","onAfterDeploy","websiteUpload","websiteRender","websiteUpdatePbSettings"],"mappings":"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","sourcesContent":["import * as aws from \"@pulumi/aws\";\n\nimport {\n defineApp,\n ApplicationContext,\n createGenericApplication,\n mergeAppHooks\n} from \"@webiny/pulumi-sdk\";\n\nimport { createPublicAppBucket } from \"../createAppBucket\";\nimport { websiteUpload } from \"./WebsiteHookUpload\";\nimport { websiteRender } from \"./WebsiteHookRender\";\nimport { websiteUpdatePbSettings } from \"./WebsiteHookUpdatePbSettings\";\nimport { applyCustomDomain, CustomDomainParams } from \"../customDomain\";\nimport { ApplicationConfig } from \"@webiny/pulumi-sdk\";\n\nexport interface WebsiteAppConfig {\n /** Custom domain configuration */\n domain?(ctx: ApplicationContext): CustomDomainParams;\n}\n\nexport const WebsiteApp = defineApp({\n name: \"Website\",\n config(app, config: WebsiteAppConfig) {\n const appBucket = createPublicAppBucket(app, \"app\");\n\n const appCloudfront = app.addResource(aws.cloudfront.Distribution, {\n name: \"app\",\n config: {\n enabled: true,\n waitForDeployment: true,\n origins: [appBucket.origin],\n defaultRootObject: \"index.html\",\n defaultCacheBehavior: {\n compress: true,\n targetOriginId: appBucket.origin.originId,\n viewerProtocolPolicy: \"redirect-to-https\",\n allowedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n cachedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n forwardedValues: {\n cookies: { forward: \"none\" },\n queryString: false\n },\n // MinTTL <= DefaultTTL <= MaxTTL\n minTtl: 0,\n defaultTtl: 0,\n maxTtl: 0\n },\n priceClass: \"PriceClass_100\",\n customErrorResponses: [\n { errorCode: 404, responseCode: 404, responsePagePath: \"/index.html\" }\n ],\n restrictions: {\n geoRestriction: {\n restrictionType: \"none\"\n }\n },\n viewerCertificate: {\n cloudfrontDefaultCertificate: true\n }\n }\n });\n\n const deliveryBucket = createPublicAppBucket(app, \"delivery\");\n\n const deliveryCloudfront = app.addResource(aws.cloudfront.Distribution, {\n name: \"delivery\",\n config: {\n enabled: true,\n waitForDeployment: true,\n origins: [deliveryBucket.origin, appBucket.origin],\n defaultRootObject: \"index.html\",\n defaultCacheBehavior: {\n compress: true,\n targetOriginId: deliveryBucket.origin.originId,\n viewerProtocolPolicy: \"redirect-to-https\",\n allowedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n cachedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n originRequestPolicyId: \"\",\n forwardedValues: {\n cookies: { forward: \"none\" },\n queryString: true\n },\n // MinTTL <= DefaultTTL <= MaxTTL\n minTtl: 0,\n defaultTtl: 30,\n maxTtl: 30\n },\n orderedCacheBehaviors: [\n {\n compress: true,\n allowedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n cachedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n forwardedValues: {\n cookies: {\n forward: \"none\"\n },\n headers: [],\n queryString: false\n },\n pathPattern: \"/static/*\",\n viewerProtocolPolicy: \"allow-all\",\n targetOriginId: appBucket.origin.originId,\n // MinTTL <= DefaultTTL <= MaxTTL\n minTtl: 0,\n defaultTtl: 2592000, // 30 days\n maxTtl: 2592000\n }\n ],\n customErrorResponses: [\n {\n errorCode: 404,\n responseCode: 404,\n responsePagePath: \"/_NOT_FOUND_PAGE_/index.html\"\n }\n ],\n priceClass: \"PriceClass_100\",\n restrictions: {\n geoRestriction: {\n restrictionType: \"none\"\n }\n },\n viewerCertificate: {\n cloudfrontDefaultCertificate: true\n }\n }\n });\n\n const domain = config.domain?.(app.ctx);\n if (domain) {\n applyCustomDomain(deliveryCloudfront, domain);\n }\n\n app.addOutputs({\n // Cloudfront and S3 bucket used to host the single-page application (SPA). The URL of the distribution is mainly\n // utilized by the Page Builder app's prerendering engine. Using this URL, it accesses the SPA and creates HTML snapshots.\n // The files that are generated in that process are stored in the `deliveryStorage` S3 bucket further below.\n appId: appCloudfront.output.id,\n appStorage: appBucket.bucket.output.id,\n appUrl: appCloudfront.output.domainName.apply(value => `https://${value}`),\n // These are the Cloudfront and S3 bucket that will deliver static pages to the actual website visitors.\n // The static HTML snapshots delivered from them still rely on the app's S3 bucket\n // defined above, for serving static assets (JS, CSS, images).\n deliveryId: deliveryCloudfront.output.id,\n deliveryStorage: deliveryBucket.bucket.output.id,\n deliveryUrl: deliveryCloudfront.output.domainName.apply(value => `https://${value}`)\n });\n\n return {\n app: {\n ...appBucket,\n cloudfront: appCloudfront\n },\n delivery: {\n ...deliveryBucket,\n cloudfront: deliveryCloudfront\n }\n };\n }\n});\n\nexport type WebsiteApp = InstanceType<typeof WebsiteApp>;\n\nexport function createWebsiteApp(config?: WebsiteAppConfig & ApplicationConfig<WebsiteApp>) {\n return createGenericApplication({\n id: \"website\",\n name: \"website\",\n description: \"Your project's public website.\",\n cli: {\n // Default args for the \"yarn webiny watch ...\" command (we don't need deploy option while developing).\n watch: {\n deploy: false\n }\n },\n async app(ctx) {\n // Create the app instance.\n const app = new WebsiteApp(ctx);\n // Run the default application setup.\n await app.setup(config || {});\n // Run the custom user config.\n await config?.config?.(app, ctx);\n return app;\n },\n onBeforeBuild: config?.onBeforeBuild,\n onAfterBuild: config?.onAfterBuild,\n onBeforeDeploy: config?.onBeforeDeploy,\n onAfterDeploy: mergeAppHooks(\n websiteUpload,\n websiteRender,\n websiteUpdatePbSettings,\n config?.onAfterDeploy\n )\n });\n}\n"]}
1
+ {"version":3,"sources":["WebsiteApp.ts"],"names":["WebsiteApp","name","config","app","storage","addModule","StorageOutput","VpcConfig","enabled","vpc","appBucket","appCloudfront","addResource","aws","cloudfront","Distribution","waitForDeployment","origins","origin","defaultRootObject","defaultCacheBehavior","compress","targetOriginId","originId","viewerProtocolPolicy","allowedMethods","cachedMethods","forwardedValues","cookies","forward","queryString","minTtl","defaultTtl","maxTtl","priceClass","customErrorResponses","errorCode","responseCode","responsePagePath","restrictions","geoRestriction","restrictionType","viewerCertificate","cloudfrontDefaultCertificate","deliveryBucket","deliveryCloudfront","originRequestPolicyId","orderedCacheBehaviors","headers","pathPattern","prerendering","env","DB_TABLE","primaryDynamodbTableName","DB_TABLE_ELASTICSEARCH","pulumi","interpolate","elasticsearchDynamodbTableName","APP_URL","output","domainName","DELIVERY_BUCKET","bucket","DELIVERY_CLOUDFRONT","id","DELIVERY_URL","domain","ctx","addOutputs","appId","appStorage","appUrl","apply","value","appDomain","deliveryId","deliveryStorage","deliveryDomain","deliveryUrl","onAfterDeploy","outputs","appDir","variant","cwd","projectDir","delivery","createWebsiteApp","description","cli","watch","deploy","setup","onBeforeBuild","onAfterBuild","onBeforeDeploy","websiteRender"],"mappings":"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","sourcesContent":["import * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\n\nimport {\n defineApp,\n ApplicationContext,\n createGenericApplication,\n mergeAppHooks,\n updateGatewayConfig,\n ApplicationConfig\n} from \"@webiny/pulumi-sdk\";\n\nimport { createPublicAppBucket } from \"../createAppBucket\";\nimport { websiteUpload } from \"./WebsiteUpload\";\nimport { applyCustomDomain, CustomDomainParams } from \"../customDomain\";\nimport { createPrerenderingService } from \"./WebsitePrerendering\";\nimport { StorageOutput, VpcConfig } from \"../common\";\nimport { AppInput, getAppInput } from \"../utils\";\nimport { websiteRender } from \"./WebsiteHookRender\";\n\nexport interface WebsiteAppConfig {\n /** Custom domain configuration */\n domain?(ctx: ApplicationContext): CustomDomainParams | undefined | void;\n\n /**\n * Enables or disables VPC for the API.\n * For VPC to work you also have to enable it in the `storage` application.\n */\n vpc?: AppInput<boolean | undefined>;\n}\n\nexport const WebsiteApp = defineApp({\n name: \"Website\",\n config(app, config: WebsiteAppConfig) {\n // Register storage output as a module available for all other modules\n const storage = app.addModule(StorageOutput);\n\n // Register VPC config module to be available to other modules\n app.addModule(VpcConfig, {\n enabled: getAppInput(app, config.vpc)\n });\n\n const appBucket = createPublicAppBucket(app, \"app\");\n\n const appCloudfront = app.addResource(aws.cloudfront.Distribution, {\n name: \"app\",\n config: {\n enabled: true,\n waitForDeployment: true,\n origins: [appBucket.origin],\n defaultRootObject: \"index.html\",\n defaultCacheBehavior: {\n compress: true,\n targetOriginId: appBucket.origin.originId,\n viewerProtocolPolicy: \"redirect-to-https\",\n allowedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n cachedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n forwardedValues: {\n cookies: { forward: \"none\" },\n queryString: false\n },\n // MinTTL <= DefaultTTL <= MaxTTL\n minTtl: 0,\n defaultTtl: 0,\n maxTtl: 0\n },\n priceClass: \"PriceClass_100\",\n customErrorResponses: [\n { errorCode: 404, responseCode: 404, responsePagePath: \"/index.html\" }\n ],\n restrictions: {\n geoRestriction: {\n restrictionType: \"none\"\n }\n },\n viewerCertificate: {\n cloudfrontDefaultCertificate: true\n }\n }\n });\n\n const deliveryBucket = createPublicAppBucket(app, \"delivery\");\n\n const deliveryCloudfront = app.addResource(aws.cloudfront.Distribution, {\n name: \"delivery\",\n config: {\n enabled: true,\n waitForDeployment: true,\n origins: [deliveryBucket.origin, appBucket.origin],\n defaultRootObject: \"index.html\",\n defaultCacheBehavior: {\n compress: true,\n targetOriginId: deliveryBucket.origin.originId,\n viewerProtocolPolicy: \"redirect-to-https\",\n allowedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n cachedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n originRequestPolicyId: \"\",\n forwardedValues: {\n cookies: { forward: \"none\" },\n queryString: true\n },\n // MinTTL <= DefaultTTL <= MaxTTL\n minTtl: 0,\n defaultTtl: 30,\n maxTtl: 30\n },\n orderedCacheBehaviors: [\n {\n compress: true,\n allowedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n cachedMethods: [\"GET\", \"HEAD\", \"OPTIONS\"],\n forwardedValues: {\n cookies: {\n forward: \"none\"\n },\n headers: [],\n queryString: false\n },\n pathPattern: \"/static/*\",\n viewerProtocolPolicy: \"allow-all\",\n targetOriginId: appBucket.origin.originId,\n // MinTTL <= DefaultTTL <= MaxTTL\n minTtl: 0,\n defaultTtl: 2592000, // 30 days\n maxTtl: 2592000\n }\n ],\n customErrorResponses: [\n {\n errorCode: 404,\n responseCode: 404,\n responsePagePath: \"/_NOT_FOUND_PAGE_/index.html\"\n }\n ],\n priceClass: \"PriceClass_100\",\n restrictions: {\n geoRestriction: {\n restrictionType: \"none\"\n }\n },\n viewerCertificate: {\n cloudfrontDefaultCertificate: true\n }\n }\n });\n\n const prerendering = createPrerenderingService(app, {\n env: {\n DB_TABLE: storage.primaryDynamodbTableName,\n DB_TABLE_ELASTICSEARCH: pulumi.interpolate`${storage.elasticsearchDynamodbTableName}`,\n APP_URL: pulumi.interpolate`https://${appCloudfront.output.domainName}`,\n DELIVERY_BUCKET: deliveryBucket.bucket.output.bucket,\n DELIVERY_CLOUDFRONT: deliveryCloudfront.output.id,\n DELIVERY_URL: pulumi.interpolate`https://${deliveryCloudfront.output.domainName}`\n }\n });\n\n const domain = config.domain?.(app.ctx);\n if (domain) {\n applyCustomDomain(deliveryCloudfront, domain);\n }\n\n app.addOutputs({\n // Cloudfront and S3 bucket used to host the single-page application (SPA). The URL of the distribution is mainly\n // utilized by the Page Builder app's prerendering engine. Using this URL, it accesses the SPA and creates HTML snapshots.\n // The files that are generated in that process are stored in the `deliveryStorage` S3 bucket further below.\n appId: appCloudfront.output.id,\n appStorage: appBucket.bucket.output.id,\n appUrl: appCloudfront.output.domainName.apply(value => `https://${value}`),\n appDomain: appCloudfront.output.domainName,\n // These are the Cloudfront and S3 bucket that will deliver static pages to the actual website visitors.\n // The static HTML snapshots delivered from them still rely on the app's S3 bucket\n // defined above, for serving static assets (JS, CSS, images).\n deliveryId: deliveryCloudfront.output.id,\n deliveryStorage: deliveryBucket.bucket.output.id,\n deliveryDomain: deliveryCloudfront.output.domainName,\n deliveryUrl: deliveryCloudfront.output.domainName.apply(value => `https://${value}`)\n });\n\n app.onAfterDeploy(async ({ outputs }) => {\n await websiteUpload({\n appDir: app.ctx.appDir,\n bucket: outputs[\"appStorage\"]\n });\n });\n\n // Update variant gateway configuration.\n const variant = app.ctx.variant;\n if (variant) {\n app.onAfterDeploy(async ({ outputs }) => {\n // After deployment is made we update a static JSON file with a variant configuration.\n // TODO: We should update WCP config instead of a static file here\n await updateGatewayConfig({\n app: \"website\",\n cwd: app.ctx.projectDir,\n env: app.ctx.env,\n variant: variant,\n domain: outputs[\"deliveryDomain\"]\n });\n });\n }\n\n return {\n prerendering,\n app: {\n ...appBucket,\n cloudfront: appCloudfront\n },\n delivery: {\n ...deliveryBucket,\n cloudfront: deliveryCloudfront\n }\n };\n }\n});\n\nexport type WebsiteApp = InstanceType<typeof WebsiteApp>;\n\nexport function createWebsiteApp(config?: WebsiteAppConfig & ApplicationConfig<WebsiteApp>) {\n return createGenericApplication({\n id: \"website\",\n name: \"website\",\n description: \"Your project's public website.\",\n cli: {\n // Default args for the \"yarn webiny watch ...\" command (we don't need deploy option while developing).\n watch: {\n deploy: false\n }\n },\n async app(ctx) {\n // Create the app instance.\n const app = new WebsiteApp(ctx);\n // Run the default application setup.\n await app.setup(config || {});\n // Run the custom user config.\n await config?.config?.(app, ctx);\n return app;\n },\n onBeforeBuild: config?.onBeforeBuild,\n onAfterBuild: config?.onAfterBuild,\n onBeforeDeploy: config?.onBeforeDeploy,\n onAfterDeploy: mergeAppHooks(websiteRender, config?.onAfterDeploy)\n });\n}\n"]}
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.websiteRender = void 0;
9
9
 
10
- var _lambda = _interopRequireDefault(require("aws-sdk/clients/lambda"));
10
+ var _eventbridge = _interopRequireDefault(require("aws-sdk/clients/eventbridge"));
11
11
 
12
12
  var _pulumiSdk = require("@webiny/pulumi-sdk");
13
13
 
@@ -17,44 +17,42 @@ const websiteRender = (0, _pulumiSdk.defineAppHook)(async (params, context) => {
17
17
  if (params.inputs.build === false) {
18
18
  context.info(`"--no-build" argument detected - skipping Website re-rendering.`);
19
19
  return;
20
- } // 2. Get exports from `site` stack, for `args.env` environment.
21
-
20
+ }
22
21
 
23
- const apiOutput = (0, _utils.getStackOutput)({
24
- folder: "api",
22
+ const storageOutput = (0, _utils.getStackOutput)({
23
+ folder: "apps/storage",
25
24
  env: params.env
26
25
  });
27
26
  context.info("Issuing a complete website render job...");
28
27
 
29
28
  try {
30
- const lambdaClient = new _lambda.default({
31
- region: apiOutput["region"]
29
+ var _result$Entries;
30
+
31
+ const client = new _eventbridge.default({
32
+ region: storageOutput["region"]
32
33
  });
33
- const response = await lambdaClient.invoke({
34
- FunctionName: apiOutput["psQueueAdd"],
35
- Payload: JSON.stringify({
36
- render: {
34
+ const result = await client.putEvents({
35
+ Entries: [{
36
+ Source: "webiny-cli",
37
+ EventBusName: storageOutput["eventBusArn"],
38
+ DetailType: "RenderPages",
39
+ Detail: JSON.stringify({
37
40
  path: "*",
41
+ variant: params.variant,
38
42
  configuration: {
39
43
  db: {
40
44
  namespace: "T#root"
41
45
  }
42
46
  }
43
- }
44
- })
47
+ })
48
+ }]
45
49
  }).promise();
46
- const {
47
- error
48
- } = JSON.parse(response.Payload);
50
+ const entry = (_result$Entries = result.Entries) === null || _result$Entries === void 0 ? void 0 : _result$Entries[0];
49
51
 
50
- if (error) {
51
- throw error;
52
+ if (entry !== null && entry !== void 0 && entry.ErrorMessage) {
53
+ throw new Error(entry.ErrorMessage);
52
54
  }
53
55
 
54
- await lambdaClient.invoke({
55
- FunctionName: apiOutput["psQueueProcess"],
56
- InvocationType: "Event"
57
- }).promise();
58
56
  context.success("Website re-render job successfully issued.");
59
57
  context.info("Please note that it can take a couple of minutes for the website to be fully updated.");
60
58
  } catch (e) {
@@ -1 +1 @@
1
- {"version":3,"sources":["WebsiteHookRender.ts"],"names":["websiteRender","params","context","inputs","build","info","apiOutput","folder","env","lambdaClient","LambdaClient","region","response","invoke","FunctionName","Payload","JSON","stringify","render","path","configuration","db","namespace","promise","error","parse","InvocationType","success","e","console","log"],"mappings":";;;;;;;;;AAAA;;AAEA;;AACA;;AAEO,MAAMA,aAAa,GAAG,8BAAc,OAAOC,MAAP,EAAeC,OAAf,KAA2B;AAClE,MAAID,MAAM,CAACE,MAAP,CAAcC,KAAd,KAAwB,KAA5B,EAAmC;AAC/BF,IAAAA,OAAO,CAACG,IAAR,CAAc,iEAAd;AACA;AACH,GAJiE,CAMlE;;;AACA,QAAMC,SAAS,GAAG,2BAAe;AAAEC,IAAAA,MAAM,EAAE,KAAV;AAAiBC,IAAAA,GAAG,EAAEP,MAAM,CAACO;AAA7B,GAAf,CAAlB;AAEAN,EAAAA,OAAO,CAACG,IAAR,CAAa,0CAAb;;AAEA,MAAI;AACA,UAAMI,YAAY,GAAG,IAAIC,eAAJ,CAAiB;AAAEC,MAAAA,MAAM,EAAEL,SAAS,CAAC,QAAD;AAAnB,KAAjB,CAArB;AAEA,UAAMM,QAAQ,GAAG,MAAMH,YAAY,CAC9BI,MADkB,CACX;AACJC,MAAAA,YAAY,EAAER,SAAS,CAAC,YAAD,CADnB;AAEJS,MAAAA,OAAO,EAAEC,IAAI,CAACC,SAAL,CAAe;AACpBC,QAAAA,MAAM,EAAE;AACJC,UAAAA,IAAI,EAAE,GADF;AAEJC,UAAAA,aAAa,EAAE;AACXC,YAAAA,EAAE,EAAE;AACAC,cAAAA,SAAS,EAAE;AADX;AADO;AAFX;AADY,OAAf;AAFL,KADW,EAclBC,OAdkB,EAAvB;AAgBA,UAAM;AAAEC,MAAAA;AAAF,QAAYR,IAAI,CAACS,KAAL,CAAWb,QAAQ,CAACG,OAApB,CAAlB;;AACA,QAAIS,KAAJ,EAAW;AACP,YAAMA,KAAN;AACH;;AAED,UAAMf,YAAY,CACbI,MADC,CACM;AACJC,MAAAA,YAAY,EAAER,SAAS,CAAC,gBAAD,CADnB;AAEJoB,MAAAA,cAAc,EAAE;AAFZ,KADN,EAKDH,OALC,EAAN;AAOArB,IAAAA,OAAO,CAACyB,OAAR,CAAgB,4CAAhB;AACAzB,IAAAA,OAAO,CAACG,IAAR,CACI,uFADJ;AAGH,GAnCD,CAmCE,OAAOuB,CAAP,EAAU;AACR1B,IAAAA,OAAO,CAACsB,KAAR,CACK,+EADL;AAGAK,IAAAA,OAAO,CAACC,GAAR,CAAYF,CAAZ;AACH;AACJ,CApD4B,CAAtB","sourcesContent":["import LambdaClient from \"aws-sdk/clients/lambda\";\n\nimport { defineAppHook } from \"@webiny/pulumi-sdk\";\nimport { getStackOutput } from \"@webiny/cli-plugin-deploy-pulumi/utils\";\n\nexport const websiteRender = defineAppHook(async (params, context) => {\n if (params.inputs.build === false) {\n context.info(`\"--no-build\" argument detected - skipping Website re-rendering.`);\n return;\n }\n\n // 2. Get exports from `site` stack, for `args.env` environment.\n const apiOutput = getStackOutput({ folder: \"api\", env: params.env });\n\n context.info(\"Issuing a complete website render job...\");\n\n try {\n const lambdaClient = new LambdaClient({ region: apiOutput[\"region\"] });\n\n const response = await lambdaClient\n .invoke({\n FunctionName: apiOutput[\"psQueueAdd\"],\n Payload: JSON.stringify({\n render: {\n path: \"*\",\n configuration: {\n db: {\n namespace: \"T#root\"\n }\n }\n }\n })\n })\n .promise();\n\n const { error } = JSON.parse(response.Payload as string);\n if (error) {\n throw error;\n }\n\n await lambdaClient\n .invoke({\n FunctionName: apiOutput[\"psQueueProcess\"],\n InvocationType: \"Event\"\n })\n .promise();\n\n context.success(\"Website re-render job successfully issued.\");\n context.info(\n \"Please note that it can take a couple of minutes for the website to be fully updated.\"\n );\n } catch (e) {\n context.error(\n `An error occurred while trying to update default Page Builder app's settings!`\n );\n console.log(e);\n }\n});\n"]}
1
+ {"version":3,"sources":["WebsiteHookRender.ts"],"names":["websiteRender","params","context","inputs","build","info","storageOutput","folder","env","client","EventBridgeClient","region","result","putEvents","Entries","Source","EventBusName","DetailType","Detail","JSON","stringify","path","variant","configuration","db","namespace","promise","entry","ErrorMessage","Error","success","e","error","console","log"],"mappings":";;;;;;;;;AAAA;;AAEA;;AACA;;AAEO,MAAMA,aAAa,GAAG,8BAAc,OAAOC,MAAP,EAAeC,OAAf,KAA2B;AAClE,MAAID,MAAM,CAACE,MAAP,CAAcC,KAAd,KAAwB,KAA5B,EAAmC;AAC/BF,IAAAA,OAAO,CAACG,IAAR,CAAc,iEAAd;AACA;AACH;;AAED,QAAMC,aAAa,GAAG,2BAAe;AAAEC,IAAAA,MAAM,EAAE,cAAV;AAA0BC,IAAAA,GAAG,EAAEP,MAAM,CAACO;AAAtC,GAAf,CAAtB;AAEAN,EAAAA,OAAO,CAACG,IAAR,CAAa,0CAAb;;AAEA,MAAI;AAAA;;AACA,UAAMI,MAAM,GAAG,IAAIC,oBAAJ,CAAsB;AACjCC,MAAAA,MAAM,EAAEL,aAAa,CAAC,QAAD;AADY,KAAtB,CAAf;AAIA,UAAMM,MAAM,GAAG,MAAMH,MAAM,CACtBI,SADgB,CACN;AACPC,MAAAA,OAAO,EAAE,CACL;AACIC,QAAAA,MAAM,EAAE,YADZ;AAEIC,QAAAA,YAAY,EAAEV,aAAa,CAAC,aAAD,CAF/B;AAGIW,QAAAA,UAAU,EAAE,aAHhB;AAIIC,QAAAA,MAAM,EAAEC,IAAI,CAACC,SAAL,CAAe;AACnBC,UAAAA,IAAI,EAAE,GADa;AAEnBC,UAAAA,OAAO,EAAErB,MAAM,CAACqB,OAFG;AAGnBC,UAAAA,aAAa,EAAE;AACXC,YAAAA,EAAE,EAAE;AACAC,cAAAA,SAAS,EAAE;AADX;AADO;AAHI,SAAf;AAJZ,OADK;AADF,KADM,EAmBhBC,OAnBgB,EAArB;AAqBA,UAAMC,KAAK,sBAAGf,MAAM,CAACE,OAAV,oDAAG,gBAAiB,CAAjB,CAAd;;AACA,QAAIa,KAAJ,aAAIA,KAAJ,eAAIA,KAAK,CAAEC,YAAX,EAAyB;AACrB,YAAM,IAAIC,KAAJ,CAAUF,KAAK,CAACC,YAAhB,CAAN;AACH;;AAED1B,IAAAA,OAAO,CAAC4B,OAAR,CAAgB,4CAAhB;AACA5B,IAAAA,OAAO,CAACG,IAAR,CACI,uFADJ;AAGH,GAnCD,CAmCE,OAAO0B,CAAP,EAAU;AACR7B,IAAAA,OAAO,CAAC8B,KAAR,CACK,+EADL;AAGAC,IAAAA,OAAO,CAACC,GAAR,CAAYH,CAAZ;AACH;AACJ,CAnD4B,CAAtB","sourcesContent":["import EventBridgeClient from \"aws-sdk/clients/eventbridge\";\n\nimport { defineAppHook } from \"@webiny/pulumi-sdk\";\nimport { getStackOutput } from \"@webiny/cli-plugin-deploy-pulumi/utils\";\n\nexport const websiteRender = defineAppHook(async (params, context) => {\n if (params.inputs.build === false) {\n context.info(`\"--no-build\" argument detected - skipping Website re-rendering.`);\n return;\n }\n\n const storageOutput = getStackOutput({ folder: \"apps/storage\", env: params.env });\n\n context.info(\"Issuing a complete website render job...\");\n\n try {\n const client = new EventBridgeClient({\n region: storageOutput[\"region\"]\n });\n\n const result = await client\n .putEvents({\n Entries: [\n {\n Source: \"webiny-cli\",\n EventBusName: storageOutput[\"eventBusArn\"],\n DetailType: \"RenderPages\",\n Detail: JSON.stringify({\n path: \"*\",\n variant: params.variant,\n configuration: {\n db: {\n namespace: \"T#root\"\n }\n }\n })\n }\n ]\n })\n .promise();\n\n const entry = result.Entries?.[0];\n if (entry?.ErrorMessage) {\n throw new Error(entry.ErrorMessage);\n }\n\n context.success(\"Website re-render job successfully issued.\");\n context.info(\n \"Please note that it can take a couple of minutes for the website to be fully updated.\"\n );\n } catch (e) {\n context.error(\n `An error occurred while trying to update default Page Builder app's settings!`\n );\n console.log(e);\n }\n});\n"]}
@@ -0,0 +1,31 @@
1
+ import * as pulumi from "@pulumi/pulumi";
2
+ import * as aws from "@pulumi/aws";
3
+ import { PulumiApp } from "@webiny/pulumi-sdk";
4
+ interface PreRenderingServiceParams {
5
+ env: Record<string, pulumi.Input<string>>;
6
+ }
7
+ export declare function createPrerenderingService(app: PulumiApp, params: PreRenderingServiceParams): {
8
+ subscriber: {
9
+ policy: pulumi.Output<aws.iam.Policy>;
10
+ role: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.iam.Role>;
11
+ lambda: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Function>;
12
+ eventRule: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.cloudwatch.EventRule>;
13
+ eventPermission: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Permission>;
14
+ eventTarget: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.cloudwatch.EventTarget>;
15
+ };
16
+ renderer: {
17
+ policy: pulumi.Output<aws.iam.Policy>;
18
+ role: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.iam.Role>;
19
+ lambda: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Function>;
20
+ eventSourceMapping: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.EventSourceMapping>;
21
+ };
22
+ flush: {
23
+ policy: pulumi.Output<aws.iam.Policy>;
24
+ role: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.iam.Role>;
25
+ lambda: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Function>;
26
+ eventRule: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.cloudwatch.EventRule>;
27
+ eventPermission: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.lambda.Permission>;
28
+ eventTarget: import("@webiny/pulumi-sdk").PulumiAppResource<typeof aws.cloudwatch.EventTarget>;
29
+ };
30
+ };
31
+ export {};
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createPrerenderingService = createPrerenderingService;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var path = _interopRequireWildcard(require("path"));
13
+
14
+ var pulumi = _interopRequireWildcard(require("@pulumi/pulumi"));
15
+
16
+ var aws = _interopRequireWildcard(require("@pulumi/aws"));
17
+
18
+ var _awsLayers = require("@webiny/aws-layers");
19
+
20
+ var _lambdaUtils = require("../lambdaUtils");
21
+
22
+ var _common = require("../common");
23
+
24
+ var _awsUtils = require("../awsUtils");
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+
30
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
31
+
32
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
33
+
34
+ function createPrerenderingService(app, params) {
35
+ const queue = app.addResource(aws.sqs.Queue, {
36
+ name: "ps-render-queue",
37
+ config: {
38
+ visibilityTimeoutSeconds: 300,
39
+ fifoQueue: true
40
+ }
41
+ });
42
+ const policy = createLambdaPolicy(app, queue.output);
43
+ const subscriber = createRenderSubscriber(app, queue.output, policy.output, params);
44
+ const renderer = createRenderer(app, queue.output, policy.output, params);
45
+ const flush = createFlushService(app, policy.output, params);
46
+ return {
47
+ subscriber,
48
+ renderer,
49
+ flush
50
+ };
51
+ }
52
+
53
+ function createRenderSubscriber(app, queue, policy, params) {
54
+ const storage = app.getModule(_common.StorageOutput);
55
+ const role = (0, _lambdaUtils.createLambdaRole)(app, {
56
+ name: "ps-render-subscriber-role",
57
+ policy: policy,
58
+ executionRole: aws.iam.ManagedPolicy.AWSLambdaBasicExecutionRole
59
+ });
60
+ const lambda = app.addResource(aws.lambda.Function, {
61
+ name: "ps-render-subscriber-lambda",
62
+ config: {
63
+ role: role.output.arn,
64
+ runtime: "nodejs14.x",
65
+ handler: "handler.handler",
66
+ timeout: 30,
67
+ memorySize: 512,
68
+ environment: {
69
+ variables: _objectSpread(_objectSpread(_objectSpread({}, (0, _lambdaUtils.getCommonLambdaEnvVariables)(app)), params.env), {}, {
70
+ SQS_QUEUE: queue.url
71
+ })
72
+ },
73
+ description: "Subscribes to render events on event bus",
74
+ code: new pulumi.asset.AssetArchive({
75
+ ".": new pulumi.asset.FileArchive(path.join(app.ctx.appDir, "prerendering/subscribe/build"))
76
+ }),
77
+ vpcConfig: app.getModule(_common.VpcConfig).functionVpcConfig
78
+ }
79
+ });
80
+ const eventRule = app.addResource(aws.cloudwatch.EventRule, {
81
+ name: "ps-render-subscriber-event-rule",
82
+ config: {
83
+ eventBusName: storage.eventBusArn,
84
+ eventPattern: JSON.stringify({
85
+ "detail-type": ["RenderPages"]
86
+ })
87
+ }
88
+ });
89
+ const eventPermission = app.addResource(aws.lambda.Permission, {
90
+ name: "ps-render-subscriber-event-permission",
91
+ config: {
92
+ action: "lambda:InvokeFunction",
93
+ function: lambda.output.arn,
94
+ principal: "events.amazonaws.com",
95
+ sourceArn: eventRule.output.arn
96
+ }
97
+ });
98
+ const eventTarget = app.addResource(aws.cloudwatch.EventTarget, {
99
+ name: "ps-render-subscriber-event-target",
100
+ config: {
101
+ rule: eventRule.output.name,
102
+ eventBusName: storage.eventBusArn,
103
+ arn: lambda.output.arn
104
+ }
105
+ });
106
+ return {
107
+ policy,
108
+ role,
109
+ lambda,
110
+ eventRule,
111
+ eventPermission,
112
+ eventTarget
113
+ };
114
+ }
115
+
116
+ function createRenderer(app, queue, policy, params) {
117
+ const role = (0, _lambdaUtils.createLambdaRole)(app, {
118
+ name: "ps-render-lambda-role",
119
+ policy: policy,
120
+ executionRole: aws.iam.ManagedPolicy.AWSLambdaSQSQueueExecutionRole
121
+ });
122
+ const lambda = app.addResource(aws.lambda.Function, {
123
+ name: "ps-render-lambda",
124
+ config: {
125
+ role: role.output.arn,
126
+ runtime: "nodejs14.x",
127
+ handler: "handler.handler",
128
+ timeout: 300,
129
+ memorySize: 2048,
130
+ layers: [(0, _awsLayers.getLayerArn)("shelf-io-chrome-aws-lambda-layer")],
131
+ environment: {
132
+ variables: _objectSpread(_objectSpread({}, (0, _lambdaUtils.getCommonLambdaEnvVariables)(app)), params.env)
133
+ },
134
+ description: "Renders pages and stores output in an S3 bucket of choice.",
135
+ code: new pulumi.asset.AssetArchive({
136
+ ".": new pulumi.asset.FileArchive(path.join(app.ctx.appDir, "prerendering/render/build"))
137
+ }),
138
+ vpcConfig: app.getModule(_common.VpcConfig).functionVpcConfig
139
+ }
140
+ });
141
+ const eventSourceMapping = app.addResource(aws.lambda.EventSourceMapping, {
142
+ name: "ps-render-event-source-mapping",
143
+ config: {
144
+ functionName: lambda.output.arn,
145
+ eventSourceArn: queue.arn,
146
+ batchSize: 1
147
+ }
148
+ });
149
+ return {
150
+ policy,
151
+ role,
152
+ lambda,
153
+ eventSourceMapping
154
+ };
155
+ }
156
+
157
+ function createFlushService(app, policy, params) {
158
+ const storage = app.getModule(_common.StorageOutput);
159
+ const role = (0, _lambdaUtils.createLambdaRole)(app, {
160
+ name: "ps-flush-lambda-role",
161
+ policy: policy,
162
+ executionRole: aws.iam.ManagedPolicy.AWSLambdaBasicExecutionRole
163
+ });
164
+ const lambda = app.addResource(aws.lambda.Function, {
165
+ name: "ps-flush-lambda",
166
+ config: {
167
+ role: role.output.arn,
168
+ runtime: "nodejs14.x",
169
+ handler: "handler.handler",
170
+ timeout: 30,
171
+ memorySize: 512,
172
+ environment: {
173
+ variables: _objectSpread(_objectSpread({}, (0, _lambdaUtils.getCommonLambdaEnvVariables)(app)), params.env)
174
+ },
175
+ description: "Subscribes to fluhs events on event bus",
176
+ code: new pulumi.asset.AssetArchive({
177
+ ".": new pulumi.asset.FileArchive(path.join(app.ctx.appDir, "prerendering/flush/build"))
178
+ }),
179
+ vpcConfig: app.getModule(_common.VpcConfig).functionVpcConfig
180
+ }
181
+ });
182
+ const eventRule = app.addResource(aws.cloudwatch.EventRule, {
183
+ name: "ps-flush-event-rule",
184
+ config: {
185
+ eventBusName: storage.eventBusArn,
186
+ eventPattern: JSON.stringify({
187
+ "detail-type": ["FlushPages"]
188
+ })
189
+ }
190
+ });
191
+ const eventPermission = app.addResource(aws.lambda.Permission, {
192
+ name: "ps-flush-event-permission",
193
+ config: {
194
+ action: "lambda:InvokeFunction",
195
+ function: lambda.output.arn,
196
+ principal: "events.amazonaws.com",
197
+ sourceArn: eventRule.output.arn
198
+ }
199
+ });
200
+ const eventTarget = app.addResource(aws.cloudwatch.EventTarget, {
201
+ name: "ps-flush-event-target",
202
+ config: {
203
+ rule: eventRule.output.name,
204
+ eventBusName: storage.eventBusArn,
205
+ arn: lambda.output.arn
206
+ }
207
+ });
208
+ return {
209
+ policy,
210
+ role,
211
+ lambda,
212
+ eventRule,
213
+ eventPermission,
214
+ eventTarget
215
+ };
216
+ }
217
+
218
+ function createLambdaPolicy(app, queue) {
219
+ const storage = app.getModule(_common.StorageOutput);
220
+ const awsAccountId = (0, _awsUtils.getAwsAccountId)(app);
221
+ return app.addResource(aws.iam.Policy, {
222
+ name: "ps-lambda-policy",
223
+ config: {
224
+ description: "This policy enables access to Lambda, S3, Cloudfront, SQS and Dynamodb",
225
+ policy: {
226
+ Version: "2012-10-17",
227
+ Statement: [{
228
+ Sid: "PermissionForDynamodb",
229
+ Effect: "Allow",
230
+ Action: ["dynamodb:BatchGetItem", "dynamodb:BatchWriteItem", "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem"],
231
+ Resource: storage.apply(s => {
232
+ // Add permissions to DynamoDB table
233
+ const resources = [`${s.primaryDynamodbTableArn}`, `${s.primaryDynamodbTableArn}/*`]; // Attach permissions for elastic search dynamo as well (if ES is enabled).
234
+
235
+ if (s.elasticsearchDynamodbTableArn) {
236
+ resources.push(`${s.elasticsearchDynamodbTableArn}`, `${s.elasticsearchDynamodbTableArn}/*`);
237
+ }
238
+
239
+ return resources;
240
+ })
241
+ }, {
242
+ Sid: "PermissionForS3",
243
+ Effect: "Allow",
244
+ Action: ["s3:DeleteObject", "s3:GetObject", "s3:GetObjectAcl", "s3:PutObject", "s3:PutObjectAcl"],
245
+ Resource: [pulumi.interpolate`arn:aws:s3:::${storage.fileManagerBucketId}/*`,
246
+ /**
247
+ * We're using the hard-coded value for "delivery" S3 bucket because;
248
+ * It is created during deployment of the `apps/website` stack which is after the api stack,
249
+ * so, we don't know its ARN.
250
+ */
251
+ "arn:aws:s3:::delivery-*/*"]
252
+ }, {
253
+ Sid: "PermissionForCloudfront",
254
+ Effect: "Allow",
255
+ Action: "cloudfront:CreateInvalidation",
256
+ Resource: pulumi.interpolate`arn:aws:cloudfront::${awsAccountId}:distribution/*`
257
+ }, {
258
+ Sid: "PermissionForSQS",
259
+ Effect: "Allow",
260
+ Action: ["sqs:SendMessage", "sqs:SendMessageBatch"],
261
+ Resource: queue.arn
262
+ }]
263
+ }
264
+ }
265
+ });
266
+ }