@webiny/pulumi-aws 0.0.0-ee-vpcs.549378cf03

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 (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +328 -0
  3. package/apps/admin/createAdminPulumiApp.d.ts +24 -0
  4. package/apps/admin/createAdminPulumiApp.js +21 -0
  5. package/apps/admin/createAdminPulumiApp.js.map +1 -0
  6. package/apps/admin/index.d.ts +1 -0
  7. package/apps/admin/index.js +18 -0
  8. package/apps/admin/index.js.map +1 -0
  9. package/apps/api/ApiApwScheduler.d.ts +20 -0
  10. package/apps/api/ApiApwScheduler.js +246 -0
  11. package/apps/api/ApiApwScheduler.js.map +1 -0
  12. package/apps/api/ApiCloudfront.d.ts +3 -0
  13. package/apps/api/ApiCloudfront.js +101 -0
  14. package/apps/api/ApiCloudfront.js.map +1 -0
  15. package/apps/api/ApiFileManager.d.ts +10 -0
  16. package/apps/api/ApiFileManager.js +166 -0
  17. package/apps/api/ApiFileManager.js.map +1 -0
  18. package/apps/api/ApiGateway.d.ts +18 -0
  19. package/apps/api/ApiGateway.js +88 -0
  20. package/apps/api/ApiGateway.js.map +1 -0
  21. package/apps/api/ApiGraphql.d.ts +26 -0
  22. package/apps/api/ApiGraphql.js +167 -0
  23. package/apps/api/ApiGraphql.js.map +1 -0
  24. package/apps/api/ApiHeadlessCMS.d.ts +13 -0
  25. package/apps/api/ApiHeadlessCMS.js +94 -0
  26. package/apps/api/ApiHeadlessCMS.js.map +1 -0
  27. package/apps/api/ApiOutput.d.ts +15 -0
  28. package/apps/api/ApiOutput.js +43 -0
  29. package/apps/api/ApiOutput.js.map +1 -0
  30. package/apps/api/ApiPageBuilder.d.ts +24 -0
  31. package/apps/api/ApiPageBuilder.js +248 -0
  32. package/apps/api/ApiPageBuilder.js.map +1 -0
  33. package/apps/api/createApiPulumiApp.d.ts +71 -0
  34. package/apps/api/createApiPulumiApp.js +188 -0
  35. package/apps/api/createApiPulumiApp.js.map +1 -0
  36. package/apps/api/index.d.ts +9 -0
  37. package/apps/api/index.js +122 -0
  38. package/apps/api/index.js.map +1 -0
  39. package/apps/awsUtils.d.ts +3 -0
  40. package/apps/awsUtils.js +23 -0
  41. package/apps/awsUtils.js.map +1 -0
  42. package/apps/common/CoreOutput.d.ts +21 -0
  43. package/apps/common/CoreOutput.js +50 -0
  44. package/apps/common/CoreOutput.js.map +1 -0
  45. package/apps/common/VpcConfig.d.ts +8 -0
  46. package/apps/common/VpcConfig.js +37 -0
  47. package/apps/common/VpcConfig.js.map +1 -0
  48. package/apps/common/index.d.ts +2 -0
  49. package/apps/common/index.js +31 -0
  50. package/apps/common/index.js.map +1 -0
  51. package/apps/core/CoreCognito.d.ts +10 -0
  52. package/apps/core/CoreCognito.js +100 -0
  53. package/apps/core/CoreCognito.js.map +1 -0
  54. package/apps/core/CoreDynamo.d.ts +5 -0
  55. package/apps/core/CoreDynamo.js +51 -0
  56. package/apps/core/CoreDynamo.js.map +1 -0
  57. package/apps/core/CoreElasticSearch.d.ts +16 -0
  58. package/apps/core/CoreElasticSearch.js +286 -0
  59. package/apps/core/CoreElasticSearch.js.map +1 -0
  60. package/apps/core/CoreEventBus.d.ts +1 -0
  61. package/apps/core/CoreEventBus.js +25 -0
  62. package/apps/core/CoreEventBus.js.map +1 -0
  63. package/apps/core/CoreFileManager.d.ts +8 -0
  64. package/apps/core/CoreFileManager.js +55 -0
  65. package/apps/core/CoreFileManager.js.map +1 -0
  66. package/apps/core/CoreVpc.d.ts +13 -0
  67. package/apps/core/CoreVpc.js +148 -0
  68. package/apps/core/CoreVpc.js.map +1 -0
  69. package/apps/core/createCorePulumiApp.d.ts +64 -0
  70. package/apps/core/createCorePulumiApp.js +104 -0
  71. package/apps/core/createCorePulumiApp.js.map +1 -0
  72. package/apps/core/index.d.ts +6 -0
  73. package/apps/core/index.js +83 -0
  74. package/apps/core/index.js.map +1 -0
  75. package/apps/createAppBucket.d.ts +13 -0
  76. package/apps/createAppBucket.js +106 -0
  77. package/apps/createAppBucket.js.map +1 -0
  78. package/apps/customDomain.d.ts +9 -0
  79. package/apps/customDomain.js +14 -0
  80. package/apps/customDomain.js.map +1 -0
  81. package/apps/index.d.ts +7 -0
  82. package/apps/index.js +100 -0
  83. package/apps/index.js.map +1 -0
  84. package/apps/lambdaUtils.d.ts +10 -0
  85. package/apps/lambdaUtils.js +82 -0
  86. package/apps/lambdaUtils.js.map +1 -0
  87. package/apps/react/createReactPulumiApp.d.ts +33 -0
  88. package/apps/react/createReactPulumiApp.js +144 -0
  89. package/apps/react/createReactPulumiApp.js.map +1 -0
  90. package/apps/react/index.d.ts +1 -0
  91. package/apps/react/index.js +18 -0
  92. package/apps/react/index.js.map +1 -0
  93. package/apps/tenantRouter.d.ts +3 -0
  94. package/apps/tenantRouter.js +115 -0
  95. package/apps/tenantRouter.js.map +1 -0
  96. package/apps/website/WebsitePrerendering.d.ts +39 -0
  97. package/apps/website/WebsitePrerendering.js +300 -0
  98. package/apps/website/WebsitePrerendering.js.map +1 -0
  99. package/apps/website/createWebsitePulumiApp.d.ts +74 -0
  100. package/apps/website/createWebsitePulumiApp.js +246 -0
  101. package/apps/website/createWebsitePulumiApp.js.map +1 -0
  102. package/apps/website/deliveryViewerRequest.d.ts +2 -0
  103. package/apps/website/deliveryViewerRequest.js +32 -0
  104. package/apps/website/deliveryViewerRequest.js.map +1 -0
  105. package/apps/website/index.d.ts +1 -0
  106. package/apps/website/index.js +18 -0
  107. package/apps/website/index.js.map +1 -0
  108. package/components/tenantRouter/WebsiteTenantRouter.d.ts +11 -0
  109. package/components/tenantRouter/WebsiteTenantRouter.js +98 -0
  110. package/components/tenantRouter/WebsiteTenantRouter.js.map +1 -0
  111. package/components/tenantRouter/functions/origin/request.d.ts +1 -0
  112. package/components/tenantRouter/functions/origin/request.js +129 -0
  113. package/components/tenantRouter/functions/origin/request.js.map +1 -0
  114. package/enterprise/createAdminPulumiApp.d.ts +1 -0
  115. package/enterprise/createAdminPulumiApp.js +25 -0
  116. package/enterprise/createAdminPulumiApp.js.map +1 -0
  117. package/enterprise/createApiPulumiApp.d.ts +61 -0
  118. package/enterprise/createApiPulumiApp.js +68 -0
  119. package/enterprise/createApiPulumiApp.js.map +1 -0
  120. package/enterprise/createCorePulumiApp.d.ts +42 -0
  121. package/enterprise/createCorePulumiApp.js +137 -0
  122. package/enterprise/createCorePulumiApp.js.map +1 -0
  123. package/enterprise/createWebsitePulumiApp.d.ts +56 -0
  124. package/enterprise/createWebsitePulumiApp.js +68 -0
  125. package/enterprise/createWebsitePulumiApp.js.map +1 -0
  126. package/enterprise/index.d.ts +4 -0
  127. package/enterprise/index.js +57 -0
  128. package/enterprise/index.js.map +1 -0
  129. package/index.d.ts +3 -0
  130. package/index.js +44 -0
  131. package/index.js.map +1 -0
  132. package/package.json +53 -0
  133. package/utils/crawlDirectory.d.ts +1 -0
  134. package/utils/crawlDirectory.js +33 -0
  135. package/utils/crawlDirectory.js.map +1 -0
  136. package/utils/getPresignedPost.d.ts +11 -0
  137. package/utils/getPresignedPost.js +46 -0
  138. package/utils/getPresignedPost.js.map +1 -0
  139. package/utils/index.d.ts +3 -0
  140. package/utils/index.js +51 -0
  141. package/utils/index.js.map +1 -0
  142. package/utils/lambdaEnvVariables.d.ts +20 -0
  143. package/utils/lambdaEnvVariables.js +78 -0
  144. package/utils/lambdaEnvVariables.js.map +1 -0
  145. package/utils/storageMigrate.d.ts +0 -0
  146. package/utils/storageMigrate.js +292 -0
  147. package/utils/storageMigrate.js.map +1 -0
  148. package/utils/tagResources.d.ts +5 -0
  149. package/utils/tagResources.js +43 -0
  150. package/utils/tagResources.js.map +1 -0
  151. package/utils/uploadFolderToS3.d.ts +26 -0
  152. package/utils/uploadFolderToS3.js +188 -0
  153. package/utils/uploadFolderToS3.js.map +1 -0
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+
5
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.ElasticSearch = void 0;
11
+
12
+ var _path = _interopRequireDefault(require("path"));
13
+
14
+ var pulumi = _interopRequireWildcard(require("@pulumi/pulumi"));
15
+
16
+ var aws = _interopRequireWildcard(require("@pulumi/aws"));
17
+
18
+ var _pulumi2 = require("@webiny/pulumi");
19
+
20
+ var _awsUtils = require("../awsUtils");
21
+
22
+ var _CoreVpc = require("./CoreVpc");
23
+
24
+ function getDevClusterConfig() {
25
+ return {
26
+ instanceType: "t3.small.elasticsearch"
27
+ };
28
+ }
29
+
30
+ function getProdClusterConfig() {
31
+ return {
32
+ // For production deployments, we create 2 instances and configure multi-AZ.
33
+ instanceType: "t3.medium.elasticsearch",
34
+ instanceCount: 2,
35
+ zoneAwarenessEnabled: true,
36
+ zoneAwarenessConfig: {
37
+ availabilityZoneCount: 2
38
+ }
39
+ };
40
+ }
41
+
42
+ const ElasticSearch = (0, _pulumi2.createAppModule)({
43
+ name: "ElasticSearch",
44
+
45
+ config(app, params) {
46
+ const domainName = "webiny-js";
47
+ const accountId = (0, _awsUtils.getAwsAccountId)(app);
48
+ const prod = app.params.run.env === "prod";
49
+ const vpc = app.getModule(_CoreVpc.CoreVpc, {
50
+ optional: true
51
+ }); // This needs to be implemented in order to be able to use a shared ElasticSearch cluster.
52
+
53
+ let domain;
54
+ let domainPolicy;
55
+
56
+ if (process.env.AWS_ELASTIC_SEARCH_DOMAIN_NAME) {
57
+ const domainName = String(process.env.AWS_ELASTIC_SEARCH_DOMAIN_NAME); // This can be useful for testing purposes in ephemeral environments. More information here:
58
+ // https://www.webiny.com/docs/key-topics/ci-cd/testing/slow-ephemeral-environments
59
+
60
+ domain = app.addRemoteResource(domainName, () => {
61
+ return aws.elasticsearch.getDomain({
62
+ domainName
63
+ }, {
64
+ async: true
65
+ });
66
+ });
67
+ } else {
68
+ // Regular ElasticSearch deployment.
69
+ domain = app.addResource(aws.elasticsearch.Domain, {
70
+ name: domainName,
71
+ config: {
72
+ elasticsearchVersion: "7.10",
73
+ clusterConfig: prod ? getProdClusterConfig() : getDevClusterConfig(),
74
+ vpcOptions: vpc ? {
75
+ subnetIds: vpc.subnets.private.map(s => s.output.id),
76
+ securityGroupIds: [vpc.vpc.output.defaultSecurityGroupId]
77
+ } : undefined,
78
+ ebsOptions: {
79
+ ebsEnabled: true,
80
+ volumeSize: 10,
81
+ volumeType: "gp2"
82
+ },
83
+ advancedOptions: {
84
+ "rest.action.multi.allow_explicit_index": "true"
85
+ },
86
+ snapshotOptions: {
87
+ automatedSnapshotStartHour: 23
88
+ }
89
+ },
90
+ opts: {
91
+ protect: params.protect
92
+ }
93
+ });
94
+ /**
95
+ * Domain policy defines who can access your Elasticsearch Domain.
96
+ * For details on Elasticsearch security, read the official documentation:
97
+ * https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/security.html
98
+ */
99
+
100
+ domainPolicy = app.addResource(aws.elasticsearch.DomainPolicy, {
101
+ name: `${domainName}-policy`,
102
+ config: {
103
+ domainName: domain.output.domainName,
104
+ accessPolicies: {
105
+ Version: "2012-10-17",
106
+ Statement: [
107
+ /**
108
+ * Allow requests signed with current account
109
+ */
110
+ {
111
+ Effect: "Allow",
112
+ Principal: {
113
+ AWS: accountId
114
+ },
115
+ Action: "es:*",
116
+ Resource: pulumi.interpolate`${domain.output.arn}/*`
117
+ }]
118
+ }
119
+ },
120
+ opts: {
121
+ protect: params.protect
122
+ }
123
+ });
124
+ }
125
+ /**
126
+ * Create a table for Elasticsearch records. All ES records are stored in this table to dramatically improve
127
+ * performance and stability on write operations (especially massive data imports). This table also serves as a backup and
128
+ * a single source of truth for your Elasticsearch domain. Streaming is enabled on this table, and it will
129
+ * allow asynchronous synchronization of data with Elasticsearch domain.
130
+ */
131
+
132
+
133
+ const table = app.addResource(aws.dynamodb.Table, {
134
+ name: "webiny-es",
135
+ config: {
136
+ attributes: [{
137
+ name: "PK",
138
+ type: "S"
139
+ }, {
140
+ name: "SK",
141
+ type: "S"
142
+ }],
143
+ streamEnabled: true,
144
+ streamViewType: "NEW_AND_OLD_IMAGES",
145
+ billingMode: "PAY_PER_REQUEST",
146
+ hashKey: "PK",
147
+ rangeKey: "SK"
148
+ },
149
+ opts: {
150
+ protect: params.protect
151
+ }
152
+ });
153
+ const roleName = "dynamo-to-elastic-lambda-role";
154
+ const role = app.addResource(aws.iam.Role, {
155
+ name: roleName,
156
+ config: {
157
+ assumeRolePolicy: {
158
+ Version: "2012-10-17",
159
+ Statement: [{
160
+ Action: "sts:AssumeRole",
161
+ Principal: {
162
+ Service: "lambda.amazonaws.com"
163
+ },
164
+ Effect: "Allow"
165
+ }]
166
+ }
167
+ },
168
+ meta: {
169
+ isLambdaFunctionRole: true
170
+ }
171
+ });
172
+ const policy = getDynamoDbToElasticLambdaPolicy(app, domain.output);
173
+ app.addResource(aws.iam.RolePolicyAttachment, {
174
+ name: `${roleName}-DynamoDbToElasticLambdaPolicy`,
175
+ config: {
176
+ role: role.output,
177
+ policyArn: policy.output.arn
178
+ }
179
+ }); // Only use `AWSLambdaVPCAccessExecutionRole` policy if VPC feature is enabled.
180
+
181
+ if (vpc) {
182
+ app.addResource(aws.iam.RolePolicyAttachment, {
183
+ name: `${roleName}-AWSLambdaVPCAccessExecutionRole`,
184
+ config: {
185
+ role: role.output,
186
+ policyArn: aws.iam.ManagedPolicy.AWSLambdaVPCAccessExecutionRole
187
+ }
188
+ });
189
+ } else {
190
+ app.addResource(aws.iam.RolePolicyAttachment, {
191
+ name: `${roleName}-AWSLambdaBasicExecutionRole`,
192
+ config: {
193
+ role: role.output,
194
+ policyArn: aws.iam.ManagedPolicy.AWSLambdaBasicExecutionRole
195
+ }
196
+ });
197
+ }
198
+
199
+ app.addResource(aws.iam.RolePolicyAttachment, {
200
+ name: `${roleName}-AWSLambdaDynamoDBExecutionRole`,
201
+ config: {
202
+ role: role.output,
203
+ policyArn: aws.iam.ManagedPolicy.AWSLambdaDynamoDBExecutionRole
204
+ }
205
+ });
206
+ /**
207
+ * This Lambda will process the stream events from DynamoDB table that contains Elasticsearch items.
208
+ * Elasticsearch can't take large amount of individual writes in a short period of time, so this way
209
+ * we store data for Elasticsearch in a DynamoDB table, and asynchronously insert it into Elasticsearch
210
+ * using batching.
211
+ */
212
+
213
+ const lambda = app.addResource(aws.lambda.Function, {
214
+ name: "dynamo-to-elastic",
215
+ config: {
216
+ role: role.output.arn,
217
+ runtime: "nodejs14.x",
218
+ handler: "handler.handler",
219
+ timeout: 600,
220
+ memorySize: 512,
221
+ environment: {
222
+ variables: {
223
+ DEBUG: String(process.env.DEBUG),
224
+ ELASTIC_SEARCH_ENDPOINT: domain.output.endpoint
225
+ }
226
+ },
227
+ description: "Process DynamoDB Stream.",
228
+ code: new pulumi.asset.AssetArchive({
229
+ ".": new pulumi.asset.FileArchive(_path.default.join(app.paths.workspace, "dynamoToElastic/build"))
230
+ }),
231
+ vpcConfig: vpc ? {
232
+ subnetIds: vpc.subnets.private.map(s => s.output.id),
233
+ securityGroupIds: [vpc.vpc.output.defaultSecurityGroupId]
234
+ } : undefined
235
+ }
236
+ });
237
+ const eventSourceMapping = app.addResource(aws.lambda.EventSourceMapping, {
238
+ name: "dynamo-to-elastic",
239
+ config: {
240
+ eventSourceArn: table.output.streamArn,
241
+ functionName: lambda.output.arn,
242
+ startingPosition: "LATEST",
243
+ maximumRetryAttempts: 3,
244
+ batchSize: 1000,
245
+ maximumBatchingWindowInSeconds: 1
246
+ }
247
+ });
248
+ app.addOutputs({
249
+ elasticsearchDomainArn: domain.output.arn,
250
+ elasticsearchDomainEndpoint: domain.output.endpoint,
251
+ elasticsearchDynamodbTableArn: table.output.arn,
252
+ elasticsearchDynamodbTableName: table.output.name
253
+ });
254
+ return {
255
+ domain,
256
+ domainPolicy,
257
+ table,
258
+ dynamoToElastic: {
259
+ role,
260
+ policy,
261
+ lambda,
262
+ eventSourceMapping
263
+ }
264
+ };
265
+ }
266
+
267
+ });
268
+ exports.ElasticSearch = ElasticSearch;
269
+
270
+ function getDynamoDbToElasticLambdaPolicy(app, domain) {
271
+ return app.addResource(aws.iam.Policy, {
272
+ name: "DynamoDbToElasticLambdaPolicy-updated",
273
+ config: {
274
+ description: "This policy enables access to ES and Dynamodb streams",
275
+ policy: {
276
+ Version: "2012-10-17",
277
+ Statement: [{
278
+ Sid: "PermissionForES",
279
+ Effect: "Allow",
280
+ Action: ["es:ESHttpDelete", "es:ESHttpPatch", "es:ESHttpPost", "es:ESHttpPut"],
281
+ Resource: [pulumi.interpolate`${domain.arn}`, pulumi.interpolate`${domain.arn}/*`]
282
+ }]
283
+ }
284
+ }
285
+ });
286
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getDevClusterConfig","instanceType","getProdClusterConfig","instanceCount","zoneAwarenessEnabled","zoneAwarenessConfig","availabilityZoneCount","ElasticSearch","createAppModule","name","config","app","params","domainName","accountId","getAwsAccountId","prod","run","env","vpc","getModule","CoreVpc","optional","domain","domainPolicy","process","AWS_ELASTIC_SEARCH_DOMAIN_NAME","String","addRemoteResource","aws","elasticsearch","getDomain","async","addResource","Domain","elasticsearchVersion","clusterConfig","vpcOptions","subnetIds","subnets","private","map","s","output","id","securityGroupIds","defaultSecurityGroupId","undefined","ebsOptions","ebsEnabled","volumeSize","volumeType","advancedOptions","snapshotOptions","automatedSnapshotStartHour","opts","protect","DomainPolicy","accessPolicies","Version","Statement","Effect","Principal","AWS","Action","Resource","pulumi","interpolate","arn","table","dynamodb","Table","attributes","type","streamEnabled","streamViewType","billingMode","hashKey","rangeKey","roleName","role","iam","Role","assumeRolePolicy","Service","meta","isLambdaFunctionRole","policy","getDynamoDbToElasticLambdaPolicy","RolePolicyAttachment","policyArn","ManagedPolicy","AWSLambdaVPCAccessExecutionRole","AWSLambdaBasicExecutionRole","AWSLambdaDynamoDBExecutionRole","lambda","Function","runtime","handler","timeout","memorySize","environment","variables","DEBUG","ELASTIC_SEARCH_ENDPOINT","endpoint","description","code","asset","AssetArchive","FileArchive","path","join","paths","workspace","vpcConfig","eventSourceMapping","EventSourceMapping","eventSourceArn","streamArn","functionName","startingPosition","maximumRetryAttempts","batchSize","maximumBatchingWindowInSeconds","addOutputs","elasticsearchDomainArn","elasticsearchDomainEndpoint","elasticsearchDynamodbTableArn","elasticsearchDynamodbTableName","dynamoToElastic","Policy","Sid"],"sources":["CoreElasticSearch.ts"],"sourcesContent":["import path from \"path\";\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\nimport {\n createAppModule,\n PulumiApp,\n PulumiAppResource,\n PulumiAppResourceConstructor,\n PulumiAppRemoteResource\n} from \"@webiny/pulumi\";\n\nimport { getAwsAccountId } from \"../awsUtils\";\nimport { CoreVpc } from \"./CoreVpc\";\n\nexport interface ElasticSearchParams {\n protect: boolean;\n}\n\nfunction getDevClusterConfig(): aws.types.input.elasticsearch.DomainClusterConfig {\n return {\n instanceType: \"t3.small.elasticsearch\"\n };\n}\n\nfunction getProdClusterConfig(): aws.types.input.elasticsearch.DomainClusterConfig {\n return {\n // For production deployments, we create 2 instances and configure multi-AZ.\n instanceType: \"t3.medium.elasticsearch\",\n instanceCount: 2,\n zoneAwarenessEnabled: true,\n zoneAwarenessConfig: {\n availabilityZoneCount: 2\n }\n };\n}\n\nexport const ElasticSearch = createAppModule({\n name: \"ElasticSearch\",\n config(app, params: ElasticSearchParams) {\n const domainName = \"webiny-js\";\n const accountId = getAwsAccountId(app);\n const prod = app.params.run.env === \"prod\";\n const vpc = app.getModule(CoreVpc, { optional: true });\n\n // This needs to be implemented in order to be able to use a shared ElasticSearch cluster.\n let domain:\n | PulumiAppResource<PulumiAppResourceConstructor<aws.elasticsearch.Domain>>\n | PulumiAppRemoteResource<aws.elasticsearch.GetDomainResult>;\n\n let domainPolicy;\n\n if (process.env.AWS_ELASTIC_SEARCH_DOMAIN_NAME) {\n const domainName = String(process.env.AWS_ELASTIC_SEARCH_DOMAIN_NAME);\n // This can be useful for testing purposes in ephemeral environments. More information here:\n // https://www.webiny.com/docs/key-topics/ci-cd/testing/slow-ephemeral-environments\n domain = app.addRemoteResource(domainName, () => {\n return aws.elasticsearch.getDomain({ domainName }, { async: true });\n });\n } else {\n // Regular ElasticSearch deployment.\n domain = app.addResource(aws.elasticsearch.Domain, {\n name: domainName,\n config: {\n elasticsearchVersion: \"7.10\",\n clusterConfig: prod ? getProdClusterConfig() : getDevClusterConfig(),\n vpcOptions: vpc\n ? {\n subnetIds: vpc.subnets.private.map(s => s.output.id),\n securityGroupIds: [vpc.vpc.output.defaultSecurityGroupId]\n }\n : undefined,\n ebsOptions: {\n ebsEnabled: true,\n volumeSize: 10,\n volumeType: \"gp2\"\n },\n advancedOptions: {\n \"rest.action.multi.allow_explicit_index\": \"true\"\n },\n snapshotOptions: {\n automatedSnapshotStartHour: 23\n }\n },\n opts: { protect: params.protect }\n });\n\n /**\n * Domain policy defines who can access your Elasticsearch Domain.\n * For details on Elasticsearch security, read the official documentation:\n * https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/security.html\n */\n domainPolicy = app.addResource(aws.elasticsearch.DomainPolicy, {\n name: `${domainName}-policy`,\n config: {\n domainName: domain.output.domainName,\n accessPolicies: {\n Version: \"2012-10-17\",\n Statement: [\n /**\n * Allow requests signed with current account\n */\n {\n Effect: \"Allow\",\n Principal: {\n AWS: accountId\n },\n Action: \"es:*\",\n Resource: pulumi.interpolate`${domain.output.arn}/*`\n }\n ]\n }\n },\n opts: { protect: params.protect }\n });\n }\n\n /**\n * Create a table for Elasticsearch records. All ES records are stored in this table to dramatically improve\n * performance and stability on write operations (especially massive data imports). This table also serves as a backup and\n * a single source of truth for your Elasticsearch domain. Streaming is enabled on this table, and it will\n * allow asynchronous synchronization of data with Elasticsearch domain.\n */\n const table = app.addResource(aws.dynamodb.Table, {\n name: \"webiny-es\",\n config: {\n attributes: [\n { name: \"PK\", type: \"S\" },\n { name: \"SK\", type: \"S\" }\n ],\n streamEnabled: true,\n streamViewType: \"NEW_AND_OLD_IMAGES\",\n billingMode: \"PAY_PER_REQUEST\",\n hashKey: \"PK\",\n rangeKey: \"SK\"\n },\n opts: { protect: params.protect }\n });\n\n const roleName = \"dynamo-to-elastic-lambda-role\";\n\n const role = app.addResource(aws.iam.Role, {\n name: roleName,\n config: {\n assumeRolePolicy: {\n Version: \"2012-10-17\",\n Statement: [\n {\n Action: \"sts:AssumeRole\",\n Principal: {\n Service: \"lambda.amazonaws.com\"\n },\n Effect: \"Allow\"\n }\n ]\n }\n },\n meta: { isLambdaFunctionRole: true }\n });\n\n const policy = getDynamoDbToElasticLambdaPolicy(app, domain.output);\n\n app.addResource(aws.iam.RolePolicyAttachment, {\n name: `${roleName}-DynamoDbToElasticLambdaPolicy`,\n config: {\n role: role.output,\n policyArn: policy.output.arn\n }\n });\n\n // Only use `AWSLambdaVPCAccessExecutionRole` policy if VPC feature is enabled.\n if (vpc) {\n app.addResource(aws.iam.RolePolicyAttachment, {\n name: `${roleName}-AWSLambdaVPCAccessExecutionRole`,\n config: {\n role: role.output,\n policyArn: aws.iam.ManagedPolicy.AWSLambdaVPCAccessExecutionRole\n }\n });\n } else {\n app.addResource(aws.iam.RolePolicyAttachment, {\n name: `${roleName}-AWSLambdaBasicExecutionRole`,\n config: {\n role: role.output,\n policyArn: aws.iam.ManagedPolicy.AWSLambdaBasicExecutionRole\n }\n });\n }\n\n app.addResource(aws.iam.RolePolicyAttachment, {\n name: `${roleName}-AWSLambdaDynamoDBExecutionRole`,\n config: {\n role: role.output,\n policyArn: aws.iam.ManagedPolicy.AWSLambdaDynamoDBExecutionRole\n }\n });\n\n /**\n * This Lambda will process the stream events from DynamoDB table that contains Elasticsearch items.\n * Elasticsearch can't take large amount of individual writes in a short period of time, so this way\n * we store data for Elasticsearch in a DynamoDB table, and asynchronously insert it into Elasticsearch\n * using batching.\n */\n const lambda = app.addResource(aws.lambda.Function, {\n name: \"dynamo-to-elastic\",\n config: {\n role: role.output.arn,\n runtime: \"nodejs14.x\",\n handler: \"handler.handler\",\n timeout: 600,\n memorySize: 512,\n environment: {\n variables: {\n DEBUG: String(process.env.DEBUG),\n ELASTIC_SEARCH_ENDPOINT: domain.output.endpoint\n }\n },\n description: \"Process DynamoDB Stream.\",\n code: new pulumi.asset.AssetArchive({\n \".\": new pulumi.asset.FileArchive(\n path.join(app.paths.workspace, \"dynamoToElastic/build\")\n )\n }),\n vpcConfig: vpc\n ? {\n subnetIds: vpc.subnets.private.map(s => s.output.id),\n securityGroupIds: [vpc.vpc.output.defaultSecurityGroupId]\n }\n : undefined\n }\n });\n\n const eventSourceMapping = app.addResource(aws.lambda.EventSourceMapping, {\n name: \"dynamo-to-elastic\",\n config: {\n eventSourceArn: table.output.streamArn,\n functionName: lambda.output.arn,\n startingPosition: \"LATEST\",\n maximumRetryAttempts: 3,\n batchSize: 1000,\n maximumBatchingWindowInSeconds: 1\n }\n });\n\n app.addOutputs({\n elasticsearchDomainArn: domain.output.arn,\n elasticsearchDomainEndpoint: domain.output.endpoint,\n elasticsearchDynamodbTableArn: table.output.arn,\n elasticsearchDynamodbTableName: table.output.name\n });\n\n return {\n domain,\n domainPolicy,\n table,\n dynamoToElastic: {\n role,\n policy,\n lambda,\n eventSourceMapping\n }\n };\n }\n});\n\nfunction getDynamoDbToElasticLambdaPolicy(\n app: PulumiApp,\n domain: pulumi.Output<aws.elasticsearch.Domain | aws.elasticsearch.GetDomainResult>\n) {\n return app.addResource(aws.iam.Policy, {\n name: \"DynamoDbToElasticLambdaPolicy-updated\",\n config: {\n description: \"This policy enables access to ES and Dynamodb streams\",\n policy: {\n Version: \"2012-10-17\",\n Statement: [\n {\n Sid: \"PermissionForES\",\n Effect: \"Allow\",\n Action: [\n \"es:ESHttpDelete\",\n \"es:ESHttpPatch\",\n \"es:ESHttpPost\",\n \"es:ESHttpPut\"\n ],\n Resource: [\n pulumi.interpolate`${domain.arn}`,\n pulumi.interpolate`${domain.arn}/*`\n ]\n }\n ]\n }\n }\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const CoreEventBus: import("@webiny/pulumi").PulumiAppModuleDefinition<import("@webiny/pulumi").PulumiAppResource<typeof import("@pulumi/aws/cloudwatch/eventBus").EventBus>, void>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.CoreEventBus = void 0;
9
+
10
+ var aws = _interopRequireWildcard(require("@pulumi/aws"));
11
+
12
+ var _pulumi = require("@webiny/pulumi");
13
+
14
+ const CoreEventBus = (0, _pulumi.createAppModule)({
15
+ name: "CoreEventBus",
16
+
17
+ config(app) {
18
+ return app.addResource(aws.cloudwatch.EventBus, {
19
+ name: "event-bus",
20
+ config: {}
21
+ });
22
+ }
23
+
24
+ });
25
+ exports.CoreEventBus = CoreEventBus;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CoreEventBus","createAppModule","name","config","app","addResource","aws","cloudwatch","EventBus"],"sources":["CoreEventBus.ts"],"sourcesContent":["import * as aws from \"@pulumi/aws\";\nimport { createAppModule, PulumiApp } from \"@webiny/pulumi\";\n\nexport const CoreEventBus = createAppModule({\n name: \"CoreEventBus\",\n config(app: PulumiApp) {\n return app.addResource(aws.cloudwatch.EventBus, {\n name: \"event-bus\",\n config: {}\n });\n }\n});\n"],"mappings":";;;;;;;;;AAAA;;AACA;;AAEO,MAAMA,YAAY,GAAG,IAAAC,uBAAA,EAAgB;EACxCC,IAAI,EAAE,cADkC;;EAExCC,MAAM,CAACC,GAAD,EAAiB;IACnB,OAAOA,GAAG,CAACC,WAAJ,CAAgBC,GAAG,CAACC,UAAJ,CAAeC,QAA/B,EAAyC;MAC5CN,IAAI,EAAE,WADsC;MAE5CC,MAAM,EAAE;IAFoC,CAAzC,CAAP;EAIH;;AAPuC,CAAhB,CAArB"}
@@ -0,0 +1,8 @@
1
+ import { PulumiAppModule } from "@webiny/pulumi";
2
+ export declare type CoreFileManger = PulumiAppModule<typeof CoreFileManger>;
3
+ export declare const CoreFileManger: import("@webiny/pulumi").PulumiAppModuleDefinition<{
4
+ bucket: import("@webiny/pulumi").PulumiAppResource<typeof import("@pulumi/aws/s3/bucket").Bucket>;
5
+ blockPublicAccessBlock: import("@webiny/pulumi").PulumiAppResource<typeof import("@pulumi/aws/s3/bucketPublicAccessBlock").BucketPublicAccessBlock>;
6
+ }, {
7
+ protect: boolean;
8
+ }>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.CoreFileManger = void 0;
9
+
10
+ var aws = _interopRequireWildcard(require("@pulumi/aws"));
11
+
12
+ var _pulumi = require("@webiny/pulumi");
13
+
14
+ const CoreFileManger = (0, _pulumi.createAppModule)({
15
+ name: "FileManagerBucket",
16
+
17
+ config(app, params) {
18
+ const name = "fm-bucket";
19
+ const bucket = app.addResource(aws.s3.Bucket, {
20
+ name,
21
+ config: {
22
+ acl: aws.s3.CannedAcl.Private,
23
+ // We definitely don't want to force-destroy if "protected" flag is true.
24
+ forceDestroy: !params.protect,
25
+ // We need these rules to be able to upload to this bucket from the browser.
26
+ corsRules: [{
27
+ allowedHeaders: ["*"],
28
+ allowedMethods: ["POST", "GET"],
29
+ allowedOrigins: ["*"],
30
+ maxAgeSeconds: 3000
31
+ }]
32
+ },
33
+ opts: {
34
+ protect: params.protect
35
+ }
36
+ }); // Block any public access
37
+
38
+ const blockPublicAccessBlock = app.addResource(aws.s3.BucketPublicAccessBlock, {
39
+ name: `${name}-block-public-access`,
40
+ config: {
41
+ bucket: bucket.output.id,
42
+ blockPublicAcls: true,
43
+ blockPublicPolicy: true,
44
+ ignorePublicAcls: true,
45
+ restrictPublicBuckets: true
46
+ }
47
+ });
48
+ return {
49
+ bucket,
50
+ blockPublicAccessBlock
51
+ };
52
+ }
53
+
54
+ });
55
+ exports.CoreFileManger = CoreFileManger;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CoreFileManger","createAppModule","name","config","app","params","bucket","addResource","aws","s3","Bucket","acl","CannedAcl","Private","forceDestroy","protect","corsRules","allowedHeaders","allowedMethods","allowedOrigins","maxAgeSeconds","opts","blockPublicAccessBlock","BucketPublicAccessBlock","output","id","blockPublicAcls","blockPublicPolicy","ignorePublicAcls","restrictPublicBuckets"],"sources":["CoreFileManager.ts"],"sourcesContent":["import * as aws from \"@pulumi/aws\";\nimport { createAppModule, PulumiApp, PulumiAppModule } from \"@webiny/pulumi\";\n\nexport type CoreFileManger = PulumiAppModule<typeof CoreFileManger>;\n\nexport const CoreFileManger = createAppModule({\n name: \"FileManagerBucket\",\n config(app: PulumiApp, params: { protect: boolean }) {\n const name = \"fm-bucket\";\n\n const bucket = app.addResource(aws.s3.Bucket, {\n name,\n config: {\n acl: aws.s3.CannedAcl.Private,\n // We definitely don't want to force-destroy if \"protected\" flag is true.\n forceDestroy: !params.protect,\n // We need these rules to be able to upload to this bucket from the browser.\n corsRules: [\n {\n allowedHeaders: [\"*\"],\n allowedMethods: [\"POST\", \"GET\"],\n allowedOrigins: [\"*\"],\n maxAgeSeconds: 3000\n }\n ]\n },\n opts: {\n protect: params.protect\n }\n });\n\n // Block any public access\n const blockPublicAccessBlock = app.addResource(aws.s3.BucketPublicAccessBlock, {\n name: `${name}-block-public-access`,\n config: {\n bucket: bucket.output.id,\n blockPublicAcls: true,\n blockPublicPolicy: true,\n ignorePublicAcls: true,\n restrictPublicBuckets: true\n }\n });\n\n return {\n bucket,\n blockPublicAccessBlock\n };\n }\n});\n"],"mappings":";;;;;;;;;AAAA;;AACA;;AAIO,MAAMA,cAAc,GAAG,IAAAC,uBAAA,EAAgB;EAC1CC,IAAI,EAAE,mBADoC;;EAE1CC,MAAM,CAACC,GAAD,EAAiBC,MAAjB,EAA+C;IACjD,MAAMH,IAAI,GAAG,WAAb;IAEA,MAAMI,MAAM,GAAGF,GAAG,CAACG,WAAJ,CAAgBC,GAAG,CAACC,EAAJ,CAAOC,MAAvB,EAA+B;MAC1CR,IAD0C;MAE1CC,MAAM,EAAE;QACJQ,GAAG,EAAEH,GAAG,CAACC,EAAJ,CAAOG,SAAP,CAAiBC,OADlB;QAEJ;QACAC,YAAY,EAAE,CAACT,MAAM,CAACU,OAHlB;QAIJ;QACAC,SAAS,EAAE,CACP;UACIC,cAAc,EAAE,CAAC,GAAD,CADpB;UAEIC,cAAc,EAAE,CAAC,MAAD,EAAS,KAAT,CAFpB;UAGIC,cAAc,EAAE,CAAC,GAAD,CAHpB;UAIIC,aAAa,EAAE;QAJnB,CADO;MALP,CAFkC;MAgB1CC,IAAI,EAAE;QACFN,OAAO,EAAEV,MAAM,CAACU;MADd;IAhBoC,CAA/B,CAAf,CAHiD,CAwBjD;;IACA,MAAMO,sBAAsB,GAAGlB,GAAG,CAACG,WAAJ,CAAgBC,GAAG,CAACC,EAAJ,CAAOc,uBAAvB,EAAgD;MAC3ErB,IAAI,EAAG,GAAEA,IAAK,sBAD6D;MAE3EC,MAAM,EAAE;QACJG,MAAM,EAAEA,MAAM,CAACkB,MAAP,CAAcC,EADlB;QAEJC,eAAe,EAAE,IAFb;QAGJC,iBAAiB,EAAE,IAHf;QAIJC,gBAAgB,EAAE,IAJd;QAKJC,qBAAqB,EAAE;MALnB;IAFmE,CAAhD,CAA/B;IAWA,OAAO;MACHvB,MADG;MAEHgB;IAFG,CAAP;EAIH;;AA1CyC,CAAhB,CAAvB"}
@@ -0,0 +1,13 @@
1
+ import { PulumiAppModule } from "@webiny/pulumi";
2
+ export declare type CoreVpc = PulumiAppModule<typeof CoreVpc>;
3
+ export declare const CoreVpc: import("@webiny/pulumi").PulumiAppModuleDefinition<{
4
+ vpc: import("@webiny/pulumi").PulumiAppResource<typeof import("@pulumi/aws/ec2/vpc").Vpc>;
5
+ subnets: {
6
+ public: import("@webiny/pulumi").PulumiAppResource<typeof import("@pulumi/aws/ec2/subnet").Subnet>[];
7
+ private: import("@webiny/pulumi").PulumiAppResource<typeof import("@pulumi/aws/ec2/subnet").Subnet>[];
8
+ };
9
+ routeTables: {
10
+ privateSubnets: import("@webiny/pulumi").PulumiAppResource<typeof import("@pulumi/aws/ec2/routeTable").RouteTable>;
11
+ publicSubnets: import("@webiny/pulumi").PulumiAppResource<typeof import("@pulumi/aws/ec2/routeTable").RouteTable>;
12
+ };
13
+ }, void>;
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.CoreVpc = void 0;
9
+
10
+ var aws = _interopRequireWildcard(require("@pulumi/aws"));
11
+
12
+ var _pulumi = require("@webiny/pulumi");
13
+
14
+ const CoreVpc = (0, _pulumi.createAppModule)({
15
+ name: "CoreVpc",
16
+
17
+ config(app) {
18
+ // Create VPC.
19
+ const vpc = app.addResource(aws.ec2.Vpc, {
20
+ name: "webiny",
21
+ config: {
22
+ cidrBlock: "10.0.0.0/16"
23
+ }
24
+ }); // Create one public and two private subnets.
25
+
26
+ const publicSubnet = app.addResource(aws.ec2.Subnet, {
27
+ name: "public",
28
+ config: {
29
+ vpcId: vpc.output.id,
30
+ cidrBlock: "10.0.0.0/24",
31
+ tags: {
32
+ Name: "public-subnet"
33
+ }
34
+ }
35
+ });
36
+ const availabilityZones = app.addHandler(() => {
37
+ return aws.getAvailabilityZones({
38
+ state: "available"
39
+ });
40
+ });
41
+ const privateSubnet1 = app.addResource(aws.ec2.Subnet, {
42
+ name: "private-subnet-1",
43
+ config: {
44
+ vpcId: vpc.output.id,
45
+ cidrBlock: "10.0.1.0/24",
46
+ availabilityZone: availabilityZones.apply(zone => zone.names[0]),
47
+ tags: {
48
+ Name: "private-subnet-1"
49
+ }
50
+ }
51
+ });
52
+ const privateSubnet2 = app.addResource(aws.ec2.Subnet, {
53
+ name: "private-subnet-2",
54
+ config: {
55
+ vpcId: vpc.output.id,
56
+ cidrBlock: "10.0.2.0/24",
57
+ availabilityZone: availabilityZones.apply(zone => zone.names[1]),
58
+ tags: {
59
+ Name: "private-subnet-2"
60
+ }
61
+ }
62
+ }); // Create Internet gateway.
63
+
64
+ const internetGateway = app.addResource(aws.ec2.InternetGateway, {
65
+ name: "internet-gateway",
66
+ config: {
67
+ vpcId: vpc.output.id
68
+ }
69
+ }); // Create NAT gateway.
70
+
71
+ const elasticIpAllocation = app.addResource(aws.ec2.Eip, {
72
+ name: "nat-gateway-elastic-ip",
73
+ config: {
74
+ vpc: true
75
+ }
76
+ });
77
+ const natGateway = app.addResource(aws.ec2.NatGateway, {
78
+ name: "nat-gateway",
79
+ config: {
80
+ allocationId: elasticIpAllocation.output.id,
81
+ subnetId: publicSubnet.output.id
82
+ }
83
+ }); // Create a route table for both subnets.
84
+
85
+ const publicSubnetRouteTable = app.addResource(aws.ec2.RouteTable, {
86
+ name: "public",
87
+ config: {
88
+ vpcId: vpc.output.id,
89
+ routes: [{
90
+ cidrBlock: "0.0.0.0/0",
91
+ gatewayId: internetGateway.output.id
92
+ }]
93
+ }
94
+ });
95
+ const privateSubnetRouteTable = app.addResource(aws.ec2.RouteTable, {
96
+ name: "private",
97
+ config: {
98
+ vpcId: vpc.output.id,
99
+ routes: [{
100
+ cidrBlock: "0.0.0.0/0",
101
+ natGatewayId: natGateway.output.id
102
+ }]
103
+ }
104
+ }); // Create route table associations - links between subnets and route tables.
105
+
106
+ app.addResource(aws.ec2.RouteTableAssociation, {
107
+ name: "public-subnet-route-table-association",
108
+ config: {
109
+ subnetId: publicSubnet.output.id,
110
+ routeTableId: publicSubnetRouteTable.output.id
111
+ }
112
+ });
113
+ app.addResource(aws.ec2.RouteTableAssociation, {
114
+ name: "private-subnet-1-route-table-association",
115
+ config: {
116
+ subnetId: privateSubnet1.output.id,
117
+ routeTableId: privateSubnetRouteTable.output.id
118
+ }
119
+ });
120
+ app.addResource(aws.ec2.RouteTableAssociation, {
121
+ name: "private-subnet-2-route-table-association",
122
+ config: {
123
+ subnetId: privateSubnet2.output.id,
124
+ routeTableId: privateSubnetRouteTable.output.id
125
+ }
126
+ });
127
+ const subnets = {
128
+ public: [publicSubnet],
129
+ private: [privateSubnet1, privateSubnet2]
130
+ };
131
+ const routeTables = {
132
+ privateSubnets: privateSubnetRouteTable,
133
+ publicSubnets: publicSubnetRouteTable
134
+ };
135
+ app.addOutputs({
136
+ vpcPublicSubnetIds: subnets.public.map(subNet => subNet.output.id),
137
+ vpcPrivateSubnetIds: subnets.private.map(subNet => subNet.output.id),
138
+ vpcSecurityGroupIds: [vpc.output.defaultSecurityGroupId]
139
+ });
140
+ return {
141
+ vpc,
142
+ subnets,
143
+ routeTables
144
+ };
145
+ }
146
+
147
+ });
148
+ exports.CoreVpc = CoreVpc;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CoreVpc","createAppModule","name","config","app","vpc","addResource","aws","ec2","Vpc","cidrBlock","publicSubnet","Subnet","vpcId","output","id","tags","Name","availabilityZones","addHandler","getAvailabilityZones","state","privateSubnet1","availabilityZone","apply","zone","names","privateSubnet2","internetGateway","InternetGateway","elasticIpAllocation","Eip","natGateway","NatGateway","allocationId","subnetId","publicSubnetRouteTable","RouteTable","routes","gatewayId","privateSubnetRouteTable","natGatewayId","RouteTableAssociation","routeTableId","subnets","public","private","routeTables","privateSubnets","publicSubnets","addOutputs","vpcPublicSubnetIds","map","subNet","vpcPrivateSubnetIds","vpcSecurityGroupIds","defaultSecurityGroupId"],"sources":["CoreVpc.ts"],"sourcesContent":["import * as aws from \"@pulumi/aws\";\nimport { createAppModule, PulumiAppModule } from \"@webiny/pulumi\";\n\nexport type CoreVpc = PulumiAppModule<typeof CoreVpc>;\n\nexport const CoreVpc = createAppModule({\n name: \"CoreVpc\",\n config(app) {\n // Create VPC.\n const vpc = app.addResource(aws.ec2.Vpc, {\n name: \"webiny\",\n config: {\n cidrBlock: \"10.0.0.0/16\"\n }\n });\n\n // Create one public and two private subnets.\n const publicSubnet = app.addResource(aws.ec2.Subnet, {\n name: \"public\",\n config: {\n vpcId: vpc.output.id,\n cidrBlock: \"10.0.0.0/24\",\n tags: { Name: \"public-subnet\" }\n }\n });\n\n const availabilityZones = app.addHandler(() => {\n return aws.getAvailabilityZones({\n state: \"available\"\n });\n });\n\n const privateSubnet1 = app.addResource(aws.ec2.Subnet, {\n name: \"private-subnet-1\",\n config: {\n vpcId: vpc.output.id,\n cidrBlock: \"10.0.1.0/24\",\n availabilityZone: availabilityZones.apply(zone => zone.names[0]),\n tags: { Name: \"private-subnet-1\" }\n }\n });\n\n const privateSubnet2 = app.addResource(aws.ec2.Subnet, {\n name: \"private-subnet-2\",\n config: {\n vpcId: vpc.output.id,\n cidrBlock: \"10.0.2.0/24\",\n availabilityZone: availabilityZones.apply(zone => zone.names[1]),\n tags: { Name: \"private-subnet-2\" }\n }\n });\n\n // Create Internet gateway.\n const internetGateway = app.addResource(aws.ec2.InternetGateway, {\n name: \"internet-gateway\",\n config: {\n vpcId: vpc.output.id\n }\n });\n\n // Create NAT gateway.\n const elasticIpAllocation = app.addResource(aws.ec2.Eip, {\n name: \"nat-gateway-elastic-ip\",\n config: {\n vpc: true\n }\n });\n\n const natGateway = app.addResource(aws.ec2.NatGateway, {\n name: \"nat-gateway\",\n config: {\n allocationId: elasticIpAllocation.output.id,\n subnetId: publicSubnet.output.id\n }\n });\n\n // Create a route table for both subnets.\n const publicSubnetRouteTable = app.addResource(aws.ec2.RouteTable, {\n name: \"public\",\n config: {\n vpcId: vpc.output.id,\n routes: [\n {\n cidrBlock: \"0.0.0.0/0\",\n gatewayId: internetGateway.output.id\n }\n ]\n }\n });\n\n const privateSubnetRouteTable = app.addResource(aws.ec2.RouteTable, {\n name: \"private\",\n config: {\n vpcId: vpc.output.id,\n routes: [\n {\n cidrBlock: \"0.0.0.0/0\",\n natGatewayId: natGateway.output.id\n }\n ]\n }\n });\n\n // Create route table associations - links between subnets and route tables.\n app.addResource(aws.ec2.RouteTableAssociation, {\n name: \"public-subnet-route-table-association\",\n config: {\n subnetId: publicSubnet.output.id,\n routeTableId: publicSubnetRouteTable.output.id\n }\n });\n\n app.addResource(aws.ec2.RouteTableAssociation, {\n name: \"private-subnet-1-route-table-association\",\n config: {\n subnetId: privateSubnet1.output.id,\n routeTableId: privateSubnetRouteTable.output.id\n }\n });\n\n app.addResource(aws.ec2.RouteTableAssociation, {\n name: \"private-subnet-2-route-table-association\",\n config: {\n subnetId: privateSubnet2.output.id,\n routeTableId: privateSubnetRouteTable.output.id\n }\n });\n\n const subnets = {\n public: [publicSubnet],\n private: [privateSubnet1, privateSubnet2]\n };\n\n const routeTables = {\n privateSubnets: privateSubnetRouteTable,\n publicSubnets: publicSubnetRouteTable\n };\n\n app.addOutputs({\n vpcPublicSubnetIds: subnets.public.map(subNet => subNet.output.id),\n vpcPrivateSubnetIds: subnets.private.map(subNet => subNet.output.id),\n vpcSecurityGroupIds: [vpc.output.defaultSecurityGroupId]\n });\n\n return {\n vpc,\n subnets,\n routeTables\n };\n }\n});\n"],"mappings":"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"}