@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.
- package/apps/admin/AdminApp.d.ts +1 -1
- package/apps/admin/AdminApp.js +20 -1
- package/apps/admin/AdminApp.js.map +1 -1
- package/apps/api/ApiApp.d.ts +11 -14
- package/apps/api/ApiApp.js +62 -67
- package/apps/api/ApiApp.js.map +1 -1
- package/apps/api/ApiApwScheduler.d.ts +0 -2
- package/apps/api/ApiApwScheduler.js +14 -8
- package/apps/api/ApiApwScheduler.js.map +1 -1
- package/apps/api/ApiCloudfront.js +2 -2
- package/apps/api/ApiCloudfront.js.map +1 -1
- package/apps/api/ApiFileManager.d.ts +1 -8
- package/apps/api/ApiFileManager.js +31 -32
- package/apps/api/ApiFileManager.js.map +1 -1
- package/apps/api/ApiGraphql.d.ts +0 -10
- package/apps/api/ApiGraphql.js +59 -39
- package/apps/api/ApiGraphql.js.map +1 -1
- package/apps/api/ApiHeadlessCMS.d.ts +0 -4
- package/apps/api/ApiHeadlessCMS.js +30 -20
- package/apps/api/ApiHeadlessCMS.js.map +1 -1
- package/apps/api/ApiPageBuilder.d.ts +0 -8
- package/apps/api/ApiPageBuilder.js +79 -60
- package/apps/api/ApiPageBuilder.js.map +1 -1
- package/apps/common/StorageOutput.d.ts +21 -0
- package/apps/common/StorageOutput.js +50 -0
- package/apps/common/StorageOutput.js.map +1 -0
- package/apps/common/VpcConfig.d.ts +8 -0
- package/apps/common/VpcConfig.js +37 -0
- package/apps/common/VpcConfig.js.map +1 -0
- package/apps/common/index.d.ts +2 -0
- package/apps/common/index.js +31 -0
- package/apps/common/index.js.map +1 -0
- package/apps/gateway/GatewayApi.d.ts +17 -0
- package/apps/gateway/GatewayApi.js +187 -0
- package/apps/gateway/GatewayApi.js.map +1 -0
- package/apps/gateway/GatewayApp.d.ts +25 -0
- package/apps/gateway/GatewayApp.js +85 -0
- package/apps/gateway/GatewayApp.js.map +1 -0
- package/apps/gateway/GatewayLambdas.d.ts +13 -0
- package/apps/gateway/GatewayLambdas.js +92 -0
- package/apps/gateway/GatewayLambdas.js.map +1 -0
- package/apps/gateway/GatewayReactApp.d.ts +17 -0
- package/apps/gateway/GatewayReactApp.js +163 -0
- package/apps/gateway/GatewayReactApp.js.map +1 -0
- package/apps/index.d.ts +1 -0
- package/apps/index.js +14 -0
- package/apps/index.js.map +1 -1
- package/apps/{api/ApiLambdaUtils.d.ts → lambdaUtils.d.ts} +6 -3
- package/apps/lambdaUtils.js +75 -0
- package/apps/lambdaUtils.js.map +1 -0
- package/apps/storage/StorageApp.d.ts +42 -5
- package/apps/storage/StorageApp.js +27 -9
- package/apps/storage/StorageApp.js.map +1 -1
- package/apps/storage/StorageElasticSearch.d.ts +15 -0
- package/apps/storage/StorageElasticSearch.js +242 -0
- package/apps/storage/StorageElasticSearch.js.map +1 -0
- package/apps/storage/StorageEventBus.d.ts +2 -0
- package/apps/{api/ApiLambdaUtils.js → storage/StorageEventBus.js} +15 -33
- package/apps/storage/StorageEventBus.js.map +1 -0
- package/apps/{api/ApiVpc.d.ts → storage/StorageVpc.d.ts} +4 -4
- package/apps/storage/StorageVpc.js +145 -0
- package/apps/storage/StorageVpc.js.map +1 -0
- package/apps/storage/index.d.ts +2 -0
- package/apps/storage/index.js +26 -0
- package/apps/storage/index.js.map +1 -1
- package/apps/utils.d.ts +5 -0
- package/apps/utils.js +14 -0
- package/apps/utils.js.map +1 -0
- package/apps/website/WebsiteApp.d.ts +33 -3
- package/apps/website/WebsiteApp.js +57 -5
- package/apps/website/WebsiteApp.js.map +1 -1
- package/apps/website/WebsiteHookRender.js +20 -22
- package/apps/website/WebsiteHookRender.js.map +1 -1
- package/apps/website/WebsitePrerendering.d.ts +31 -0
- package/apps/website/WebsitePrerendering.js +266 -0
- package/apps/website/WebsitePrerendering.js.map +1 -0
- package/apps/website/WebsiteUpload.d.ts +6 -0
- package/apps/website/WebsiteUpload.js +50 -0
- package/apps/website/WebsiteUpload.js.map +1 -0
- package/package.json +9 -8
- package/apps/api/ApiLambdaUtils.js.map +0 -1
- package/apps/api/ApiPrerendering.d.ts +0 -24
- package/apps/api/ApiPrerendering.js +0 -200
- package/apps/api/ApiPrerendering.js.map +0 -1
- package/apps/api/ApiVpc.js +0 -129
- package/apps/api/ApiVpc.js.map +0 -1
- package/apps/getStorageOutput.d.ts +0 -13
- package/apps/getStorageOutput.js +0 -29
- package/apps/getStorageOutput.js.map +0 -1
- package/apps/website/WebsiteHookUpdatePbSettings.d.ts +0 -5
- package/apps/website/WebsiteHookUpdatePbSettings.js +0 -80
- package/apps/website/WebsiteHookUpdatePbSettings.js.map +0 -1
- package/apps/website/WebsiteHookUpload.d.ts +0 -1
- package/apps/website/WebsiteHookUpload.js +0 -65
- 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 {
|
|
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
|
|
21
|
+
var _WebsiteUpload = require("./WebsiteUpload");
|
|
20
22
|
|
|
21
|
-
var
|
|
23
|
+
var _customDomain = require("../customDomain");
|
|
22
24
|
|
|
23
|
-
var
|
|
25
|
+
var _WebsitePrerendering = require("./WebsitePrerendering");
|
|
24
26
|
|
|
25
|
-
var
|
|
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)(
|
|
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
|
|
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
|
-
}
|
|
21
|
-
|
|
20
|
+
}
|
|
22
21
|
|
|
23
|
-
const
|
|
24
|
-
folder: "
|
|
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
|
-
|
|
31
|
-
|
|
29
|
+
var _result$Entries;
|
|
30
|
+
|
|
31
|
+
const client = new _eventbridge.default({
|
|
32
|
+
region: storageOutput["region"]
|
|
32
33
|
});
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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 (
|
|
51
|
-
throw
|
|
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","
|
|
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
|
+
}
|