@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.
- package/README.md +68 -0
- package/dist/index.js +18 -0
- package/dist/lib/app.d.ts +6 -0
- package/dist/lib/app.js +19 -0
- package/dist/lib/config/aws/base/costAllocationTags.d.ts +5 -0
- package/dist/lib/config/aws/base/costAllocationTags.js +57 -0
- package/dist/lib/config/aws/base/iamIdentityCenter.d.ts +5 -0
- package/dist/lib/config/aws/base/iamIdentityCenter.js +86 -0
- package/dist/lib/config/aws/base/identityCenter.d.ts +5 -0
- package/dist/lib/config/aws/base/identityCenter.js +90 -0
- package/dist/lib/config/aws/base/ipam.d.ts +5 -0
- package/dist/lib/config/aws/base/ipam.js +29 -0
- package/dist/lib/config/aws/base/ipamPool.d.ts +5 -0
- package/dist/lib/config/aws/base/ipamPool.js +46 -0
- package/dist/lib/examples/custom-resources/lambda/aws-cost-allocation-tags/awsCostAllocationTagsLambda.d.ts +2 -0
- package/dist/lib/examples/custom-resources/lambda/aws-cost-allocation-tags/awsCostAllocationTagsLambda.js +62 -0
- package/dist/lib/examples/cutomResourceExample.d.ts +6 -0
- package/dist/lib/examples/cutomResourceExample.js +45 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +18 -0
- package/dist/lib/patterns/aws/customResource.d.ts +7 -0
- package/dist/lib/patterns/aws/customResource.js +28 -0
- package/dist/lib/patterns/aws/index.d.ts +2 -0
- package/dist/lib/patterns/aws/index.js +19 -0
- package/dist/lib/patterns/aws/multiEnvironmentOrganisation.d.ts +33 -0
- package/dist/lib/patterns/aws/multiEnvironmentOrganisation.js +107 -0
- package/dist/lib/patterns/aws/webApp.d.ts +17 -0
- package/dist/lib/patterns/aws/webApp.js +36 -0
- package/dist/lib/resources/aws/awsStack.d.ts +36 -0
- package/dist/lib/resources/aws/awsStack.js +86 -0
- package/dist/lib/resources/aws/compute/__tests__/fargate.test.d.ts +1 -0
- package/dist/lib/resources/aws/compute/__tests__/fargate.test.js +21 -0
- package/dist/lib/resources/aws/compute/fargate.d.ts +23 -0
- package/dist/lib/resources/aws/compute/fargate.js +50 -0
- package/dist/lib/resources/aws/compute/lambda.d.ts +18 -0
- package/dist/lib/resources/aws/compute/lambda.js +28 -0
- package/dist/lib/resources/aws/constant/__tests__/vpc.test.d.ts +1 -0
- package/dist/lib/resources/aws/constant/__tests__/vpc.test.js +13 -0
- package/dist/lib/resources/aws/constant/ecr.d.ts +12 -0
- package/dist/lib/resources/aws/constant/ecr.js +29 -0
- package/dist/lib/resources/aws/constant/vpc.d.ts +18 -0
- package/dist/lib/resources/aws/constant/vpc.js +53 -0
- package/dist/lib/resources/aws/iam/assignment.d.ts +5 -0
- package/dist/lib/resources/aws/iam/assignment.js +13 -0
- package/dist/lib/resources/aws/iam/group.d.ts +5 -0
- package/dist/lib/resources/aws/iam/group.js +15 -0
- package/dist/lib/resources/aws/iam/iamRole.d.ts +5 -0
- package/dist/lib/resources/aws/iam/iamRole.js +18 -0
- package/dist/lib/resources/aws/iam/permissionSet.d.ts +5 -0
- package/dist/lib/resources/aws/iam/permissionSet.js +13 -0
- package/dist/lib/resources/aws/iam/role.d.ts +5 -0
- package/dist/lib/resources/aws/iam/role.js +18 -0
- package/dist/lib/resources/aws/logging/logGroup.d.ts +9 -0
- package/dist/lib/resources/aws/logging/logGroup.js +24 -0
- package/dist/lib/resources/aws/networking/hostedZone.d.ts +5 -0
- package/dist/lib/resources/aws/networking/hostedZone.js +20 -0
- package/dist/lib/resources/aws/networking/ipam.d.ts +5 -0
- package/dist/lib/resources/aws/networking/ipam.js +15 -0
- package/dist/lib/resources/aws/networking/ipamPool.d.ts +9 -0
- package/dist/lib/resources/aws/networking/ipamPool.js +35 -0
- package/dist/lib/resources/aws/store/database.d.ts +13 -0
- package/dist/lib/resources/aws/store/database.js +29 -0
- package/dist/lib/resources/aws/store/rds.d.ts +25 -0
- package/dist/lib/resources/aws/store/rds.js +90 -0
- package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +6 -0
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +24 -0
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +5 -0
- package/dist/lib/resources/aws/utilities/cfnOutput.js +16 -0
- package/dist/lib/resources/aws/utilities/customResource.d.ts +5 -0
- package/dist/lib/resources/aws/utilities/customResource.js +13 -0
- package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +5 -0
- package/dist/lib/resources/aws/utilities/customResourceProvider.js +19 -0
- package/dist/lib/utils/addSuffixToEmail.d.ts +1 -0
- package/dist/lib/utils/addSuffixToEmail.js +7 -0
- package/dist/lib/utils/getConfig.d.ts +7 -0
- package/dist/lib/utils/getConfig.js +22 -0
- 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,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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|