@fjall/components-infrastructure 0.1.5 → 0.1.10
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/config/aws/costAllocationTags.js +58 -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/identityCenter.js +107 -0
- package/dist/lib/config/aws/index.d.ts +8 -0
- package/dist/lib/config/aws/index.js +25 -0
- package/dist/lib/config/aws/ipam.d.ts +5 -0
- package/dist/lib/config/aws/ipam.js +30 -0
- package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +9 -0
- package/dist/lib/config/aws/ipamDelegateAdmin.js +62 -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/{base/iamIdentityCenter.d.ts → ipamPoolResourceShare.d.ts} +2 -2
- package/dist/lib/config/aws/ipamPoolResourceShare.js +42 -0
- package/dist/lib/config/aws/organisationId.d.ts +5 -0
- package/dist/lib/config/aws/organisationId.js +40 -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/{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 +344 -0
- package/dist/lib/patterns/aws/index.d.ts +2 -2
- package/dist/lib/patterns/aws/index.js +3 -3
- package/dist/lib/patterns/aws/{multiEnvironmentOrganisation.d.ts → managedOrganisation.d.ts} +8 -10
- package/dist/lib/patterns/aws/managedOrganisation.js +159 -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 +76 -0
- package/dist/lib/resources/aws/compute/ecs.js +265 -0
- package/dist/lib/resources/aws/compute/lambda.d.ts +12 -5
- package/dist/lib/resources/aws/compute/lambda.js +23 -5
- 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/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/logGroup.d.ts +5 -1
- package/dist/lib/resources/aws/logging/logGroup.js +4 -5
- 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 +3 -7
- package/dist/lib/resources/aws/networking/ipamPool.js +5 -27
- 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/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/utils/getAccountId.d.ts +1 -0
- package/dist/lib/utils/getAccountId.js +11 -0
- package/dist/lib/utils/getConfig.d.ts +4 -3
- package/dist/lib/utils/getConfig.js +26 -12
- 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/tagResource.d.ts +4 -0
- package/dist/lib/utils/tagResource.js +10 -0
- package/package.json +23 -18
- package/dist/lib/config/aws/base/costAllocationTags.js +0 -57
- 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.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/config/aws/{base/costAllocationTags.d.ts → costAllocationTags.d.ts} +0 -0
- /package/dist/lib/config/aws/{base/identityCenter.d.ts → identityCenter.d.ts} +0 -0
- /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,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BuildkiteDefaultProps = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
6
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
7
|
+
const aws_autoscaling_1 = require("aws-cdk-lib/aws-autoscaling");
|
|
8
|
+
const aws_sam_1 = require("aws-cdk-lib/aws-sam");
|
|
9
|
+
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
10
|
+
const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
|
|
11
|
+
const vpc_1 = require("../../resources/aws/constant/vpc");
|
|
12
|
+
const iam_1 = require("../../resources/aws/iam");
|
|
13
|
+
const store_1 = require("../../resources/aws/store");
|
|
14
|
+
const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
|
|
15
|
+
const tagResource_1 = require("../../utils/tagResource");
|
|
16
|
+
var agentRelease;
|
|
17
|
+
(function (agentRelease) {
|
|
18
|
+
agentRelease["STABLE"] = "stable";
|
|
19
|
+
agentRelease["BETA"] = "beta";
|
|
20
|
+
agentRelease["EDGE"] = "edge";
|
|
21
|
+
})(agentRelease || (agentRelease = {}));
|
|
22
|
+
exports.BuildkiteDefaultProps = {
|
|
23
|
+
elasticStackVersion: "v6.7.1",
|
|
24
|
+
agentScalerVersion: "1.6.0",
|
|
25
|
+
agentInstanceType: aws_ec2_1.InstanceType.of(aws_ec2_1.InstanceClass.M4, aws_ec2_1.InstanceSize.LARGE),
|
|
26
|
+
agentVolumeSize: 250,
|
|
27
|
+
agentMinInstances: 0,
|
|
28
|
+
agentMaxInstances: 10,
|
|
29
|
+
agentsPerInstance: 1,
|
|
30
|
+
agentRelease: agentRelease.STABLE,
|
|
31
|
+
spotCapacityPercentage: 75,
|
|
32
|
+
scaleInPeriod: 600,
|
|
33
|
+
instanceStorage: false,
|
|
34
|
+
instanceTerminationAfterJob: false,
|
|
35
|
+
dockerUserNamespaceRemap: true,
|
|
36
|
+
dockerExperimental: false,
|
|
37
|
+
secretsPluginEnabled: true,
|
|
38
|
+
ecrPluginEnabled: true,
|
|
39
|
+
dockerLoginPluginEnabled: true,
|
|
40
|
+
timestampLines: false,
|
|
41
|
+
gitMirrors: false,
|
|
42
|
+
scaleOutFactor: "1.0",
|
|
43
|
+
scaleOutWaitingForJobs: false,
|
|
44
|
+
eventScheduledPeriod: "1 minute",
|
|
45
|
+
minPollInterval: "10s",
|
|
46
|
+
agentTags: "",
|
|
47
|
+
experiments: "",
|
|
48
|
+
tracingBackend: "",
|
|
49
|
+
bootstrapScript: "",
|
|
50
|
+
envFileUrl: "",
|
|
51
|
+
authorizedUsersUrl: "",
|
|
52
|
+
ecrAccessPolicy: "",
|
|
53
|
+
sudoPermissions: ""
|
|
54
|
+
};
|
|
55
|
+
class Buildkite extends aws_cdk_lib_1.Stack {
|
|
56
|
+
constructor(scope, id, props) {
|
|
57
|
+
super(scope, id, props);
|
|
58
|
+
// VPC
|
|
59
|
+
const vpc = new vpc_1.Vpc(this, "buildkite", {
|
|
60
|
+
environment: props.environment,
|
|
61
|
+
tags: props.tags,
|
|
62
|
+
subnetConfiguration: [
|
|
63
|
+
{
|
|
64
|
+
name: `${id}`,
|
|
65
|
+
subnetType: aws_ec2_1.SubnetType.PUBLIC
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
});
|
|
69
|
+
// Artifacts Bucket
|
|
70
|
+
const artifactBucket = new store_1.S3Bucket(this, "artifactBucket");
|
|
71
|
+
// Managed Secrets
|
|
72
|
+
const managedSecretsBucket = new store_1.S3Bucket(this, "managedSecretsBucket");
|
|
73
|
+
if (process.env.BUILDKITE_PRIVATE_SSH_KEY) {
|
|
74
|
+
new aws_s3_deployment_1.BucketDeployment(this, "buildkiteSshKey", {
|
|
75
|
+
sources: [
|
|
76
|
+
aws_s3_deployment_1.Source.data("private_ssh_key", process.env.BUILDKITE_PRIVATE_SSH_KEY)
|
|
77
|
+
],
|
|
78
|
+
destinationBucket: managedSecretsBucket
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.warn("WARN:'BUILDKITE_PRIVATE_SSH_KEY' environment variable not declared. Skipping upload of private SSH key");
|
|
83
|
+
}
|
|
84
|
+
// Encrypted Buildkite Agent Token
|
|
85
|
+
const agentToken = new store_1.SecureStringParameter(this, "agentToken", {
|
|
86
|
+
name: `/buildkite/agentToken`,
|
|
87
|
+
aliasName: `buildkiteAgentToken`,
|
|
88
|
+
value: process.env.BUILDKITE_AGENT_TOKEN,
|
|
89
|
+
overwrite: process.env.BUILDKITE_AGENT_TOKEN ? true : false,
|
|
90
|
+
tags: props.tags,
|
|
91
|
+
accountId: this.account,
|
|
92
|
+
region: this.region
|
|
93
|
+
});
|
|
94
|
+
// Buildkite Agent Execution Role
|
|
95
|
+
const agentRole = new iam_1.Role(this, "agentIamRole", {
|
|
96
|
+
roleName: `${id}AgentRole`,
|
|
97
|
+
description: "Buildkite Agent IAM Role",
|
|
98
|
+
inlinePolicies: {
|
|
99
|
+
["decryptBuildkiteAgentToken"]: new aws_iam_1.PolicyDocument({
|
|
100
|
+
statements: [
|
|
101
|
+
new aws_iam_1.PolicyStatement({
|
|
102
|
+
actions: ["kms:Decrypt"],
|
|
103
|
+
resources: [agentToken.cmk.key.keyArn]
|
|
104
|
+
})
|
|
105
|
+
]
|
|
106
|
+
}),
|
|
107
|
+
["readBuildkiteAgentToken"]: new aws_iam_1.PolicyDocument({
|
|
108
|
+
statements: [
|
|
109
|
+
new aws_iam_1.PolicyStatement({
|
|
110
|
+
actions: ["ssm:GetParameter"],
|
|
111
|
+
resources: [
|
|
112
|
+
`arn:aws:ssm:${props.env?.region}:${props.env?.account}:parameter${agentToken.name}`
|
|
113
|
+
]
|
|
114
|
+
})
|
|
115
|
+
]
|
|
116
|
+
}),
|
|
117
|
+
["readManagedSecretsBucket"]: new aws_iam_1.PolicyDocument({
|
|
118
|
+
statements: [
|
|
119
|
+
new aws_iam_1.PolicyStatement({
|
|
120
|
+
actions: ["s3:Get*", "s3:List*"],
|
|
121
|
+
resources: [
|
|
122
|
+
managedSecretsBucket.bucketArn,
|
|
123
|
+
`${managedSecretsBucket.bucketArn}/*`
|
|
124
|
+
]
|
|
125
|
+
})
|
|
126
|
+
]
|
|
127
|
+
}),
|
|
128
|
+
["writeArtifactBucket"]: new aws_iam_1.PolicyDocument({
|
|
129
|
+
statements: [
|
|
130
|
+
new aws_iam_1.PolicyStatement({
|
|
131
|
+
actions: [
|
|
132
|
+
"s3:GetObject",
|
|
133
|
+
"s3:GetObjectAcl",
|
|
134
|
+
"s3:GetObjectVersion",
|
|
135
|
+
"s3:GetObjectVersionAcl",
|
|
136
|
+
"s3:ListBucket",
|
|
137
|
+
"s3:PutObject",
|
|
138
|
+
"s3:PutObjectAcl",
|
|
139
|
+
"s3:PutObjectVersionAcl"
|
|
140
|
+
],
|
|
141
|
+
resources: [
|
|
142
|
+
artifactBucket.bucketArn,
|
|
143
|
+
`${artifactBucket.bucketArn}/*`
|
|
144
|
+
]
|
|
145
|
+
})
|
|
146
|
+
]
|
|
147
|
+
}),
|
|
148
|
+
["describeInstance"]: new aws_iam_1.PolicyDocument({
|
|
149
|
+
statements: [
|
|
150
|
+
new aws_iam_1.PolicyStatement({
|
|
151
|
+
actions: [
|
|
152
|
+
"autoscaling:DescribeAutoScalingInstances",
|
|
153
|
+
"cloudwatch:PutMetricData",
|
|
154
|
+
"cloudformation:DescribeStackResource",
|
|
155
|
+
"ec2:DescribeTags"
|
|
156
|
+
],
|
|
157
|
+
resources: ["*"]
|
|
158
|
+
})
|
|
159
|
+
]
|
|
160
|
+
}),
|
|
161
|
+
["logging"]: new aws_iam_1.PolicyDocument({
|
|
162
|
+
statements: [
|
|
163
|
+
new aws_iam_1.PolicyStatement({
|
|
164
|
+
actions: [
|
|
165
|
+
"logs:CreateLogGroup",
|
|
166
|
+
"logs:CreateLogStream",
|
|
167
|
+
"logs:PutLogEvents",
|
|
168
|
+
"logs:DescribeLogGroups",
|
|
169
|
+
"logs:DescribeLogStreams"
|
|
170
|
+
],
|
|
171
|
+
resources: ["*"]
|
|
172
|
+
})
|
|
173
|
+
]
|
|
174
|
+
}),
|
|
175
|
+
["ssm"]: new aws_iam_1.PolicyDocument({
|
|
176
|
+
statements: [
|
|
177
|
+
new aws_iam_1.PolicyStatement({
|
|
178
|
+
actions: [
|
|
179
|
+
"ssm:DescribeInstanceProperties",
|
|
180
|
+
"ssm:ListAssociations",
|
|
181
|
+
"ssm:PutInventory",
|
|
182
|
+
"ssm:UpdateInstanceInformation",
|
|
183
|
+
"ssmmessages:CreateControlChannel",
|
|
184
|
+
"ssmmessages:CreateDataChannel",
|
|
185
|
+
"ssmmessages:OpenControlChannel",
|
|
186
|
+
"ssmmessages:OpenDataChannel",
|
|
187
|
+
"ec2messages:AcknowledgeMessage",
|
|
188
|
+
"ec2messages:DeleteMessage",
|
|
189
|
+
"ec2messages:FailMessage",
|
|
190
|
+
"ec2messages:GetEndpoint",
|
|
191
|
+
"ec2messages:GetMessages",
|
|
192
|
+
"ec2messages:SendReply"
|
|
193
|
+
],
|
|
194
|
+
resources: ["*"]
|
|
195
|
+
})
|
|
196
|
+
]
|
|
197
|
+
})
|
|
198
|
+
},
|
|
199
|
+
assumedBy: new aws_iam_1.CompositePrincipal(new aws_iam_1.ServicePrincipal("autoscaling.amazonaws.com"), new aws_iam_1.ServicePrincipal("ec2.amazonaws.com"))
|
|
200
|
+
});
|
|
201
|
+
// Buildkite Agent EC2 User Data
|
|
202
|
+
const multipartUserData = new aws_ec2_1.MultipartUserData();
|
|
203
|
+
// Cloud Config
|
|
204
|
+
const cloudConfigUserData = aws_ec2_1.UserData.forLinux({
|
|
205
|
+
shebang: "#cloud-config"
|
|
206
|
+
});
|
|
207
|
+
cloudConfigUserData.addCommands("cloud_final_modules:", " - [scripts-user, always]");
|
|
208
|
+
multipartUserData.addPart(aws_ec2_1.MultipartBody.fromUserData(cloudConfigUserData, "text/cloud-config; charset='us-ascii'"));
|
|
209
|
+
// Mount Storage
|
|
210
|
+
const mountStorageUserData = aws_ec2_1.UserData.forLinux({
|
|
211
|
+
shebang: "#!/bin/bash -v"
|
|
212
|
+
});
|
|
213
|
+
mountStorageUserData.addCommands(`BUILDKITE_ENABLE_INSTANCE_STORAGE='${props.instanceStorage}' \\`, "/usr/local/bin/bk-mount-instance-storage.sh");
|
|
214
|
+
multipartUserData.addPart(aws_ec2_1.MultipartBody.fromUserData(mountStorageUserData, "text/x-shellscript; charset='us-ascii'"));
|
|
215
|
+
// Configure Docker
|
|
216
|
+
const configureDockerUserData = aws_ec2_1.UserData.forLinux({
|
|
217
|
+
shebang: "#!/bin/bash -v"
|
|
218
|
+
});
|
|
219
|
+
configureDockerUserData.addCommands(`DOCKER_USERNS_REMAP='${props.dockerUserNamespaceRemap}' \\`, `DOCKER_EXPERIMENTAL='${props.dockerExperimental}' \\`, `BUILDKITE_ENABLE_INSTANCE_STORAGE='${props.instanceStorage}' \\`, "/usr/local/bin/bk-configure-docker.sh");
|
|
220
|
+
multipartUserData.addPart(aws_ec2_1.MultipartBody.fromUserData(configureDockerUserData, "text/x-shellscript; charset='us-ascii'"));
|
|
221
|
+
const installElasticStackUserData = aws_ec2_1.UserData.forLinux({
|
|
222
|
+
shebang: "#!/bin/bash -v"
|
|
223
|
+
});
|
|
224
|
+
installElasticStackUserData.addCommands(`BUILDKITE_STACK_NAME='${id}' \\`, `BUILDKITE_STACK_VERSION='${props.elasticStackVersion}' \\`, `BUILDKITE_SCALE_IN_IDLE_PERIOD='${props.scaleInPeriod}' \\`, `BUILDKITE_SECRETS_BUCKET='${managedSecretsBucket.bucketName}' \\`, `BUILDKITE_SECRETS_BUCKET_REGION='${props.env?.region}' \\`, `BUILDKITE_AGENT_TOKEN_PATH='${agentToken.name}' \\`, `BUILDKITE_AGENTS_PER_INSTANCE='${props.agentsPerInstance}' \\`, `BUILDKITE_AGENT_TAGS='${props.agentTags}' \\`, `BUILDKITE_AGENT_TIMESTAMP_LINES='${props.timestampLines}' \\`, `BUILDKITE_AGENT_EXPERIMENTS='${props.experiments}' \\`, `BUILDKITE_AGENT_TRACING_BACKEND='${props.tracingBackend}' \\`, `BUILDKITE_AGENT_RELEASE='${props.agentRelease}' \\`, `BUILDKITE_QUEUE='${props.queueName}' \\`, `BUILDKITE_AGENT_ENABLE_GIT_MIRRORS='${props.gitMirrors}' \\`, `BUILDKITE_ELASTIC_BOOTSTRAP_SCRIPT='${props.bootstrapScript}' \\`, `BUILDKITE_ENV_FILE_URL='${props.envFileUrl}' \\`, `BUILDKITE_ENABLE_INSTANCE_STORAGE='${props.instanceStorage}' \\`, `BUILDKITE_AUTHORIZED_USERS_URL='${props.authorizedUsersUrl}' \\`, `BUILDKITE_ECR_POLICY='${props.ecrAccessPolicy}' \\`, `BUILDKITE_TERMINATE_INSTANCE_AFTER_JOB='${props.instanceTerminationAfterJob}' \\`, `BUILDKITE_ADDITIONAL_SUDO_PERMISSIONS='${props.sudoPermissions}' \\`, `AWS_DEFAULT_REGION='${props.env?.region}' \\`, `SECRETS_PLUGIN_ENABLED='${props.secretsPluginEnabled}' \\`, `ECR_PLUGIN_ENABLED='${props.ecrPluginEnabled}' \\`, `DOCKER_LOGIN_PLUGIN_ENABLED='${props.dockerLoginPluginEnabled}' \\`, `DOCKER_EXPERIMENTAL='${props.dockerExperimental}' \\`, `AWS_REGION='${props.env?.region}' \\`, "/usr/local/bin/bk-install-elastic-stack.sh");
|
|
225
|
+
// Merge User Data
|
|
226
|
+
multipartUserData.addPart(aws_ec2_1.MultipartBody.fromUserData(installElasticStackUserData, "text/x-shellscript; charset='us-ascii'"));
|
|
227
|
+
// Launch Template
|
|
228
|
+
const launchTemplate = new aws_ec2_1.LaunchTemplate(this, "agentLaunchTemplate", {
|
|
229
|
+
launchTemplateName: `buildkiteLaunchTemplate`,
|
|
230
|
+
instanceType: props.agentInstanceType,
|
|
231
|
+
machineImage: aws_ec2_1.MachineImage.lookup({
|
|
232
|
+
name: "buildkite-stack-linux-x86_64-*",
|
|
233
|
+
owners: ["172840064832"],
|
|
234
|
+
filters: {
|
|
235
|
+
["block-device-mapping.volume-type"]: ["gp3"]
|
|
236
|
+
}
|
|
237
|
+
}),
|
|
238
|
+
userData: multipartUserData,
|
|
239
|
+
role: agentRole,
|
|
240
|
+
blockDevices: [
|
|
241
|
+
{
|
|
242
|
+
deviceName: "/dev/xvda",
|
|
243
|
+
volume: aws_ec2_1.BlockDeviceVolume.ebs(props.agentVolumeSize)
|
|
244
|
+
}
|
|
245
|
+
],
|
|
246
|
+
detailedMonitoring: true,
|
|
247
|
+
requireImdsv2: false,
|
|
248
|
+
httpPutResponseHopLimit: 2,
|
|
249
|
+
httpTokens: aws_ec2_1.LaunchTemplateHttpTokens.REQUIRED,
|
|
250
|
+
instanceMetadataTags: true
|
|
251
|
+
});
|
|
252
|
+
(0, tagResource_1.default)(launchTemplate, {
|
|
253
|
+
"fjall:costAllocation:environment": props.environment,
|
|
254
|
+
"fjall:costAllocation:service": "buildkite",
|
|
255
|
+
"fjall:costAllocation:owner": "platform",
|
|
256
|
+
Role: "buildkiteAgent",
|
|
257
|
+
BuildkiteAgentRelease: agentRelease.STABLE,
|
|
258
|
+
BuildkiteQueue: props.queueName
|
|
259
|
+
});
|
|
260
|
+
// Autoscaling Group
|
|
261
|
+
const autoScalingGroup = new aws_autoscaling_1.AutoScalingGroup(this, "agentAutoScalingGroup", {
|
|
262
|
+
vpc: vpc,
|
|
263
|
+
mixedInstancesPolicy: {
|
|
264
|
+
launchTemplate: launchTemplate,
|
|
265
|
+
instancesDistribution: {
|
|
266
|
+
onDemandPercentageAboveBaseCapacity: props.spotCapacityPercentage,
|
|
267
|
+
spotAllocationStrategy: aws_autoscaling_1.SpotAllocationStrategy.CAPACITY_OPTIMIZED
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
minCapacity: props.agentMinInstances,
|
|
271
|
+
maxCapacity: props.agentMaxInstances,
|
|
272
|
+
cooldown: aws_cdk_lib_1.Duration.seconds(60),
|
|
273
|
+
groupMetrics: [aws_autoscaling_1.GroupMetrics.all()],
|
|
274
|
+
updatePolicy: aws_autoscaling_1.UpdatePolicy.replacingUpdate(),
|
|
275
|
+
newInstancesProtectedFromScaleIn: true,
|
|
276
|
+
terminationPolicies: [
|
|
277
|
+
aws_autoscaling_1.TerminationPolicy.OLDEST_LAUNCH_CONFIGURATION,
|
|
278
|
+
aws_autoscaling_1.TerminationPolicy.CLOSEST_TO_NEXT_INSTANCE_HOUR
|
|
279
|
+
],
|
|
280
|
+
ssmSessionPermissions: true
|
|
281
|
+
});
|
|
282
|
+
agentRole.attachInlinePolicy(new iam_1.Policy(this, "updateAutoScalingGroup", {
|
|
283
|
+
statements: [
|
|
284
|
+
new aws_iam_1.PolicyStatement({
|
|
285
|
+
actions: [
|
|
286
|
+
"autoscaling:SetInstanceHealth",
|
|
287
|
+
"autoscaling:TerminateInstanceInAutoScalingGroup"
|
|
288
|
+
],
|
|
289
|
+
resources: [`${autoScalingGroup.autoScalingGroupArn}`]
|
|
290
|
+
})
|
|
291
|
+
]
|
|
292
|
+
}));
|
|
293
|
+
(0, tagResource_1.default)(autoScalingGroup, {
|
|
294
|
+
"fjall:costAllocation:environment": props.environment,
|
|
295
|
+
"fjall:costAllocation:service": "buildkite",
|
|
296
|
+
"fjall:costAllocation:owner": "platform"
|
|
297
|
+
});
|
|
298
|
+
// Buildkite Suspend Austoscaling Group Custom Resource
|
|
299
|
+
new awsCustomResource_1.AwsCustomResource(this, "suspendAutoscalingProcess", {
|
|
300
|
+
functionName: "suspendAutoScalingProcessess",
|
|
301
|
+
onCreate: {
|
|
302
|
+
service: "AutoScaling",
|
|
303
|
+
action: "suspendProcesses",
|
|
304
|
+
parameters: {
|
|
305
|
+
AutoScalingGroupName: autoScalingGroup.autoScalingGroupName,
|
|
306
|
+
ScalingProcesses: ["AZRebalance"]
|
|
307
|
+
},
|
|
308
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of("suspendAutoScalingProcessess")
|
|
309
|
+
},
|
|
310
|
+
onUpdate: {
|
|
311
|
+
service: "AutoScaling",
|
|
312
|
+
action: "suspendProcesses",
|
|
313
|
+
parameters: {
|
|
314
|
+
AutoScalingGroupName: autoScalingGroup.autoScalingGroupName,
|
|
315
|
+
ScalingProcesses: ["AZRebalance"]
|
|
316
|
+
},
|
|
317
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of("suspendAutoScalingProcessess")
|
|
318
|
+
},
|
|
319
|
+
resourceType: "Custom::buildkiteSuspendAutoscaling"
|
|
320
|
+
});
|
|
321
|
+
new aws_sam_1.CfnApplication(this, "agentScaler", {
|
|
322
|
+
location: {
|
|
323
|
+
applicationId: "arn:aws:serverlessrepo:us-east-1:172840064832:applications/buildkite-agent-scaler",
|
|
324
|
+
semanticVersion: props.agentScalerVersion
|
|
325
|
+
},
|
|
326
|
+
parameters: {
|
|
327
|
+
BuildkiteAgentTokenParameter: `${agentToken.name}`,
|
|
328
|
+
BuildkiteAgentTokenParameterStoreKMSKey: agentToken.cmk.key.keyArn,
|
|
329
|
+
RolePermissionsBoundaryARN: "",
|
|
330
|
+
BuildkiteQueue: props.queueName,
|
|
331
|
+
AgentsPerInstance: `${props.agentsPerInstance}`,
|
|
332
|
+
MinSize: `${props.agentMinInstances}`,
|
|
333
|
+
MaxSize: `${props.agentMaxInstances}`,
|
|
334
|
+
AgentAutoScaleGroup: autoScalingGroup.autoScalingGroupName,
|
|
335
|
+
ScaleOutFactor: props.scaleOutFactor,
|
|
336
|
+
ScaleOutForWaitingJobs: `${props.scaleOutWaitingForJobs}`,
|
|
337
|
+
EventSchedulePeriod: props.eventScheduledPeriod,
|
|
338
|
+
MinPollInterval: props.minPollInterval
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
exports.default = Buildkite;
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRraXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9idWlsZGtpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTBEO0FBQzFELGlEQUs2QjtBQUM3QixpREFZNkI7QUFDN0IsaUVBTXFDO0FBQ3JDLGlEQUFxRDtBQUNyRCxtRUFBa0U7QUFDbEUscUVBQXlFO0FBRXpFLDBEQUF1RDtBQUN2RCxpREFBdUQ7QUFDdkQscURBQTRFO0FBQzVFLHVGQUFvRjtBQUNwRix5REFBa0Q7QUFHbEQsSUFBSyxZQUlKO0FBSkQsV0FBSyxZQUFZO0lBQ2YsaUNBQWlCLENBQUE7SUFDakIsNkJBQWEsQ0FBQTtJQUNiLDZCQUFhLENBQUE7QUFDZixDQUFDLEVBSkksWUFBWSxLQUFaLFlBQVksUUFJaEI7QUF1Q1ksUUFBQSxxQkFBcUIsR0FpQzlCO0lBQ0YsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixrQkFBa0IsRUFBRSxPQUFPO0lBQzNCLGlCQUFpQixFQUFFLHNCQUFZLENBQUMsRUFBRSxDQUFDLHVCQUFhLENBQUMsRUFBRSxFQUFFLHNCQUFZLENBQUMsS0FBSyxDQUFDO0lBQ3hFLGVBQWUsRUFBRSxHQUFHO0lBQ3BCLGlCQUFpQixFQUFFLENBQUM7SUFDcEIsaUJBQWlCLEVBQUUsRUFBRTtJQUNyQixpQkFBaUIsRUFBRSxDQUFDO0lBQ3BCLFlBQVksRUFBRSxZQUFZLENBQUMsTUFBTTtJQUNqQyxzQkFBc0IsRUFBRSxFQUFFO0lBQzFCLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLGVBQWUsRUFBRSxLQUFLO0lBQ3RCLDJCQUEyQixFQUFFLEtBQUs7SUFDbEMsd0JBQXdCLEVBQUUsSUFBSTtJQUM5QixrQkFBa0IsRUFBRSxLQUFLO0lBQ3pCLG9CQUFvQixFQUFFLElBQUk7SUFDMUIsZ0JBQWdCLEVBQUUsSUFBSTtJQUN0Qix3QkFBd0IsRUFBRSxJQUFJO0lBQzlCLGNBQWMsRUFBRSxLQUFL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LDBCQUEwQixFQUFFLEVBQUU7Z0JBQzlCLGNBQWMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDL0IsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUMsaUJBQWlCLEVBQUU7Z0JBQy9DLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtnQkFDckMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFO2dCQUNyQyxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQyxvQkFBb0I7Z0JBQzFELGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztnQkFDcEMsc0JBQXNCLEVBQUUsR0FBRyxLQUFLLENBQUMsc0JBQXNCLEVBQUU7Z0JBQ3pELG1CQUFtQixFQUFFLEtBQUssQ0FBQyxvQkFBb0I7Z0JBQy9DLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTthQUN2QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTVYRCw0QkE0WEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiwgU3RhY2tQcm9wcywgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIENvbXBvc2l0ZVByaW5jaXBhbCxcbiAgU2VydmljZVByaW5jaXBhbCxcbiAgUG9saWN5RG9jdW1lbnQsXG4gIFBvbGljeVN0YXRlbWVudFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgQmxvY2tEZXZpY2VWb2x1bWUsXG4gIEluc3RhbmNlQ2xhc3MsXG4gIEluc3RhbmNlU2l6ZSxcbiAgSW5zdGFuY2VUeXBlLFxuICBMYXVuY2hUZW1wbGF0ZSxcbiAgTGF1bmNoVGVtcGxhdGVIdHRwVG9rZW5zLFxuICBNYWNoaW5lSW1hZ2UsXG4gIE11bHRpcGFydEJvZHksXG4gIE11bHRpcGFydFVzZXJEYXRhLFxuICBTdWJuZXRUeXBlLFxuICBVc2VyRGF0YVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtcbiAgQXV0b1NjYWxpbmdHcm91cCxcbiAgR3JvdXBNZXRyaWNzLFxuICBTcG90QWxsb2NhdGlvblN0cmF0ZWd5LFxuICBUZXJtaW5hdGlvblBvbGljeSxcbiAgVXBkYXRlUG9saWN5XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXV0b3NjYWxpbmdcIjtcbmltcG9ydCB7IENmbkFwcGxpY2F0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zYW1cIjtcbmltcG9ydCB7IFBoeXNpY2FsUmVzb3VyY2VJZCB9IGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBTb3VyY2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBWcGMgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb25zdGFudC92cGNcIjtcbmltcG9ydCB7IFBvbGljeSwgUm9sZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2lhbVwiO1xuaW1wb3J0IHsgUzNCdWNrZXQsIFNlY3VyZVN0cmluZ1BhcmFtZXRlciB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3N0b3JlXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuaW1wb3J0IHRhZ1Jlc291cmNlIGZyb20gXCIuLi8uLi91dGlscy90YWdSZXNvdXJjZVwiO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc1wiO1xuXG5lbnVtIGFnZW50UmVsZWFzZSB7XG4gIFNUQUJMRSA9IFwic3RhYmxlXCIsXG4gIEJFVEEgPSBcImJldGFcIixcbiAgRURHRSA9IFwiZWRnZVwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRraXRlUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgZWxhc3RpY1N0YWNrVmVyc2lvbjogc3RyaW5nO1xuICBhZ2VudFNjYWxlclZlcnNpb246IHN0cmluZztcbiAgcXVldWVOYW1lOiBzdHJpbmc7XG4gIHNwb3RDYXBhY2l0eVBlcmNlbnRhZ2U6IG51bWJlcjtcbiAgYWdlbnRJbnN0YW5jZVR5cGU6IEluc3RhbmNlVHlwZTtcbiAgYWdlbnRWb2x1bWVTaXplOiBudW1iZXI7XG4gIGFnZW50TWluSW5zdGFuY2VzOiBudW1iZXI7XG4gIGFnZW50TWF4SW5zdGFuY2VzOiBudW1iZXI7XG4gIGluc3RhbmNlU3RvcmFnZTogYm9vbGVhbjtcbiAgZG9ja2VyVXNlck5hbWVzcGFjZVJlbWFwOiBib29sZWFuO1xuICBkb2NrZXJFeHBlcmltZW50YWw6IGJvb2xlYW47XG4gIHNjYWxlSW5QZXJpb2Q6IG51bWJlcjtcbiAgYWdlbnRzUGVySW5zdGFuY2U6IG51bWJlcjtcbiAgYWdlbnRUYWdzOiBzdHJpbmc7XG4gIHRpbWVzdGFtcExpbmVzOiBib29sZWFuO1xuICBleHBlcmltZW50czogc3RyaW5nO1xuICB0cmFjaW5nQmFja2VuZDogc3RyaW5nO1xuICBhZ2VudFJlbGVhc2U6IGFnZW50UmVsZWFzZTtcbiAgZ2l0TWlycm9yczogYm9vbGVhbjtcbiAgYm9vdHN0cmFwU2NyaXB0OiBzdHJpbmc7XG4gIGVudkZpbGVVcmw6IHN0cmluZztcbiAgYXV0aG9yaXplZFVzZXJzVXJsOiBzdHJpbmc7XG4gIGVjckFjY2Vzc1BvbGljeTogc3RyaW5nO1xuICBpbnN0YW5jZVRlcm1pbmF0aW9uQWZ0ZXJKb2I6IGJvb2xlYW47XG4gIHN1ZG9QZXJtaXNzaW9uczogc3RyaW5nO1xuICB0YWdzOiBLZXlWYWx1ZTtcbiAgc2VjcmV0c1BsdWdpbkVuYWJsZWQ6IGJvb2xlYW47XG4gIGVjclBsdWdpbkVuYWJsZWQ6IGJvb2xlYW47XG4gIGRvY2tlckxvZ2luUGx1Z2luRW5hYmxlZDogYm9vbGVhbjtcbiAgc2NhbGVPdXRGYWN0b3I6IHN0cmluZztcbiAgc2NhbGVPdXRXYWl0aW5nRm9ySm9iczogYm9vbGVhbjtcbiAgZXZlbnRTY2hlZHVsZWRQZXJpb2Q6IHN0cmluZztcbiAgbWluUG9sbEludGVydmFsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBCdWlsZGtpdGVEZWZhdWx0UHJvcHM6IFBpY2s8XG4gIEJ1aWxka2l0ZVByb3BzLFxuICB8IFwiZWxhc3RpY1N0YWNrVmVyc2lvblwiXG4gIHwgXCJhZ2VudFNjYWxlclZlcnNpb25cIlxuICB8IFwic3BvdENhcGFjaXR5UGVyY2VudGFnZVwiXG4gIHwgXCJhZ2VudEluc3RhbmNlVHlwZVwiXG4gIHwgXCJhZ2VudFZvbHVtZVNpemVcIlxuICB8IFwiYWdlbnRNaW5JbnN0YW5jZXNcIlxuICB8IFwiYWdlbnRNYXhJbnN0YW5jZXNcIlxuICB8IFwiaW5zdGFuY2VTdG9yYWdlXCJcbiAgfCBcImRvY2tlclVzZXJOYW1lc3BhY2VSZW1hcFwiXG4gIHwgXCJkb2NrZXJFeHBlcmltZW50YWxcIlxuICB8IFwic2NhbGVJblBlcmlvZFwiXG4gIHwgXCJhZ2VudHNQZXJJbnN0YW5jZVwiXG4gIHwgXCJhZ2VudFRhZ3NcIlxuICB8IFwidGltZXN0YW1wTGluZXNcIlxuICB8IFwiZXhwZXJpbWVudHNcIlxuICB8IFwidHJhY2luZ0JhY2tlbmRcIlxuICB8IFwiYWdlbnRSZWxlYXNlXCJcbiAgfCBcImdpdE1pcnJvcnNcIlxuICB8IFwiYm9vdHN0cmFwU2NyaXB0XCJcbiAgfCBcImVudkZpbGVVcmxcIlxuICB8IFwiYXV0aG9yaXplZFVzZXJzVXJsXCJcbiAgfCBcImVjckFjY2Vzc1BvbGljeVwiXG4gIHwgXCJpbnN0YW5jZVRlcm1pbmF0aW9uQWZ0ZXJKb2JcIlxuICB8IFwic3Vkb1Blcm1pc3Npb25zXCJcbiAgfCBcInNlY3JldHNQbHVnaW5FbmFibGVkXCJcbiAgfCBcImVjclBsdWdpbkVuYWJsZWRcIlxuICB8IFwiZG9ja2VyTG9naW5QbHVnaW5FbmFibGVkXCJcbiAgfCBcInNjYWxlT3V0RmFjdG9yXCJcbiAgfCBcInNjYWxlT3V0V2FpdGluZ0ZvckpvYnNcIlxuICB8IFwiZXZlbnRTY2hlZHVsZWRQZXJpb2RcIlxuICB8IFwibWluUG9sbEludGVydmFsXCJcbj4gPSB7XG4gIGVsYXN0aWNTdGFja1ZlcnNpb246IFwidjYuNy4xXCIsXG4gIGFnZW50U2NhbGVyVmVyc2lvbjogXCIxLjYuMFwiLFxuICBhZ2VudEluc3RhbmNlVHlwZTogSW5zdGFuY2VUeXBlLm9mKEluc3RhbmNlQ2xhc3MuTTQsIEluc3RhbmNlU2l6ZS5MQVJHRSksXG4gIGFnZW50Vm9sdW1lU2l6ZTogMjUwLFxuICBhZ2VudE1pbkluc3RhbmNlczogMCxcbiAgYWdlbnRNYXhJbnN0YW5jZXM6IDEwLFxuICBhZ2VudHNQZXJJbnN0YW5jZTogMSxcbiAgYWdlbnRSZWxlYXNlOiBhZ2VudFJlbGVhc2UuU1RBQkxFLFxuICBzcG90Q2FwYWNpdHlQZXJjZW50YWdlOiA3NSxcbiAgc2NhbGVJblBlcmlvZDogNjAwLFxuICBpbnN0YW5jZVN0b3JhZ2U6IGZhbHNlLFxuICBpbnN0YW5jZVRlcm1pbmF0aW9uQWZ0ZXJKb2I6IGZhbHNlLFxuICBkb2NrZXJVc2VyTmFtZXNwYWNlUmVtYXA6IHRydWUsXG4gIGRvY2tlckV4cGVyaW1lbnRhbDogZmFsc2UsXG4gIHNlY3JldHNQbHVnaW5FbmFibGVkOiB0cnVlLFxuICBlY3JQbHVnaW5FbmFibGVkOiB0cnVlLFxuICBkb2NrZXJMb2dpblBsdWdpbkVuYWJsZWQ6IHRydWUsXG4gIHRpbWVzdGFtcExpbmVzOiBmYWxzZSxcbiAgZ2l0TWlycm9yczogZmFsc2UsXG4gIHNjYWxlT3V0RmFjdG9yOiBcIjEuMFwiLFxuICBzY2FsZU91dFdhaXRpbmdGb3JKb2JzOiBmYWxzZSxcbiAgZXZlbnRTY2hlZHVsZWRQZXJpb2Q6IFwiMSBtaW51dGVcIixcbiAgbWluUG9sbEludGVydmFsOiBcIjEwc1wiLFxuICBhZ2VudFRhZ3M6IFwiXCIsXG4gIGV4cGVyaW1lbnRzOiBcIlwiLFxuICB0cmFjaW5nQmFja2VuZDogXCJcIixcbiAgYm9vdHN0cmFwU2NyaXB0OiBcIlwiLFxuICBlbnZGaWxlVXJsOiBcIlwiLFxuICBhdXRob3JpemVkVXNlcnNVcmw6IFwiXCIsXG4gIGVjckFjY2Vzc1BvbGljeTogXCJcIixcbiAgc3Vkb1Blcm1pc3Npb25zOiBcIlwiXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdWlsZGtpdGUgZXh0ZW5kcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCdWlsZGtpdGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgLy8gVlBDXG4gICAgY29uc3QgdnBjID0gbmV3IFZwYyh0aGlzLCBcImJ1aWxka2l0ZVwiLCB7XG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgICAgc3VibmV0Q29uZmlndXJhdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogYCR7aWR9YCxcbiAgICAgICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBVQkxJQ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICAvLyBBcnRpZmFjdHMgQnVja2V0XG4gICAgY29uc3QgYXJ0aWZhY3RCdWNrZXQgPSBuZXcgUzNCdWNrZXQodGhpcywgXCJhcnRpZmFjdEJ1Y2tldFwiKTtcblxuICAgIC8vIE1hbmFnZWQgU2VjcmV0c1xuICAgIGNvbnN0IG1hbmFnZWRTZWNyZXRzQnVja2V0ID0gbmV3IFMzQnVja2V0KHRoaXMsIFwibWFuYWdlZFNlY3JldHNCdWNrZXRcIik7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJVSUxES0lURV9QUklWQVRFX1NTSF9LRVkpIHtcbiAgICAgIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIFwiYnVpbGRraXRlU3NoS2V5XCIsIHtcbiAgICAgICAgc291cmNlczogW1xuICAgICAgICAgIFNvdXJjZS5kYXRhKFwicHJpdmF0ZV9zc2hfa2V5XCIsIHByb2Nlc3MuZW52LkJVSUxES0lURV9QUklWQVRFX1NTSF9LRVkpXG4gICAgICAgIF0sXG4gICAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiBtYW5hZ2VkU2VjcmV0c0J1Y2tldFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJXQVJOOidCVUlMREtJVEVfUFJJVkFURV9TU0hfS0VZJyBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3QgZGVjbGFyZWQuIFNraXBwaW5nIHVwbG9hZCBvZiBwcml2YXRlIFNTSCBrZXlcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFbmNyeXB0ZWQgQnVpbGRraXRlIEFnZW50IFRva2VuXG4gICAgY29uc3QgYWdlbnRUb2tlbiA9IG5ldyBTZWN1cmVTdHJpbmdQYXJhbWV0ZXIodGhpcywgXCJhZ2VudFRva2VuXCIsIHtcbiAgICAgIG5hbWU6IGAvYnVpbGRraXRlL2FnZW50VG9rZW5gLFxuICAgICAgYWxpYXNOYW1lOiBgYnVpbGRraXRlQWdlbnRUb2tlbmAsXG4gICAgICB2YWx1ZTogcHJvY2Vzcy5lbnYuQlVJTERLSVRFX0FHRU5UX1RPS0VOLFxuICAgICAgb3ZlcndyaXRlOiBwcm9jZXNzLmVudi5CVUlMREtJVEVfQUdFTlRfVE9LRU4gPyB0cnVlIDogZmFsc2UsXG4gICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgICAgYWNjb3VudElkOiB0aGlzLmFjY291bnQsXG4gICAgICByZWdpb246IHRoaXMucmVnaW9uXG4gICAgfSk7XG5cbiAgICAvLyBCdWlsZGtpdGUgQWdlbnQgRXhlY3V0aW9uIFJvbGVcbiAgICBjb25zdCBhZ2VudFJvbGUgPSBuZXcgUm9sZSh0aGlzLCBcImFnZW50SWFtUm9sZVwiLCB7XG4gICAgICByb2xlTmFtZTogYCR7aWR9QWdlbnRSb2xlYCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkJ1aWxka2l0ZSBBZ2VudCBJQU0gUm9sZVwiLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgW1wiZGVjcnlwdEJ1aWxka2l0ZUFnZW50VG9rZW5cIl06IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCJdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFthZ2VudFRva2VuLmNtay5rZXkua2V5QXJuXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdXG4gICAgICAgIH0pLFxuICAgICAgICBbXCJyZWFkQnVpbGRraXRlQWdlbnRUb2tlblwiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogW1wic3NtOkdldFBhcmFtZXRlclwiXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6c3NtOiR7cHJvcHMuZW52Py5yZWdpb259OiR7cHJvcHMuZW52Py5hY2NvdW50fTpwYXJhbWV0ZXIke2FnZW50VG9rZW4ubmFtZX1gXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgW1wicmVhZE1hbmFnZWRTZWNyZXRzQnVja2V0XCJdOiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbXCJzMzpHZXQqXCIsIFwiczM6TGlzdCpcIl0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIG1hbmFnZWRTZWNyZXRzQnVja2V0LmJ1Y2tldEFybixcbiAgICAgICAgICAgICAgICBgJHttYW5hZ2VkU2VjcmV0c0J1Y2tldC5idWNrZXRBcm59LypgXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgW1wid3JpdGVBcnRpZmFjdEJ1Y2tldFwiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIFwiczM6R2V0T2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgXCJzMzpHZXRPYmplY3RBY2xcIixcbiAgICAgICAgICAgICAgICBcInMzOkdldE9iamVjdFZlcnNpb25cIixcbiAgICAgICAgICAgICAgICBcInMzOkdldE9iamVjdFZlcnNpb25BY2xcIixcbiAgICAgICAgICAgICAgICBcInMzOkxpc3RCdWNrZXRcIixcbiAgICAgICAgICAgICAgICBcInMzOlB1dE9iamVjdFwiLFxuICAgICAgICAgICAgICAgIFwiczM6UHV0T2JqZWN0QWNsXCIsXG4gICAgICAgICAgICAgICAgXCJzMzpQdXRPYmplY3RWZXJzaW9uQWNsXCJcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYXJ0aWZhY3RCdWNrZXQuYnVja2V0QXJuLFxuICAgICAgICAgICAgICAgIGAke2FydGlmYWN0QnVja2V0LmJ1Y2tldEFybn0vKmBcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdXG4gICAgICAgIH0pLFxuICAgICAgICBbXCJkZXNjcmliZUluc3RhbmNlXCJdOiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgXCJhdXRvc2NhbGluZzpEZXNjcmliZUF1dG9TY2FsaW5nSW5zdGFuY2VzXCIsXG4gICAgICAgICAgICAgICAgXCJjbG91ZHdhdGNoOlB1dE1ldHJpY0RhdGFcIixcbiAgICAgICAgICAgICAgICBcImNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tSZXNvdXJjZVwiLFxuICAgICAgICAgICAgICAgIFwiZWMyOkRlc2NyaWJlVGFnc1wiXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdXG4gICAgICAgIH0pLFxuICAgICAgICBbXCJsb2dnaW5nXCJdOiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgXCJsb2dzOkNyZWF0ZUxvZ0dyb3VwXCIsXG4gICAgICAgICAgICAgICAgXCJsb2dzOkNyZWF0ZUxvZ1N0cmVhbVwiLFxuICAgICAgICAgICAgICAgIFwibG9nczpQdXRMb2dFdmVudHNcIixcbiAgICAgICAgICAgICAgICBcImxvZ3M6RGVzY3JpYmVMb2dHcm91cHNcIixcbiAgICAgICAgICAgICAgICBcImxvZ3M6RGVzY3JpYmVMb2dTdHJlYW1zXCJcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSksXG4gICAgICAgIFtcInNzbVwiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIFwic3NtOkRlc2NyaWJlSW5zdGFuY2VQcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAgXCJzc206TGlzdEFzc29jaWF0aW9uc1wiLFxuICAgICAgICAgICAgICAgIFwic3NtOlB1dEludmVudG9yeVwiLFxuICAgICAgICAgICAgICAgIFwic3NtOlVwZGF0ZUluc3RhbmNlSW5mb3JtYXRpb25cIixcbiAgICAgICAgICAgICAgICBcInNzbW1lc3NhZ2VzOkNyZWF0ZUNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpDcmVhdGVEYXRhQ2hhbm5lbFwiLFxuICAgICAgICAgICAgICAgIFwic3NtbWVzc2FnZXM6T3BlbkNvbnRyb2xDaGFubmVsXCIsXG4gICAgICAgICAgICAgICAgXCJzc21tZXNzYWdlczpPcGVuRGF0YUNoYW5uZWxcIixcbiAgICAgICAgICAgICAgICBcImVjMm1lc3NhZ2VzOkFja25vd2xlZGdlTWVzc2FnZVwiLFxuICAgICAgICAgICAgICAgIFwiZWMybWVzc2FnZXM6RGVsZXRlTWVzc2FnZVwiLFxuICAgICAgICAgICAgICAgIFwiZWMybWVzc2FnZXM6RmFpbE1lc3NhZ2VcIixcbiAgICAgICAgICAgICAgICBcImVjMm1lc3NhZ2VzOkdldEVuZHBvaW50XCIsXG4gICAgICAgICAgICAgICAgXCJlYzJtZXNzYWdlczpHZXRNZXNzYWdlc1wiLFxuICAgICAgICAgICAgICAgIFwiZWMybWVzc2FnZXM6U2VuZFJlcGx5XCJcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBhc3N1bWVkQnk6IG5ldyBDb21wb3NpdGVQcmluY2lwYWwoXG4gICAgICAgIG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiYXV0b3NjYWxpbmcuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJlYzIuYW1hem9uYXdzLmNvbVwiKVxuICAgICAgKVxuICAgIH0pO1xuXG4gICAgLy8gQnVpbGRraXRlIEFnZW50IEVDMiBVc2VyIERhdGFcbiAgICBjb25zdCBtdWx0aXBhcnRVc2VyRGF0YSA9IG5ldyBNdWx0aXBhcnRVc2VyRGF0YSgpO1xuXG4gICAgLy8gQ2xvdWQgQ29uZmlnXG4gICAgY29uc3QgY2xvdWRDb25maWdVc2VyRGF0YSA9IFVzZXJEYXRhLmZvckxpbnV4KHtcbiAgICAgIHNoZWJhbmc6IFwiI2Nsb3VkLWNvbmZpZ1wiXG4gICAgfSk7XG4gICAgY2xvdWRDb25maWdVc2VyRGF0YS5hZGRDb21tYW5kcyhcbiAgICAgIFwiY2xvdWRfZmluYWxfbW9kdWxlczpcIixcbiAgICAgIFwiICAtIFtzY3JpcHRzLXVzZXIsIGFsd2F5c11cIlxuICAgICk7XG4gICAgbXVsdGlwYXJ0VXNlckRhdGEuYWRkUGFydChcbiAgICAgIE11bHRpcGFydEJvZHkuZnJvbVVzZXJEYXRhKFxuICAgICAgICBjbG91ZENvbmZpZ1VzZXJEYXRhLFxuICAgICAgICBcInRleHQvY2xvdWQtY29uZmlnOyBjaGFyc2V0PSd1cy1hc2NpaSdcIlxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBNb3VudCBTdG9yYWdlXG4gICAgY29uc3QgbW91bnRTdG9yYWdlVXNlckRhdGEgPSBVc2VyRGF0YS5mb3JMaW51eCh7XG4gICAgICBzaGViYW5nOiBcIiMhL2Jpbi9iYXNoIC12XCJcbiAgICB9KTtcbiAgICBtb3VudFN0b3JhZ2VVc2VyRGF0YS5hZGRDb21tYW5kcyhcbiAgICAgIGBCVUlMREtJVEVfRU5BQkxFX0lOU1RBTkNFX1NUT1JBR0U9JyR7cHJvcHMuaW5zdGFuY2VTdG9yYWdlfScgXFxcXGAsXG4gICAgICBcIi91c3IvbG9jYWwvYmluL2JrLW1vdW50LWluc3RhbmNlLXN0b3JhZ2Uuc2hcIlxuICAgICk7XG4gICAgbXVsdGlwYXJ0VXNlckRhdGEuYWRkUGFydChcbiAgICAgIE11bHRpcGFydEJvZHkuZnJvbVVzZXJEYXRhKFxuICAgICAgICBtb3VudFN0b3JhZ2VVc2VyRGF0YSxcbiAgICAgICAgXCJ0ZXh0L3gtc2hlbGxzY3JpcHQ7IGNoYXJzZXQ9J3VzLWFzY2lpJ1wiXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIENvbmZpZ3VyZSBEb2NrZXJcbiAgICBjb25zdCBjb25maWd1cmVEb2NrZXJVc2VyRGF0YSA9IFVzZXJEYXRhLmZvckxpbnV4KHtcbiAgICAgIHNoZWJhbmc6IFwiIyEvYmluL2Jhc2ggLXZcIlxuICAgIH0pO1xuICAgIGNvbmZpZ3VyZURvY2tlclVzZXJEYXRhLmFkZENvbW1hbmRzKFxuICAgICAgYERPQ0tFUl9VU0VSTlNfUkVNQVA9JyR7cHJvcHMuZG9ja2VyVXNlck5hbWVzcGFjZVJlbWFwfScgXFxcXGAsXG4gICAgICBgRE9DS0VSX0VYUEVSSU1FTlRBTD0nJHtwcm9wcy5kb2NrZXJFeHBlcmltZW50YWx9JyBcXFxcYCxcbiAgICAgIGBCVUlMREtJVEVfRU5BQkxFX0lOU1RBTkNFX1NUT1JBR0U9JyR7cHJvcHMuaW5zdGFuY2VTdG9yYWdlfScgXFxcXGAsXG4gICAgICBcIi91c3IvbG9jYWwvYmluL2JrLWNvbmZpZ3VyZS1kb2NrZXIuc2hcIlxuICAgICk7XG4gICAgbXVsdGlwYXJ0VXNlckRhdGEuYWRkUGFydChcbiAgICAgIE11bHRpcGFydEJvZHkuZnJvbVVzZXJEYXRhKFxuICAgICAgICBjb25maWd1cmVEb2NrZXJVc2VyRGF0YSxcbiAgICAgICAgXCJ0ZXh0L3gtc2hlbGxzY3JpcHQ7IGNoYXJzZXQ9J3VzLWFzY2lpJ1wiXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGluc3RhbGxFbGFzdGljU3RhY2tVc2VyRGF0YSA9IFVzZXJEYXRhLmZvckxpbnV4KHtcbiAgICAgIHNoZWJhbmc6IFwiIyEvYmluL2Jhc2ggLXZcIlxuICAgIH0pO1xuICAgIGluc3RhbGxFbGFzdGljU3RhY2tVc2VyRGF0YS5hZGRDb21tYW5kcyhcbiAgICAgIGBCVUlMREtJVEVfU1RBQ0tfTkFNRT0nJHtpZH0nIFxcXFxgLFxuICAgICAgYEJVSUxES0lURV9TVEFDS19WRVJTSU9OPScke3Byb3BzLmVsYXN0aWNTdGFja1ZlcnNpb259JyBcXFxcYCxcbiAgICAgIGBCVUlMREtJVEVfU0NBTEVfSU5fSURMRV9QRVJJT0Q9JyR7cHJvcHMuc2NhbGVJblBlcmlvZH0nIFxcXFxgLFxuICAgICAgYEJVSUxES0lURV9TRUNSRVRTX0JVQ0tFVD0nJHttYW5hZ2VkU2VjcmV0c0J1Y2tldC5idWNrZXROYW1lfScgXFxcXGAsXG4gICAgICBgQlVJTERLSVRFX1NFQ1JFVFNfQlVDS0VUX1JFR0lPTj0nJHtwcm9wcy5lbnY/LnJlZ2lvbn0nIFxcXFxgLFxuICAgICAgYEJVSUxES0lURV9BR0VOVF9UT0tFTl9QQVRIPScke2FnZW50VG9rZW4ubmFtZX0nIFxcXFxgLFxuICAgICAgYEJVSUxES0lURV9BR0VOVFNfUEVSX0lOU1RBTkNFPScke3Byb3BzLmFnZW50c1Blckluc3RhbmNlfScgXFxcXGAsXG4gICAgICBgQlVJTERLSVRFX0FHRU5UX1RBR1M9JyR7cHJvcHMuYWdlbnRUYWdzfScgXFxcXGAsXG4gICAgICBgQlVJTERLSVRFX0FHRU5UX1RJTUVTVEFNUF9MSU5FUz0nJHtwcm9wcy50aW1lc3RhbXBMaW5lc30nIFxcXFxgLFxuICAgICAgYEJVSUxES0lURV9BR0VOVF9FWFBFUklNRU5UUz0nJHtwcm9wcy5leHBlcmltZW50c30nIFxcXFxgLFxuICAgICAgYEJVSUxES0lURV9BR0VOVF9UUkFDSU5HX0JBQ0tFTkQ9JyR7cHJvcHMudHJhY2luZ0JhY2tlbmR9JyBcXFxcYCxcbiAgICAgIGBCVUlMREtJVEVfQUdFTlRfUkVMRUFTRT0nJHtwcm9wcy5hZ2VudFJlbGVhc2V9JyBcXFxcYCxcbiAgICAgIGBCVUlMREtJVEVfUVVFVUU9JyR7cHJvcHMucXVldWVOYW1lfScgXFxcXGAsXG4gICAgICBgQlVJTERLSVRFX0FHRU5UX0VOQUJMRV9HSVRfTUlSUk9SUz0nJHtwcm9wcy5naXRNaXJyb3JzfScgXFxcXGAsXG4gICAgICBgQlVJTERLSVRFX0VMQVNUSUNfQk9PVFNUUkFQX1NDUklQVD0nJHtwcm9wcy5ib290c3RyYXBTY3JpcHR9JyBcXFxcYCxcbiAgICAgIGBCVUlMREtJVEVfRU5WX0ZJTEVfVVJMPScke3Byb3BzLmVudkZpbGVVcmx9JyBcXFxcYCxcbiAgICAgIGBCVUlMREtJVEVfRU5BQkxFX0lOU1RBTkNFX1NUT1JBR0U9JyR7cHJvcHMuaW5zdGFuY2VTdG9yYWdlfScgXFxcXGAsXG4gICAgICBgQlVJTERLSVRFX0FVVEhPUklaRURfVVNFUlNfVVJMPScke3Byb3BzLmF1dGhvcml6ZWRVc2Vyc1VybH0nIFxcXFxgLFxuICAgICAgYEJVSUxES0lURV9FQ1JfUE9MSUNZPScke3Byb3BzLmVjckFjY2Vzc1BvbGljeX0nIFxcXFxgLFxuICAgICAgYEJVSUxES0lURV9URVJNSU5BVEVfSU5TVEFOQ0VfQUZURVJfSk9CPScke3Byb3BzLmluc3RhbmNlVGVybWluYXRpb25BZnRlckpvYn0nIFxcXFxgLFxuICAgICAgYEJVSUxES0lURV9BRERJVElPTkFMX1NVRE9fUEVSTUlTU0lPTlM9JyR7cHJvcHMuc3Vkb1Blcm1pc3Npb25zfScgXFxcXGAsXG4gICAgICBgQVdTX0RFRkFVTFRfUkVHSU9OPScke3Byb3BzLmVudj8ucmVnaW9ufScgXFxcXGAsXG4gICAgICBgU0VDUkVUU19QTFVHSU5fRU5BQkxFRD0nJHtwcm9wcy5zZWNyZXRzUGx1Z2luRW5hYmxlZH0nIFxcXFxgLFxuICAgICAgYEVDUl9QTFVHSU5fRU5BQkxFRD0nJHtwcm9wcy5lY3JQbHVnaW5FbmFibGVkfScgXFxcXGAsXG4gICAgICBgRE9DS0VSX0xPR0lOX1BMVUdJTl9FTkFCTEVEPScke3Byb3BzLmRvY2tlckxvZ2luUGx1Z2luRW5hYmxlZH0nIFxcXFxgLFxuICAgICAgYERPQ0tFUl9FWFBFUklNRU5UQUw9JyR7cHJvcHMuZG9ja2VyRXhwZXJpbWVudGFsfScgXFxcXGAsXG4gICAgICBgQVdTX1JFR0lPTj0nJHtwcm9wcy5lbnY/LnJlZ2lvbn0nIFxcXFxgLFxuICAgICAgXCIvdXNyL2xvY2FsL2Jpbi9iay1pbnN0YWxsLWVsYXN0aWMtc3RhY2suc2hcIlxuICAgICk7XG5cbiAgICAvLyBNZXJnZSBVc2VyIERhdGFcbiAgICBtdWx0aXBhcnRVc2VyRGF0YS5hZGRQYXJ0KFxuICAgICAgTXVsdGlwYXJ0Qm9keS5mcm9tVXNlckRhdGEoXG4gICAgICAgIGluc3RhbGxFbGFzdGljU3RhY2tVc2VyRGF0YSxcbiAgICAgICAgXCJ0ZXh0L3gtc2hlbGxzY3JpcHQ7IGNoYXJzZXQ9J3VzLWFzY2lpJ1wiXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIExhdW5jaCBUZW1wbGF0ZVxuICAgIGNvbnN0IGxhdW5jaFRlbXBsYXRlID0gbmV3IExhdW5jaFRlbXBsYXRlKHRoaXMsIFwiYWdlbnRMYXVuY2hUZW1wbGF0ZVwiLCB7XG4gICAgICBsYXVuY2hUZW1wbGF0ZU5hbWU6IGBidWlsZGtpdGVMYXVuY2hUZW1wbGF0ZWAsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmFnZW50SW5zdGFuY2VUeXBlLFxuICAgICAgbWFjaGluZUltYWdlOiBNYWNoaW5lSW1hZ2UubG9va3VwKHtcbiAgICAgICAgbmFtZTogXCJidWlsZGtpdGUtc3RhY2stbGludXgteDg2XzY0LSpcIixcbiAgICAgICAgb3duZXJzOiBbXCIxNzI4NDAwNjQ4MzJcIl0sXG4gICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICBbXCJibG9jay1kZXZpY2UtbWFwcGluZy52b2x1bWUtdHlwZVwiXTogW1wiZ3AzXCJdXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdXNlckRhdGE6IG11bHRpcGFydFVzZXJEYXRhLFxuICAgICAgcm9sZTogYWdlbnRSb2xlLFxuICAgICAgYmxvY2tEZXZpY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkZXZpY2VOYW1lOiBcIi9kZXYveHZkYVwiLFxuICAgICAgICAgIHZvbHVtZTogQmxvY2tEZXZpY2VWb2x1bWUuZWJzKHByb3BzLmFnZW50Vm9sdW1lU2l6ZSlcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGRldGFpbGVkTW9uaXRvcmluZzogdHJ1ZSxcbiAgICAgIHJlcXVpcmVJbWRzdjI6IGZhbHNlLFxuICAgICAgaHR0cFB1dFJlc3BvbnNlSG9wTGltaXQ6IDIsXG4gICAgICBodHRwVG9rZW5zOiBMYXVuY2hUZW1wbGF0ZUh0dHBUb2tlbnMuUkVRVUlSRUQsXG4gICAgICBpbnN0YW5jZU1ldGFkYXRhVGFnczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGFnUmVzb3VyY2UobGF1bmNoVGVtcGxhdGUsIHtcbiAgICAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246ZW52aXJvbm1lbnRcIjogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOnNlcnZpY2VcIjogXCJidWlsZGtpdGVcIixcbiAgICAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246b3duZXJcIjogXCJwbGF0Zm9ybVwiLFxuICAgICAgUm9sZTogXCJidWlsZGtpdGVBZ2VudFwiLFxuICAgICAgQnVpbGRraXRlQWdlbnRSZWxlYXNlOiBhZ2VudFJlbGVhc2UuU1RBQkxFLFxuICAgICAgQnVpbGRraXRlUXVldWU6IHByb3BzLnF1ZXVlTmFtZVxuICAgIH0pO1xuXG4gICAgLy8gQXV0b3NjYWxpbmcgR3JvdXBcbiAgICBjb25zdCBhdXRvU2NhbGluZ0dyb3VwID0gbmV3IEF1dG9TY2FsaW5nR3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgXCJhZ2VudEF1dG9TY2FsaW5nR3JvdXBcIixcbiAgICAgIHtcbiAgICAgICAgdnBjOiB2cGMsXG4gICAgICAgIG1peGVkSW5zdGFuY2VzUG9saWN5OiB7XG4gICAgICAgICAgbGF1bmNoVGVtcGxhdGU6IGxhdW5jaFRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlc0Rpc3RyaWJ1dGlvbjoge1xuICAgICAgICAgICAgb25EZW1hbmRQZXJjZW50YWdlQWJvdmVCYXNlQ2FwYWNpdHk6IHByb3BzLnNwb3RDYXBhY2l0eVBlcmNlbnRhZ2UsXG4gICAgICAgICAgICBzcG90QWxsb2NhdGlvblN0cmF0ZWd5OiBTcG90QWxsb2NhdGlvblN0cmF0ZWd5LkNBUEFDSVRZX09QVElNSVpFRFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWluQ2FwYWNpdHk6IHByb3BzLmFnZW50TWluSW5zdGFuY2VzLFxuICAgICAgICBtYXhDYXBhY2l0eTogcHJvcHMuYWdlbnRNYXhJbnN0YW5jZXMsXG4gICAgICAgIGNvb2xkb3duOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgICAgZ3JvdXBNZXRyaWNzOiBbR3JvdXBNZXRyaWNzLmFsbCgpXSxcbiAgICAgICAgdXBkYXRlUG9saWN5OiBVcGRhdGVQb2xpY3kucmVwbGFjaW5nVXBkYXRlKCksXG4gICAgICAgIG5ld0luc3RhbmNlc1Byb3RlY3RlZEZyb21TY2FsZUluOiB0cnVlLFxuICAgICAgICB0ZXJtaW5hdGlvblBvbGljaWVzOiBbXG4gICAgICAgICAgVGVybWluYXRpb25Qb2xpY3kuT0xERVNUX0xBVU5DSF9DT05GSUdVUkFUSU9OLFxuICAgICAgICAgIFRlcm1pbmF0aW9uUG9saWN5LkNMT1NFU1RfVE9fTkVYVF9JTlNUQU5DRV9IT1VSXG4gICAgICAgIF0sXG4gICAgICAgIHNzbVNlc3Npb25QZXJtaXNzaW9uczogdHJ1ZVxuICAgICAgfVxuICAgICk7XG5cbiAgICBhZ2VudFJvbGUuYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCBcInVwZGF0ZUF1dG9TY2FsaW5nR3JvdXBcIiwge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIFwiYXV0b3NjYWxpbmc6U2V0SW5zdGFuY2VIZWFsdGhcIixcbiAgICAgICAgICAgICAgXCJhdXRvc2NhbGluZzpUZXJtaW5hdGVJbnN0YW5jZUluQXV0b1NjYWxpbmdHcm91cFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbYCR7YXV0b1NjYWxpbmdHcm91cC5hdXRvU2NhbGluZ0dyb3VwQXJufWBdXG4gICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGFnUmVzb3VyY2UoYXV0b1NjYWxpbmdHcm91cCwge1xuICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjplbnZpcm9ubWVudFwiOiBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246c2VydmljZVwiOiBcImJ1aWxka2l0ZVwiLFxuICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpvd25lclwiOiBcInBsYXRmb3JtXCJcbiAgICB9KTtcblxuICAgIC8vIEJ1aWxka2l0ZSBTdXNwZW5kIEF1c3Rvc2NhbGluZyBHcm91cCBDdXN0b20gUmVzb3VyY2VcbiAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJzdXNwZW5kQXV0b3NjYWxpbmdQcm9jZXNzXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogXCJzdXNwZW5kQXV0b1NjYWxpbmdQcm9jZXNzZXNzXCIsXG4gICAgICBvbkNyZWF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIkF1dG9TY2FsaW5nXCIsXG4gICAgICAgIGFjdGlvbjogXCJzdXNwZW5kUHJvY2Vzc2VzXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBBdXRvU2NhbGluZ0dyb3VwTmFtZTogYXV0b1NjYWxpbmdHcm91cC5hdXRvU2NhbGluZ0dyb3VwTmFtZSxcbiAgICAgICAgICBTY2FsaW5nUHJvY2Vzc2VzOiBbXCJBWlJlYmFsYW5jZVwiXVxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IFBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBcInN1c3BlbmRBdXRvU2NhbGluZ1Byb2Nlc3Nlc3NcIlxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJBdXRvU2NhbGluZ1wiLFxuICAgICAgICBhY3Rpb246IFwic3VzcGVuZFByb2Nlc3Nlc1wiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQXV0b1NjYWxpbmdHcm91cE5hbWU6IGF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWUsXG4gICAgICAgICAgU2NhbGluZ1Byb2Nlc3NlczogW1wiQVpSZWJhbGFuY2VcIl1cbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgXCJzdXNwZW5kQXV0b1NjYWxpbmdQcm9jZXNzZXNzXCJcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OmJ1aWxka2l0ZVN1c3BlbmRBdXRvc2NhbGluZ1wiXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuQXBwbGljYXRpb24odGhpcywgXCJhZ2VudFNjYWxlclwiLCB7XG4gICAgICBsb2NhdGlvbjoge1xuICAgICAgICBhcHBsaWNhdGlvbklkOlxuICAgICAgICAgIFwiYXJuOmF3czpzZXJ2ZXJsZXNzcmVwbzp1cy1lYXN0LTE6MTcyODQwMDY0ODMyOmFwcGxpY2F0aW9ucy9idWlsZGtpdGUtYWdlbnQtc2NhbGVyXCIsXG4gICAgICAgIHNlbWFudGljVmVyc2lvbjogcHJvcHMuYWdlbnRTY2FsZXJWZXJzaW9uXG4gICAgICB9LFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBCdWlsZGtpdGVBZ2VudFRva2VuUGFyYW1ldGVyOiBgJHthZ2VudFRva2VuLm5hbWV9YCxcbiAgICAgICAgQnVpbGRraXRlQWdlbnRUb2tlblBhcmFtZXRlclN0b3JlS01TS2V5OiBhZ2VudFRva2VuLmNtay5rZXkua2V5QXJuLFxuICAgICAgICBSb2xlUGVybWlzc2lvbnNCb3VuZGFyeUFSTjogXCJcIixcbiAgICAgICAgQnVpbGRraXRlUXVldWU6IHByb3BzLnF1ZXVlTmFtZSxcbiAgICAgICAgQWdlbnRzUGVySW5zdGFuY2U6IGAke3Byb3BzLmFnZW50c1Blckluc3RhbmNlfWAsXG4gICAgICAgIE1pblNpemU6IGAke3Byb3BzLmFnZW50TWluSW5zdGFuY2VzfWAsXG4gICAgICAgIE1heFNpemU6IGAke3Byb3BzLmFnZW50TWF4SW5zdGFuY2VzfWAsXG4gICAgICAgIEFnZW50QXV0b1NjYWxlR3JvdXA6IGF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWUsXG4gICAgICAgIFNjYWxlT3V0RmFjdG9yOiBwcm9wcy5zY2FsZU91dEZhY3RvcixcbiAgICAgICAgU2NhbGVPdXRGb3JXYWl0aW5nSm9iczogYCR7cHJvcHMuc2NhbGVPdXRXYWl0aW5nRm9ySm9ic31gLFxuICAgICAgICBFdmVudFNjaGVkdWxlUGVyaW9kOiBwcm9wcy5ldmVudFNjaGVkdWxlZFBlcmlvZCxcbiAgICAgICAgTWluUG9sbEludGVydmFsOiBwcm9wcy5taW5Qb2xsSW50ZXJ2YWxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./
|
|
1
|
+
export * from "./managedOrganisation";
|
|
2
|
+
export * from "./basicApp";
|
|
@@ -14,6 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
18
|
-
__exportStar(require("./
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
__exportStar(require("./managedOrganisation"), exports);
|
|
18
|
+
__exportStar(require("./basicApp"), exports);
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3REFBc0M7QUFDdEMsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vbWFuYWdlZE9yZ2FuaXNhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYmFzaWNBcHBcIjtcbiJdfQ==
|
package/dist/lib/patterns/aws/{multiEnvironmentOrganisation.d.ts → managedOrganisation.d.ts}
RENAMED
|
@@ -1,33 +1,31 @@
|
|
|
1
1
|
import { Stack } from "aws-cdk-lib";
|
|
2
2
|
import { Construct } from "constructs";
|
|
3
3
|
import { Account } from "@pepperize/cdk-organizations";
|
|
4
|
-
interface
|
|
4
|
+
interface ManagedOrganisationProps {
|
|
5
5
|
organisationName: string;
|
|
6
6
|
accountEmail: string;
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* A construct for creating multi environment organisations with a production, staging and development account.
|
|
10
10
|
*/
|
|
11
|
-
export declare class
|
|
12
|
-
props:
|
|
11
|
+
export declare class ManagedOrganisation extends Construct {
|
|
12
|
+
props: ManagedOrganisationProps;
|
|
13
13
|
private organisation;
|
|
14
14
|
private organisationalUnits;
|
|
15
15
|
private accounts;
|
|
16
|
-
constructor(scope: Construct, id: string, props:
|
|
16
|
+
constructor(scope: Construct, id: string, props: ManagedOrganisationProps);
|
|
17
17
|
private addOrganisation;
|
|
18
|
-
private
|
|
19
|
-
private addStagingUnit;
|
|
20
|
-
private addDevelopmentUnit;
|
|
18
|
+
private addOrganisationUnitsAndAccounts;
|
|
21
19
|
private addOrganisationalUnit;
|
|
22
20
|
private addAccount;
|
|
23
21
|
getAccounts(): Account[];
|
|
24
22
|
}
|
|
25
|
-
export default
|
|
23
|
+
export default ManagedOrganisation;
|
|
26
24
|
/**
|
|
27
25
|
* A stack for creating multi environment organisations with a production, staging and development account.
|
|
28
26
|
*/
|
|
29
|
-
export declare class
|
|
27
|
+
export declare class ManagedOrganisationStack extends Stack {
|
|
30
28
|
private resource;
|
|
31
|
-
constructor(id: string, props:
|
|
29
|
+
constructor(id: string, props: ManagedOrganisationProps);
|
|
32
30
|
getAccounts(): Account[];
|
|
33
31
|
}
|