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