@fjall/components-infrastructure 0.1.5 → 0.1.6

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 (218) hide show
  1. package/dist/lib/app.d.ts +2 -1
  2. package/dist/lib/app.js +4 -2
  3. package/dist/lib/config/aws/accountId.d.ts +6 -0
  4. package/dist/lib/config/aws/accountId.js +33 -0
  5. package/dist/lib/config/aws/cloudTrail.d.ts +10 -0
  6. package/dist/lib/config/aws/cloudTrail.js +22 -0
  7. package/dist/lib/config/aws/costAllocationTags.d.ts +4 -0
  8. package/dist/lib/config/aws/costAllocationTags.js +59 -0
  9. package/dist/lib/config/aws/delegateHostedZoneRole.d.ts +5 -0
  10. package/dist/lib/config/aws/delegateHostedZoneRole.js +77 -0
  11. package/dist/lib/config/aws/ecrDefaultImage.d.ts +11 -0
  12. package/dist/lib/config/aws/ecrDefaultImage.js +127 -0
  13. package/dist/lib/config/aws/eventBus.d.ts +7 -0
  14. package/dist/lib/config/aws/eventBus.js +24 -0
  15. package/dist/lib/config/aws/identityCenter.d.ts +13 -0
  16. package/dist/lib/config/aws/identityCenter.js +102 -0
  17. package/dist/lib/config/aws/identityCenterUser.d.ts +16 -0
  18. package/dist/lib/config/aws/identityCenterUser.js +125 -0
  19. package/dist/lib/config/aws/index.d.ts +12 -0
  20. package/dist/lib/config/aws/index.js +29 -0
  21. package/dist/lib/config/aws/ipam.d.ts +5 -0
  22. package/dist/lib/config/aws/ipam.js +48 -0
  23. package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +8 -0
  24. package/dist/lib/config/aws/ipamDelegateAdmin.js +58 -0
  25. package/dist/lib/config/aws/ipamPool.d.ts +5 -0
  26. package/dist/lib/config/aws/ipamPool.js +56 -0
  27. package/dist/lib/config/aws/ipamPoolId.d.ts +9 -0
  28. package/dist/lib/config/aws/ipamPoolId.js +36 -0
  29. package/dist/lib/config/aws/{base/identityCenter.d.ts → ipamPoolResourceShare.d.ts} +2 -2
  30. package/dist/lib/config/aws/ipamPoolResourceShare.js +42 -0
  31. package/dist/lib/config/aws/organisation.d.ts +28 -0
  32. package/dist/lib/config/aws/organisation.js +142 -0
  33. package/dist/lib/config/aws/organisationId.d.ts +7 -0
  34. package/dist/lib/config/aws/organisationId.js +46 -0
  35. package/dist/lib/config/aws/{base/ipamPool.d.ts → ramEnableSharing.d.ts} +1 -1
  36. package/dist/lib/config/aws/ramEnableSharing.js +35 -0
  37. package/dist/lib/config/aws/ramSharing.d.ts +4 -0
  38. package/dist/lib/config/aws/ramSharing.js +35 -0
  39. package/dist/lib/config/aws/{base/ipam.d.ts → users.d.ts} +1 -1
  40. package/dist/lib/config/aws/users.js +126 -0
  41. package/dist/lib/config/fjall/hostedZones/fjall.io.d.ts +10 -0
  42. package/dist/lib/config/fjall/hostedZones/fjall.io.js +25 -0
  43. package/dist/lib/index.d.ts +3 -0
  44. package/dist/lib/index.js +4 -1
  45. package/dist/lib/patterns/aws/basicApp.d.ts +47 -0
  46. package/dist/lib/patterns/aws/basicApp.js +90 -0
  47. package/dist/lib/patterns/aws/buildkite.d.ts +50 -0
  48. package/dist/lib/patterns/aws/buildkite.js +346 -0
  49. package/dist/lib/patterns/aws/freeTierApp.d.ts +46 -0
  50. package/dist/lib/patterns/aws/freeTierApp.js +95 -0
  51. package/dist/lib/patterns/aws/hostedZone.d.ts +11 -0
  52. package/dist/lib/patterns/aws/hostedZone.js +73 -0
  53. package/dist/lib/patterns/aws/index.d.ts +5 -2
  54. package/dist/lib/patterns/aws/index.js +6 -3
  55. package/dist/lib/patterns/aws/managedAccount.d.ts +13 -0
  56. package/dist/lib/patterns/aws/managedAccount.js +39 -0
  57. package/dist/lib/patterns/aws/managedOrganisation.d.ts +19 -0
  58. package/dist/lib/patterns/aws/managedOrganisation.js +45 -0
  59. package/dist/lib/patterns/aws/managedPlatform.d.ts +13 -0
  60. package/dist/lib/patterns/aws/managedPlatform.js +22 -0
  61. package/dist/lib/patterns/aws/spotInstanceApp.d.ts +46 -0
  62. package/dist/lib/patterns/aws/spotInstanceApp.js +95 -0
  63. package/dist/lib/patterns/aws/subdomainHostedZone.d.ts +9 -0
  64. package/dist/lib/patterns/aws/subdomainHostedZone.js +39 -0
  65. package/dist/lib/resources/aws/awsStack.d.ts +5 -0
  66. package/dist/lib/resources/aws/awsStack.js +11 -1
  67. package/dist/lib/resources/aws/compute/ecs.d.ts +74 -0
  68. package/dist/lib/resources/aws/compute/ecs.js +269 -0
  69. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +76 -0
  70. package/dist/lib/resources/aws/compute/ecsFreeTier.js +352 -0
  71. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +76 -0
  72. package/dist/lib/resources/aws/compute/ecsSpot.js +334 -0
  73. package/dist/lib/resources/aws/compute/index.d.ts +2 -0
  74. package/dist/lib/resources/aws/compute/index.js +19 -0
  75. package/dist/lib/resources/aws/compute/lambda.d.ts +13 -6
  76. package/dist/lib/resources/aws/compute/lambda.js +23 -4
  77. package/dist/lib/resources/aws/constant/ecr.js +4 -3
  78. package/dist/lib/resources/aws/constant/vpc.d.ts +10 -2
  79. package/dist/lib/resources/aws/constant/vpc.js +18 -8
  80. package/dist/lib/resources/aws/database/database.d.ts +16 -0
  81. package/dist/lib/resources/aws/database/database.js +30 -0
  82. package/dist/lib/resources/aws/database/databaseFreeTier.d.ts +17 -0
  83. package/dist/lib/resources/aws/database/databaseFreeTier.js +31 -0
  84. package/dist/lib/resources/aws/database/databaseInstance.d.ts +17 -0
  85. package/dist/lib/resources/aws/database/databaseInstance.js +32 -0
  86. package/dist/lib/resources/aws/database/index.d.ts +2 -0
  87. package/dist/lib/resources/aws/database/index.js +19 -0
  88. package/dist/lib/resources/aws/database/rds.d.ts +23 -0
  89. package/dist/lib/resources/aws/database/rds.js +130 -0
  90. package/dist/lib/resources/aws/database/rdsFreeTier.d.ts +36 -0
  91. package/dist/lib/resources/aws/database/rdsFreeTier.js +80 -0
  92. package/dist/lib/resources/aws/database/rdsInstance.d.ts +42 -0
  93. package/dist/lib/resources/aws/database/rdsInstance.js +173 -0
  94. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +13 -0
  95. package/dist/lib/resources/aws/iam/identityCenter/group.js +14 -0
  96. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +13 -0
  97. package/dist/lib/resources/aws/iam/index.d.ts +5 -0
  98. package/dist/lib/resources/aws/iam/index.js +22 -0
  99. package/dist/lib/resources/aws/iam/instanceProfile.d.ts +5 -0
  100. package/dist/lib/resources/aws/iam/instanceProfile.js +13 -0
  101. package/dist/lib/resources/aws/iam/managedPolicy.d.ts +5 -0
  102. package/dist/lib/resources/aws/iam/managedPolicy.js +14 -0
  103. package/dist/lib/resources/aws/iam/policy.d.ts +5 -0
  104. package/dist/lib/resources/aws/iam/policy.js +13 -0
  105. package/dist/lib/resources/aws/iam/role.js +2 -7
  106. package/dist/lib/resources/aws/iam/securityGroup.d.ts +5 -0
  107. package/dist/lib/resources/aws/iam/securityGroup.js +14 -0
  108. package/dist/lib/resources/aws/index.d.ts +1 -0
  109. package/dist/lib/resources/aws/index.js +18 -0
  110. package/dist/lib/resources/aws/logging/cloudTrail.d.ts +18 -0
  111. package/dist/lib/resources/aws/logging/cloudTrail.js +46 -0
  112. package/dist/lib/resources/aws/logging/logGroup.d.ts +8 -4
  113. package/dist/lib/resources/aws/logging/logGroup.js +6 -7
  114. package/dist/lib/resources/aws/networking/hostedZone.d.ts +19 -3
  115. package/dist/lib/resources/aws/networking/hostedZone.js +59 -11
  116. package/dist/lib/resources/aws/networking/index.d.ts +3 -0
  117. package/dist/lib/resources/aws/networking/index.js +20 -0
  118. package/dist/lib/resources/aws/networking/ipam.d.ts +2 -2
  119. package/dist/lib/resources/aws/networking/ipam.js +3 -3
  120. package/dist/lib/resources/aws/networking/ipamPool.d.ts +14 -5
  121. package/dist/lib/resources/aws/networking/ipamPool.js +69 -22
  122. package/dist/lib/resources/aws/networking/vpc.d.ts +29 -0
  123. package/dist/lib/resources/aws/networking/vpc.js +64 -0
  124. package/dist/lib/resources/aws/secrets/alias.d.ts +5 -0
  125. package/dist/lib/resources/aws/secrets/alias.js +13 -0
  126. package/dist/lib/resources/aws/secrets/index.d.ts +5 -0
  127. package/dist/lib/resources/aws/secrets/index.js +22 -0
  128. package/dist/lib/resources/aws/secrets/kms.d.ts +14 -0
  129. package/dist/lib/resources/aws/secrets/kms.js +34 -0
  130. package/dist/lib/resources/aws/secrets/parameter.d.ts +26 -0
  131. package/dist/lib/resources/aws/secrets/parameter.js +100 -0
  132. package/dist/lib/resources/aws/secrets/secret.d.ts +24 -0
  133. package/dist/lib/resources/aws/secrets/secret.js +53 -0
  134. package/dist/lib/resources/aws/storage/ecr.d.ts +12 -0
  135. package/dist/lib/resources/aws/storage/ecr.js +31 -0
  136. package/dist/lib/resources/aws/storage/index.d.ts +2 -0
  137. package/dist/lib/resources/aws/storage/index.js +19 -0
  138. package/dist/lib/resources/aws/storage/s3.d.ts +11 -0
  139. package/dist/lib/resources/aws/storage/s3.js +44 -0
  140. package/dist/lib/resources/aws/store/alias.d.ts +5 -0
  141. package/dist/lib/resources/aws/store/alias.js +13 -0
  142. package/dist/lib/resources/aws/store/database.d.ts +7 -2
  143. package/dist/lib/resources/aws/store/database.js +9 -5
  144. package/dist/lib/resources/aws/store/index.d.ts +7 -0
  145. package/dist/lib/resources/aws/store/index.js +24 -0
  146. package/dist/lib/resources/aws/store/kms.d.ts +14 -0
  147. package/dist/lib/resources/aws/store/kms.js +34 -0
  148. package/dist/lib/resources/aws/store/parameter.d.ts +26 -0
  149. package/dist/lib/resources/aws/store/parameter.js +100 -0
  150. package/dist/lib/resources/aws/store/rds.d.ts +15 -15
  151. package/dist/lib/resources/aws/store/rds.js +110 -68
  152. package/dist/lib/resources/aws/store/s3.d.ts +11 -0
  153. package/dist/lib/resources/aws/store/s3.js +43 -0
  154. package/dist/lib/resources/aws/store/secret.d.ts +26 -0
  155. package/dist/lib/resources/aws/store/secret.js +55 -0
  156. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -6
  157. package/dist/lib/resources/aws/utilities/cfnOutput.js +2 -5
  158. package/dist/lib/resources/aws/utilities/codeBuild.d.ts +15 -0
  159. package/dist/lib/resources/aws/utilities/codeBuild.js +28 -0
  160. package/dist/lib/resources/aws/utilities/customResource.d.ts +20 -3
  161. package/dist/lib/resources/aws/utilities/customResource.js +24 -5
  162. package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -5
  163. package/dist/lib/resources/aws/utilities/resourceShare.d.ts +5 -0
  164. package/dist/lib/resources/aws/utilities/resourceShare.js +13 -0
  165. package/dist/lib/resources/index.d.ts +1 -0
  166. package/dist/lib/resources/index.js +18 -0
  167. package/dist/lib/types.d.ts +3 -0
  168. package/dist/lib/types.js +3 -0
  169. package/dist/lib/utils/capitalizeString.d.ts +1 -0
  170. package/dist/lib/utils/capitalizeString.js +8 -0
  171. package/dist/lib/utils/getAccountId.d.ts +1 -0
  172. package/dist/lib/utils/getAccountId.js +12 -0
  173. package/dist/lib/utils/getCidr.d.ts +8 -0
  174. package/dist/lib/utils/getCidr.js +42 -0
  175. package/dist/lib/utils/getConfig.d.ts +7 -5
  176. package/dist/lib/utils/getConfig.js +39 -11
  177. package/dist/lib/utils/getStackOutput.d.ts +1 -0
  178. package/dist/lib/utils/getStackOutput.js +20 -0
  179. package/dist/lib/utils/index.d.ts +1 -0
  180. package/dist/lib/utils/index.js +18 -0
  181. package/dist/lib/utils/stripAndCamelCase.d.ts +1 -0
  182. package/dist/lib/utils/stripAndCamelCase.js +17 -0
  183. package/dist/lib/utils/tagResource.d.ts +4 -0
  184. package/dist/lib/utils/tagResource.js +10 -0
  185. package/dist/lib/utils/usersConfig.d.ts +7 -0
  186. package/dist/lib/utils/usersConfig.js +18 -0
  187. package/package.json +23 -18
  188. package/dist/lib/config/aws/base/costAllocationTags.d.ts +0 -5
  189. package/dist/lib/config/aws/base/costAllocationTags.js +0 -57
  190. package/dist/lib/config/aws/base/iamIdentityCenter.d.ts +0 -5
  191. package/dist/lib/config/aws/base/iamIdentityCenter.js +0 -86
  192. package/dist/lib/config/aws/base/identityCenter.js +0 -90
  193. package/dist/lib/config/aws/base/ipam.js +0 -29
  194. package/dist/lib/config/aws/base/ipamPool.js +0 -46
  195. package/dist/lib/examples/custom-resources/lambda/aws-cost-allocation-tags/awsCostAllocationTagsLambda.d.ts +0 -2
  196. package/dist/lib/examples/custom-resources/lambda/aws-cost-allocation-tags/awsCostAllocationTagsLambda.js +0 -62
  197. package/dist/lib/examples/cutomResourceExample.d.ts +0 -6
  198. package/dist/lib/examples/cutomResourceExample.js +0 -45
  199. package/dist/lib/patterns/aws/customResource.d.ts +0 -7
  200. package/dist/lib/patterns/aws/customResource.js +0 -28
  201. package/dist/lib/patterns/aws/multiEnvironmentOrganisation.d.ts +0 -33
  202. package/dist/lib/patterns/aws/multiEnvironmentOrganisation.js +0 -107
  203. package/dist/lib/patterns/aws/webApp.d.ts +0 -17
  204. package/dist/lib/patterns/aws/webApp.js +0 -36
  205. package/dist/lib/resources/aws/compute/__tests__/fargate.test.d.ts +0 -1
  206. package/dist/lib/resources/aws/compute/__tests__/fargate.test.js +0 -21
  207. package/dist/lib/resources/aws/compute/fargate.d.ts +0 -23
  208. package/dist/lib/resources/aws/compute/fargate.js +0 -50
  209. package/dist/lib/resources/aws/constant/__tests__/vpc.test.d.ts +0 -1
  210. package/dist/lib/resources/aws/constant/__tests__/vpc.test.js +0 -13
  211. package/dist/lib/resources/aws/iam/assignment.js +0 -13
  212. package/dist/lib/resources/aws/iam/group.js +0 -15
  213. package/dist/lib/resources/aws/iam/iamRole.d.ts +0 -5
  214. package/dist/lib/resources/aws/iam/iamRole.js +0 -18
  215. package/dist/lib/resources/aws/iam/permissionSet.js +0 -13
  216. /package/dist/lib/resources/aws/iam/{assignment.d.ts → identityCenter/assignment.d.ts} +0 -0
  217. /package/dist/lib/resources/aws/iam/{group.d.ts → identityCenter/group.d.ts} +0 -0
  218. /package/dist/lib/resources/aws/iam/{permissionSet.d.ts → identityCenter/permissionSet.d.ts} +0 -0
