@fjall/components-infrastructure 0.1.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 (77) hide show
  1. package/README.md +68 -0
  2. package/dist/index.js +18 -0
  3. package/dist/lib/app.d.ts +6 -0
  4. package/dist/lib/app.js +19 -0
  5. package/dist/lib/config/aws/base/costAllocationTags.d.ts +5 -0
  6. package/dist/lib/config/aws/base/costAllocationTags.js +57 -0
  7. package/dist/lib/config/aws/base/iamIdentityCenter.d.ts +5 -0
  8. package/dist/lib/config/aws/base/iamIdentityCenter.js +86 -0
  9. package/dist/lib/config/aws/base/identityCenter.d.ts +5 -0
  10. package/dist/lib/config/aws/base/identityCenter.js +90 -0
  11. package/dist/lib/config/aws/base/ipam.d.ts +5 -0
  12. package/dist/lib/config/aws/base/ipam.js +29 -0
  13. package/dist/lib/config/aws/base/ipamPool.d.ts +5 -0
  14. package/dist/lib/config/aws/base/ipamPool.js +46 -0
  15. package/dist/lib/examples/custom-resources/lambda/aws-cost-allocation-tags/awsCostAllocationTagsLambda.d.ts +2 -0
  16. package/dist/lib/examples/custom-resources/lambda/aws-cost-allocation-tags/awsCostAllocationTagsLambda.js +62 -0
  17. package/dist/lib/examples/cutomResourceExample.d.ts +6 -0
  18. package/dist/lib/examples/cutomResourceExample.js +45 -0
  19. package/dist/lib/index.d.ts +1 -0
  20. package/dist/lib/index.js +18 -0
  21. package/dist/lib/patterns/aws/customResource.d.ts +7 -0
  22. package/dist/lib/patterns/aws/customResource.js +28 -0
  23. package/dist/lib/patterns/aws/index.d.ts +2 -0
  24. package/dist/lib/patterns/aws/index.js +19 -0
  25. package/dist/lib/patterns/aws/multiEnvironmentOrganisation.d.ts +33 -0
  26. package/dist/lib/patterns/aws/multiEnvironmentOrganisation.js +107 -0
  27. package/dist/lib/patterns/aws/webApp.d.ts +17 -0
  28. package/dist/lib/patterns/aws/webApp.js +36 -0
  29. package/dist/lib/resources/aws/awsStack.d.ts +36 -0
  30. package/dist/lib/resources/aws/awsStack.js +86 -0
  31. package/dist/lib/resources/aws/compute/__tests__/fargate.test.d.ts +1 -0
  32. package/dist/lib/resources/aws/compute/__tests__/fargate.test.js +21 -0
  33. package/dist/lib/resources/aws/compute/fargate.d.ts +23 -0
  34. package/dist/lib/resources/aws/compute/fargate.js +50 -0
  35. package/dist/lib/resources/aws/compute/lambda.d.ts +18 -0
  36. package/dist/lib/resources/aws/compute/lambda.js +28 -0
  37. package/dist/lib/resources/aws/constant/__tests__/vpc.test.d.ts +1 -0
  38. package/dist/lib/resources/aws/constant/__tests__/vpc.test.js +13 -0
  39. package/dist/lib/resources/aws/constant/ecr.d.ts +12 -0
  40. package/dist/lib/resources/aws/constant/ecr.js +29 -0
  41. package/dist/lib/resources/aws/constant/vpc.d.ts +18 -0
  42. package/dist/lib/resources/aws/constant/vpc.js +53 -0
  43. package/dist/lib/resources/aws/iam/assignment.d.ts +5 -0
  44. package/dist/lib/resources/aws/iam/assignment.js +13 -0
  45. package/dist/lib/resources/aws/iam/group.d.ts +5 -0
  46. package/dist/lib/resources/aws/iam/group.js +15 -0
  47. package/dist/lib/resources/aws/iam/iamRole.d.ts +5 -0
  48. package/dist/lib/resources/aws/iam/iamRole.js +18 -0
  49. package/dist/lib/resources/aws/iam/permissionSet.d.ts +5 -0
  50. package/dist/lib/resources/aws/iam/permissionSet.js +13 -0
  51. package/dist/lib/resources/aws/iam/role.d.ts +5 -0
  52. package/dist/lib/resources/aws/iam/role.js +18 -0
  53. package/dist/lib/resources/aws/logging/logGroup.d.ts +9 -0
  54. package/dist/lib/resources/aws/logging/logGroup.js +24 -0
  55. package/dist/lib/resources/aws/networking/hostedZone.d.ts +5 -0
  56. package/dist/lib/resources/aws/networking/hostedZone.js +20 -0
  57. package/dist/lib/resources/aws/networking/ipam.d.ts +5 -0
  58. package/dist/lib/resources/aws/networking/ipam.js +15 -0
  59. package/dist/lib/resources/aws/networking/ipamPool.d.ts +9 -0
  60. package/dist/lib/resources/aws/networking/ipamPool.js +35 -0
  61. package/dist/lib/resources/aws/store/database.d.ts +13 -0
  62. package/dist/lib/resources/aws/store/database.js +29 -0
  63. package/dist/lib/resources/aws/store/rds.d.ts +25 -0
  64. package/dist/lib/resources/aws/store/rds.js +90 -0
  65. package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +6 -0
  66. package/dist/lib/resources/aws/utilities/awsCustomResource.js +24 -0
  67. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +5 -0
  68. package/dist/lib/resources/aws/utilities/cfnOutput.js +16 -0
  69. package/dist/lib/resources/aws/utilities/customResource.d.ts +5 -0
  70. package/dist/lib/resources/aws/utilities/customResource.js +13 -0
  71. package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +5 -0
  72. package/dist/lib/resources/aws/utilities/customResourceProvider.js +19 -0
  73. package/dist/lib/utils/addSuffixToEmail.d.ts +1 -0
  74. package/dist/lib/utils/addSuffixToEmail.js +7 -0
  75. package/dist/lib/utils/getConfig.d.ts +7 -0
  76. package/dist/lib/utils/getConfig.js +22 -0
  77. package/package.json +59 -0
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomResourceExample = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
6
+ const path = require("path");
7
+ const lambda = require("aws-cdk-lib/aws-lambda");
8
+ const lambda_1 = require("../resources/aws/compute/lambda");
9
+ const customResource_1 = require("../resources/aws/utilities/customResource");
10
+ const customResourceProvider_1 = require("../resources/aws/utilities/customResourceProvider");
11
+ // An example of how to use a custom provider, keeping for reference
12
+ // TODO: Turn into a pattern
13
+ class CustomResourceExample extends cdk.Stack {
14
+ constructor(scope, id) {
15
+ super(scope, id);
16
+ const lambdaFunction = new lambda_1.lambdaSingletonFunction(this, "costAllocationTagLambda", {
17
+ code: lambda.Code.fromAsset(path.join(__dirname, "./custom-resources/lambda/aws-cost-allocation-tags")),
18
+ handler: "awsCostAllocationTagsLambda.handler",
19
+ runtime: lambda.Runtime.NODEJS_18_X,
20
+ roleDescription: "Lambda role for AWS Cost Allocation Tags",
21
+ inlinePolicy: {
22
+ ["costAllocationTag"]: new aws_iam_1.PolicyDocument({
23
+ statements: [
24
+ new aws_iam_1.PolicyStatement({
25
+ actions: [
26
+ "ce:ListCostAllocationTags",
27
+ "ce:UpdateCostAllocationTagsStatus"
28
+ ],
29
+ resources: ["*"]
30
+ })
31
+ ]
32
+ })
33
+ }
34
+ });
35
+ const provider = new customResourceProvider_1.CustomResourceProvider(this, "costAllocationTagsProvider", {
36
+ onEventHandler: lambdaFunction
37
+ });
38
+ const customResource = new customResource_1.CustomResource(this, "awsCostAllocationTagsCustomResource", {
39
+ serviceToken: provider.serviceToken
40
+ });
41
+ this.response = customResource.getAtt("Response").toString();
42
+ }
43
+ }
44
+ exports.CustomResourceExample = CustomResourceExample;
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3V0b21SZXNvdXJjZUV4YW1wbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXhhbXBsZXMvY3V0b21SZXNvdXJjZUV4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBRW5DLGlEQUFzRTtBQUN0RSw2QkFBNkI7QUFDN0IsaURBQWlEO0FBRWpELDREQUEwRTtBQUMxRSw4RUFBMkU7QUFDM0UsOEZBQTJGO0FBRTNGLG9FQUFvRTtBQUNwRSw0QkFBNEI7QUFDNUIsTUFBYSxxQkFBc0IsU0FBUSxHQUFHLENBQUMsS0FBSztJQUdsRCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sY0FBYyxHQUFHLElBQUksZ0NBQXVCLENBQ2hELElBQUksRUFDSix5QkFBeUIsRUFDekI7WUFDRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ3pCLElBQUksQ0FBQyxJQUFJLENBQ1AsU0FBUyxFQUNULG9EQUFvRCxDQUNyRCxDQUNGO1lBQ0QsT0FBTyxFQUFFLHFDQUFxQztZQUM5QyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLGVBQWUsRUFBRSwwQ0FBMEM7WUFDM0QsWUFBWSxFQUFFO2dCQUNaLENBQUMsbUJBQW1CLENBQUMsRUFBRSxJQUFJLHdCQUFjLENBQUM7b0JBQ3hDLFVBQVUsRUFBRTt3QkFDVixJQUFJLHlCQUFlLENBQUM7NEJBQ2xCLE9BQU8sRUFBRTtnQ0FDUCwyQkFBMkI7Z0NBQzNCLG1DQUFtQzs2QkFDcEM7NEJBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO3lCQUNqQixDQUFDO3FCQUNIO2lCQUNGLENBQUM7YUFDSDtTQUNGLENBQ0YsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksK0NBQXNCLENBQ3pDLElBQUksRUFDSiw0QkFBNEIsRUFDNUI7WUFDRSxjQUFjLEVBQUUsY0FBYztTQUMvQixDQUNGLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxJQUFJLCtCQUFjLENBQ3ZDLElBQUksRUFDSixxQ0FBcUMsRUFDckM7WUFDRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7U0FDcEMsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9ELENBQUM7Q0FDRjtBQXJERCxzREFxREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgUG9saWN5RG9jdW1lbnQsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcblxuaW1wb3J0IHsgbGFtYmRhU2luZ2xldG9uRnVuY3Rpb24gfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2xhbWJkYVwiO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvY3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlUHJvdmlkZXIgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvY3VzdG9tUmVzb3VyY2VQcm92aWRlclwiO1xuXG4vLyBBbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgYSBjdXN0b20gcHJvdmlkZXIsIGtlZXBpbmcgZm9yIHJlZmVyZW5jZVxuLy8gVE9ETzogVHVybiBpbnRvIGEgcGF0dGVyblxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlc291cmNlRXhhbXBsZSBleHRlbmRzIGNkay5TdGFjayB7XG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgbGFtYmRhRnVuY3Rpb24gPSBuZXcgbGFtYmRhU2luZ2xldG9uRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJjb3N0QWxsb2NhdGlvblRhZ0xhbWJkYVwiLFxuICAgICAge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICAgICAgXCIuL2N1c3RvbS1yZXNvdXJjZXMvbGFtYmRhL2F3cy1jb3N0LWFsbG9jYXRpb24tdGFnc1wiXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBoYW5kbGVyOiBcImF3c0Nvc3RBbGxvY2F0aW9uVGFnc0xhbWJkYS5oYW5kbGVyXCIsXG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgICByb2xlRGVzY3JpcHRpb246IFwiTGFtYmRhIHJvbGUgZm9yIEFXUyBDb3N0IEFsbG9jYXRpb24gVGFnc1wiLFxuICAgICAgICBpbmxpbmVQb2xpY3k6IHtcbiAgICAgICAgICBbXCJjb3N0QWxsb2NhdGlvblRhZ1wiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgXCJjZTpMaXN0Q29zdEFsbG9jYXRpb25UYWdzXCIsXG4gICAgICAgICAgICAgICAgICBcImNlOlVwZGF0ZUNvc3RBbGxvY2F0aW9uVGFnc1N0YXR1c1wiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IEN1c3RvbVJlc291cmNlUHJvdmlkZXIoXG4gICAgICB0aGlzLFxuICAgICAgXCJjb3N0QWxsb2NhdGlvblRhZ3NQcm92aWRlclwiLFxuICAgICAge1xuICAgICAgICBvbkV2ZW50SGFuZGxlcjogbGFtYmRhRnVuY3Rpb25cbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgY3VzdG9tUmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UoXG4gICAgICB0aGlzLFxuICAgICAgXCJhd3NDb3N0QWxsb2NhdGlvblRhZ3NDdXN0b21SZXNvdXJjZVwiLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlblxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJlc3BvbnNlID0gY3VzdG9tUmVzb3VyY2UuZ2V0QXR0KFwiUmVzcG9uc2VcIikudG9TdHJpbmcoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1 @@
1
+ export * from "./patterns/aws";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./patterns/aws"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUErQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3BhdHRlcm5zL2F3c1wiO1xuIl19
@@ -0,0 +1,7 @@
1
+ import { Stack } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ import { lambdaSingletonFunctionProps } from "../../resources/aws/compute/lambda";
4
+ export declare class CustomResource extends Stack {
5
+ readonly response: string;
6
+ constructor(scope: Construct, id: string, props: lambdaSingletonFunctionProps);
7
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomResource = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const lambda_1 = require("../../resources/aws/compute/lambda");
6
+ const customResource_1 = require("../../resources/aws/utilities/customResource");
7
+ const customResourceProvider_1 = require("../../resources/aws/utilities/customResourceProvider");
8
+ class CustomResource extends aws_cdk_lib_1.Stack {
9
+ constructor(scope, id, props) {
10
+ super(scope, id);
11
+ const lambdaFunction = new lambda_1.lambdaSingletonFunction(this, `${id}SingletonLambda`, {
12
+ code: props.code,
13
+ handler: `${id}.handler`,
14
+ runtime: props.runtime,
15
+ roleDescription: props.roleDescription,
16
+ inlinePolicy: props.inlinePolicy
17
+ });
18
+ const provider = new customResourceProvider_1.CustomResourceProvider(this, `${id}Provider`, {
19
+ onEventHandler: lambdaFunction
20
+ });
21
+ const cr = new customResource_1.CustomResource(this, `${id}CustomResource`, {
22
+ serviceToken: provider.serviceToken
23
+ });
24
+ this.response = cr.getAtt("Response").toString();
25
+ }
26
+ }
27
+ exports.CustomResource = CustomResource;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tUmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2N1c3RvbVJlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFvQztBQUVwQywrREFBMkc7QUFDM0csaUZBQWdHO0FBQ2hHLGlHQUE4RjtBQUU5RixNQUFhLGNBQWUsU0FBUSxtQkFBSztJQUd2QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1DO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxjQUFjLEdBQUcsSUFBSSxnQ0FBdUIsQ0FDaEQsSUFBSSxFQUNKLEdBQUcsRUFBRSxpQkFBaUIsRUFDdEI7WUFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVO1lBQ3hCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDdEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1NBQ2pDLENBQ0YsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksK0NBQXNCLENBQ3pDLElBQUksRUFDSixHQUFHLEVBQUUsVUFBVSxFQUNmO1lBQ0UsY0FBYyxFQUFFLGNBQWM7U0FDL0IsQ0FDRixDQUFDO1FBRUYsTUFBTSxFQUFFLEdBQUcsSUFBSSwrQkFBYyxDQUMzQixJQUFJLEVBQ0osR0FBRyxFQUFFLGdCQUFnQixFQUNyQjtZQUNFLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtTQUNwQyxDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkQsQ0FBQztDQUVGO0FBckNELHdDQXFDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgbGFtYmRhU2luZ2xldG9uRnVuY3Rpb24sIGxhbWJkYVNpbmdsZXRvbkZ1bmN0aW9uUHJvcHMgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2xhbWJkYVwiO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UgYXMgY3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvY3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlUHJvdmlkZXIgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvY3VzdG9tUmVzb3VyY2VQcm92aWRlclwiO1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVzb3VyY2UgZXh0ZW5kcyBTdGFjayB7XG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBsYW1iZGFTaW5nbGV0b25GdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGxhbWJkYUZ1bmN0aW9uID0gbmV3IGxhbWJkYVNpbmdsZXRvbkZ1bmN0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2lkfVNpbmdsZXRvbkxhbWJkYWAsXG4gICAgICB7XG4gICAgICAgIGNvZGU6IHByb3BzLmNvZGUsXG4gICAgICAgIGhhbmRsZXI6IGAke2lkfS5oYW5kbGVyYCxcbiAgICAgICAgcnVudGltZTogcHJvcHMucnVudGltZSxcbiAgICAgICAgcm9sZURlc2NyaXB0aW9uOiBwcm9wcy5yb2xlRGVzY3JpcHRpb24sXG4gICAgICAgIGlubGluZVBvbGljeTogcHJvcHMuaW5saW5lUG9saWN5XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IEN1c3RvbVJlc291cmNlUHJvdmlkZXIoXG4gICAgICB0aGlzLFxuICAgICAgYCR7aWR9UHJvdmlkZXJgLFxuICAgICAge1xuICAgICAgICBvbkV2ZW50SGFuZGxlcjogbGFtYmRhRnVuY3Rpb25cbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgY3IgPSBuZXcgY3VzdG9tUmVzb3VyY2UoXG4gICAgICB0aGlzLFxuICAgICAgYCR7aWR9Q3VzdG9tUmVzb3VyY2VgLFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlblxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJlc3BvbnNlID0gY3IuZ2V0QXR0KFwiUmVzcG9uc2VcIikudG9TdHJpbmcoKTtcbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from "./multiEnvironmentOrganisation";
2
+ export * from "./webApp";
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./multiEnvironmentOrganisation"), exports);
18
+ __exportStar(require("./webApp"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpRUFBK0M7QUFDL0MsMkNBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vbXVsdGlFbnZpcm9ubWVudE9yZ2FuaXNhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2ViQXBwXCI7XG4iXX0=
@@ -0,0 +1,33 @@
1
+ import { Stack } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ import { Account } from "@pepperize/cdk-organizations";
4
+ interface MultiEnvironmentOrganisationProps {
5
+ organisationName: string;
6
+ accountEmail: string;
7
+ }
8
+ /**
9
+ * A construct for creating multi environment organisations with a production, staging and development account.
10
+ */
11
+ export declare class MultiEnvironmentOrganisation extends Construct {
12
+ props: MultiEnvironmentOrganisationProps;
13
+ private organisation;
14
+ private organisationalUnits;
15
+ private accounts;
16
+ constructor(scope: Construct, id: string, props: MultiEnvironmentOrganisationProps);
17
+ private addOrganisation;
18
+ private addProductionUnit;
19
+ private addStagingUnit;
20
+ private addDevelopmentUnit;
21
+ private addOrganisationalUnit;
22
+ private addAccount;
23
+ getAccounts(): Account[];
24
+ }
25
+ export default MultiEnvironmentOrganisation;
26
+ /**
27
+ * A stack for creating multi environment organisations with a production, staging and development account.
28
+ */
29
+ export declare class MultiEnvironmentOrganisationStack extends Stack {
30
+ private resource;
31
+ constructor(id: string, props: MultiEnvironmentOrganisationProps);
32
+ getAccounts(): Account[];
33
+ }
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiEnvironmentOrganisationStack = exports.MultiEnvironmentOrganisation = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const constructs_1 = require("constructs");
6
+ const aws_cdk_lib_2 = require("aws-cdk-lib");
7
+ const app_1 = require("../../app");
8
+ const cdk_organizations_1 = require("@pepperize/cdk-organizations");
9
+ const addSuffixToEmail_1 = require("../../utils/addSuffixToEmail");
10
+ /**
11
+ * A construct for creating multi environment organisations with a production, staging and development account.
12
+ */
13
+ class MultiEnvironmentOrganisation extends constructs_1.Construct {
14
+ constructor(scope, id, props) {
15
+ super(scope, id);
16
+ this.organisationalUnits = [];
17
+ this.accounts = [];
18
+ this.props = props;
19
+ this.addOrganisation();
20
+ this.addProductionUnit();
21
+ this.addStagingUnit();
22
+ this.addDevelopmentUnit();
23
+ //todo: Consider adding the remaining AWS recommended organisational units
24
+ // https://aws.amazon.com/blogs/mt/best-practices-for-organizational-units-with-aws-organizations/
25
+ // - deployments (build agents - accounts may be specific per 'service')
26
+ // - security
27
+ // - infrastructure (shared networking and IT services)
28
+ // - sandbox (equivalent to development unit?)
29
+ // - workloads
30
+ }
31
+ addOrganisation() {
32
+ this.organisation = new cdk_organizations_1.Organization(this, this.props.organisationName, {
33
+ featureSet: cdk_organizations_1.FeatureSet.ALL
34
+ });
35
+ const enforcedPolicyTypes = [
36
+ cdk_organizations_1.PolicyType.SERVICE_CONTROL_POLICY,
37
+ cdk_organizations_1.PolicyType.TAG_POLICY,
38
+ cdk_organizations_1.PolicyType.BACKUP_POLICY,
39
+ cdk_organizations_1.PolicyType.AISERVICES_OPT_OUT_POLICY
40
+ ];
41
+ for (const policyType of enforcedPolicyTypes) {
42
+ this.organisation.enablePolicyType(policyType);
43
+ }
44
+ }
45
+ addProductionUnit() {
46
+ const prodOrgUnit = this.addOrganisationalUnit("productionOrganizationalUnit", "Production");
47
+ this.addAccount("productionAccount", "Production2", (0, addSuffixToEmail_1.default)(this.props.accountEmail, "production2"), { env: "production" }, prodOrgUnit);
48
+ }
49
+ addStagingUnit() {
50
+ const stagOrgUnit = this.addOrganisationalUnit("stagingOrganisationUnit", "Staging");
51
+ this.addAccount("stagingAccount", "Staging", (0, addSuffixToEmail_1.default)(this.props.accountEmail, "staging"), { env: "staging" }, stagOrgUnit);
52
+ }
53
+ addDevelopmentUnit() {
54
+ const devOrgUnit = this.addOrganisationalUnit("developmentOrganisationUnit", "Development");
55
+ this.addAccount("developmentAccount", "Development", (0, addSuffixToEmail_1.default)(this.props.accountEmail, "development"), { env: "development" }, devOrgUnit);
56
+ }
57
+ addOrganisationalUnit(id, name) {
58
+ const ou = new cdk_organizations_1.OrganizationalUnit(this, id, {
59
+ organizationalUnitName: name,
60
+ parent: this.organisation.root,
61
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY //todo: validate if this is best practice
62
+ // defaults
63
+ // importOnDuplicate: false, //todo: should we import pre-existing organisational units?
64
+ });
65
+ this.organisationalUnits.push(ou);
66
+ return ou;
67
+ }
68
+ addAccount(id, name, email, tags, organisationalUnit) {
69
+ const acc = new cdk_organizations_1.Account(this, id, {
70
+ accountName: name,
71
+ email: email,
72
+ parent: organisationalUnit
73
+ });
74
+ this.accounts.push(acc);
75
+ for (const tag in tags) {
76
+ aws_cdk_lib_2.Tags.of(acc).add(tag, tags[tag]);
77
+ }
78
+ new aws_cdk_lib_1.CfnOutput(this, `${id}Id`, {
79
+ value: acc.accountId,
80
+ exportName: `${id}Id`
81
+ });
82
+ new aws_cdk_lib_1.CfnOutput(this, `${id}Arn`, {
83
+ value: acc.accountId,
84
+ exportName: `${id}Arn`
85
+ });
86
+ return acc;
87
+ }
88
+ getAccounts() {
89
+ return this.accounts;
90
+ }
91
+ }
92
+ exports.MultiEnvironmentOrganisation = MultiEnvironmentOrganisation;
93
+ exports.default = MultiEnvironmentOrganisation;
94
+ /**
95
+ * A stack for creating multi environment organisations with a production, staging and development account.
96
+ */
97
+ class MultiEnvironmentOrganisationStack extends aws_cdk_lib_1.Stack {
98
+ constructor(id, props) {
99
+ super(app_1.default.getInstance(), id);
100
+ this.resource = new MultiEnvironmentOrganisation(this, id, props);
101
+ }
102
+ getAccounts() {
103
+ return this.resource.getAccounts();
104
+ }
105
+ }
106
+ exports.MultiEnvironmentOrganisationStack = MultiEnvironmentOrganisationStack;
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlFbnZpcm9ubWVudE9yZ2FuaXNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvbXVsdGlFbnZpcm9ubWVudE9yZ2FuaXNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBOEQ7QUFDOUQsMkNBQXVDO0FBQ3ZDLDZDQUFtQztBQUVuQyxtQ0FBNEI7QUFFNUIsb0VBTXNDO0FBRXRDLG1FQUE0RDtBQU81RDs7R0FFRztBQUNILE1BQWEsNEJBQTZCLFNBQVEsc0JBQVM7SUFPekQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBd0M7UUFFeEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQVJYLHdCQUFtQixHQUF5QixFQUFFLENBQUM7UUFDL0MsYUFBUSxHQUFjLEVBQUUsQ0FBQztRQVEvQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTFCLDBFQUEwRTtRQUMxRSxrR0FBa0c7UUFDbEcsd0VBQXdFO1FBQ3hFLGFBQWE7UUFDYix1REFBdUQ7UUFDdkQsOENBQThDO1FBQzlDLGNBQWM7SUFDaEIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGdDQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7WUFDdEUsVUFBVSxFQUFFLDhCQUFVLENBQUMsR0FBRztTQUMzQixDQUFDLENBQUM7UUFFSCxNQUFNLG1CQUFtQixHQUFpQjtZQUN4Qyw4QkFBVSxDQUFDLHNCQUFzQjtZQUNqQyw4QkFBVSxDQUFDLFVBQVU7WUFDckIs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S0FBSyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1lBQ3BCLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUExSUQsb0VBMElDO0FBQ0Qsa0JBQWUsNEJBQTRCLENBQUM7QUFFNUM7O0dBRUc7QUFDSCxNQUFhLGlDQUFrQyxTQUFRLG1CQUFLO0lBRzFELFlBQVksRUFBVSxFQUFFLEtBQXdDO1FBQzlELEtBQUssQ0FBQyxhQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLDRCQUE0QixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQVhELDhFQVdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFJlbW92YWxQb2xpY3ksIENmbk91dHB1dCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFRhZ3MgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuaW1wb3J0IEFwcCBmcm9tIFwiLi4vLi4vYXBwXCI7XG5cbmltcG9ydCB7XG4gIEFjY291bnQsXG4gIEZlYXR1cmVTZXQsXG4gIE9yZ2FuaXphdGlvbixcbiAgT3JnYW5pemF0aW9uYWxVbml0LFxuICBQb2xpY3lUeXBlXG59IGZyb20gXCJAcGVwcGVyaXplL2Nkay1vcmdhbml6YXRpb25zXCI7XG5cbmltcG9ydCBhZGRTdWZmaXhUb0VtYWlsIGZyb20gXCIuLi8uLi91dGlscy9hZGRTdWZmaXhUb0VtYWlsXCI7XG5cbmludGVyZmFjZSBNdWx0aUVudmlyb25tZW50T3JnYW5pc2F0aW9uUHJvcHMge1xuICBvcmdhbmlzYXRpb25OYW1lOiBzdHJpbmc7XG4gIGFjY291bnRFbWFpbDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29uc3RydWN0IGZvciBjcmVhdGluZyBtdWx0aSBlbnZpcm9ubWVudCBvcmdhbmlzYXRpb25zIHdpdGggYSBwcm9kdWN0aW9uLCBzdGFnaW5nIGFuZCBkZXZlbG9wbWVudCBhY2NvdW50LlxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlFbnZpcm9ubWVudE9yZ2FuaXNhdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyBwcm9wczogTXVsdGlFbnZpcm9ubWVudE9yZ2FuaXNhdGlvblByb3BzO1xuXG4gIHByaXZhdGUgb3JnYW5pc2F0aW9uOiBPcmdhbml6YXRpb247XG4gIHByaXZhdGUgb3JnYW5pc2F0aW9uYWxVbml0czogT3JnYW5pemF0aW9uYWxVbml0W10gPSBbXTtcbiAgcHJpdmF0ZSBhY2NvdW50czogQWNjb3VudFtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBNdWx0aUVudmlyb25tZW50T3JnYW5pc2F0aW9uUHJvcHNcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICB0aGlzLmFkZE9yZ2FuaXNhdGlvbigpO1xuXG4gICAgdGhpcy5hZGRQcm9kdWN0aW9uVW5pdCgpO1xuICAgIHRoaXMuYWRkU3RhZ2luZ1VuaXQoKTtcbiAgICB0aGlzLmFkZERldmVsb3BtZW50VW5pdCgpO1xuXG4gICAgLy90b2RvOiBDb25zaWRlciBhZGRpbmcgdGhlIHJlbWFpbmluZyBBV1MgcmVjb21tZW5kZWQgb3JnYW5pc2F0aW9uYWwgdW5pdHNcbiAgICAvLyBodHRwczovL2F3cy5hbWF6b24uY29tL2Jsb2dzL210L2Jlc3QtcHJhY3RpY2VzLWZvci1vcmdhbml6YXRpb25hbC11bml0cy13aXRoLWF3cy1vcmdhbml6YXRpb25zL1xuICAgIC8vIC0gZGVwbG95bWVudHMgKGJ1aWxkIGFnZW50cyAtIGFjY291bnRzIG1heSBiZSBzcGVjaWZpYyBwZXIgJ3NlcnZpY2UnKVxuICAgIC8vIC0gc2VjdXJpdHlcbiAgICAvLyAtIGluZnJhc3RydWN0dXJlIChzaGFyZWQgbmV0d29ya2luZyBhbmQgSVQgc2VydmljZXMpXG4gICAgLy8gLSBzYW5kYm94IChlcXVpdmFsZW50IHRvIGRldmVsb3BtZW50IHVuaXQ/KVxuICAgIC8vIC0gd29ya2xvYWRzXG4gIH1cblxuICBwcml2YXRlIGFkZE9yZ2FuaXNhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLm9yZ2FuaXNhdGlvbiA9IG5ldyBPcmdhbml6YXRpb24odGhpcywgdGhpcy5wcm9wcy5vcmdhbmlzYXRpb25OYW1lLCB7XG4gICAgICBmZWF0dXJlU2V0OiBGZWF0dXJlU2V0LkFMTFxuICAgIH0pO1xuXG4gICAgY29uc3QgZW5mb3JjZWRQb2xpY3lUeXBlczogUG9saWN5VHlwZVtdID0gW1xuICAgICAgUG9saWN5VHlwZS5TRVJWSUNFX0NPTlRST0xfUE9MSUNZLFxuICAgICAgUG9saWN5VHlwZS5UQUdfUE9MSUNZLFxuICAgICAgUG9saWN5VHlwZS5CQUNLVVBfUE9MSUNZLFxuICAgICAgUG9saWN5VHlwZS5BSVNFUlZJQ0VTX09QVF9PVVRfUE9MSUNZXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcG9saWN5VHlwZSBvZiBlbmZvcmNlZFBvbGljeVR5cGVzKSB7XG4gICAgICB0aGlzLm9yZ2FuaXNhdGlvbi5lbmFibGVQb2xpY3lUeXBlKHBvbGljeVR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkUHJvZHVjdGlvblVuaXQoKTogdm9pZCB7XG4gICAgY29uc3QgcHJvZE9yZ1VuaXQgPSB0aGlzLmFkZE9yZ2FuaXNhdGlvbmFsVW5pdChcbiAgICAgIFwicHJvZHVjdGlvbk9yZ2FuaXphdGlvbmFsVW5pdFwiLFxuICAgICAgXCJQcm9kdWN0aW9uXCJcbiAgICApO1xuXG4gICAgdGhpcy5hZGRBY2NvdW50KFxuICAgICAgXCJwcm9kdWN0aW9uQWNjb3VudFwiLFxuICAgICAgXCJQcm9kdWN0aW9uMlwiLFxuICAgICAgYWRkU3VmZml4VG9FbWFpbCh0aGlzLnByb3BzLmFjY291bnRFbWFpbCwgXCJwcm9kdWN0aW9uMlwiKSxcbiAgICAgIHsgZW52OiBcInByb2R1Y3Rpb25cIiB9LFxuICAgICAgcHJvZE9yZ1VuaXRcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTdGFnaW5nVW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFnT3JnVW5pdCA9IHRoaXMuYWRkT3JnYW5pc2F0aW9uYWxVbml0KFxuICAgICAgXCJzdGFnaW5nT3JnYW5pc2F0aW9uVW5pdFwiLFxuICAgICAgXCJTdGFnaW5nXCJcbiAgICApO1xuXG4gICAgdGhpcy5hZGRBY2NvdW50KFxuICAgICAgXCJzdGFnaW5nQWNjb3VudFwiLFxuICAgICAgXCJTdGFnaW5nXCIsXG4gICAgICBhZGRTdWZmaXhUb0VtYWlsKHRoaXMucHJvcHMuYWNjb3VudEVtYWlsLCBcInN0YWdpbmdcIiksXG4gICAgICB7IGVudjogXCJzdGFnaW5nXCIgfSxcbiAgICAgIHN0YWdPcmdVbml0XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGV2ZWxvcG1lbnRVbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRldk9yZ1VuaXQgPSB0aGlzLmFkZE9yZ2FuaXNhdGlvbmFsVW5pdChcbiAgICAgIFwiZGV2ZWxvcG1lbnRPcmdhbmlzYXRpb25Vbml0XCIsXG4gICAgICBcIkRldmVsb3BtZW50XCJcbiAgICApO1xuXG4gICAgdGhpcy5hZGRBY2NvdW50KFxuICAgICAgXCJkZXZlbG9wbWVudEFjY291bnRcIixcbiAgICAgIFwiRGV2ZWxvcG1lbnRcIixcbiAgICAgIGFkZFN1ZmZpeFRvRW1haWwodGhpcy5wcm9wcy5hY2NvdW50RW1haWwsIFwiZGV2ZWxvcG1lbnRcIiksXG4gICAgICB7IGVudjogXCJkZXZlbG9wbWVudFwiIH0sXG4gICAgICBkZXZPcmdVbml0XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkT3JnYW5pc2F0aW9uYWxVbml0KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IE9yZ2FuaXphdGlvbmFsVW5pdCB7XG4gICAgY29uc3Qgb3UgPSBuZXcgT3JnYW5pemF0aW9uYWxVbml0KHRoaXMsIGlkLCB7XG4gICAgICBvcmdhbml6YXRpb25hbFVuaXROYW1lOiBuYW1lLFxuICAgICAgcGFyZW50OiB0aGlzLm9yZ2FuaXNhdGlvbi5yb290LFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIC8vdG9kbzogdmFsaWRhdGUgaWYgdGhpcyBpcyBiZXN0IHByYWN0aWNlXG4gICAgICAvLyBkZWZhdWx0c1xuICAgICAgLy8gaW1wb3J0T25EdXBsaWNhdGU6IGZhbHNlLCAvL3RvZG86IHNob3VsZCB3ZSBpbXBvcnQgcHJlLWV4aXN0aW5nIG9yZ2FuaXNhdGlvbmFsIHVuaXRzP1xuICAgIH0pO1xuXG4gICAgdGhpcy5vcmdhbmlzYXRpb25hbFVuaXRzLnB1c2gob3UpO1xuICAgIHJldHVybiBvdTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQWNjb3VudChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgb3JnYW5pc2F0aW9uYWxVbml0OiBPcmdhbml6YXRpb25hbFVuaXRcbiAgKTogQWNjb3VudCB7XG4gICAgY29uc3QgYWNjID0gbmV3IEFjY291bnQodGhpcywgaWQsIHtcbiAgICAgIGFjY291bnROYW1lOiBuYW1lLFxuICAgICAgZW1haWw6IGVtYWlsLFxuICAgICAgcGFyZW50OiBvcmdhbmlzYXRpb25hbFVuaXRcbiAgICB9KTtcbiAgICB0aGlzLmFjY291bnRzLnB1c2goYWNjKTtcblxuICAgIGZvciAoY29uc3QgdGFnIGluIHRhZ3MpIHtcbiAgICAgIFRhZ3Mub2YoYWNjKS5hZGQodGFnLCB0YWdzW3RhZ10pO1xuICAgIH1cblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9SWRgLCB7XG4gICAgICB2YWx1ZTogYWNjLmFjY291bnRJZCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke2lkfUlkYFxuICAgIH0pO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QXJuYCwge1xuICAgICAgdmFsdWU6IGFjYy5hY2NvdW50SWQsXG4gICAgICBleHBvcnROYW1lOiBgJHtpZH1Bcm5gXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgcHVibGljIGdldEFjY291bnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFjY291bnRzO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBNdWx0aUVudmlyb25tZW50T3JnYW5pc2F0aW9uO1xuXG4vKipcbiAqIEEgc3RhY2sgZm9yIGNyZWF0aW5nIG11bHRpIGVudmlyb25tZW50IG9yZ2FuaXNhdGlvbnMgd2l0aCBhIHByb2R1Y3Rpb24sIHN0YWdpbmcgYW5kIGRldmVsb3BtZW50IGFjY291bnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aUVudmlyb25tZW50T3JnYW5pc2F0aW9uU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIHByaXZhdGUgcmVzb3VyY2U6IE11bHRpRW52aXJvbm1lbnRPcmdhbmlzYXRpb247XG5cbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgcHJvcHM6IE11bHRpRW52aXJvbm1lbnRPcmdhbmlzYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKEFwcC5nZXRJbnN0YW5jZSgpLCBpZCk7XG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBNdWx0aUVudmlyb25tZW50T3JnYW5pc2F0aW9uKHRoaXMsIGlkLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWNjb3VudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0QWNjb3VudHMoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,17 @@
1
+ import { AwsStackProps } from "../../resources/aws/awsStack";
2
+ export interface WebAppProps {
3
+ account?: string;
4
+ region?: string;
5
+ environment?: string;
6
+ tags?: {
7
+ [key: string]: string;
8
+ };
9
+ }
10
+ export declare class WebApp {
11
+ private vpcStack;
12
+ private databaseStack;
13
+ private computeStack;
14
+ constructor(id: string, props?: WebAppProps);
15
+ getStackProps(props?: WebAppProps): AwsStackProps | undefined;
16
+ }
17
+ export default WebApp;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebApp = void 0;
4
+ const awsStack_1 = require("../../resources/aws/awsStack");
5
+ const vpc_1 = require("../../resources/aws/constant/vpc");
6
+ const ecr_1 = require("../../resources/aws/constant/ecr");
7
+ const fargate_1 = require("../../resources/aws/compute/fargate");
8
+ const database_1 = require("../../resources/aws/store/database");
9
+ class WebApp {
10
+ constructor(id, props) {
11
+ this.vpcStack = new awsStack_1.default(`${id}Network`, [], this.getStackProps(props))
12
+ .addNetwork(vpc_1.Vpc.build(`${id}Vpc`))
13
+ .addResource(ecr_1.default.build(`${id}Ecr`));
14
+ this.databaseStack = new awsStack_1.default(`${id}Database`, this.vpcStack, this.getStackProps(props))
15
+ .addNetwork(this.vpcStack.getNetwork())
16
+ .addResource(database_1.default.build(`${id}Database`));
17
+ //todo: validate id does not contain special characters (no hyphens - no slashes etc)
18
+ // this is neccessary as database instances won't allow it
19
+ this.computeStack = new awsStack_1.default(`${id}Compute`, [this.vpcStack, this.databaseStack], this.getStackProps(props))
20
+ .addNetwork(this.vpcStack.getNetwork())
21
+ .addResource(fargate_1.default.build(`${id}Fargate`))
22
+ .connect(`${id}Fargate`, this.databaseStack.getResource(`${id}Database`), 5432);
23
+ }
24
+ getStackProps(props) {
25
+ if (!props)
26
+ return;
27
+ return {
28
+ account: props.account,
29
+ region: props.region,
30
+ environment: props.environment
31
+ };
32
+ }
33
+ }
34
+ exports.WebApp = WebApp;
35
+ exports.default = WebApp;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViQXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy93ZWJBcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQXVFO0FBQ3ZFLDBEQUF1RDtBQUN2RCwwREFBbUQ7QUFDbkQsaUVBQTBEO0FBQzFELGlFQUEwRDtBQVMxRCxNQUFhLE1BQU07SUFLakIsWUFBWSxFQUFVLEVBQUUsS0FBbUI7UUFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGtCQUFRLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN4RSxVQUFVLENBQUMsU0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDakMsV0FBVyxDQUFDLGFBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGtCQUFRLENBQy9CLEdBQUcsRUFBRSxVQUFVLEVBQ2YsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUMxQjthQUNFLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ3RDLFdBQVcsQ0FBQyxrQkFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUVoRCxxRkFBcUY7UUFDckYsMkRBQTJEO1FBRTNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxrQkFBUSxDQUM5QixHQUFHLEVBQUUsU0FBUyxFQUNkLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQzFCO2FBQ0UsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDdEMsV0FBVyxDQUFDLGlCQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQzthQUMxQyxPQUFPLENBQ04sR0FBRyxFQUFFLFNBQVMsRUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQy9DLElBQUksQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFtQjtRQUMvQixJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFFbkIsT0FBTztZQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1NBQy9CLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE1Q0Qsd0JBNENDO0FBQ0Qsa0JBQWUsTUFBTSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEF3c1N0YWNrLCB7IEF3c1N0YWNrUHJvcHMgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9hd3NTdGFja1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29uc3RhbnQvdnBjXCI7XG5pbXBvcnQgRWNyIGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2NvbnN0YW50L2VjclwiO1xuaW1wb3J0IEZhcmdhdGUgZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9mYXJnYXRlXCI7XG5pbXBvcnQgRGF0YWJhc2UgZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc3RvcmUvZGF0YWJhc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJBcHBQcm9wcyB7XG4gIGFjY291bnQ/OiBzdHJpbmc7XG4gIHJlZ2lvbj86IHN0cmluZztcbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgY2xhc3MgV2ViQXBwIHtcbiAgcHJpdmF0ZSB2cGNTdGFjazogQXdzU3RhY2s7XG4gIHByaXZhdGUgZGF0YWJhc2VTdGFjazogQXdzU3RhY2s7XG4gIHByaXZhdGUgY29tcHV0ZVN0YWNrOiBBd3NTdGFjaztcblxuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBwcm9wcz86IFdlYkFwcFByb3BzKSB7XG4gICAgdGhpcy52cGNTdGFjayA9IG5ldyBBd3NTdGFjayhgJHtpZH1OZXR3b3JrYCwgW10sIHRoaXMuZ2V0U3RhY2tQcm9wcyhwcm9wcykpXG4gICAgICAuYWRkTmV0d29yayhWcGMuYnVpbGQoYCR7aWR9VnBjYCkpXG4gICAgICAuYWRkUmVzb3VyY2UoRWNyLmJ1aWxkKGAke2lkfUVjcmApKTtcblxuICAgIHRoaXMuZGF0YWJhc2VTdGFjayA9IG5ldyBBd3NTdGFjayhcbiAgICAgIGAke2lkfURhdGFiYXNlYCxcbiAgICAgIHRoaXMudnBjU3RhY2ssXG4gICAgICB0aGlzLmdldFN0YWNrUHJvcHMocHJvcHMpXG4gICAgKVxuICAgICAgLmFkZE5ldHdvcmsodGhpcy52cGNTdGFjay5nZXROZXR3b3JrKCkpXG4gICAgICAuYWRkUmVzb3VyY2UoRGF0YWJhc2UuYnVpbGQoYCR7aWR9RGF0YWJhc2VgKSk7XG5cbiAgICAvL3RvZG86IHZhbGlkYXRlIGlkIGRvZXMgbm90IGNvbnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzIChubyBoeXBoZW5zIC0gbm8gc2xhc2hlcyBldGMpXG4gICAgLy8gIHRoaXMgaXMgbmVjY2Vzc2FyeSBhcyBkYXRhYmFzZSBpbnN0YW5jZXMgd29uJ3QgYWxsb3cgaXRcblxuICAgIHRoaXMuY29tcHV0ZVN0YWNrID0gbmV3IEF3c1N0YWNrKFxuICAgICAgYCR7aWR9Q29tcHV0ZWAsXG4gICAgICBbdGhpcy52cGNTdGFjaywgdGhpcy5kYXRhYmFzZVN0YWNrXSxcbiAgICAgIHRoaXMuZ2V0U3RhY2tQcm9wcyhwcm9wcylcbiAgICApXG4gICAgICAuYWRkTmV0d29yayh0aGlzLnZwY1N0YWNrLmdldE5ldHdvcmsoKSlcbiAgICAgIC5hZGRSZXNvdXJjZShGYXJnYXRlLmJ1aWxkKGAke2lkfUZhcmdhdGVgKSlcbiAgICAgIC5jb25uZWN0KFxuICAgICAgICBgJHtpZH1GYXJnYXRlYCxcbiAgICAgICAgdGhpcy5kYXRhYmFzZVN0YWNrLmdldFJlc291cmNlKGAke2lkfURhdGFiYXNlYCksXG4gICAgICAgIDU0MzJcbiAgICAgICk7XG4gIH1cblxuICBnZXRTdGFja1Byb3BzKHByb3BzPzogV2ViQXBwUHJvcHMpOiBBd3NTdGFja1Byb3BzIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXByb3BzKSByZXR1cm47XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudDogcHJvcHMuYWNjb3VudCxcbiAgICAgIHJlZ2lvbjogcHJvcHMucmVnaW9uLFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50XG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgV2ViQXBwO1xuIl19
@@ -0,0 +1,36 @@
1
+ import { Stack } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ export interface StackBuilder {
4
+ addConstruct(resource: Construct): StackBuilder;
5
+ addResource(fn: (stackBuilder: StackBuilder) => Construct): StackBuilder;
6
+ addNetwork(resource: Construct): StackBuilder;
7
+ addNetwork(fn: (stackBuilder: StackBuilder) => Construct): StackBuilder;
8
+ addNetwork(resource: Construct | string): StackBuilder;
9
+ getStack(): Stack;
10
+ getNetwork(): Construct;
11
+ }
12
+ export interface AwsStackProps {
13
+ readonly account?: string;
14
+ readonly region?: string;
15
+ environment?: string;
16
+ }
17
+ export default class AwsStack implements StackBuilder {
18
+ readonly resources: {
19
+ [key: string]: Construct;
20
+ };
21
+ private stack;
22
+ private network;
23
+ constructor(id: string, dependencies?: AwsStack | AwsStack[], props?: AwsStackProps);
24
+ private addDependencies;
25
+ private getCdkStack;
26
+ private getStackProps;
27
+ private isConnectable;
28
+ addConstruct(construct: Construct): AwsStack;
29
+ addResource(fn: (stackBuilder: StackBuilder) => Construct): AwsStack;
30
+ addNetwork(resource: Construct): AwsStack;
31
+ addNetwork(resource: (stackBuilder: StackBuilder) => Construct): AwsStack;
32
+ getStack(): Stack;
33
+ getNetwork(): Construct;
34
+ getResource(identifier: string): Construct;
35
+ connect(from: Construct | string, to: Construct | string, port?: number): this;
36
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
4
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
5
+ const constructs_1 = require("constructs");
6
+ const app_1 = require("../../app");
7
+ class AwsStack {
8
+ constructor(id, dependencies, props) {
9
+ this.resources = {};
10
+ // Create inner CDK Stack
11
+ this.stack = this.getCdkStack(id, props);
12
+ // Register all stack dependencies
13
+ this.addDependencies(dependencies);
14
+ }
15
+ addDependencies(dependencies) {
16
+ if (!dependencies)
17
+ return;
18
+ if (Array.isArray(dependencies)) {
19
+ for (const dependency of dependencies) {
20
+ this.stack.addDependency(dependency.getStack());
21
+ }
22
+ }
23
+ else {
24
+ this.stack.addDependency(dependencies.getStack());
25
+ }
26
+ }
27
+ getCdkStack(id, props) {
28
+ if (process.env.JEST_WORKER_ID !== undefined) {
29
+ return new aws_cdk_lib_1.Stack(undefined, id, this.getStackProps(props)); // Create a mock stack for testing
30
+ }
31
+ return new aws_cdk_lib_1.Stack(app_1.default.getInstance(), id, this.getStackProps(props));
32
+ }
33
+ getStackProps(props) {
34
+ if (!props)
35
+ return;
36
+ const stackProps = {
37
+ env: props.account && props.region
38
+ ? { account: props.account, region: props.region }
39
+ : undefined
40
+ };
41
+ return stackProps;
42
+ }
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ isConnectable(arg) {
45
+ return arg.connections;
46
+ }
47
+ addConstruct(construct) {
48
+ this.resources[construct.node.id] = construct;
49
+ return this;
50
+ }
51
+ addResource(fn) {
52
+ const resource = fn(this);
53
+ this.resources[resource.node.id] = resource;
54
+ return this;
55
+ }
56
+ addNetwork(resource) {
57
+ const resourceActual = resource instanceof constructs_1.Construct ? resource : resource(this);
58
+ this.resources[resourceActual.node.id] = resourceActual;
59
+ this.network = resourceActual;
60
+ return this;
61
+ }
62
+ getStack() {
63
+ return this.stack;
64
+ }
65
+ getNetwork() {
66
+ return this.network;
67
+ }
68
+ getResource(identifier) {
69
+ return this.resources[identifier];
70
+ }
71
+ connect(from, to, port) {
72
+ if (!from || !to)
73
+ return this;
74
+ const fromResource = from instanceof constructs_1.Construct ? from : this.getResource(from);
75
+ const toResource = to instanceof constructs_1.Construct ? to : this.getResource(to);
76
+ if (!fromResource || !toResource)
77
+ return this;
78
+ if (!this.isConnectable(fromResource) || !this.isConnectable(toResource))
79
+ return this;
80
+ const portActual = port ? aws_ec2_1.Port.tcp(port) : aws_ec2_1.Port.allTcp();
81
+ fromResource.connections.allowTo(toResource, portActual);
82
+ return this;
83
+ }
84
+ }
85
+ exports.default = AwsStack;
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzU3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9hd3NTdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFnRDtBQUNoRCxpREFBeUQ7QUFDekQsMkNBQXVDO0FBRXZDLG1DQUE0QjtBQW9CNUIsTUFBcUIsUUFBUTtJQVEzQixZQUNFLEVBQVUsRUFDVixZQUFvQyxFQUNwQyxLQUFxQjtRQVZQLGNBQVMsR0FFckIsRUFBRSxDQUFDO1FBVUwseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFekMsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLGVBQWUsQ0FBQyxZQUFvQztRQUMxRCxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFFMUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQy9CLEtBQUssTUFBTSxVQUFVLElBQUksWUFBWSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUNqRDtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFTyxXQUFXLENBQUMsRUFBVSxFQUFFLEtBQXFCO1FBQ25ELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO1lBQzVDLE9BQU8sSUFBSSxtQkFBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1NBQy9GO1FB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QU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUF0SEQsMkJBc0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDb25uZWN0YWJsZSwgUG9ydCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTdGFja0J1aWxkZXIge1xuICBhZGRDb25zdHJ1Y3QocmVzb3VyY2U6IENvbnN0cnVjdCk6IFN0YWNrQnVpbGRlcjtcbiAgYWRkUmVzb3VyY2UoZm46IChzdGFja0J1aWxkZXI6IFN0YWNrQnVpbGRlcikgPT4gQ29uc3RydWN0KTogU3RhY2tCdWlsZGVyO1xuXG4gIGFkZE5ldHdvcmsocmVzb3VyY2U6IENvbnN0cnVjdCk6IFN0YWNrQnVpbGRlcjtcbiAgYWRkTmV0d29yayhmbjogKHN0YWNrQnVpbGRlcjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3QpOiBTdGFja0J1aWxkZXI7XG4gIGFkZE5ldHdvcmsocmVzb3VyY2U6IENvbnN0cnVjdCB8IHN0cmluZyk6IFN0YWNrQnVpbGRlcjtcblxuICBnZXRTdGFjaygpOiBTdGFjaztcbiAgZ2V0TmV0d29yaygpOiBDb25zdHJ1Y3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzU3RhY2tQcm9wcyB7XG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF3c1N0YWNrIGltcGxlbWVudHMgU3RhY2tCdWlsZGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlczoge1xuICAgIFtrZXk6IHN0cmluZ106IENvbnN0cnVjdDtcbiAgfSA9IHt9O1xuXG4gIHByaXZhdGUgc3RhY2s6IFN0YWNrO1xuICBwcml2YXRlIG5ldHdvcms6IENvbnN0cnVjdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlcGVuZGVuY2llcz86IEF3c1N0YWNrIHwgQXdzU3RhY2tbXSxcbiAgICBwcm9wcz86IEF3c1N0YWNrUHJvcHNcbiAgKSB7XG4gICAgLy8gQ3JlYXRlIGlubmVyIENESyBTdGFja1xuICAgIHRoaXMuc3RhY2sgPSB0aGlzLmdldENka1N0YWNrKGlkLCBwcm9wcyk7XG5cbiAgICAvLyBSZWdpc3RlciBhbGwgc3RhY2sgZGVwZW5kZW5jaWVzXG4gICAgdGhpcy5hZGREZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcz86IEF3c1N0YWNrIHwgQXdzU3RhY2tbXSkge1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSByZXR1cm47XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHRoaXMuc3RhY2suYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5LmdldFN0YWNrKCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YWNrLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jaWVzLmdldFN0YWNrKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2RrU3RhY2soaWQ6IHN0cmluZywgcHJvcHM/OiBBd3NTdGFja1Byb3BzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkpFU1RfV09SS0VSX0lEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU3RhY2sodW5kZWZpbmVkLCBpZCwgdGhpcy5nZXRTdGFja1Byb3BzKHByb3BzKSk7IC8vIENyZWF0ZSBhIG1vY2sgc3RhY2sgZm9yIHRlc3RpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0YWNrKEFwcC5nZXRJbnN0YW5jZSgpLCBpZCwgdGhpcy5nZXRTdGFja1Byb3BzKHByb3BzKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWNrUHJvcHMoXG4gICAgcHJvcHM6IEF3c1N0YWNrUHJvcHMgfCB1bmRlZmluZWRcbiAgKTogU3RhY2tQcm9wcyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwcm9wcykgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3RhY2tQcm9wczogU3RhY2tQcm9wcyA9IHtcbiAgICAgIGVudjpcbiAgICAgICAgcHJvcHMuYWNjb3VudCAmJiBwcm9wcy5yZWdpb25cbiAgICAgICAgICA/IHsgYWNjb3VudDogcHJvcHMuYWNjb3VudCwgcmVnaW9uOiBwcm9wcy5yZWdpb24gfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgfTtcblxuICAgIHJldHVybiBzdGFja1Byb3BzO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBpc0Nvbm5lY3RhYmxlKGFyZzogYW55KTogYXJnIGlzIElDb25uZWN0YWJsZSB7XG4gICAgcmV0dXJuIGFyZy5jb25uZWN0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBhZGRDb25zdHJ1Y3QoY29uc3RydWN0OiBDb25zdHJ1Y3QpOiBBd3NTdGFjayB7XG4gICAgdGhpcy5yZXNvdXJjZXNbY29uc3RydWN0Lm5vZGUuaWRdID0gY29uc3RydWN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFkZFJlc291cmNlKGZuOiAoc3RhY2tCdWlsZGVyOiBTdGFja0J1aWxkZXIpID0+IENvbnN0cnVjdCk6IEF3c1N0YWNrIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IGZuKHRoaXMpO1xuICAgIHRoaXMucmVzb3VyY2VzW3Jlc291cmNlLm5vZGUuaWRdID0gcmVzb3VyY2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgYWRkTmV0d29yayhyZXNvdXJjZTogQ29uc3RydWN0KTogQXdzU3RhY2s7XG4gIHB1YmxpYyBhZGROZXR3b3JrKFxuICAgIHJlc291cmNlOiAoc3RhY2tCdWlsZGVyOiBTdGFja0J1aWxkZXIpID0+IENvbnN0cnVjdFxuICApOiBBd3NTdGFjaztcbiAgcHVibGljIGFkZE5ldHdvcmsoXG4gICAgcmVzb3VyY2U6IENvbnN0cnVjdCB8ICgoc3RhY2tCdWlsZGVyOiBTdGFja0J1aWxkZXIpID0+IENvbnN0cnVjdClcbiAgKTogQXdzU3RhY2sge1xuICAgIGNvbnN0IHJlc291cmNlQWN0dWFsID1cbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgQ29uc3RydWN0ID8gcmVzb3VyY2UgOiByZXNvdXJjZSh0aGlzKTtcbiAgICB0aGlzLnJlc291cmNlc1tyZXNvdXJjZUFjdHVhbC5ub2RlLmlkXSA9IHJlc291cmNlQWN0dWFsO1xuICAgIHRoaXMubmV0d29yayA9IHJlc291cmNlQWN0dWFsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGdldFN0YWNrKCkge1xuICAgIHJldHVybiB0aGlzLnN0YWNrO1xuICB9XG5cbiAgcHVibGljIGdldE5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMubmV0d29yaztcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNvdXJjZShpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXNbaWRlbnRpZmllcl07XG4gIH1cblxuICBwdWJsaWMgY29ubmVjdChcbiAgICBmcm9tOiBDb25zdHJ1Y3QgfCBzdHJpbmcsXG4gICAgdG86IENvbnN0cnVjdCB8IHN0cmluZyxcbiAgICBwb3J0PzogbnVtYmVyXG4gICkge1xuICAgIGlmICghZnJvbSB8fCAhdG8pIHJldHVybiB0aGlzO1xuXG4gICAgY29uc3QgZnJvbVJlc291cmNlID1cbiAgICAgIGZyb20gaW5zdGFuY2VvZiBDb25zdHJ1Y3QgPyBmcm9tIDogdGhpcy5nZXRSZXNvdXJjZShmcm9tKTtcbiAgICBjb25zdCB0b1Jlc291cmNlID0gdG8gaW5zdGFuY2VvZiBDb25zdHJ1Y3QgPyB0byA6IHRoaXMuZ2V0UmVzb3VyY2UodG8pO1xuXG4gICAgaWYgKCFmcm9tUmVzb3VyY2UgfHwgIXRvUmVzb3VyY2UpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGFibGUoZnJvbVJlc291cmNlKSB8fCAhdGhpcy5pc0Nvbm5lY3RhYmxlKHRvUmVzb3VyY2UpKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBwb3J0QWN0dWFsID0gcG9ydCA/IFBvcnQudGNwKHBvcnQpIDogUG9ydC5hbGxUY3AoKTtcbiAgICBmcm9tUmVzb3VyY2UuY29ubmVjdGlvbnMuYWxsb3dUbyh0b1Jlc291cmNlLCBwb3J0QWN0dWFsKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const assertions_1 = require("aws-cdk-lib/assertions");
4
+ const awsStack_1 = require("../../awsStack");
5
+ const fargate_1 = require("../fargate");
6
+ const vpc_1 = require("../../constant/vpc");
7
+ describe("Fargate", () => {
8
+ it("creates Fargate construct with default cluster and vpc", () => {
9
+ const awsStack = new awsStack_1.default("Test").addResource(fargate_1.default.build("Fargate"));
10
+ const template = assertions_1.Template.fromStack(awsStack.getStack());
11
+ expect(template.toJSON()).toMatchSnapshot();
12
+ });
13
+ it("creates Fargate construct with specified VPC and Cluster", () => {
14
+ const awsStack = new awsStack_1.default("TestWithVpc")
15
+ .addNetwork(vpc_1.Vpc.build("Vpc"))
16
+ .addResource(fargate_1.default.build("Fargate"));
17
+ const template = assertions_1.Template.fromStack(awsStack.getStack());
18
+ expect(template.toJSON()).toMatchSnapshot();
19
+ });
20
+ });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9fX3Rlc3RzX18vZmFyZ2F0ZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsdURBQWtEO0FBQ2xELDZDQUFzQztBQUN0Qyx3Q0FBaUM7QUFDakMsNENBQXlDO0FBRXpDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ3ZCLEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxHQUFHLEVBQUU7UUFDaEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxrQkFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxpQkFBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTVFLE1BQU0sUUFBUSxHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRSxHQUFHLEVBQUU7UUFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxrQkFBUSxDQUFDLGFBQWEsQ0FBQzthQUN6QyxVQUFVLENBQUMsU0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QixXQUFXLENBQUMsaUJBQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUV6QyxNQUFNLFFBQVEsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2Fzc2VydGlvbnNcIjtcbmltcG9ydCBBd3NTdGFjayBmcm9tIFwiLi4vLi4vYXdzU3RhY2tcIjtcbmltcG9ydCBGYXJnYXRlIGZyb20gXCIuLi9mYXJnYXRlXCI7XG5pbXBvcnQgeyBWcGMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvdnBjXCI7XG5cbmRlc2NyaWJlKFwiRmFyZ2F0ZVwiLCAoKSA9PiB7XG4gIGl0KFwiY3JlYXRlcyBGYXJnYXRlIGNvbnN0cnVjdCB3aXRoIGRlZmF1bHQgY2x1c3RlciBhbmQgdnBjXCIsICgpID0+IHtcbiAgICBjb25zdCBhd3NTdGFjayA9IG5ldyBBd3NTdGFjayhcIlRlc3RcIikuYWRkUmVzb3VyY2UoRmFyZ2F0ZS5idWlsZChcIkZhcmdhdGVcIikpO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soYXdzU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgZXhwZWN0KHRlbXBsYXRlLnRvSlNPTigpKS50b01hdGNoU25hcHNob3QoKTtcbiAgfSk7XG5cbiAgaXQoXCJjcmVhdGVzIEZhcmdhdGUgY29uc3RydWN0IHdpdGggc3BlY2lmaWVkIFZQQyBhbmQgQ2x1c3RlclwiLCAoKSA9PiB7XG4gICAgY29uc3QgYXdzU3RhY2sgPSBuZXcgQXdzU3RhY2soXCJUZXN0V2l0aFZwY1wiKVxuICAgICAgLmFkZE5ldHdvcmsoVnBjLmJ1aWxkKFwiVnBjXCIpKVxuICAgICAgLmFkZFJlc291cmNlKEZhcmdhdGUuYnVpbGQoXCJGYXJnYXRlXCIpKTtcblxuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKGF3c1N0YWNrLmdldFN0YWNrKCkpO1xuICAgIGV4cGVjdCh0ZW1wbGF0ZS50b0pTT04oKSkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,23 @@
1
+ import { Cluster as CdkCluster, ClusterProps } from "aws-cdk-lib/aws-ecs";
2
+ import { IVpc, IConnectable, Connections } from "aws-cdk-lib/aws-ec2";
3
+ import { Construct } from "constructs";
4
+ import { StackBuilder } from "../awsStack";
5
+ export declare class Cluster extends CdkCluster {
6
+ constructor(scope: Construct, id: string, props: ClusterProps);
7
+ static build(id: string): (scope: Construct) => Construct;
8
+ }
9
+ interface FargateProps {
10
+ vpc?: IVpc;
11
+ cluster?: Cluster;
12
+ cpu?: number;
13
+ desiredCount?: number;
14
+ memoryLimitMiB?: number;
15
+ publicLoadBalancer?: boolean;
16
+ }
17
+ export default class Fargate extends Construct implements IConnectable {
18
+ private albFargateService;
19
+ connections: Connections;
20
+ constructor(scope: Construct, id: string, props: FargateProps);
21
+ static build(id: string, props?: FargateProps): (sb: StackBuilder) => Construct;
22
+ }
23
+ export {};
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Cluster = void 0;
4
+ const aws_ecs_1 = require("aws-cdk-lib/aws-ecs");
5
+ const aws_ecs_patterns_1 = require("aws-cdk-lib/aws-ecs-patterns");
6
+ const constructs_1 = require("constructs");
7
+ class Cluster extends aws_ecs_1.Cluster {
8
+ constructor(scope, id, props) {
9
+ super(scope, id, props);
10
+ }
11
+ static build(id) {
12
+ return (scope) => {
13
+ return new this(scope, id, {});
14
+ };
15
+ }
16
+ }
17
+ exports.Cluster = Cluster;
18
+ class Fargate extends constructs_1.Construct {
19
+ constructor(scope, id, props) {
20
+ super(scope, id);
21
+ const cluster = props.cluster ||
22
+ new Cluster(this, `${id}Cluster`, {
23
+ vpc: props.vpc
24
+ });
25
+ this.albFargateService = new aws_ecs_patterns_1.ApplicationLoadBalancedFargateService(this, `${id}Service`, {
26
+ cluster: cluster,
27
+ cpu: props.cpu || 256,
28
+ desiredCount: props.desiredCount || 1,
29
+ taskImageOptions: {
30
+ image: aws_ecs_1.ContainerImage.fromRegistry("amazon/amazon-ecs-sample")
31
+ },
32
+ memoryLimitMiB: props.memoryLimitMiB || 512,
33
+ publicLoadBalancer: props.publicLoadBalancer || true
34
+ });
35
+ this.connections = this.albFargateService.service.connections;
36
+ }
37
+ static build(id, props) {
38
+ return (sb) => {
39
+ const newProps = {
40
+ ...props,
41
+ ...{
42
+ vpc: sb.getNetwork() || props?.vpc
43
+ }
44
+ };
45
+ return new this(sb.getStack(), id, newProps);
46
+ };
47
+ }
48
+ }
49
+ exports.default = Fargate;
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2NvbXB1dGUvZmFyZ2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFJNkI7QUFFN0IsbUVBQXFGO0FBQ3JGLDJDQUF1QztBQUl2QyxNQUFhLE9BQVEsU0FBUSxpQkFBVTtJQUNyQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1CO1FBQzNELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQVU7UUFDckIsT0FBTyxDQUFDLEtBQWdCLEVBQUUsRUFBRTtZQUMxQixPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBVkQsMEJBVUM7QUFXRCxNQUFxQixPQUFRLFNBQVEsc0JBQVM7SUFJNUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFtQjtRQUMzRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sT0FBTyxHQUNYLEtBQUssQ0FBQyxPQUFPO1lBQ2IsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7Z0JBQ2hDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRzthQUNmLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLHdEQUFxQyxDQUNoRSxJQUFJLEVBQ0osR0FBRyxFQUFFLFNBQVMsRUFDZDtZQUNFLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUc7WUFDckIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksQ0FBQztZQUNyQyxnQkFBZ0IsRUFBRTtnQkFDaEIsS0FBSyxFQUFFLHdCQUFjLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUFDO2FBQy9EO1lBQ0QsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjLElBQUksR0FBRztZQUMzQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCLElBQUksSUFBSTtTQUNyRCxDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUNWLEVBQVUsRUFDVixLQUFvQjtRQUVwQixPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE1BQU0sUUFBUSxHQUFpQjtnQkFDN0IsR0FBRyxLQUFLO2dCQUNSLEdBQUc7b0JBQ0QsR0FBRyxFQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQVcsSUFBSSxLQUFLLEVBQUUsR0FBRztpQkFDN0M7YUFDRixDQUFDO1lBQ0YsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTdDRCwwQkE2Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDbHVzdGVyIGFzIENka0NsdXN0ZXIsXG4gIENsdXN0ZXJQcm9wcyxcbiAgQ29udGFpbmVySW1hZ2Vcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7IElWcGMsIElDb25uZWN0YWJsZSwgQ29ubmVjdGlvbnMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgeyBTdGFja0J1aWxkZXIgfSBmcm9tIFwiLi4vYXdzU3RhY2tcIjtcblxuZXhwb3J0IGNsYXNzIENsdXN0ZXIgZXh0ZW5kcyBDZGtDbHVzdGVyIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENsdXN0ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkKGlkOiBzdHJpbmcpOiAoc2NvcGU6IENvbnN0cnVjdCkgPT4gQ29uc3RydWN0IHtcbiAgICByZXR1cm4gKHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIHJldHVybiBuZXcgdGhpcyhzY29wZSwgaWQsIHt9KTtcbiAgICB9O1xuICB9XG59XG5cbmludGVyZmFjZSBGYXJnYXRlUHJvcHMge1xuICB2cGM/OiBJVnBjO1xuICBjbHVzdGVyPzogQ2x1c3RlcjtcbiAgY3B1PzogbnVtYmVyO1xuICBkZXNpcmVkQ291bnQ/OiBudW1iZXI7XG4gIG1lbW9yeUxpbWl0TWlCPzogbnVtYmVyO1xuICBwdWJsaWNMb2FkQmFsYW5jZXI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGYXJnYXRlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHJpdmF0ZSBhbGJGYXJnYXRlU2VydmljZTogQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZTtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRmFyZ2F0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGNsdXN0ZXIgPVxuICAgICAgcHJvcHMuY2x1c3RlciB8fFxuICAgICAgbmV3IENsdXN0ZXIodGhpcywgYCR7aWR9Q2x1c3RlcmAsIHtcbiAgICAgICAgdnBjOiBwcm9wcy52cGNcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5hbGJGYXJnYXRlU2VydmljZSA9IG5ldyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke2lkfVNlcnZpY2VgLFxuICAgICAge1xuICAgICAgICBjbHVzdGVyOiBjbHVzdGVyLFxuICAgICAgICBjcHU6IHByb3BzLmNwdSB8fCAyNTYsXG4gICAgICAgIGRlc2lyZWRDb3VudDogcHJvcHMuZGVzaXJlZENvdW50IHx8IDEsXG4gICAgICAgIHRhc2tJbWFnZU9wdGlvbnM6IHtcbiAgICAgICAgICBpbWFnZTogQ29udGFpbmVySW1hZ2UuZnJvbVJlZ2lzdHJ5KFwiYW1hem9uL2FtYXpvbi1lY3Mtc2FtcGxlXCIpXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW9yeUxpbWl0TWlCOiBwcm9wcy5tZW1vcnlMaW1pdE1pQiB8fCA1MTIsXG4gICAgICAgIHB1YmxpY0xvYWRCYWxhbmNlcjogcHJvcHMucHVibGljTG9hZEJhbGFuY2VyIHx8IHRydWVcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuYWxiRmFyZ2F0ZVNlcnZpY2Uuc2VydmljZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzPzogRmFyZ2F0ZVByb3BzXG4gICk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgbmV3UHJvcHM6IEZhcmdhdGVQcm9wcyA9IHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIC4uLntcbiAgICAgICAgICB2cGM6IChzYi5nZXROZXR3b3JrKCkgYXMgSVZwYykgfHwgcHJvcHM/LnZwY1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBuZXdQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19