@@ -0,0 +1,352 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScalingType = void 0;
4
+ const aws_ecs_1 = require("aws-cdk-lib/aws-ecs");
5
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
6
+ const constructs_1 = require("constructs");
7
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
8
+ const aws_elasticloadbalancingv2_1 = require("aws-cdk-lib/aws-elasticloadbalancingv2");
9
+ const tagResource_1 = require("../../../utils/tagResource");
10
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
11
+ const aws_applicationautoscaling_1 = require("aws-cdk-lib/aws-applicationautoscaling");
12
+ const aws_ecs_2 = require("aws-cdk-lib/aws-ecs");
13
+ const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
14
+ const aws_certificatemanager_1 = require("aws-cdk-lib/aws-certificatemanager");
15
+ const aws_route53_1 = require("aws-cdk-lib/aws-route53");
16
+ const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets");
17
+ const aws_ecr_1 = require("aws-cdk-lib/aws-ecr");
18
+ const aws_autoscaling_1 = require("aws-cdk-lib/aws-autoscaling");
19
+ const securityGroup_1 = require("../iam/securityGroup");
20
+ const awsCustomResource_1 = require("../utilities/awsCustomResource");
21
+ const custom_resources_1 = require("aws-cdk-lib/custom-resources");
22
+ const cfnOutput_1 = require("../utilities/cfnOutput");
23
+ var ScalingType;
24
+ (function (ScalingType) {
25
+ ScalingType["CPU"] = "ECSServiceAverageCPUUtilization";
26
+ ScalingType["MEMORY"] = "ECSServiceAverageMemoryUtilization";
27
+ })(ScalingType = exports.ScalingType || (exports.ScalingType = {}));
28
+ class Ec2Cluster extends constructs_1.Construct {
29
+ constructor(scope, id, props) {
30
+ super(scope, id);
31
+ this.secrets = {};
32
+ this.addCluster(props);
33
+ this.addAutoScalingGroup(props);
34
+ this.addSecrets(props);
35
+ this.addExecutionRole(props);
36
+ this.addTaskDefinition(props);
37
+ this.addContainerDefinition(props);
38
+ this.addEc2Service(props);
39
+ this.addLoadBalancer(props);
40
+ this.removeAutoScalingGroup();
41
+ this.addLoadBalancerListener(props);
42
+ this.registerLoadBalancerTargets(props);
43
+ if (!!props.parentDomain)
44
+ this.addHostedZone(props);
45
+ }
46
+ addCluster(props) {
47
+ this.cluster = new aws_ecs_1.Cluster(this, `${props.clusterName}`, {
48
+ vpc: props.vpc,
49
+ clusterName: props.clusterName,
50
+ containerInsights: true
51
+ });
52
+ (0, tagResource_1.default)(this.cluster, props.tags);
53
+ }
54
+ addAutoScalingGroup(props) {
55
+ this.asgSecurityGroup = new securityGroup_1.SecurityGroup(this, `AsgSecurityGroup`, {
56
+ vpc: this.cluster.vpc,
57
+ description: `Security group for the ${props.clusterName} auto scaling group`
58
+ });
59
+ // Allows the asgSecurityGroup to talk to the Database on port 5432
60
+ if (props.databaseConnection) {
61
+ this.asgSecurityGroup.connections.allowTo(props.databaseConnection, aws_ec2_1.Port.POSTGRES);
62
+ }
63
+ this.autoScalingGroup = new aws_autoscaling_1.AutoScalingGroup(this, "AutoScalingGroup", {
64
+ autoScalingGroupName: `${props.clusterName}AutoScalingGroup`,
65
+ vpc: this.cluster.vpc,
66
+ vpcSubnets: {
67
+ subnetType: aws_ec2_1.SubnetType.PUBLIC
68
+ },
69
+ securityGroup: this.asgSecurityGroup,
70
+ minCapacity: 1,
71
+ maxCapacity: 1,
72
+ instanceType: new aws_ec2_1.InstanceType("t3.micro"),
73
+ capacityRebalance: true,
74
+ instanceMonitoring: aws_autoscaling_1.Monitoring.BASIC,
75
+ machineImage: aws_ecs_1.EcsOptimizedImage.amazonLinux2(aws_ecs_1.AmiHardwareType.STANDARD)
76
+ });
77
+ (0, tagResource_1.default)(this.autoScalingGroup, props.tags);
78
+ this.asgCapacityProvider = new aws_ecs_1.AsgCapacityProvider(this, "AsgCapacityProvider", {
79
+ autoScalingGroup: this.autoScalingGroup
80
+ });
81
+ (0, tagResource_1.default)(this.asgCapacityProvider, props.tags);
82
+ this.cluster.addAsgCapacityProvider(this.asgCapacityProvider);
83
+ }
84
+ addSecrets(props) {
85
+ // Container Secrets
86
+ const containerSecret = aws_secretsmanager_1.Secret.fromSecretNameV2(this, `${props.clusterName}Secret`, `/${props.clusterName}/${props.serviceName}`);
87
+ for (const secretField in props.containerSecrets) {
88
+ this.secrets[secretField] = aws_ecs_2.Secret.fromSecretsManager(containerSecret, secretField);
89
+ }
90
+ }
91
+ addExecutionRole(props) {
92
+ this.executionRole = new aws_iam_1.Role(this, `${props.serviceName}ExecutionRole`, {
93
+ roleName: `${props.serviceName}ExecutionRole`,
94
+ description: `${props.serviceName} Execution Role`,
95
+ managedPolicies: [
96
+ {
97
+ managedPolicyArn: "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
98
+ }
99
+ ],
100
+ inlinePolicies: {
101
+ ["readSecrets"]: new aws_iam_1.PolicyDocument({
102
+ statements: [
103
+ new aws_iam_1.PolicyStatement({
104
+ actions: [
105
+ "secretsmanager:GetSecretValue",
106
+ "secretsmanager:DescribeSecret"
107
+ ],
108
+ resources: ["*"] // TODO: Set this to the secret ARN
109
+ })
110
+ ]
111
+ }),
112
+ ["decryptSecrets"]: new aws_iam_1.PolicyDocument({
113
+ statements: [
114
+ new aws_iam_1.PolicyStatement({
115
+ actions: ["kms:Decrypt"],
116
+ resources: ["*"] // TODO: Set this to the KMS Arn
117
+ })
118
+ ]
119
+ }),
120
+ ["ecsExecuteCommand"]: new aws_iam_1.PolicyDocument({
121
+ statements: [
122
+ new aws_iam_1.PolicyStatement({
123
+ actions: [
124
+ "ssmmessages:CreateControlChannel",
125
+ "ssmmessages:CreateDataChannel",
126
+ "ssmmessages:OpenControlChannel",
127
+ "ssmmessages:OpenDataChannel"
128
+ ],
129
+ effect: aws_iam_1.Effect.ALLOW,
130
+ resources: ["*"]
131
+ })
132
+ ]
133
+ })
134
+ },
135
+ assumedBy: new aws_iam_1.CompositePrincipal(new aws_iam_1.ServicePrincipal("ecs-tasks.amazonaws.com"))
136
+ });
137
+ }
138
+ addTaskDefinition(props) {
139
+ this.taskDefinition = new aws_ecs_1.Ec2TaskDefinition(this, `${props.serviceName}TaskDefinition`, {
140
+ // ipcMode: IpcMode.HOST, TODO: Figure out if we want this to allow easy inter-container communication
141
+ executionRole: this.executionRole,
142
+ taskRole: new aws_iam_1.Role(this, `${props.serviceName}TaskRole`, {
143
+ roleName: `${props.serviceName}TaskRole`,
144
+ description: `${props.serviceName} Task Role`,
145
+ inlinePolicies: props.taskRoleInlinePolicies,
146
+ managedPolicies: props.taskRoleManagedPolicies,
147
+ assumedBy: new aws_iam_1.CompositePrincipal(new aws_iam_1.ServicePrincipal("ecs-tasks.amazonaws.com"))
148
+ })
149
+ });
150
+ (0, tagResource_1.default)(this.taskDefinition, props.tags);
151
+ }
152
+ addContainerDefinition(props) {
153
+ this.containerDefinition = this.taskDefinition.addContainer(`${props.serviceName}ContainerDefinition`, {
154
+ image: this.getImage(props),
155
+ memoryLimitMiB: 400,
156
+ containerName: props.serviceName,
157
+ environment: {
158
+ ...props.containerEnvironment
159
+ },
160
+ entryPoint: props.containerEntryPoint || ["node", "main.js"],
161
+ command: props.containerCommand || [`${props.containerPort}`],
162
+ secrets: {
163
+ ...this.secrets
164
+ },
165
+ //todo: provide health check options
166
+ // healthCheck: {
167
+ // command: [
168
+ // "CMD-SHELL",
169
+ // `timeout 10s /bin/sh -c ':> /dev/tcp/127.0.0.1/${props.containerPort}' || exit 1`
170
+ // ]
171
+ // },
172
+ logging: new aws_ecs_1.AwsLogDriver({
173
+ streamPrefix: `/ecs/${props.clusterName}/${props.serviceName}`,
174
+ logRetention: 14
175
+ }),
176
+ portMappings: props.containerPort
177
+ ? [{ containerPort: props.containerPort, hostPort: 0 }]
178
+ : [{ containerPort: 80, hostPort: 0 }]
179
+ });
180
+ (0, tagResource_1.default)(this.containerDefinition, props.tags);
181
+ }
182
+ addEc2Service(props) {
183
+ this.ec2Service = new aws_ecs_1.Ec2Service(this, `${props.serviceName}Ec2Service`, {
184
+ circuitBreaker: { rollback: true },
185
+ cluster: this.cluster,
186
+ desiredCount: 1,
187
+ enableECSManagedTags: true,
188
+ enableExecuteCommand: true,
189
+ healthCheckGracePeriod: aws_cdk_lib_1.Duration.seconds(120),
190
+ serviceName: `${props.serviceName}`,
191
+ taskDefinition: this.taskDefinition,
192
+ placementStrategies: [aws_ecs_1.PlacementStrategy.spreadAcrossInstances()]
193
+ });
194
+ (0, tagResource_1.default)(this.ec2Service, props.tags);
195
+ }
196
+ addScalingPolicy(props) {
197
+ this.scalingPolicy = new aws_applicationautoscaling_1.TargetTrackingScalingPolicy(this, `${props.serviceName}ScalingPolicy`, {
198
+ policyName: `${props.serviceName}ScalingPolicy`,
199
+ scalingTarget: new aws_applicationautoscaling_1.ScalableTarget(this, `${props.serviceName}scalableTarget`, {
200
+ maxCapacity: 1,
201
+ minCapacity: 1,
202
+ resourceId: `service/${this.cluster.clusterName}/${this.ec2Service.serviceName}`,
203
+ scalableDimension: "ecs:service:DesiredCount",
204
+ serviceNamespace: aws_applicationautoscaling_1.ServiceNamespace.ECS
205
+ }),
206
+ targetValue: 50,
207
+ scaleOutCooldown: aws_cdk_lib_1.Duration.seconds(60),
208
+ scaleInCooldown: aws_cdk_lib_1.Duration.seconds(60),
209
+ predefinedMetric: props.scalingType == ScalingType.MEMORY
210
+ ? aws_applicationautoscaling_1.PredefinedMetric.ECS_SERVICE_AVERAGE_MEMORY_UTILIZATION
211
+ : aws_applicationautoscaling_1.PredefinedMetric.ECS_SERVICE_AVERAGE_CPU_UTILIZATION
212
+ });
213
+ }
214
+ addLoadBalancer(props) {
215
+ this.loadBalancerSecurityGroup = new securityGroup_1.SecurityGroup(this, `LoadBalancerSecurityGroup`, {
216
+ vpc: this.cluster.vpc,
217
+ description: `Security group for the ${props.clusterName} load balancer`
218
+ });
219
+ this.loadBalancerSecurityGroup.connections.allowTo(this.asgSecurityGroup, aws_ec2_1.Port.allTcp());
220
+ // this.loadBalancerSecurityGroup.addEgressRule(
221
+ // this.asgSecurityGroup,
222
+ // Port.allTcp()
223
+ // );
224
+ this.loadBalancer = new aws_elasticloadbalancingv2_1.ApplicationLoadBalancer(this, `${props.clusterName}LoadBalancer`, {
225
+ vpc: this.cluster.vpc,
226
+ internetFacing: true,
227
+ securityGroup: this.loadBalancerSecurityGroup,
228
+ loadBalancerName: `${props.serviceName}LoadBalancer`,
229
+ vpcSubnets: {
230
+ subnetType: aws_ec2_1.SubnetType.PUBLIC
231
+ }
232
+ });
233
+ (0, tagResource_1.default)(this.loadBalancer, props.tags);
234
+ // Allow connections to ephemeral ports
235
+ this.asgSecurityGroup.connections.allowFrom(this.loadBalancerSecurityGroup, aws_ec2_1.Port.tcpRange(49152, 65535));
236
+ }
237
+ removeAutoScalingGroup() {
238
+ new awsCustomResource_1.AwsCustomResource(this, "deleteAutoscalingGroup", {
239
+ functionName: "deleteAutoscalingGroup",
240
+ onDelete: {
241
+ service: "AutoScaling",
242
+ action: "DeleteAutoScalingGroupCommand",
243
+ parameters: {
244
+ AutoScalingGroupName: this.autoScalingGroup.autoScalingGroupName,
245
+ ForceDelete: true
246
+ },
247
+ physicalResourceId: custom_resources_1.PhysicalResourceId.of("deleteAutoscalingGroup")
248
+ }
249
+ });
250
+ }
251
+ // addLoadBalancerListener(props: Ec2ClusterProps) {
252
+ // if (!!this.certificate) {
253
+ // this.loadBalancerListener = this.loadBalancer.addListener(
254
+ // `${props.serviceName}Listener`,
255
+ // {
256
+ // port: props.protocol == Protocol.HTTP ? 80 : 443,
257
+ // certificates: [this.certificate]
258
+ // }
259
+ // );
260
+ // } else {
261
+ // this.loadBalancerListener = this.loadBalancer.addListener(
262
+ // `${props.serviceName}Listener`,
263
+ // {
264
+ // port: props.protocol == Protocol.HTTP ? 80 : 443
265
+ // }
266
+ // );
267
+ // }
268
+ // tagResource(this.loadBalancerListener, props.tags);
269
+ // }
270
+ addLoadBalancerListener(props) {
271
+ let addListenerProps = {};
272
+ if (!!props.parentDomain) {
273
+ this.certificate = new aws_certificatemanager_1.Certificate(this, `${props.serviceName}Certificate`, {
274
+ domainName: `${props.serviceName}.${props.clusterName}.${props.parentDomain}`,
275
+ validation: aws_certificatemanager_1.CertificateValidation.fromDns(this.hostedZone)
276
+ });
277
+ addListenerProps = {
278
+ port: 443,
279
+ certificates: [this.certificate]
280
+ };
281
+ }
282
+ else {
283
+ addListenerProps = {
284
+ port: 80
285
+ };
286
+ }
287
+ this.loadBalancerListener = this.loadBalancer.addListener(`${props.serviceName}Listener`, addListenerProps);
288
+ (0, tagResource_1.default)(this.loadBalancerListener, props.tags);
289
+ }
290
+ addHostedZone(props) {
291
+ if (!props.parentDomain)
292
+ return;
293
+ this.hostedZone = aws_route53_1.HostedZone.fromHostedZoneAttributes(this, "hostedZone", {
294
+ hostedZoneId: aws_cdk_lib_1.Fn.importValue(`${props.parentDomain.split(".").join("")}HostedZoneId`),
295
+ zoneName: props.parentDomain
296
+ });
297
+ this.aRecord = new aws_route53_1.ARecord(this, `${props.serviceName}.${props.clusterName}.${props.parentDomain}ARecord`, {
298
+ recordName: `${props.serviceName}.${props.clusterName}.${props.parentDomain}`,
299
+ zone: this.hostedZone,
300
+ target: aws_route53_1.RecordTarget.fromAlias(new aws_route53_targets_1.LoadBalancerTarget(this.loadBalancer))
301
+ });
302
+ new cfnOutput_1.CfnOutput(this, `${props.serviceName}ARecord`, {
303
+ key: `${props.serviceName}ARecord`,
304
+ value: this.aRecord.domainName,
305
+ exportName: `${props.serviceName}ARecord`
306
+ });
307
+ }
308
+ registerLoadBalancerTargets(props) {
309
+ this.ec2Service.registerLoadBalancerTargets({
310
+ containerName: this.containerDefinition.containerName,
311
+ containerPort: this.containerDefinition.containerPort,
312
+ newTargetGroupId: `${props.serviceName}TargetGroup`,
313
+ listener: aws_ecs_1.ListenerConfig.applicationListener(this.loadBalancerListener, {
314
+ port: props.containerPort,
315
+ protocol: aws_elasticloadbalancingv2_1.ApplicationProtocol.HTTP,
316
+ healthCheck: {
317
+ interval: aws_cdk_lib_1.Duration.seconds(30),
318
+ healthyThresholdCount: 3,
319
+ unhealthyThresholdCount: 3,
320
+ path: props.healthCheckPath || "/",
321
+ port: "traffic-port",
322
+ timeout: aws_cdk_lib_1.Duration.seconds(15)
323
+ }
324
+ })
325
+ });
326
+ }
327
+ getImage(props) {
328
+ if (!props.ecrRepository)
329
+ return aws_ecs_1.ContainerImage.fromRegistry("amazon/amazon-ecs-sample");
330
+ if (typeof props.ecrRepository === "string")
331
+ return aws_ecs_1.ContainerImage.fromEcrRepository(aws_ecr_1.Repository.fromRepositoryName(this, "ecrRepository", props.ecrRepository), "latest");
332
+ if (props.ecrRepository instanceof aws_ecs_1.ContainerImage)
333
+ return props.ecrRepository;
334
+ if (props.ecrRepository instanceof aws_ecr_1.Repository) {
335
+ return aws_ecs_1.ContainerImage.fromEcrRepository(props.ecrRepository, "latest");
336
+ }
337
+ return aws_ecs_1.ContainerImage.fromRegistry("amazon/amazon-ecs-sample");
338
+ }
339
+ static build(id, props) {
340
+ return (sb) => {
341
+ const newProps = {
342
+ ...props,
343
+ ...{
344
+ vpc: sb.getNetwork() || props.vpc
345
+ }
346
+ };
347
+ return new this(sb.getStack(), id, newProps);
348
+ };
349
+ }
350
+ }
351
+ exports.default = Ec2Cluster;
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzRnJlZVRpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc0ZyZWVUaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQWE2QjtBQUM3QixpREFPNkI7QUFDN0IsMkNBQXVDO0FBRXZDLDZDQUF3RDtBQUN4RCx1RkFLZ0Q7QUFDaEQsNERBQXFEO0FBQ3JELGlEQVE2QjtBQUM3Qix1RkFLZ0Q7QUFDaEQsaURBQTBEO0FBQzFELHVFQUF3RDtBQUN4RCwrRUFHNEM7QUFDNUMseURBS2lDO0FBQ2pDLHlFQUFxRTtBQUNyRSxpREFBaUQ7QUFDakQsaUVBQTJFO0FBRTNFLHdEQUFxRDtBQUNyRCxzRUFBbUU7QUFDbkUsbUVBQWtFO0FBQ2xFLHNEQUFtRDtBQUVuRCxJQUFZLFdBR1g7QUFIRCxXQUFZLFdBQVc7SUFDckIsc0RBQTBELENBQUE7SUFDMUQsNERBQWdFLENBQUE7QUFDbEUsQ0FBQyxFQUhXLFdBQVcsR0FBWCxtQkFBVyxLQUFYLG1CQUFXLFFBR3RCO0FBaUNELE1BQXFCLFVBQVcsU0FBUSxzQkFBUztJQXVCL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBTFgsWUFBTyxHQUVYLEVBQUUsQ0FBQztRQUtMLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFD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RSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFoY0QsNkJBZ2NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXdzTG9nRHJpdmVyLFxuICBDbHVzdGVyIGFzIENka0NsdXN0ZXIsXG4gIENvbnRhaW5lckltYWdlLFxuICBFYzJTZXJ2aWNlLFxuICBFYzJUYXNrRGVmaW5pdGlvbixcbiAgTGlzdGVuZXJDb25maWcsXG4gIFJlcG9zaXRvcnlJbWFnZSxcbiAgQ29udGFpbmVyRGVmaW5pdGlvbixcbiAgUGxhY2VtZW50U3RyYXRlZ3ksXG4gIEFzZ0NhcGFjaXR5UHJvdmlkZXIsXG4gIEVjc09wdGltaXplZEltYWdlLFxuICBBbWlIYXJkd2FyZVR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICBJQ29ubmVjdGFibGUsXG4gIEluc3RhbmNlVHlwZSxcbiAgSVZwYyxcbiAgUG9ydCxcbiAgU3VibmV0VHlwZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFN0YWNrQnVpbGRlciB9IGZyb20gXCIuLi9hd3NTdGFja1wiO1xuaW1wb3J0IHsgRHVyYXRpb24sIEZuLCBTZWNyZXRWYWx1ZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25MaXN0ZW5lcixcbiAgQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsXG4gIEFwcGxpY2F0aW9uUHJvdG9jb2wsXG4gIEJhc2VBcHBsaWNhdGlvbkxpc3RlbmVyUHJvcHNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQgdGFnUmVzb3VyY2UgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3RhZ1Jlc291cmNlXCI7XG5pbXBvcnQge1xuICBDb21wb3NpdGVQcmluY2lwYWwsXG4gIEVmZmVjdCxcbiAgSU1hbmFnZWRQb2xpY3ksXG4gIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIFJvbGUsXG4gIFNlcnZpY2VQcmluY2lwYWxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7XG4gIFByZWRlZmluZWRNZXRyaWMsXG4gIFNjYWxhYmxlVGFyZ2V0LFxuICBTZXJ2aWNlTmFtZXNwYWNlLFxuICBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3lcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcHBsaWNhdGlvbmF1dG9zY2FsaW5nXCI7XG5pbXBvcnQgeyBTZWNyZXQgYXMgRWNzU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlLFxuICBDZXJ0aWZpY2F0ZVZhbGlkYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEFSZWNvcmQsXG4gIEhvc3RlZFpvbmUsXG4gIFJlY29yZFRhcmdldCxcbiAgSUhvc3RlZFpvbmVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCI7XG5pbXBvcnQgeyBMb2FkQmFsYW5jZXJUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyXCI7XG5pbXBvcnQgeyBBdXRvU2NhbGluZ0dyb3VwLCBNb25pdG9yaW5nIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hdXRvc2NhbGluZ1wiO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vaWFtL3NlY3VyaXR5R3JvdXBcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuaW1wb3J0IHsgUGh5c2ljYWxSZXNvdXJjZUlkIH0gZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCIuLi91dGlsaXRpZXMvY2ZuT3V0cHV0XCI7XG5cbmV4cG9ydCBlbnVtIFNjYWxpbmdUeXBlIHtcbiAgQ1BVID0gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX0NQVV9VVElMSVpBVElPTixcbiAgTUVNT1JZID0gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX01FTU9SWV9VVElMSVpBVElPTlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lclNlY3JldCB7XG4gIFtrZXk6IHN0cmluZ106IFNlY3JldFZhbHVlO1xufVxuXG50eXBlIEVjMkNsdXN0ZXJQcm9wcyA9IHtcbiAgZWNyUmVwb3NpdG9yeTogUmVwb3NpdG9yeSB8IFJlcG9zaXRvcnlJbWFnZSB8IHN0cmluZztcbiAgY2x1c3Rlck5hbWU6IHN0cmluZztcbiAgY29udGFpbmVyRW50cnlQb2ludD86IHN0cmluZ1tdO1xuICBjb250YWluZXJDb21tYW5kPzogc3RyaW5nW107XG4gIGNvbnRhaW5lckVudmlyb25tZW50PzogS2V5VmFsdWU7XG4gIGNvbnRhaW5lclNlY3JldHM/OiBDb250YWluZXJTZWNyZXQ7XG4gIC8vIFRPRE86IENvbnRhaW5lciBQb3J0IHNob3VsZCBiZSBzZXQgaW4gcmF3UHJvcHNcbiAgY29udGFpbmVyUG9ydD86IG51bWJlcjtcbiAgY3B1PzogbnVtYmVyO1xuICBkYXRhYmFzZUNvbm5lY3Rpb246IElDb25uZWN0YWJsZTtcbiAgcGFyZW50RG9tYWluPzogc3RyaW5nOyAvLyBUT0RPOiBCcmVhayBvdXQgYSBIVFRQIGFuZCBIVFRQUyBzZXJ2aWNlIHdoZXJlIHRoaXMgaXMgb3B0aW9uYWxcbiAgZGVzaXJlZENvdW50PzogbnVtYmVyO1xuICBoZWFsdGhDaGVja1BhdGg/OiBzdHJpbmc7XG4gIGxpc3RlbmVyUG9ydD86IG51bWJlcjtcbiAgbWVtb3J5TGltaXRNaUI/OiBudW1iZXI7XG4gIHB1YmxpY0xvYWRCYWxhbmNlcj86IGJvb2xlYW47XG4gIHNjYWxpbmdUeXBlPzogU2NhbGluZ1R5cGU7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIHRhZ3M6IEtleVZhbHVlO1xuICB0YXNrUm9sZUlubGluZVBvbGljaWVzPzoge1xuICAgIFtuYW1lOiBzdHJpbmddOiBQb2xpY3lEb2N1bWVudDtcbiAgfTtcbiAgdGFza1JvbGVNYW5hZ2VkUG9saWNpZXM/OiBJTWFuYWdlZFBvbGljeVtdO1xuICB2cGM/OiBJVnBjO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWMyQ2x1c3RlciBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBjbHVzdGVyOiBDZGtDbHVzdGVyO1xuICBwcml2YXRlIGF1dG9TY2FsaW5nR3JvdXA6IEF1dG9TY2FsaW5nR3JvdXA7XG4gIHByaXZhdGUgYXNnU2VjdXJpdHlHcm91cDogU2VjdXJpdHlHcm91cDtcbiAgcHJpdmF0ZSBhc2dDYXBhY2l0eVByb3ZpZGVyOiBBc2dDYXBhY2l0eVByb3ZpZGVyO1xuICBwcml2YXRlIGxvYWRCYWxhbmNlcjogQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIHByaXZhdGUgbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cDogU2VjdXJpdHlHcm91cDtcbiAgcHJpdmF0ZSBsb2FkQmFsYW5jZXJMaXN0ZW5lcjogQXBwbGljYXRpb25MaXN0ZW5lcjtcbiAgcHJpdmF0ZSBleGVjdXRpb25Sb2xlOiBSb2xlO1xuICBwcml2YXRlIHRhc2tEZWZpbml0aW9uOiBFYzJUYXNrRGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBjb250YWluZXJEZWZpbml0aW9uOiBDb250YWluZXJEZWZpbml0aW9uO1xuICBwcml2YXRlIGVjMlNlcnZpY2U6IEVjMlNlcnZpY2U7XG4gIHByaXZhdGUgc2NhbGluZ1BvbGljeTogVGFyZ2V0VHJhY2tpbmdTY2FsaW5nUG9saWN5O1xuICBwcml2YXRlIGhvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICBwcml2YXRlIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZTtcbiAgcHJpdmF0ZSBhUmVjb3JkOiBBUmVjb3JkO1xuXG4gIHByaXZhdGUgc2VjcmV0czoge1xuICAgIFtrZXk6IHN0cmluZ106IEVjc1NlY3JldDtcbiAgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5hZGRDbHVzdGVyKHByb3BzKTtcbiAgICB0aGlzLmFkZEF1dG9TY2FsaW5nR3JvdXAocHJvcHMpO1xuICAgIHRoaXMuYWRkU2VjcmV0cyhwcm9wcyk7XG4gICAgdGhpcy5hZGRFeGVjdXRpb25Sb2xlKHByb3BzKTtcbiAgICB0aGlzLmFkZFRhc2tEZWZpbml0aW9uKHByb3BzKTtcbiAgICB0aGlzLmFkZENvbnRhaW5lckRlZmluaXRpb24ocHJvcHMpO1xuICAgIHRoaXMuYWRkRWMyU2VydmljZShwcm9wcyk7XG4gICAgdGhpcy5hZGRMb2FkQmFsYW5jZXIocHJvcHMpO1xuICAgIHRoaXMucmVtb3ZlQXV0b1NjYWxpbmdHcm91cCgpO1xuICAgIHRoaXMuYWRkTG9hZEJhbGFuY2VyTGlzdGVuZXIocHJvcHMpO1xuICAgIHRoaXMucmVnaXN0ZXJMb2FkQmFsYW5jZXJUYXJnZXRzKHByb3BzKTtcblxuICAgIGlmICghIXByb3BzLnBhcmVudERvbWFpbikgdGhpcy5hZGRIb3N0ZWRab25lKHByb3BzKTtcbiAgfVxuXG4gIGFkZENsdXN0ZXIocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuY2x1c3RlciA9IG5ldyBDZGtDbHVzdGVyKHRoaXMsIGAke3Byb3BzLmNsdXN0ZXJOYW1lfWAsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgY2x1c3Rlck5hbWU6IHByb3BzLmNsdXN0ZXJOYW1lLFxuICAgICAgY29udGFpbmVySW5zaWdodHM6IHRydWVcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLmNsdXN0ZXIsIHByb3BzLnRhZ3MpO1xuICB9XG5cbiAgYWRkQXV0b1NjYWxpbmdHcm91cChwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAodGhpcywgYEFzZ1NlY3VyaXR5R3JvdXBgLCB7XG4gICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciB0aGUgJHtwcm9wcy5jbHVzdGVyTmFtZX0gYXV0byBzY2FsaW5nIGdyb3VwYFxuICAgIH0pO1xuXG4gICAgLy8gQWxsb3dzIHRoZSBhc2dTZWN1cml0eUdyb3VwIHRvIHRhbGsgdG8gdGhlIERhdGFiYXNlIG9uIHBvcnQgNTQzMlxuICAgIGlmIChwcm9wcy5kYXRhYmFzZUNvbm5lY3Rpb24pIHtcbiAgICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cC5jb25uZWN0aW9ucy5hbGxvd1RvKFxuICAgICAgICBwcm9wcy5kYXRhYmFzZUNvbm5lY3Rpb24sXG4gICAgICAgIFBvcnQuUE9TVEdSRVNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRvU2NhbGluZ0dyb3VwID0gbmV3IEF1dG9TY2FsaW5nR3JvdXAodGhpcywgXCJBdXRvU2NhbGluZ0dyb3VwXCIsIHtcbiAgICAgIGF1dG9TY2FsaW5nR3JvdXBOYW1lOiBgJHtwcm9wcy5jbHVzdGVyTmFtZX1BdXRvU2NhbGluZ0dyb3VwYCxcbiAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgIH0sXG4gICAgICBzZWN1cml0eUdyb3VwOiB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAsXG4gICAgICBtaW5DYXBhY2l0eTogMSxcbiAgICAgIG1heENhcGFjaXR5OiAxLFxuICAgICAgaW5zdGFuY2VUeXBlOiBuZXcgSW5zdGFuY2VUeXBlKFwidDMubWljcm9cIiksXG4gICAgICBjYXBhY2l0eVJlYmFsYW5jZTogdHJ1ZSxcbiAgICAgIGluc3RhbmNlTW9uaXRvcmluZzogTW9uaXRvcmluZy5CQVNJQyxcbiAgICAgIG1hY2hpbmVJbWFnZTogRWNzT3B0aW1pemVkSW1hZ2UuYW1hem9uTGludXgyKEFtaUhhcmR3YXJlVHlwZS5TVEFOREFSRClcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLmF1dG9TY2FsaW5nR3JvdXAsIHByb3BzLnRhZ3MpO1xuXG4gICAgdGhpcy5hc2dDYXBhY2l0eVByb3ZpZGVyID0gbmV3IEFzZ0NhcGFjaXR5UHJvdmlkZXIoXG4gICAgICB0aGlzLFxuICAgICAgXCJBc2dDYXBhY2l0eVByb3ZpZGVyXCIsXG4gICAgICB7XG4gICAgICAgIGF1dG9TY2FsaW5nR3JvdXA6IHRoaXMuYXV0b1NjYWxpbmdHcm91cFxuICAgICAgfVxuICAgICk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5hc2dDYXBhY2l0eVByb3ZpZGVyLCBwcm9wcy50YWdzKTtcblxuICAgIHRoaXMuY2x1c3Rlci5hZGRBc2dDYXBhY2l0eVByb3ZpZGVyKHRoaXMuYXNnQ2FwYWNpdHlQcm92aWRlcik7XG4gIH1cblxuICBhZGRTZWNyZXRzKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICAvLyBDb250YWluZXIgU2VjcmV0c1xuICAgIGNvbnN0IGNvbnRhaW5lclNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfVNlY3JldGAsXG4gICAgICBgLyR7cHJvcHMuY2x1c3Rlck5hbWV9LyR7cHJvcHMuc2VydmljZU5hbWV9YFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHNlY3JldEZpZWxkIGluIHByb3BzLmNvbnRhaW5lclNlY3JldHMpIHtcbiAgICAgIHRoaXMuc2VjcmV0c1tzZWNyZXRGaWVsZF0gPSBFY3NTZWNyZXQuZnJvbVNlY3JldHNNYW5hZ2VyKFxuICAgICAgICBjb250YWluZXJTZWNyZXQsXG4gICAgICAgIHNlY3JldEZpZWxkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZEV4ZWN1dGlvblJvbGUocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuZXhlY3V0aW9uUm9sZSA9IG5ldyBSb2xlKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfUV4ZWN1dGlvblJvbGVgLCB7XG4gICAgICByb2xlTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9RXhlY3V0aW9uUm9sZWAsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7cHJvcHMuc2VydmljZU5hbWV9IEV4ZWN1dGlvbiBSb2xlYCxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICB7XG4gICAgICAgICAgbWFuYWdlZFBvbGljeUFybjpcbiAgICAgICAgICAgIFwiYXJuOmF3czppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FtYXpvbkVDU1Rhc2tFeGVjdXRpb25Sb2xlUG9saWN5XCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIFtcInJlYWRTZWNyZXRzXCJdOiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgXCJzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZVwiLFxuICAgICAgICAgICAgICAgIFwic2VjcmV0c21hbmFnZXI6RGVzY3JpYmVTZWNyZXRcIlxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0gLy8gVE9ETzogU2V0IHRoaXMgdG8gdGhlIHNlY3JldCBBUk5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgW1wiZGVjcnlwdFNlY3JldHNcIl06IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCJdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0gLy8gVE9ETzogU2V0IHRoaXMgdG8gdGhlIEtNUyBBcm5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgW1wiZWNzRXhlY3V0ZUNvbW1hbmRcIl06IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcInNzbW1lc3NhZ2VzOkNyZWF0ZUNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpDcmVhdGVEYXRhQ2hhbm5lbFwiLFxuICAgICAgICAgICAgICAgIFwic3NtbWVzc2FnZXM6T3BlbkNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpPcGVuRGF0YUNoYW5uZWxcIlxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBhc3N1bWVkQnk6IG5ldyBDb21wb3NpdGVQcmluY2lwYWwoXG4gICAgICAgIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiZWNzLXRhc2tzLmFtYXpvbmF3cy5jb21cIilcbiAgICAgIClcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFRhc2tEZWZpbml0aW9uKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICB0aGlzLnRhc2tEZWZpbml0aW9uID0gbmV3IEVjMlRhc2tEZWZpbml0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfVRhc2tEZWZpbml0aW9uYCxcbiAgICAgIHtcbiAgICAgICAgLy8gaXBjTW9kZTogSXBjTW9kZS5IT1NULCBUT0RPOiBGaWd1cmUgb3V0IGlmIHdlIHdhbnQgdGhpcyB0byBhbGxvdyBlYXN5IGludGVyLWNvbnRhaW5lciBjb21tdW5pY2F0aW9uXG4gICAgICAgIGV4ZWN1dGlvblJvbGU6IHRoaXMuZXhlY3V0aW9uUm9sZSxcbiAgICAgICAgdGFza1JvbGU6IG5ldyBSb2xlKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfVRhc2tSb2xlYCwge1xuICAgICAgICAgIHJvbGVOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1UYXNrUm9sZWAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke3Byb3BzLnNlcnZpY2VOYW1lfSBUYXNrIFJvbGVgLFxuICAgICAgICAgIGlubGluZVBvbGljaWVzOiBwcm9wcy50YXNrUm9sZUlubGluZVBvbGljaWVzLFxuICAgICAgICAgIG1hbmFnZWRQb2xpY2llczogcHJvcHMudGFza1JvbGVNYW5hZ2VkUG9saWNpZXMsXG4gICAgICAgICAgYXNzdW1lZEJ5OiBuZXcgQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICAgICAgbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJlY3MtdGFza3MuYW1hem9uYXdzLmNvbVwiKVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApO1xuICAgIHRhZ1Jlc291cmNlKHRoaXMudGFza0RlZmluaXRpb24sIHByb3BzLnRhZ3MpO1xuICB9XG5cbiAgYWRkQ29udGFpbmVyRGVmaW5pdGlvbihwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5jb250YWluZXJEZWZpbml0aW9uID0gdGhpcy50YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoXG4gICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1Db250YWluZXJEZWZpbml0aW9uYCxcbiAgICAgIHtcbiAgICAgICAgaW1hZ2U6IHRoaXMuZ2V0SW1hZ2UocHJvcHMpLFxuICAgICAgICBtZW1vcnlMaW1pdE1pQjogNDAwLFxuICAgICAgICBjb250YWluZXJOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAuLi5wcm9wcy5jb250YWluZXJFbnZpcm9ubWVudFxuICAgICAgICB9LFxuICAgICAgICBlbnRyeVBvaW50OiBwcm9wcy5jb250YWluZXJFbnRyeVBvaW50IHx8IFtcIm5vZGVcIiwgXCJtYWluLmpzXCJdLFxuICAgICAgICBjb21tYW5kOiBwcm9wcy5jb250YWluZXJDb21tYW5kIHx8IFtgJHtwcm9wcy5jb250YWluZXJQb3J0fWBdLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgLi4udGhpcy5zZWNyZXRzXG4gICAgICAgIH0sXG4gICAgICAgIC8vdG9kbzogcHJvdmlkZSBoZWFsdGggY2hlY2sgb3B0aW9uc1xuICAgICAgICAvLyBoZWFsdGhDaGVjazoge1xuICAgICAgICAvLyAgIGNvbW1hbmQ6IFtcbiAgICAgICAgLy8gICAgIFwiQ01ELVNIRUxMXCIsXG4gICAgICAgIC8vICAgICBgdGltZW91dCAxMHMgL2Jpbi9zaCAtYyAnOj4gL2Rldi90Y3AvMTI3LjAuMC4xLyR7cHJvcHMuY29udGFpbmVyUG9ydH0nIHx8IGV4aXQgMWBcbiAgICAgICAgLy8gICBdXG4gICAgICAgIC8vIH0sXG4gICAgICAgIGxvZ2dpbmc6IG5ldyBBd3NMb2dEcml2ZXIoe1xuICAgICAgICAgIHN0cmVhbVByZWZpeDogYC9lY3MvJHtwcm9wcy5jbHVzdGVyTmFtZX0vJHtwcm9wcy5zZXJ2aWNlTmFtZX1gLFxuICAgICAgICAgIGxvZ1JldGVudGlvbjogMTRcbiAgICAgICAgfSksXG4gICAgICAgIHBvcnRNYXBwaW5nczogcHJvcHMuY29udGFpbmVyUG9ydFxuICAgICAgICAgID8gW3sgY29udGFpbmVyUG9ydDogcHJvcHMuY29udGFpbmVyUG9ydCwgaG9zdFBvcnQ6IDAgfV1cbiAgICAgICAgICA6IFt7IGNvbnRhaW5lclBvcnQ6IDgwLCBob3N0UG9ydDogMCB9XVxuICAgICAgfVxuICAgICk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5jb250YWluZXJEZWZpbml0aW9uLCBwcm9wcy50YWdzKTtcbiAgfVxuXG4gIGFkZEVjMlNlcnZpY2UocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuZWMyU2VydmljZSA9IG5ldyBFYzJTZXJ2aWNlKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfUVjMlNlcnZpY2VgLCB7XG4gICAgICBjaXJjdWl0QnJlYWtlcjogeyByb2xsYmFjazogdHJ1ZSB9LFxuICAgICAgY2x1c3RlcjogdGhpcy5jbHVzdGVyLFxuICAgICAgZGVzaXJlZENvdW50OiAxLFxuICAgICAgZW5hYmxlRUNTTWFuYWdlZFRhZ3M6IHRydWUsXG4gICAgICBlbmFibGVFeGVjdXRlQ29tbWFuZDogdHJ1ZSxcbiAgICAgIGhlYWx0aENoZWNrR3JhY2VQZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoMTIwKSxcbiAgICAgIHNlcnZpY2VOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1gLFxuICAgICAgdGFza0RlZmluaXRpb246IHRoaXMudGFza0RlZmluaXRpb24sXG4gICAgICBwbGFjZW1lbnRTdHJhdGVnaWVzOiBbUGxhY2VtZW50U3RyYXRlZ3kuc3ByZWFkQWNyb3NzSW5zdGFuY2VzKCldXG4gICAgfSk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5lYzJTZXJ2aWNlLCBwcm9wcy50YWdzKTtcbiAgfVxuXG4gIGFkZFNjYWxpbmdQb2xpY3kocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIHRoaXMuc2NhbGluZ1BvbGljeSA9IG5ldyBUYXJnZXRUcmFja2luZ1NjYWxpbmdQb2xpY3koXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9U2NhbGluZ1BvbGljeWAsXG4gICAgICB7XG4gICAgICAgIHBvbGljeU5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfVNjYWxpbmdQb2xpY3lgLFxuICAgICAgICBzY2FsaW5nVGFyZ2V0OiBuZXcgU2NhbGFibGVUYXJnZXQoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1zY2FsYWJsZVRhcmdldGAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWF4Q2FwYWNpdHk6IDEsXG4gICAgICAgICAgICBtaW5DYXBhY2l0eTogMSxcbiAgICAgICAgICAgIHJlc291cmNlSWQ6IGBzZXJ2aWNlLyR7dGhpcy5jbHVzdGVyLmNsdXN0ZXJOYW1lfS8ke3RoaXMuZWMyU2VydmljZS5zZXJ2aWNlTmFtZX1gLFxuICAgICAgICAgICAgc2NhbGFibGVEaW1lbnNpb246IFwiZWNzOnNlcnZpY2U6RGVzaXJlZENvdW50XCIsXG4gICAgICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBTZXJ2aWNlTmFtZXNwYWNlLkVDU1xuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgdGFyZ2V0VmFsdWU6IDUwLFxuICAgICAgICBzY2FsZU91dENvb2xkb3duOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgICAgc2NhbGVJbkNvb2xkb3duOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgICAgcHJlZGVmaW5lZE1ldHJpYzpcbiAgICAgICAgICBwcm9wcy5zY2FsaW5nVHlwZSA9PSBTY2FsaW5nVHlwZS5NRU1PUllcbiAgICAgICAgICAgID8gUHJlZGVmaW5lZE1ldHJpYy5FQ1NfU0VSVklDRV9BVkVSQUdFX01FTU9SWV9VVElMSVpBVElPTlxuICAgICAgICAgICAgOiBQcmVkZWZpbmVkTWV0cmljLkVDU19TRVJWSUNFX0FWRVJBR0VfQ1BVX1VUSUxJWkFUSU9OXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGFkZExvYWRCYWxhbmNlcihwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYExvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXBgLFxuICAgICAge1xuICAgICAgICB2cGM6IHRoaXMuY2x1c3Rlci52cGMsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgU2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSAke3Byb3BzLmNsdXN0ZXJOYW1lfSBsb2FkIGJhbGFuY2VyYFxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAuY29ubmVjdGlvbnMuYWxsb3dUbyhcbiAgICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cCxcbiAgICAgIFBvcnQuYWxsVGNwKClcbiAgICApO1xuXG4gICAgLy8gdGhpcy5sb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLmFkZEVncmVzc1J1bGUoXG4gICAgLy8gICB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAsXG4gICAgLy8gICBQb3J0LmFsbFRjcCgpXG4gICAgLy8gKTtcblxuICAgIHRoaXMubG9hZEJhbGFuY2VyID0gbmV3IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmNsdXN0ZXJOYW1lfUxvYWRCYWxhbmNlcmAsXG4gICAgICB7XG4gICAgICAgIHZwYzogdGhpcy5jbHVzdGVyLnZwYyxcbiAgICAgICAgaW50ZXJuZXRGYWNpbmc6IHRydWUsXG4gICAgICAgIHNlY3VyaXR5R3JvdXA6IHRoaXMubG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cCxcbiAgICAgICAgbG9hZEJhbGFuY2VyTmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9TG9hZEJhbGFuY2VyYCxcbiAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFVCTElDXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICAgIHRhZ1Jlc291cmNlKHRoaXMubG9hZEJhbGFuY2VyLCBwcm9wcy50YWdzKTtcblxuICAgIC8vIEFsbG93IGNvbm5lY3Rpb25zIHRvIGVwaGVtZXJhbCBwb3J0c1xuICAgIHRoaXMuYXNnU2VjdXJpdHlHcm91cC5jb25uZWN0aW9ucy5hbGxvd0Zyb20oXG4gICAgICB0aGlzLmxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gICAgICBQb3J0LnRjcFJhbmdlKDQ5MTUyLCA2NTUzNSlcbiAgICApO1xuICB9XG5cbiAgcmVtb3ZlQXV0b1NjYWxpbmdHcm91cCgpIHtcbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJkZWxldGVBdXRvc2NhbGluZ0dyb3VwXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogXCJkZWxldGVBdXRvc2NhbGluZ0dyb3VwXCIsXG4gICAgICBvbkRlbGV0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIkF1dG9TY2FsaW5nXCIsXG4gICAgICAgIGFjdGlvbjogXCJEZWxldGVBdXRvU2NhbGluZ0dyb3VwQ29tbWFuZFwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQXV0b1NjYWxpbmdHcm91cE5hbWU6IHRoaXMuYXV0b1NjYWxpbmdHcm91cC5hdXRvU2NhbGluZ0dyb3VwTmFtZSxcbiAgICAgICAgICBGb3JjZURlbGV0ZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IFBoeXNpY2FsUmVzb3VyY2VJZC5vZihcImRlbGV0ZUF1dG9zY2FsaW5nR3JvdXBcIilcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGFkZExvYWRCYWxhbmNlckxpc3RlbmVyKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgLy8gICBpZiAoISF0aGlzLmNlcnRpZmljYXRlKSB7XG4gIC8vICAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyID0gdGhpcy5sb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gIC8vICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUxpc3RlbmVyYCxcbiAgLy8gICAgICAge1xuICAvLyAgICAgICAgIHBvcnQ6IHByb3BzLnByb3RvY29sID09IFByb3RvY29sLkhUVFAgPyA4MCA6IDQ0MyxcbiAgLy8gICAgICAgICBjZXJ0aWZpY2F0ZXM6IFt0aGlzLmNlcnRpZmljYXRlXVxuICAvLyAgICAgICB9XG4gIC8vICAgICApO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICB0aGlzLmxvYWRCYWxhbmNlckxpc3RlbmVyID0gdGhpcy5sb2FkQmFsYW5jZXIuYWRkTGlzdGVuZXIoXG4gIC8vICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUxpc3RlbmVyYCxcbiAgLy8gICAgICAge1xuICAvLyAgICAgICAgIHBvcnQ6IHByb3BzLnByb3RvY29sID09IFByb3RvY29sLkhUVFAgPyA4MCA6IDQ0M1xuICAvLyAgICAgICB9XG4gIC8vICAgICApO1xuICAvLyAgIH1cblxuICAvLyAgIHRhZ1Jlc291cmNlKHRoaXMubG9hZEJhbGFuY2VyTGlzdGVuZXIsIHByb3BzLnRhZ3MpO1xuICAvLyB9XG5cbiAgYWRkTG9hZEJhbGFuY2VyTGlzdGVuZXIocHJvcHM6IEVjMkNsdXN0ZXJQcm9wcykge1xuICAgIGxldCBhZGRMaXN0ZW5lclByb3BzOiBCYXNlQXBwbGljYXRpb25MaXN0ZW5lclByb3BzID0ge307XG5cbiAgICBpZiAoISFwcm9wcy5wYXJlbnREb21haW4pIHtcbiAgICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgQ2VydGlmaWNhdGUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLnNlcnZpY2VOYW1lfUNlcnRpZmljYXRlYCxcbiAgICAgICAge1xuICAgICAgICAgIGRvbWFpbk5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfS4ke3Byb3BzLmNsdXN0ZXJOYW1lfS4ke3Byb3BzLnBhcmVudERvbWFpbn1gLFxuICAgICAgICAgIHZhbGlkYXRpb246IENlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHRoaXMuaG9zdGVkWm9uZSlcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgYWRkTGlzdGVuZXJQcm9wcyA9IHtcbiAgICAgICAgcG9ydDogNDQzLFxuICAgICAgICBjZXJ0aWZpY2F0ZXM6IFt0aGlzLmNlcnRpZmljYXRlXVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkTGlzdGVuZXJQcm9wcyA9IHtcbiAgICAgICAgcG9ydDogODBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciA9IHRoaXMubG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFxuICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9TGlzdGVuZXJgLFxuICAgICAgYWRkTGlzdGVuZXJQcm9wc1xuICAgICk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciwgcHJvcHMudGFncyk7XG4gIH1cblxuICBhZGRIb3N0ZWRab25lKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnBhcmVudERvbWFpbikgcmV0dXJuO1xuXG4gICAgdGhpcy5ob3N0ZWRab25lID0gSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgXCJob3N0ZWRab25lXCIsIHtcbiAgICAgIGhvc3RlZFpvbmVJZDogRm4uaW1wb3J0VmFsdWUoXG4gICAgICAgIGAke3Byb3BzLnBhcmVudERvbWFpbi5zcGxpdChcIi5cIikuam9pbihcIlwiKX1Ib3N0ZWRab25lSWRgXG4gICAgICApLFxuICAgICAgem9uZU5hbWU6IHByb3BzLnBhcmVudERvbWFpblxuICAgIH0pO1xuXG4gICAgdGhpcy5hUmVjb3JkID0gbmV3IEFSZWNvcmQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuc2VydmljZU5hbWV9LiR7cHJvcHMuY2x1c3Rlck5hbWV9LiR7cHJvcHMucGFyZW50RG9tYWlufUFSZWNvcmRgLFxuICAgICAge1xuICAgICAgICByZWNvcmROYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0uJHtwcm9wcy5jbHVzdGVyTmFtZX0uJHtwcm9wcy5wYXJlbnREb21haW59YCxcbiAgICAgICAgem9uZTogdGhpcy5ob3N0ZWRab25lLFxuICAgICAgICB0YXJnZXQ6IFJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgICAgbmV3IExvYWRCYWxhbmNlclRhcmdldCh0aGlzLmxvYWRCYWxhbmNlcilcbiAgICAgICAgKVxuICAgICAgfVxuICAgICk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfUFSZWNvcmRgLCB7XG4gICAgICBrZXk6IGAke3Byb3BzLnNlcnZpY2VOYW1lfUFSZWNvcmRgLFxuICAgICAgdmFsdWU6IHRoaXMuYVJlY29yZC5kb21haW5OYW1lLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9QVJlY29yZGBcbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyTG9hZEJhbGFuY2VyVGFyZ2V0cyhwcm9wczogRWMyQ2x1c3RlclByb3BzKSB7XG4gICAgdGhpcy5lYzJTZXJ2aWNlLnJlZ2lzdGVyTG9hZEJhbGFuY2VyVGFyZ2V0cyh7XG4gICAgICBjb250YWluZXJOYW1lOiB0aGlzLmNvbnRhaW5lckRlZmluaXRpb24uY29udGFpbmVyTmFtZSxcbiAgICAgIGNvbnRhaW5lclBvcnQ6IHRoaXMuY29udGFpbmVyRGVmaW5pdGlvbi5jb250YWluZXJQb3J0LFxuICAgICAgbmV3VGFyZ2V0R3JvdXBJZDogYCR7cHJvcHMuc2VydmljZU5hbWV9VGFyZ2V0R3JvdXBgLFxuICAgICAgbGlzdGVuZXI6IExpc3RlbmVyQ29uZmlnLmFwcGxpY2F0aW9uTGlzdGVuZXIodGhpcy5sb2FkQmFsYW5jZXJMaXN0ZW5lciwge1xuICAgICAgICBwb3J0OiBwcm9wcy5jb250YWluZXJQb3J0LFxuICAgICAgICBwcm90b2NvbDogQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQLFxuICAgICAgICBoZWFsdGhDaGVjazoge1xuICAgICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgICAgICBoZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgICAgdW5oZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgICAgcGF0aDogcHJvcHMuaGVhbHRoQ2hlY2tQYXRoIHx8IFwiL1wiLFxuICAgICAgICAgIHBvcnQ6IFwidHJhZmZpYy1wb3J0XCIsXG4gICAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxNSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGdldEltYWdlKHByb3BzOiBFYzJDbHVzdGVyUHJvcHMpOiBDb250YWluZXJJbWFnZSB7XG4gICAgaWYgKCFwcm9wcy5lY3JSZXBvc2l0b3J5KVxuICAgICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21SZWdpc3RyeShcImFtYXpvbi9hbWF6b24tZWNzLXNhbXBsZVwiKTtcbiAgICBpZiAodHlwZW9mIHByb3BzLmVjclJlcG9zaXRvcnkgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkoXG4gICAgICAgIFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlOYW1lKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJlY3JSZXBvc2l0b3J5XCIsXG4gICAgICAgICAgcHJvcHMuZWNyUmVwb3NpdG9yeVxuICAgICAgICApLFxuICAgICAgICBcImxhdGVzdFwiXG4gICAgICApO1xuICAgIGlmIChwcm9wcy5lY3JSZXBvc2l0b3J5IGluc3RhbmNlb2YgQ29udGFpbmVySW1hZ2UpXG4gICAgICByZXR1cm4gcHJvcHMuZWNyUmVwb3NpdG9yeTtcbiAgICBpZiAocHJvcHMuZWNyUmVwb3NpdG9yeSBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHtcbiAgICAgIHJldHVybiBDb250YWluZXJJbWFnZS5mcm9tRWNyUmVwb3NpdG9yeShwcm9wcy5lY3JSZXBvc2l0b3J5LCBcImxhdGVzdFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIENvbnRhaW5lckltYWdlLmZyb21SZWdpc3RyeShcImFtYXpvbi9hbWF6b24tZWNzLXNhbXBsZVwiKTtcbiAgfVxuXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBFYzJDbHVzdGVyUHJvcHNcbiAgKTogKHNiOiBTdGFja0J1aWxkZXIpID0+IENvbnN0cnVjdCB7XG4gICAgcmV0dXJuIChzYjogU3RhY2tCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBuZXdQcm9wczogRWMyQ2x1c3RlclByb3BzID0ge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogKHNiLmdldE5ldHdvcmsoKSBhcyBJVnBjKSB8fCBwcm9wcy52cGNcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgdGhpcyhzYi5nZXRTdGFjaygpLCBpZCwgbmV3UHJvcHMpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,76 @@
1
+ import { ContainerImage, RepositoryImage } from "aws-cdk-lib/aws-ecs";
2
+ import { Connections, IConnectable, IVpc } from "aws-cdk-lib/aws-ec2";
3
+ import { Construct } from "constructs";
4
+ import { StackBuilder } from "../awsStack";
5
+ import { SecretValue } from "aws-cdk-lib";
6
+ import { IManagedPolicy, PolicyDocument } from "aws-cdk-lib/aws-iam";
7
+ import { Repository } from "aws-cdk-lib/aws-ecr";
8
+ import { KeyValue } from "../../../types";
9
+ export declare enum ScalingType {
10
+ CPU = "ECSServiceAverageCPUUtilization",
11
+ MEMORY = "ECSServiceAverageMemoryUtilization"
12
+ }
13
+ export interface ContainerSecret {
14
+ [key: string]: SecretValue;
15
+ }
16
+ type Ec2ClusterProps = {
17
+ ecrRepository: Repository | RepositoryImage | string;
18
+ clusterName: string;
19
+ containerEntryPoint?: string[];
20
+ containerCommand?: string[];
21
+ containerEnvironment?: KeyValue;
22
+ containerSecrets?: ContainerSecret;
23
+ containerPort?: number;
24
+ cpu?: number;
25
+ databaseConnection: IConnectable;
26
+ parentDomain?: string;
27
+ desiredCount?: number;
28
+ healthCheckPath?: string;
29
+ listenerPort?: number;
30
+ memoryLimitMiB?: number;
31
+ publicLoadBalancer?: boolean;
32
+ scalingType?: ScalingType;
33
+ serviceName: string;
34
+ tags: KeyValue;
35
+ taskRoleInlinePolicies?: {
36
+ [name: string]: PolicyDocument;
37
+ };
38
+ taskRoleManagedPolicies?: IManagedPolicy[];
39
+ vpc?: IVpc;
40
+ };
41
+ export default class Ec2Cluster extends Construct implements IConnectable {
42
+ connections: Connections;
43
+ private cluster;
44
+ private autoScalingGroup;
45
+ private asgSecurityGroup;
46
+ private asgCapacityProvider;
47
+ private loadBalancer;
48
+ private loadBalancerSecurityGroup;
49
+ private loadBalancerListener;
50
+ private executionRole;
51
+ private taskDefinition;
52
+ private containerDefinition;
53
+ private ec2Service;
54
+ private scalingPolicy;
55
+ private hostedZone;
56
+ private certificate;
57
+ private aRecord;
58
+ private secrets;
59
+ constructor(scope: Construct, id: string, props: Ec2ClusterProps);
60
+ addCluster(props: Ec2ClusterProps): void;
61
+ addAutoScalingGroup(props: Ec2ClusterProps): void;
62
+ addSecrets(props: Ec2ClusterProps): void;
63
+ addExecutionRole(props: Ec2ClusterProps): void;
64
+ addTaskDefinition(props: Ec2ClusterProps): void;
65
+ addContainerDefinition(props: Ec2ClusterProps): void;
66
+ addEc2Service(props: Ec2ClusterProps): void;
67
+ addScalingPolicy(props: Ec2ClusterProps): void;
68
+ addLoadBalancer(props: Ec2ClusterProps): void;
69
+ removeAutoScalingGroup(): void;
70
+ addLoadBalancerListener(props: Ec2ClusterProps): void;
71
+ addHostedZone(props: Ec2ClusterProps): void;
72
+ registerLoadBalancerTargets(props: Ec2ClusterProps): void;
73
+ getImage(props: Ec2ClusterProps): ContainerImage;
74
+ static build(id: string, props: Ec2ClusterProps): (sb: StackBuilder) => Construct;
75
+ }
76
+ export {};