@fjall/components-infrastructure 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/dist/lib/app.d.ts +2 -1
  2. package/dist/lib/app.js +4 -2
  3. package/dist/lib/config/aws/accountId.d.ts +6 -0
  4. package/dist/lib/config/aws/accountId.js +33 -0
  5. package/dist/lib/config/aws/cloudTrail.d.ts +10 -0
  6. package/dist/lib/config/aws/cloudTrail.js +22 -0
  7. package/dist/lib/config/aws/costAllocationTags.d.ts +4 -0
  8. package/dist/lib/config/aws/costAllocationTags.js +59 -0
  9. package/dist/lib/config/aws/delegateHostedZoneRole.d.ts +5 -0
  10. package/dist/lib/config/aws/delegateHostedZoneRole.js +77 -0
  11. package/dist/lib/config/aws/ecrDefaultImage.d.ts +11 -0
  12. package/dist/lib/config/aws/ecrDefaultImage.js +127 -0
  13. package/dist/lib/config/aws/eventBus.d.ts +7 -0
  14. package/dist/lib/config/aws/eventBus.js +24 -0
  15. package/dist/lib/config/aws/identityCenter.d.ts +13 -0
  16. package/dist/lib/config/aws/identityCenter.js +102 -0
  17. package/dist/lib/config/aws/identityCenterUser.d.ts +16 -0
  18. package/dist/lib/config/aws/identityCenterUser.js +125 -0
  19. package/dist/lib/config/aws/index.d.ts +12 -0
  20. package/dist/lib/config/aws/index.js +29 -0
  21. package/dist/lib/config/aws/ipam.d.ts +5 -0
  22. package/dist/lib/config/aws/ipam.js +48 -0
  23. package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +8 -0
  24. package/dist/lib/config/aws/ipamDelegateAdmin.js +58 -0
  25. package/dist/lib/config/aws/ipamPool.d.ts +5 -0
  26. package/dist/lib/config/aws/ipamPool.js +56 -0
  27. package/dist/lib/config/aws/ipamPoolId.d.ts +9 -0
  28. package/dist/lib/config/aws/ipamPoolId.js +36 -0
  29. package/dist/lib/config/aws/{base/identityCenter.d.ts → ipamPoolResourceShare.d.ts} +2 -2
  30. package/dist/lib/config/aws/ipamPoolResourceShare.js +42 -0
  31. package/dist/lib/config/aws/organisation.d.ts +28 -0
  32. package/dist/lib/config/aws/organisation.js +142 -0
  33. package/dist/lib/config/aws/organisationId.d.ts +7 -0
  34. package/dist/lib/config/aws/organisationId.js +46 -0
  35. package/dist/lib/config/aws/{base/ipamPool.d.ts → ramEnableSharing.d.ts} +1 -1
  36. package/dist/lib/config/aws/ramEnableSharing.js +35 -0
  37. package/dist/lib/config/aws/ramSharing.d.ts +4 -0
  38. package/dist/lib/config/aws/ramSharing.js +35 -0
  39. package/dist/lib/config/aws/{base/ipam.d.ts → users.d.ts} +1 -1
  40. package/dist/lib/config/aws/users.js +126 -0
  41. package/dist/lib/config/fjall/hostedZones/fjall.io.d.ts +10 -0
  42. package/dist/lib/config/fjall/hostedZones/fjall.io.js +25 -0
  43. package/dist/lib/index.d.ts +3 -0
  44. package/dist/lib/index.js +4 -1
  45. package/dist/lib/patterns/aws/basicApp.d.ts +47 -0
  46. package/dist/lib/patterns/aws/basicApp.js +90 -0
  47. package/dist/lib/patterns/aws/buildkite.d.ts +50 -0
  48. package/dist/lib/patterns/aws/buildkite.js +346 -0
  49. package/dist/lib/patterns/aws/freeTierApp.d.ts +46 -0
  50. package/dist/lib/patterns/aws/freeTierApp.js +95 -0
  51. package/dist/lib/patterns/aws/hostedZone.d.ts +11 -0
  52. package/dist/lib/patterns/aws/hostedZone.js +73 -0
  53. package/dist/lib/patterns/aws/index.d.ts +5 -2
  54. package/dist/lib/patterns/aws/index.js +6 -3
  55. package/dist/lib/patterns/aws/managedAccount.d.ts +13 -0
  56. package/dist/lib/patterns/aws/managedAccount.js +39 -0
  57. package/dist/lib/patterns/aws/managedOrganisation.d.ts +19 -0
  58. package/dist/lib/patterns/aws/managedOrganisation.js +45 -0
  59. package/dist/lib/patterns/aws/managedPlatform.d.ts +13 -0
  60. package/dist/lib/patterns/aws/managedPlatform.js +22 -0
  61. package/dist/lib/patterns/aws/spotInstanceApp.d.ts +46 -0
  62. package/dist/lib/patterns/aws/spotInstanceApp.js +95 -0
  63. package/dist/lib/patterns/aws/subdomainHostedZone.d.ts +9 -0
  64. package/dist/lib/patterns/aws/subdomainHostedZone.js +39 -0
  65. package/dist/lib/resources/aws/awsStack.d.ts +5 -0
  66. package/dist/lib/resources/aws/awsStack.js +11 -1
  67. package/dist/lib/resources/aws/compute/ecs.d.ts +74 -0
  68. package/dist/lib/resources/aws/compute/ecs.js +269 -0
  69. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +76 -0
  70. package/dist/lib/resources/aws/compute/ecsFreeTier.js +352 -0
  71. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +76 -0
  72. package/dist/lib/resources/aws/compute/ecsSpot.js +334 -0
  73. package/dist/lib/resources/aws/compute/index.d.ts +2 -0
  74. package/dist/lib/resources/aws/compute/index.js +19 -0
  75. package/dist/lib/resources/aws/compute/lambda.d.ts +13 -6
  76. package/dist/lib/resources/aws/compute/lambda.js +23 -4
  77. package/dist/lib/resources/aws/constant/ecr.js +4 -3
  78. package/dist/lib/resources/aws/constant/vpc.d.ts +10 -2
  79. package/dist/lib/resources/aws/constant/vpc.js +18 -8
  80. package/dist/lib/resources/aws/database/database.d.ts +16 -0
  81. package/dist/lib/resources/aws/database/database.js +30 -0
  82. package/dist/lib/resources/aws/database/databaseFreeTier.d.ts +17 -0
  83. package/dist/lib/resources/aws/database/databaseFreeTier.js +31 -0
  84. package/dist/lib/resources/aws/database/databaseInstance.d.ts +17 -0
  85. package/dist/lib/resources/aws/database/databaseInstance.js +32 -0
  86. package/dist/lib/resources/aws/database/index.d.ts +2 -0
  87. package/dist/lib/resources/aws/database/index.js +19 -0
  88. package/dist/lib/resources/aws/database/rds.d.ts +23 -0
  89. package/dist/lib/resources/aws/database/rds.js +130 -0
  90. package/dist/lib/resources/aws/database/rdsFreeTier.d.ts +36 -0
  91. package/dist/lib/resources/aws/database/rdsFreeTier.js +80 -0
  92. package/dist/lib/resources/aws/database/rdsInstance.d.ts +42 -0
  93. package/dist/lib/resources/aws/database/rdsInstance.js +173 -0
  94. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +13 -0
  95. package/dist/lib/resources/aws/iam/identityCenter/group.js +14 -0
  96. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +13 -0
  97. package/dist/lib/resources/aws/iam/index.d.ts +5 -0
  98. package/dist/lib/resources/aws/iam/index.js +22 -0
  99. package/dist/lib/resources/aws/iam/instanceProfile.d.ts +5 -0
  100. package/dist/lib/resources/aws/iam/instanceProfile.js +13 -0
  101. package/dist/lib/resources/aws/iam/managedPolicy.d.ts +5 -0
  102. package/dist/lib/resources/aws/iam/managedPolicy.js +14 -0
  103. package/dist/lib/resources/aws/iam/policy.d.ts +5 -0
  104. package/dist/lib/resources/aws/iam/policy.js +13 -0
  105. package/dist/lib/resources/aws/iam/role.js +2 -7
  106. package/dist/lib/resources/aws/iam/securityGroup.d.ts +5 -0
  107. package/dist/lib/resources/aws/iam/securityGroup.js +14 -0
  108. package/dist/lib/resources/aws/index.d.ts +1 -0
  109. package/dist/lib/resources/aws/index.js +18 -0
  110. package/dist/lib/resources/aws/logging/cloudTrail.d.ts +18 -0
  111. package/dist/lib/resources/aws/logging/cloudTrail.js +46 -0
  112. package/dist/lib/resources/aws/logging/logGroup.d.ts +8 -4
  113. package/dist/lib/resources/aws/logging/logGroup.js +6 -7
  114. package/dist/lib/resources/aws/networking/hostedZone.d.ts +19 -3
  115. package/dist/lib/resources/aws/networking/hostedZone.js +59 -11
  116. package/dist/lib/resources/aws/networking/index.d.ts +3 -0
  117. package/dist/lib/resources/aws/networking/index.js +20 -0
  118. package/dist/lib/resources/aws/networking/ipam.d.ts +2 -2
  119. package/dist/lib/resources/aws/networking/ipam.js +3 -3
  120. package/dist/lib/resources/aws/networking/ipamPool.d.ts +14 -5
  121. package/dist/lib/resources/aws/networking/ipamPool.js +69 -22
  122. package/dist/lib/resources/aws/networking/vpc.d.ts +29 -0
  123. package/dist/lib/resources/aws/networking/vpc.js +64 -0
  124. package/dist/lib/resources/aws/secrets/alias.d.ts +5 -0
  125. package/dist/lib/resources/aws/secrets/alias.js +13 -0
  126. package/dist/lib/resources/aws/secrets/index.d.ts +5 -0
  127. package/dist/lib/resources/aws/secrets/index.js +22 -0
  128. package/dist/lib/resources/aws/secrets/kms.d.ts +14 -0
  129. package/dist/lib/resources/aws/secrets/kms.js +34 -0
  130. package/dist/lib/resources/aws/secrets/parameter.d.ts +26 -0
  131. package/dist/lib/resources/aws/secrets/parameter.js +100 -0
  132. package/dist/lib/resources/aws/secrets/secret.d.ts +24 -0
  133. package/dist/lib/resources/aws/secrets/secret.js +53 -0
  134. package/dist/lib/resources/aws/storage/ecr.d.ts +12 -0
  135. package/dist/lib/resources/aws/storage/ecr.js +31 -0
  136. package/dist/lib/resources/aws/storage/index.d.ts +2 -0
  137. package/dist/lib/resources/aws/storage/index.js +19 -0
  138. package/dist/lib/resources/aws/storage/s3.d.ts +11 -0
  139. package/dist/lib/resources/aws/storage/s3.js +44 -0
  140. package/dist/lib/resources/aws/store/alias.d.ts +5 -0
  141. package/dist/lib/resources/aws/store/alias.js +13 -0
  142. package/dist/lib/resources/aws/store/database.d.ts +7 -2
  143. package/dist/lib/resources/aws/store/database.js +9 -5
  144. package/dist/lib/resources/aws/store/index.d.ts +7 -0
  145. package/dist/lib/resources/aws/store/index.js +24 -0
  146. package/dist/lib/resources/aws/store/kms.d.ts +14 -0
  147. package/dist/lib/resources/aws/store/kms.js +34 -0
  148. package/dist/lib/resources/aws/store/parameter.d.ts +26 -0
  149. package/dist/lib/resources/aws/store/parameter.js +100 -0
  150. package/dist/lib/resources/aws/store/rds.d.ts +15 -15
  151. package/dist/lib/resources/aws/store/rds.js +110 -68
  152. package/dist/lib/resources/aws/store/s3.d.ts +11 -0
  153. package/dist/lib/resources/aws/store/s3.js +43 -0
  154. package/dist/lib/resources/aws/store/secret.d.ts +26 -0
  155. package/dist/lib/resources/aws/store/secret.js +55 -0
  156. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -6
  157. package/dist/lib/resources/aws/utilities/cfnOutput.js +2 -5
  158. package/dist/lib/resources/aws/utilities/codeBuild.d.ts +15 -0
  159. package/dist/lib/resources/aws/utilities/codeBuild.js +28 -0
  160. package/dist/lib/resources/aws/utilities/customResource.d.ts +20 -3
  161. package/dist/lib/resources/aws/utilities/customResource.js +24 -5
  162. package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -5
  163. package/dist/lib/resources/aws/utilities/resourceShare.d.ts +5 -0
  164. package/dist/lib/resources/aws/utilities/resourceShare.js +13 -0
  165. package/dist/lib/resources/index.d.ts +1 -0
  166. package/dist/lib/resources/index.js +18 -0
  167. package/dist/lib/types.d.ts +3 -0
  168. package/dist/lib/types.js +3 -0
  169. package/dist/lib/utils/capitalizeString.d.ts +1 -0
  170. package/dist/lib/utils/capitalizeString.js +8 -0
  171. package/dist/lib/utils/getAccountId.d.ts +1 -0
  172. package/dist/lib/utils/getAccountId.js +12 -0
  173. package/dist/lib/utils/getCidr.d.ts +8 -0
  174. package/dist/lib/utils/getCidr.js +42 -0
  175. package/dist/lib/utils/getConfig.d.ts +7 -5
  176. package/dist/lib/utils/getConfig.js +39 -11
  177. package/dist/lib/utils/getStackOutput.d.ts +1 -0
  178. package/dist/lib/utils/getStackOutput.js +20 -0
  179. package/dist/lib/utils/index.d.ts +1 -0
  180. package/dist/lib/utils/index.js +18 -0
  181. package/dist/lib/utils/stripAndCamelCase.d.ts +1 -0
  182. package/dist/lib/utils/stripAndCamelCase.js +17 -0
  183. package/dist/lib/utils/tagResource.d.ts +4 -0
  184. package/dist/lib/utils/tagResource.js +10 -0
  185. package/dist/lib/utils/usersConfig.d.ts +7 -0
  186. package/dist/lib/utils/usersConfig.js +18 -0
  187. package/package.json +23 -18
  188. package/dist/lib/config/aws/base/costAllocationTags.d.ts +0 -5
  189. package/dist/lib/config/aws/base/costAllocationTags.js +0 -57
  190. package/dist/lib/config/aws/base/iamIdentityCenter.d.ts +0 -5
  191. package/dist/lib/config/aws/base/iamIdentityCenter.js +0 -86
  192. package/dist/lib/config/aws/base/identityCenter.js +0 -90
  193. package/dist/lib/config/aws/base/ipam.js +0 -29
  194. package/dist/lib/config/aws/base/ipamPool.js +0 -46
  195. package/dist/lib/examples/custom-resources/lambda/aws-cost-allocation-tags/awsCostAllocationTagsLambda.d.ts +0 -2
  196. package/dist/lib/examples/custom-resources/lambda/aws-cost-allocation-tags/awsCostAllocationTagsLambda.js +0 -62
  197. package/dist/lib/examples/cutomResourceExample.d.ts +0 -6
  198. package/dist/lib/examples/cutomResourceExample.js +0 -45
  199. package/dist/lib/patterns/aws/customResource.d.ts +0 -7
  200. package/dist/lib/patterns/aws/customResource.js +0 -28
  201. package/dist/lib/patterns/aws/multiEnvironmentOrganisation.d.ts +0 -33
  202. package/dist/lib/patterns/aws/multiEnvironmentOrganisation.js +0 -107
  203. package/dist/lib/patterns/aws/webApp.d.ts +0 -17
  204. package/dist/lib/patterns/aws/webApp.js +0 -36
  205. package/dist/lib/resources/aws/compute/__tests__/fargate.test.d.ts +0 -1
  206. package/dist/lib/resources/aws/compute/__tests__/fargate.test.js +0 -21
  207. package/dist/lib/resources/aws/compute/fargate.d.ts +0 -23
  208. package/dist/lib/resources/aws/compute/fargate.js +0 -50
  209. package/dist/lib/resources/aws/constant/__tests__/vpc.test.d.ts +0 -1
  210. package/dist/lib/resources/aws/constant/__tests__/vpc.test.js +0 -13
  211. package/dist/lib/resources/aws/iam/assignment.js +0 -13
  212. package/dist/lib/resources/aws/iam/group.js +0 -15
  213. package/dist/lib/resources/aws/iam/iamRole.d.ts +0 -5
  214. package/dist/lib/resources/aws/iam/iamRole.js +0 -18
  215. package/dist/lib/resources/aws/iam/permissionSet.js +0 -13
  216. /package/dist/lib/resources/aws/iam/{assignment.d.ts → identityCenter/assignment.d.ts} +0 -0
  217. /package/dist/lib/resources/aws/iam/{group.d.ts → identityCenter/group.d.ts} +0 -0
  218. /package/dist/lib/resources/aws/iam/{permissionSet.d.ts → identityCenter/permissionSet.d.ts} +0 -0
package/dist/lib/app.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { App as CdkApp } from "aws-cdk-lib";
2
- export default class App extends CdkApp {
2
+ export declare class App extends CdkApp {
3
3
  private static instance;
4
4
  private constructor();
5
5
  static getInstance(): App;
6
6
  }
7
+ export default App;
package/dist/lib/app.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.App = void 0;
3
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
4
5
  class App extends aws_cdk_lib_1.App {
5
6
  constructor() {
@@ -14,6 +15,7 @@ class App extends aws_cdk_lib_1.App {
14
15
  return App.instance;
15
16
  }
16
17
  }
17
- exports.default = App;
18
+ exports.App = App;
18
19
  App.instance = null;
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUE0QztBQUU1QyxNQUFxQixHQUFJLFNBQVEsaUJBQU07SUFHckM7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFTSxNQUFNLENBQUMsV0FBVztRQUN2Qiw2REFBNkQ7UUFDN0QsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQ2pCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUMxQjtRQUVELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUN0QixDQUFDOztBQWZILHNCQWdCQztBQWZnQixZQUFRLEdBQWUsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwIGFzIENka0FwcCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcHAgZXh0ZW5kcyBDZGtBcHAge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQXBwIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBBcHAge1xuICAgIC8vIERlc3BpdGUgc3VwcG9ydGluZyBtdWx0aXBsZSBzdGFja3MgeW91IGNhbiBzdGlsbCBvbmx5IGV2ZXJcbiAgICAvLyBoYXZlIGEgc2luZ2xlIEFwcGxpY2F0aW9uIHBlciBDREsgZGVwbG95bWVudFxuICAgIGlmICghQXBwLmluc3RhbmNlKSB7XG4gICAgICBBcHAuaW5zdGFuY2UgPSBuZXcgQXBwKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFwcC5pbnN0YW5jZTtcbiAgfVxufVxuIl19
20
+ exports.default = App;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBNEM7QUFFNUMsTUFBYSxHQUFJLFNBQVEsaUJBQU07SUFHN0I7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFTSxNQUFNLENBQUMsV0FBVztRQUN2Qiw2REFBNkQ7UUFDN0QsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQ2pCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUMxQjtRQUVELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUN0QixDQUFDOztBQWZILGtCQWdCQztBQWZnQixZQUFRLEdBQWUsSUFBSSxDQUFDO0FBZ0I3QyxrQkFBZSxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHAgYXMgQ2RrQXBwIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbmV4cG9ydCBjbGFzcyBBcHAgZXh0ZW5kcyBDZGtBcHAge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQXBwIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBBcHAge1xuICAgIC8vIERlc3BpdGUgc3VwcG9ydGluZyBtdWx0aXBsZSBzdGFja3MgeW91IGNhbiBzdGlsbCBvbmx5IGV2ZXJcbiAgICAvLyBoYXZlIGEgc2luZ2xlIEFwcGxpY2F0aW9uIHBlciBDREsgZGVwbG95bWVudFxuICAgIGlmICghQXBwLmluc3RhbmNlKSB7XG4gICAgICBBcHAuaW5zdGFuY2UgPSBuZXcgQXBwKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFwcC5pbnN0YW5jZTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl19
@@ -0,0 +1,6 @@
1
+ import { CfnOutput } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ export declare class AccountId extends Construct {
4
+ readonly accountId: CfnOutput;
5
+ constructor(scope: Construct, id: string);
6
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AccountId = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const customResources = require("aws-cdk-lib/custom-resources");
6
+ const constructs_1 = require("constructs");
7
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
8
+ class AccountId extends constructs_1.Construct {
9
+ constructor(scope, id) {
10
+ super(scope, id);
11
+ const sts = new awsCustomResource_1.AwsCustomResource(this, "getAccountId", {
12
+ functionName: "getAccountId",
13
+ onCreate: {
14
+ service: "sts",
15
+ action: "GetCallerIdentityCommand",
16
+ physicalResourceId: customResources.PhysicalResourceId.of("getAccountId")
17
+ },
18
+ onUpdate: {
19
+ service: "sts",
20
+ action: "GetCallerIdentityCommand",
21
+ physicalResourceId: customResources.PhysicalResourceId.of("getAccountId")
22
+ },
23
+ resourceType: "Custom::getAccountId"
24
+ });
25
+ this.accountId = new aws_cdk_lib_1.CfnOutput(this, "AccountId", {
26
+ key: "AccountId",
27
+ value: sts.getResponseField("Account"),
28
+ exportName: "AccountId"
29
+ });
30
+ }
31
+ }
32
+ exports.AccountId = AccountId;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudElkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3MvYWNjb3VudElkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF3QztBQUN4QyxnRUFBZ0U7QUFDaEUsMkNBQXVDO0FBRXZDLHVGQUFvRjtBQUVwRixNQUFhLFNBQVUsU0FBUSxzQkFBUztJQUd0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sR0FBRyxHQUFHLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUN0RCxZQUFZLEVBQUUsY0FBYztZQUM1QixRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLDBCQUEwQjtnQkFDbEMsa0JBQWtCLEVBQ2hCLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ3hEO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE1BQU0sRUFBRSwwQkFBMEI7Z0JBQ2xDLGtCQUFrQixFQUNoQixlQUFlLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUN4RDtZQUNELFlBQVksRUFBRSxzQkFBc0I7U0FDckMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUNoRCxHQUFHLEVBQUUsV0FBVztZQUNoQixLQUFLLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztZQUN0QyxVQUFVLEVBQUUsV0FBVztTQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE3QkQsOEJBNkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBjdXN0b21SZXNvdXJjZXMgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvdXRpbGl0aWVzL2F3c0N1c3RvbVJlc291cmNlXCI7XG5cbmV4cG9ydCBjbGFzcyBBY2NvdW50SWQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYWNjb3VudElkOiBDZm5PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBzdHMgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJnZXRBY2NvdW50SWRcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBcImdldEFjY291bnRJZFwiLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJzdHNcIixcbiAgICAgICAgYWN0aW9uOiBcIkdldENhbGxlcklkZW50aXR5Q29tbWFuZFwiLCAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy92My9sYXRlc3QvY2xpZW50L3N0cy9jb21tYW5kL0dldENhbGxlcklkZW50aXR5Q29tbWFuZC9cbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOlxuICAgICAgICAgIGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXCJnZXRBY2NvdW50SWRcIilcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcInN0c1wiLFxuICAgICAgICBhY3Rpb246IFwiR2V0Q2FsbGVySWRlbnRpdHlDb21tYW5kXCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL3YzL2xhdGVzdC9jbGllbnQvc3RzL2NvbW1hbmQvR2V0Q2FsbGVySWRlbnRpdHlDb21tYW5kL1xuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6XG4gICAgICAgICAgY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcImdldEFjY291bnRJZFwiKVxuICAgICAgfSxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OmdldEFjY291bnRJZFwiXG4gICAgfSk7XG5cbiAgICB0aGlzLmFjY291bnRJZCA9IG5ldyBDZm5PdXRwdXQodGhpcywgXCJBY2NvdW50SWRcIiwge1xuICAgICAga2V5OiBcIkFjY291bnRJZFwiLFxuICAgICAgdmFsdWU6IHN0cy5nZXRSZXNwb25zZUZpZWxkKFwiQWNjb3VudFwiKSxcbiAgICAgIGV4cG9ydE5hbWU6IFwiQWNjb3VudElkXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,10 @@
1
+ import { CfnOutput } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ export interface ManagementEventsTrailProps {
4
+ accountId: string;
5
+ }
6
+ export declare class ManagementEventsTrail extends Construct {
7
+ readonly defaultEventBusName: CfnOutput;
8
+ readonly defaultEventBusArn: CfnOutput;
9
+ constructor(scope: Construct, id: string, props: ManagementEventsTrailProps);
10
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ManagementEventsTrail = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const cloudTrail_1 = require("../../resources/aws/logging/cloudTrail");
6
+ class ManagementEventsTrail extends constructs_1.Construct {
7
+ constructor(scope, id, props) {
8
+ super(scope, id);
9
+ new cloudTrail_1.Trail(this, "managementEventsTrail", {
10
+ bucketName: `cloudtrail-management-events-${props.accountId}`,
11
+ trailName: "managementEvents",
12
+ isMultiRegionTrail: true,
13
+ tags: {
14
+ "fjall:costAllocation:environment": "management",
15
+ "fjall:costAllocation:service": "managementEventsTrail",
16
+ "fjall:costAllocation:owner": "Fjall"
17
+ }
18
+ });
19
+ }
20
+ }
21
+ exports.ManagementEventsTrail = ManagementEventsTrail;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRUcmFpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9jb25maWcvYXdzL2Nsb3VkVHJhaWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXVDO0FBQ3ZDLHVFQUErRDtBQU0vRCxNQUFhLHFCQUFzQixTQUFRLHNCQUFTO0lBSWxELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLGtCQUFLLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO1lBQ3ZDLFVBQVUsRUFBRSxnQ0FBZ0MsS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUM3RCxTQUFTLEVBQUUsa0JBQWtCO1lBQzdCLGtCQUFrQixFQUFFLElBQUk7WUFDeEIsSUFBSSxFQUFFO2dCQUNKLGtDQUFrQyxFQUFFLFlBQVk7Z0JBQ2hELDhCQUE4QixFQUFFLHVCQUF1QjtnQkFDdkQsNEJBQTRCLEVBQUUsT0FBTzthQUN0QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWxCRCxzREFrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBUcmFpbCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2xvZ2dpbmcvY2xvdWRUcmFpbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZW1lbnRFdmVudHNUcmFpbFByb3BzIHtcbiAgYWNjb3VudElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VtZW50RXZlbnRzVHJhaWwgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdEV2ZW50QnVzTmFtZTogQ2ZuT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdEV2ZW50QnVzQXJuOiBDZm5PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE1hbmFnZW1lbnRFdmVudHNUcmFpbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBUcmFpbCh0aGlzLCBcIm1hbmFnZW1lbnRFdmVudHNUcmFpbFwiLCB7XG4gICAgICBidWNrZXROYW1lOiBgY2xvdWR0cmFpbC1tYW5hZ2VtZW50LWV2ZW50cy0ke3Byb3BzLmFjY291bnRJZH1gLFxuICAgICAgdHJhaWxOYW1lOiBcIm1hbmFnZW1lbnRFdmVudHNcIixcbiAgICAgIGlzTXVsdGlSZWdpb25UcmFpbDogdHJ1ZSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjplbnZpcm9ubWVudFwiOiBcIm1hbmFnZW1lbnRcIixcbiAgICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpzZXJ2aWNlXCI6IFwibWFuYWdlbWVudEV2ZW50c1RyYWlsXCIsXG4gICAgICAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246b3duZXJcIjogXCJGamFsbFwiXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import { Construct } from "constructs";
2
+ export declare class CostAllocationTags extends Construct {
3
+ constructor(scope: Construct, id: string);
4
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CostAllocationTags = void 0;
4
+ const customResources = require("aws-cdk-lib/custom-resources");
5
+ const constructs_1 = require("constructs");
6
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
7
+ // TODO: Use an AWS CDK conditional trigger to wait for Cost Explorer to be created
8
+ const costAllocationTags = [
9
+ "aws:cloudformation:logical-id",
10
+ "aws:cloudformation:stack-id",
11
+ "aws:cloudformation:stack-name",
12
+ "aws:createdBy"
13
+ // "fjall:operations:pool"
14
+ // "fjall:costAllocation:environment",
15
+ // "fjall:costAllocation:service",
16
+ // "fjall:costAllocation:owner"
17
+ ];
18
+ function toggleCostTag(tags, tagStatus) {
19
+ return tags.map((tag) => {
20
+ return {
21
+ TagKey: tag,
22
+ Status: tagStatus
23
+ };
24
+ });
25
+ }
26
+ class CostAllocationTags extends constructs_1.Construct {
27
+ constructor(scope, id) {
28
+ super(scope, id);
29
+ new awsCustomResource_1.AwsCustomResource(this, "costAllocationTags", {
30
+ functionName: "enableCostAllocationTags",
31
+ onCreate: {
32
+ service: "CostExplorer",
33
+ action: "updateCostAllocationTagsStatus",
34
+ parameters: {
35
+ CostAllocationTagsStatus: toggleCostTag(costAllocationTags, "Active")
36
+ },
37
+ physicalResourceId: customResources.PhysicalResourceId.of("enableCostAllocationTags")
38
+ },
39
+ onUpdate: {
40
+ service: "CostExplorer",
41
+ action: "updateCostAllocationTagsStatus",
42
+ parameters: {
43
+ CostAllocationTagsStatus: toggleCostTag(costAllocationTags, "Active")
44
+ },
45
+ physicalResourceId: customResources.PhysicalResourceId.of("updateCostAllocationTags")
46
+ },
47
+ onDelete: {
48
+ service: "CostExplorer",
49
+ action: "updateCostAllocationTagsStatus",
50
+ parameters: {
51
+ CostAllocationTagsStatus: toggleCostTag(costAllocationTags, "Inactive")
52
+ }
53
+ },
54
+ resourceType: "Custom::CostAllocationTags"
55
+ });
56
+ }
57
+ }
58
+ exports.CostAllocationTags = CostAllocationTags;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zdEFsbG9jYXRpb25UYWdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3MvY29zdEFsbG9jYXRpb25UYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdFQUFnRTtBQUNoRSwyQ0FBdUM7QUFFdkMsdUZBQW9GO0FBRXBGLG1GQUFtRjtBQUNuRixNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLCtCQUErQjtJQUMvQiw2QkFBNkI7SUFDN0IsK0JBQStCO0lBQy9CLGVBQWU7SUFDZiwwQkFBMEI7SUFDMUIsc0NBQXNDO0lBQ3RDLGtDQUFrQztJQUNsQywrQkFBK0I7Q0FDaEMsQ0FBQztBQUVGLFNBQVMsYUFBYSxDQUFDLElBQWMsRUFBRSxTQUFpQjtJQUN0RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUN0QixPQUFPO1lBQ0wsTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNLEVBQUUsU0FBUztTQUNsQixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUztJQUMvQyxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ2hELFlBQVksRUFBRSwwQkFBMEI7WUFDeEMsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixNQUFNLEVBQUUsZ0NBQWdDO2dCQUN4QyxVQUFVLEVBQUU7b0JBQ1Ysd0JBQXdCLEVBQUUsYUFBYSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQztpQkFDdEU7Z0JBQ0Qsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FDdkQsMEJBQTBCLENBQzNCO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLE1BQU0sRUFBRSxnQ0FBZ0M7Z0JBQ3hDLFVBQVUsRUFBRTtvQkFDVix3QkFBd0IsRUFBRSxhQUFhLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDO2lCQUN0RTtnQkFDRCxrQkFBa0IsRUFBRSxlQUFlLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUN2RCwwQkFBMEIsQ0FDM0I7YUFDRjtZQUNELFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsY0FBYztnQkFDdkIsTUFBTSxFQUFFLGdDQUFnQztnQkFDeEMsVUFBVSxFQUFFO29CQUNWLHdCQUF3QixFQUFFLGFBQWEsQ0FDckMsa0JBQWtCLEVBQ2xCLFVBQVUsQ0FDWDtpQkFDRjthQUNGO1lBQ0QsWUFBWSxFQUFFLDRCQUE0QjtTQUMzQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF2Q0QsZ0RBdUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuXG4vLyBUT0RPOiBVc2UgYW4gQVdTIENESyBjb25kaXRpb25hbCB0cmlnZ2VyIHRvIHdhaXQgZm9yIENvc3QgRXhwbG9yZXIgdG8gYmUgY3JlYXRlZFxuY29uc3QgY29zdEFsbG9jYXRpb25UYWdzID0gW1xuICBcImF3czpjbG91ZGZvcm1hdGlvbjpsb2dpY2FsLWlkXCIsXG4gIFwiYXdzOmNsb3VkZm9ybWF0aW9uOnN0YWNrLWlkXCIsXG4gIFwiYXdzOmNsb3VkZm9ybWF0aW9uOnN0YWNrLW5hbWVcIixcbiAgXCJhd3M6Y3JlYXRlZEJ5XCJcbiAgLy8gXCJmamFsbDpvcGVyYXRpb25zOnBvb2xcIlxuICAvLyBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOmVudmlyb25tZW50XCIsXG4gIC8vIFwiZmphbGw6Y29zdEFsbG9jYXRpb246c2VydmljZVwiLFxuICAvLyBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOm93bmVyXCJcbl07XG5cbmZ1bmN0aW9uIHRvZ2dsZUNvc3RUYWcodGFnczogc3RyaW5nW10sIHRhZ1N0YXR1czogc3RyaW5nKSB7XG4gIHJldHVybiB0YWdzLm1hcCgodGFnKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFRhZ0tleTogdGFnLFxuICAgICAgU3RhdHVzOiB0YWdTdGF0dXNcbiAgICB9O1xuICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIENvc3RBbGxvY2F0aW9uVGFncyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiY29zdEFsbG9jYXRpb25UYWdzXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogXCJlbmFibGVDb3N0QWxsb2NhdGlvblRhZ3NcIixcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiQ29zdEV4cGxvcmVyXCIsXG4gICAgICAgIGFjdGlvbjogXCJ1cGRhdGVDb3N0QWxsb2NhdGlvblRhZ3NTdGF0dXNcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIENvc3RBbGxvY2F0aW9uVGFnc1N0YXR1czogdG9nZ2xlQ29zdFRhZyhjb3N0QWxsb2NhdGlvblRhZ3MsIFwiQWN0aXZlXCIpXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBcImVuYWJsZUNvc3RBbGxvY2F0aW9uVGFnc1wiXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIkNvc3RFeHBsb3JlclwiLFxuICAgICAgICBhY3Rpb246IFwidXBkYXRlQ29zdEFsbG9jYXRpb25UYWdzU3RhdHVzXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBDb3N0QWxsb2NhdGlvblRhZ3NTdGF0dXM6IHRvZ2dsZUNvc3RUYWcoY29zdEFsbG9jYXRpb25UYWdzLCBcIkFjdGl2ZVwiKVxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgXCJ1cGRhdGVDb3N0QWxsb2NhdGlvblRhZ3NcIlxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogXCJDb3N0RXhwbG9yZXJcIixcbiAgICAgICAgYWN0aW9uOiBcInVwZGF0ZUNvc3RBbGxvY2F0aW9uVGFnc1N0YXR1c1wiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgQ29zdEFsbG9jYXRpb25UYWdzU3RhdHVzOiB0b2dnbGVDb3N0VGFnKFxuICAgICAgICAgICAgY29zdEFsbG9jYXRpb25UYWdzLFxuICAgICAgICAgICAgXCJJbmFjdGl2ZVwiXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6Q29zdEFsbG9jYXRpb25UYWdzXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ import { Stack } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ export declare class DelegateHostedZoneRole extends Stack {
4
+ constructor(scope: Construct, id: string);
5
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DelegateHostedZoneRole = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const iam_1 = require("../../resources/aws/iam");
6
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
+ const customResources = require("aws-cdk-lib/custom-resources");
8
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
9
+ // TODO: Automatically import when a domain is imported, updated or created
10
+ const domains = ["Z08225072O6SFKZASVL1U"];
11
+ class DelegateHostedZoneRole extends aws_cdk_lib_1.Stack {
12
+ constructor(scope, id) {
13
+ super(scope, id);
14
+ const getHostedZoneArn = (domains) => {
15
+ const hostedZoneArn = [];
16
+ for (const domain of domains) {
17
+ hostedZoneArn.push(`arn:aws:route53:::hostedzone/${domain}`);
18
+ }
19
+ return hostedZoneArn;
20
+ };
21
+ const listHostedZones = new awsCustomResource_1.AwsCustomResource(this, "listHostedZones", {
22
+ functionName: "listHostedZones",
23
+ onCreate: {
24
+ service: "route-53",
25
+ action: "ListHostedZonesByNameCommand",
26
+ physicalResourceId: customResources.PhysicalResourceId.of("listHostedZones")
27
+ },
28
+ onUpdate: {
29
+ service: "route-53",
30
+ action: "ListHostedZonesByNameCommand",
31
+ physicalResourceId: customResources.PhysicalResourceId.of("HostedZoneId")
32
+ },
33
+ resourceType: "Custom::ListHostedZones",
34
+ policy: customResources.AwsCustomResourcePolicy.fromStatements([
35
+ new aws_iam_1.PolicyStatement({
36
+ actions: ["route53:ListHostedZonesByName"],
37
+ resources: ["*"],
38
+ effect: aws_iam_1.Effect.ALLOW
39
+ })
40
+ ])
41
+ });
42
+ new aws_cdk_lib_1.CfnOutput(this, "HostedZoneIds", {
43
+ key: "HostedZoneIds",
44
+ value: listHostedZones.getResponseField("HostedZoneId"),
45
+ exportName: "HostedZoneIds"
46
+ });
47
+ const role = new iam_1.Role(this, "DelegateHostedZoneRole", {
48
+ assumedBy: new aws_iam_1.OrganizationPrincipal(aws_cdk_lib_1.Fn.importValue("OrganisationId")),
49
+ roleName: "DelegateHostedZoneRole",
50
+ inlinePolicies: {
51
+ ["listHostedZones"]: new aws_iam_1.PolicyDocument({
52
+ statements: [
53
+ new aws_iam_1.PolicyStatement({
54
+ actions: ["route53:ListHostedZonesByName"],
55
+ resources: ["*"]
56
+ })
57
+ ]
58
+ }),
59
+ ["changeResourceRecordSets"]: new aws_iam_1.PolicyDocument({
60
+ statements: [
61
+ new aws_iam_1.PolicyStatement({
62
+ actions: ["route53:ChangeResourceRecordSets"],
63
+ resources: getHostedZoneArn(domains)
64
+ })
65
+ ]
66
+ })
67
+ }
68
+ });
69
+ new aws_cdk_lib_1.CfnOutput(this, "DelegateHostedZoneRoleArn", {
70
+ key: "DelegateHostedZoneRoleArn",
71
+ value: role.roleArn,
72
+ exportName: "DelegateHostedZoneRoleArn"
73
+ });
74
+ }
75
+ }
76
+ exports.DelegateHostedZoneRole = DelegateHostedZoneRole;
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGVIb3N0ZWRab25lUm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9jb25maWcvYXdzL2RlbGVnYXRlSG9zdGVkWm9uZVJvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQW1EO0FBRW5ELGlEQUErQztBQUMvQyxpREFLNkI7QUFDN0IsZ0VBQWdFO0FBQ2hFLHVGQUFvRjtBQUVwRiwyRUFBMkU7QUFDM0UsTUFBTSxPQUFPLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBRTFDLE1BQWEsc0JBQXVCLFNBQVEsbUJBQUs7SUFDL0MsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLGdCQUFnQixHQUFHLENBQUMsT0FBaUIsRUFBRSxFQUFFO1lBQzdDLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztZQUVuQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtnQkFDNUIsYUFBYSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsTUFBTSxFQUFFLENBQUMsQ0FBQzthQUM5RDtZQUNELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQ3JFLFlBQVksRUFBRSxpQkFBaUI7WUFDL0IsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixNQUFNLEVBQUUsOEJBQThCO2dCQUN0QyxrQkFBa0IsRUFDaEIsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQzthQUMzRDtZQUNELFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsVUFBVTtnQkFDbkIsTUFBTSxFQUFFLDhCQUE4QjtnQkFDdEMsa0JBQWtCLEVBQ2hCLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ3hEO1lBQ0QsWUFBWSxFQUFFLHlCQUF5QjtZQUN2QyxNQUFNLEVBQUUsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDN0QsSUFBSSx5QkFBZSxDQUFDO29CQUNsQixPQUFPLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztvQkFDMUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO29CQUNoQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2lCQUNyQixDQUFDO2FBQ0gsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ25DLEdBQUcsRUFBRSxlQUFlO1lBQ3BCLEtBQUssRUFBRSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDO1lBQ3ZELFVBQVUsRUFBRSxlQUFlO1NBQzVCLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFHLElBQUksVUFBSSxDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRTtZQUNwRCxTQUFTLEVBQUUsSUFBSSwrQkFBcUIsQ0FBQyxnQkFBRSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RFLFFBQVEsRUFBRSx3QkFBd0I7WUFDbEMsY0FBYyxFQUFFO2dCQUNkLENBQUMsaUJBQWlCLENBQUMsRUFBRSxJQUFJLHdCQUFjLENBQUM7b0JBQ3RDLFVBQVUsRUFBRTt3QkFDVixJQUFJLHlCQUFlLENBQUM7NEJBQ2xCLE9BQU8sRUFBRSxDQUFDLCtCQUErQixDQUFDOzRCQUMxQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7eUJBQ2pCLENBQUM7cUJBQ0g7aUJBQ0YsQ0FBQztnQkFDRixDQUFDLDBCQUEwQixDQUFDLEVBQUUsSUFBSSx3QkFBYyxDQUFDO29CQUMvQyxVQUFVLEVBQUU7d0JBQ1YsSUFBSSx5QkFBZSxDQUFDOzRCQUNsQixPQUFPLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQzs0QkFDN0MsU0FBUyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQzt5QkFDckMsQ0FBQztxQkFDSDtpQkFDRixDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFFO1lBQy9DLEdBQUcsRUFBRSwyQkFBMkI7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ25CLFVBQVUsRUFBRSwyQkFBMkI7U0FDeEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBeEVELHdEQXdFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgRm4sIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2lhbVwiO1xuaW1wb3J0IHtcbiAgRWZmZWN0LFxuICBPcmdhbml6YXRpb25QcmluY2lwYWwsXG4gIFBvbGljeURvY3VtZW50LFxuICBQb2xpY3lTdGF0ZW1lbnRcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCAqIGFzIGN1c3RvbVJlc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgQXdzQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcblxuLy8gVE9ETzogQXV0b21hdGljYWxseSBpbXBvcnQgd2hlbiBhIGRvbWFpbiBpcyBpbXBvcnRlZCwgdXBkYXRlZCBvciBjcmVhdGVkXG5jb25zdCBkb21haW5zID0gW1wiWjA4MjI1MDcyTzZTRktaQVNWTDFVXCJdO1xuXG5leHBvcnQgY2xhc3MgRGVsZWdhdGVIb3N0ZWRab25lUm9sZSBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBnZXRIb3N0ZWRab25lQXJuID0gKGRvbWFpbnM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBjb25zdCBob3N0ZWRab25lQXJuOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiBkb21haW5zKSB7XG4gICAgICAgIGhvc3RlZFpvbmVBcm4ucHVzaChgYXJuOmF3czpyb3V0ZTUzOjo6aG9zdGVkem9uZS8ke2RvbWFpbn1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBob3N0ZWRab25lQXJuO1xuICAgIH07XG5cbiAgICBjb25zdCBsaXN0SG9zdGVkWm9uZXMgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJsaXN0SG9zdGVkWm9uZXNcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBcImxpc3RIb3N0ZWRab25lc1wiLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJyb3V0ZS01M1wiLFxuICAgICAgICBhY3Rpb246IFwiTGlzdEhvc3RlZFpvbmVzQnlOYW1lQ29tbWFuZFwiLCAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy9sYXRlc3QvQVdTL1JvdXRlNTMuaHRtbCNsaXN0SG9zdGVkWm9uZXMtcHJvcGVydHlcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOlxuICAgICAgICAgIGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXCJsaXN0SG9zdGVkWm9uZXNcIilcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcInJvdXRlLTUzXCIsXG4gICAgICAgIGFjdGlvbjogXCJMaXN0SG9zdGVkWm9uZXNCeU5hbWVDb21tYW5kXCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL2xhdGVzdC9BV1MvUm91dGU1My5odG1sI2xpc3RIb3N0ZWRab25lcy1wcm9wZXJ0eVxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6XG4gICAgICAgICAgY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcIkhvc3RlZFpvbmVJZFwiKVxuICAgICAgfSxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206Okxpc3RIb3N0ZWRab25lc1wiLFxuICAgICAgcG9saWN5OiBjdXN0b21SZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXCJyb3V0ZTUzOkxpc3RIb3N0ZWRab25lc0J5TmFtZVwiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1dcbiAgICAgICAgfSlcbiAgICAgIF0pXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiSG9zdGVkWm9uZUlkc1wiLCB7XG4gICAgICBrZXk6IFwiSG9zdGVkWm9uZUlkc1wiLFxuICAgICAgdmFsdWU6IGxpc3RIb3N0ZWRab25lcy5nZXRSZXNwb25zZUZpZWxkKFwiSG9zdGVkWm9uZUlkXCIpLFxuICAgICAgZXhwb3J0TmFtZTogXCJIb3N0ZWRab25lSWRzXCJcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvbGUgPSBuZXcgUm9sZSh0aGlzLCBcIkRlbGVnYXRlSG9zdGVkWm9uZVJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgT3JnYW5pemF0aW9uUHJpbmNpcGFsKEZuLmltcG9ydFZhbHVlKFwiT3JnYW5pc2F0aW9uSWRcIikpLCAvLyBUT0RPOiBTb3VyY2UgZnJvbSBsb2NhbCBjb25maWcsIHJhdGhlciB0aGFuIGRlcGxveWluZyBpbiBlYWNoIHJlZ2lvblxuICAgICAgcm9sZU5hbWU6IFwiRGVsZWdhdGVIb3N0ZWRab25lUm9sZVwiLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgW1wibGlzdEhvc3RlZFpvbmVzXCJdOiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbXCJyb3V0ZTUzOkxpc3RIb3N0ZWRab25lc0J5TmFtZVwiXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSksXG4gICAgICAgIFtcImNoYW5nZVJlc291cmNlUmVjb3JkU2V0c1wiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogW1wicm91dGU1MzpDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNcIl0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogZ2V0SG9zdGVkWm9uZUFybihkb21haW5zKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiRGVsZWdhdGVIb3N0ZWRab25lUm9sZUFyblwiLCB7XG4gICAgICBrZXk6IFwiRGVsZWdhdGVIb3N0ZWRab25lUm9sZUFyblwiLFxuICAgICAgdmFsdWU6IHJvbGUucm9sZUFybixcbiAgICAgIGV4cG9ydE5hbWU6IFwiRGVsZWdhdGVIb3N0ZWRab25lUm9sZUFyblwiXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import { Construct } from "constructs";
2
+ import { StackProps } from "aws-cdk-lib";
3
+ interface EcrDefaultImageProps extends StackProps {
4
+ region: string;
5
+ accountId: string;
6
+ eventBusArn: string;
7
+ }
8
+ export declare class EcrDefaultImage extends Construct {
9
+ constructor(scope: Construct, id: string, props: EcrDefaultImageProps);
10
+ }
11
+ export {};
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EcrDefaultImage = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const codeBuild_1 = require("../../resources/aws/utilities/codeBuild");
6
+ const aws_codebuild_1 = require("aws-cdk-lib/aws-codebuild");
7
+ const logGroup_1 = require("../../resources/aws/logging/logGroup");
8
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
9
+ const role_1 = require("../../resources/aws/iam/role");
10
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
11
+ const aws_events_1 = require("aws-cdk-lib/aws-events");
12
+ const Targets = require("aws-cdk-lib/aws-events-targets");
13
+ const aws_stepfunctions_tasks_1 = require("aws-cdk-lib/aws-stepfunctions-tasks");
14
+ const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions");
15
+ class EcrDefaultImage extends constructs_1.Construct {
16
+ constructor(scope, id, props) {
17
+ super(scope, id);
18
+ const logGroup = new logGroup_1.LogGroup(this, `logGroup`, {
19
+ logGroupName: `/vpc/codebuild/${id}/`,
20
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY
21
+ });
22
+ const ecrDefaultImageRole = new role_1.Role(this, "ecrDefaultImageRole", {
23
+ roleName: `ecrDefaultImageRole`,
24
+ description: "Role to push default ECR images into new repositories",
25
+ assumedBy: new aws_iam_1.ServicePrincipal("codebuild.amazonaws.com"),
26
+ inlinePolicies: {
27
+ ["pushEcrImage"]: new aws_iam_1.PolicyDocument({
28
+ statements: [
29
+ new aws_iam_1.PolicyStatement({
30
+ actions: [
31
+ "ecr:CompleteLayerUpload",
32
+ "ecr:GetAuthorizationToken",
33
+ "ecr:UploadLayerPart",
34
+ "ecr:InitiateLayerUpload",
35
+ "ecr:BatchCheckLayerAvailability",
36
+ "ecr:PutImage"
37
+ ],
38
+ resources: ["*"]
39
+ })
40
+ ]
41
+ }),
42
+ ["writeLogs"]: new aws_iam_1.PolicyDocument({
43
+ statements: [
44
+ new aws_iam_1.PolicyStatement({
45
+ actions: [
46
+ "logs:CreateLogGroup",
47
+ "logs:CreateLogStream",
48
+ "logs:PutLogEvents"
49
+ ],
50
+ resources: [logGroup.logGroupArn]
51
+ })
52
+ ]
53
+ })
54
+ }
55
+ });
56
+ const codeBuildProject = new codeBuild_1.CodeBuildProject(this, "codeBuildProject", {
57
+ description: "Build and push the default ECR image to new repositories",
58
+ projectName: "ecrDefaultImage",
59
+ buildSpec: aws_codebuild_1.BuildSpec.fromObject({
60
+ version: 0.2,
61
+ phases: {
62
+ build: {
63
+ commands: [
64
+ "docker pull fjall/ecrdefaultimage:latest",
65
+ "docker tag fjall/ecrdefaultimage:latest $ECR_REPOSITORY:latest",
66
+ `aws ecr get-login-password --region ${props.region} | docker login --username AWS --password-stdin ${props.accountId}.dkr.ecr.${props.region}.amazonaws.com`,
67
+ "docker push $ECR_REPOSITORY:latest"
68
+ ]
69
+ }
70
+ }
71
+ }),
72
+ logging: {
73
+ cloudWatch: {
74
+ logGroup: logGroup
75
+ }
76
+ },
77
+ role: ecrDefaultImageRole,
78
+ tags: {
79
+ "fjall:costAllocation:environment": "management",
80
+ "fjall:costAllocation:service": "ecrDefaultImage",
81
+ "fjall:costAllocation:owner": "Fjall"
82
+ }
83
+ });
84
+ new aws_stepfunctions_tasks_1.CodeBuildStartBuild(this, "codeBuildTask", {
85
+ project: codeBuildProject.project,
86
+ inputPath: aws_stepfunctions_1.JsonPath.stringAt("$.source"),
87
+ environmentVariablesOverride: {
88
+ ECR_REPOSITORY: {
89
+ type: aws_codebuild_1.BuildEnvironmentVariableType.PLAINTEXT,
90
+ value: aws_stepfunctions_1.JsonPath.stringAt("$.source")
91
+ }
92
+ }
93
+ });
94
+ const eventInputMapping = {
95
+ repositoryUri: aws_events_1.EventField.fromPath("$.detail.responseElements.repository.repositoryUri")
96
+ };
97
+ const eventInputTemplate = {
98
+ environmentVariablesOverride: [
99
+ {
100
+ name: "ECR_REPOSITORY",
101
+ value: eventInputMapping.repositoryUri
102
+ }
103
+ ]
104
+ };
105
+ new aws_events_1.Rule(this, "ecrCreationRule", {
106
+ ruleName: "ecrCreationRule",
107
+ description: "Trigger the default ECR image build when a new repository is created",
108
+ enabled: true,
109
+ eventBus: aws_events_1.EventBus.fromEventBusArn(this, "defaultEventBus", props.eventBusArn),
110
+ eventPattern: {
111
+ source: ["aws.ecr"],
112
+ detailType: ["AWS API Call via CloudTrail"],
113
+ detail: {
114
+ eventSource: ["ecr.amazonaws.com"],
115
+ eventName: ["CreateRepository"]
116
+ }
117
+ },
118
+ targets: [
119
+ new Targets.CodeBuildProject(codeBuildProject.project, {
120
+ event: aws_events_1.RuleTargetInput.fromObject(eventInputTemplate)
121
+ })
122
+ ]
123
+ });
124
+ }
125
+ }
126
+ exports.EcrDefaultImage = EcrDefaultImage;
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNyRGVmYXVsdEltYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2NvbmZpZy9hd3MvZWNyRGVmYXVsdEltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyx1RUFBMkU7QUFDM0UsNkRBR21DO0FBQ25DLG1FQUFnRTtBQUNoRSw2Q0FBd0Q7QUFDeEQsdURBQW9EO0FBQ3BELGlEQUk2QjtBQUM3Qix1REFLZ0M7QUFDaEMsMERBQTBEO0FBQzFELGlGQUEwRTtBQUMxRSxxRUFBeUQ7QUFRekQsTUFBYSxlQUFnQixTQUFRLHNCQUFTO0lBQzVDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFFBQVEsR0FBRyxJQUFJLG1CQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUM5QyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsR0FBRztZQUNyQyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1NBQ3JDLENBQUMsQ0FBQztRQUVILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxXQUFJLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQ2hFLFFBQVEsRUFBRSxxQkFBcUI7WUFDL0IsV0FBVyxFQUFFLHVEQUF1RDtZQUNwRSxTQUFTLEVBQUUsSUFBSSwwQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQztZQUMxRCxjQUFjLEVBQUU7Z0JBQ2QsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLHdCQUFjLENBQUM7b0JBQ25DLFVBQVUsRUFBRTt3QkFDVixJQUFJLHlCQUFlLENBQUM7NEJBQ2xCLE9BQU8sRUFBRTtnQ0FDUCx5QkFBeUI7Z0NBQ3pCLDJCQUEyQjtnQ0FDM0IscUJBQXFCO2dDQUNyQix5QkFBeUI7Z0NBQ3pCLGlDQUFpQztnQ0FDakMsY0FBYzs2QkFDZjs0QkFDRCxTQUFTLEVBQUUsQ0FB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dEQsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBNUhELDBDQTRIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDb2RlQnVpbGRQcm9qZWN0IH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvdXRpbGl0aWVzL2NvZGVCdWlsZFwiO1xuaW1wb3J0IHtcbiAgQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSxcbiAgQnVpbGRTcGVjXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkXCI7XG5pbXBvcnQgeyBMb2dHcm91cCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2xvZ2dpbmcvbG9nR3JvdXBcIjtcbmltcG9ydCB7IFJlbW92YWxQb2xpY3ksIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9pYW0vcm9sZVwiO1xuaW1wb3J0IHtcbiAgUG9saWN5RG9jdW1lbnQsXG4gIFBvbGljeVN0YXRlbWVudCxcbiAgU2VydmljZVByaW5jaXBhbFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgRXZlbnRCdXMsXG4gIEV2ZW50RmllbGQsXG4gIFJ1bGUsXG4gIFJ1bGVUYXJnZXRJbnB1dFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0ICogYXMgVGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQgeyBDb2RlQnVpbGRTdGFydEJ1aWxkIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzXCI7XG5pbXBvcnQgeyBKc29uUGF0aCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiO1xuXG5pbnRlcmZhY2UgRWNyRGVmYXVsdEltYWdlUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICBldmVudEJ1c0Fybjogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRWNyRGVmYXVsdEltYWdlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVjckRlZmF1bHRJbWFnZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKHRoaXMsIGBsb2dHcm91cGAsIHtcbiAgICAgIGxvZ0dyb3VwTmFtZTogYC92cGMvY29kZWJ1aWxkLyR7aWR9L2AsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICB9KTtcblxuICAgIGNvbnN0IGVjckRlZmF1bHRJbWFnZVJvbGUgPSBuZXcgUm9sZSh0aGlzLCBcImVjckRlZmF1bHRJbWFnZVJvbGVcIiwge1xuICAgICAgcm9sZU5hbWU6IGBlY3JEZWZhdWx0SW1hZ2VSb2xlYCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJvbGUgdG8gcHVzaCBkZWZhdWx0IEVDUiBpbWFnZXMgaW50byBuZXcgcmVwb3NpdG9yaWVzXCIsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiY29kZWJ1aWxkLmFtYXpvbmF3cy5jb21cIiksXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICBbXCJwdXNoRWNySW1hZ2VcIl06IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcImVjcjpDb21wbGV0ZUxheWVyVXBsb2FkXCIsXG4gICAgICAgICAgICAgICAgXCJlY3I6R2V0QXV0aG9yaXphdGlvblRva2VuXCIsXG4gICAgICAgICAgICAgICAgXCJlY3I6VXBsb2FkTGF5ZXJQYXJ0XCIsXG4gICAgICAgICAgICAgICAgXCJlY3I6SW5pdGlhdGVMYXllclVwbG9hZFwiLFxuICAgICAgICAgICAgICAgIFwiZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eVwiLFxuICAgICAgICAgICAgICAgIFwiZWNyOlB1dEltYWdlXCJcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSksXG4gICAgICAgIFtcIndyaXRlTG9nc1wiXTogbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIFwibG9nczpDcmVhdGVMb2dHcm91cFwiLFxuICAgICAgICAgICAgICAgIFwibG9nczpDcmVhdGVMb2dTdHJlYW1cIixcbiAgICAgICAgICAgICAgICBcImxvZ3M6UHV0TG9nRXZlbnRzXCJcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbbG9nR3JvdXAubG9nR3JvdXBBcm5dXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGNvZGVCdWlsZFByb2plY3QgPSBuZXcgQ29kZUJ1aWxkUHJvamVjdCh0aGlzLCBcImNvZGVCdWlsZFByb2plY3RcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiQnVpbGQgYW5kIHB1c2ggdGhlIGRlZmF1bHQgRUNSIGltYWdlIHRvIG5ldyByZXBvc2l0b3JpZXNcIixcbiAgICAgIHByb2plY3ROYW1lOiBcImVjckRlZmF1bHRJbWFnZVwiLFxuICAgICAgYnVpbGRTcGVjOiBCdWlsZFNwZWMuZnJvbU9iamVjdCh7XG4gICAgICAgIHZlcnNpb246IDAuMixcbiAgICAgICAgcGhhc2VzOiB7XG4gICAgICAgICAgYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgIFwiZG9ja2VyIHB1bGwgZmphbGwvZWNyZGVmYXVsdGltYWdlOmxhdGVzdFwiLFxuICAgICAgICAgICAgICBcImRvY2tlciB0YWcgZmphbGwvZWNyZGVmYXVsdGltYWdlOmxhdGVzdCAkRUNSX1JFUE9TSVRPUlk6bGF0ZXN0XCIsXG4gICAgICAgICAgICAgIGBhd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lvbiAke3Byb3BzLnJlZ2lvbn0gfCBkb2NrZXIgbG9naW4gLS11c2VybmFtZSBBV1MgLS1wYXNzd29yZC1zdGRpbiAke3Byb3BzLmFjY291bnRJZH0uZGtyLmVjci4ke3Byb3BzLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWAsXG4gICAgICAgICAgICAgIFwiZG9ja2VyIHB1c2ggJEVDUl9SRVBPU0lUT1JZOmxhdGVzdFwiXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGxvZ2dpbmc6IHtcbiAgICAgICAgY2xvdWRXYXRjaDoge1xuICAgICAgICAgIGxvZ0dyb3VwOiBsb2dHcm91cFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcm9sZTogZWNyRGVmYXVsdEltYWdlUm9sZSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjplbnZpcm9ubWVudFwiOiBcIm1hbmFnZW1lbnRcIixcbiAgICAgICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpzZXJ2aWNlXCI6IFwiZWNyRGVmYXVsdEltYWdlXCIsXG4gICAgICAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246b3duZXJcIjogXCJGamFsbFwiXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBuZXcgQ29kZUJ1aWxkU3RhcnRCdWlsZCh0aGlzLCBcImNvZGVCdWlsZFRhc2tcIiwge1xuICAgICAgcHJvamVjdDogY29kZUJ1aWxkUHJvamVjdC5wcm9qZWN0LFxuICAgICAgaW5wdXRQYXRoOiBKc29uUGF0aC5zdHJpbmdBdChcIiQuc291cmNlXCIpLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXNPdmVycmlkZToge1xuICAgICAgICBFQ1JfUkVQT1NJVE9SWToge1xuICAgICAgICAgIHR5cGU6IEJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZVR5cGUuUExBSU5URVhULFxuICAgICAgICAgIHZhbHVlOiBKc29uUGF0aC5zdHJpbmdBdChcIiQuc291cmNlXCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGV2ZW50SW5wdXRNYXBwaW5nID0ge1xuICAgICAgcmVwb3NpdG9yeVVyaTogRXZlbnRGaWVsZC5mcm9tUGF0aChcbiAgICAgICAgXCIkLmRldGFpbC5yZXNwb25zZUVsZW1lbnRzLnJlcG9zaXRvcnkucmVwb3NpdG9yeVVyaVwiXG4gICAgICApXG4gICAgfTtcblxuICAgIGNvbnN0IGV2ZW50SW5wdXRUZW1wbGF0ZSA9IHtcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzT3ZlcnJpZGU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiRUNSX1JFUE9TSVRPUllcIixcbiAgICAgICAgICB2YWx1ZTogZXZlbnRJbnB1dE1hcHBpbmcucmVwb3NpdG9yeVVyaVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcblxuICAgIG5ldyBSdWxlKHRoaXMsIFwiZWNyQ3JlYXRpb25SdWxlXCIsIHtcbiAgICAgIHJ1bGVOYW1lOiBcImVjckNyZWF0aW9uUnVsZVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiVHJpZ2dlciB0aGUgZGVmYXVsdCBFQ1IgaW1hZ2UgYnVpbGQgd2hlbiBhIG5ldyByZXBvc2l0b3J5IGlzIGNyZWF0ZWRcIixcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBldmVudEJ1czogRXZlbnRCdXMuZnJvbUV2ZW50QnVzQXJuKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcImRlZmF1bHRFdmVudEJ1c1wiLFxuICAgICAgICBwcm9wcy5ldmVudEJ1c0FyblxuICAgICAgKSxcbiAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICBzb3VyY2U6IFtcImF3cy5lY3JcIl0sXG4gICAgICAgIGRldGFpbFR5cGU6IFtcIkFXUyBBUEkgQ2FsbCB2aWEgQ2xvdWRUcmFpbFwiXSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgZXZlbnRTb3VyY2U6IFtcImVjci5hbWF6b25hd3MuY29tXCJdLFxuICAgICAgICAgIGV2ZW50TmFtZTogW1wiQ3JlYXRlUmVwb3NpdG9yeVwiXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGFyZ2V0czogW1xuICAgICAgICBuZXcgVGFyZ2V0cy5Db2RlQnVpbGRQcm9qZWN0KGNvZGVCdWlsZFByb2plY3QucHJvamVjdCwge1xuICAgICAgICAgIGV2ZW50OiBSdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdChldmVudElucHV0VGVtcGxhdGUpXG4gICAgICAgIH0pXG4gICAgICBdXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { CfnOutput } from "aws-cdk-lib";
2
+ import { Construct } from "constructs";
3
+ export declare class DefaultEventBus extends Construct {
4
+ readonly defaultEventBusName: CfnOutput;
5
+ readonly defaultEventBusArn: CfnOutput;
6
+ constructor(scope: Construct, id: string);
7
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultEventBus = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const Events = require("aws-cdk-lib/aws-events");
6
+ const constructs_1 = require("constructs");
7
+ class DefaultEventBus extends constructs_1.Construct {
8
+ constructor(scope, id) {
9
+ super(scope, id);
10
+ const eventBridge = Events.EventBus.fromEventBusName(this, "defaultEventBus", "default");
11
+ this.defaultEventBusName = new aws_cdk_lib_1.CfnOutput(this, "defaultEventBusName", {
12
+ key: `defaultEventBusName`,
13
+ value: eventBridge.eventBusName,
14
+ exportName: "defaultEventBusName"
15
+ });
16
+ this.defaultEventBusArn = new aws_cdk_lib_1.CfnOutput(this, "defaultEventBusArn", {
17
+ key: `defaultEventBusArn`,
18
+ value: eventBridge.eventBusArn,
19
+ exportName: "defaultEventBusArn"
20
+ });
21
+ }
22
+ }
23
+ exports.DefaultEventBus = DefaultEventBus;
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRCdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9ldmVudEJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBd0M7QUFDeEMsaURBQWlEO0FBQ2pELDJDQUF1QztBQUV2QyxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFJNUMsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUNsRCxJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLFNBQVMsQ0FDVixDQUFDO1FBRUYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUU7WUFDcEUsR0FBRyxFQUFFLHFCQUFxQjtZQUMxQixLQUFLLEVBQUUsV0FBVyxDQUFDLFlBQVk7WUFDL0IsVUFBVSxFQUFFLHFCQUFxQjtTQUNsQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNsRSxHQUFHLEVBQUUsb0JBQW9CO1lBQ3pCLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVztZQUM5QixVQUFVLEVBQUUsb0JBQW9CO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpCRCwwQ0F5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGNsYXNzIERlZmF1bHRFdmVudEJ1cyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0RXZlbnRCdXNOYW1lOiBDZm5PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0RXZlbnRCdXNBcm46IENmbk91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGV2ZW50QnJpZGdlID0gRXZlbnRzLkV2ZW50QnVzLmZyb21FdmVudEJ1c05hbWUoXG4gICAgICB0aGlzLFxuICAgICAgXCJkZWZhdWx0RXZlbnRCdXNcIixcbiAgICAgIFwiZGVmYXVsdFwiXG4gICAgKTtcblxuICAgIHRoaXMuZGVmYXVsdEV2ZW50QnVzTmFtZSA9IG5ldyBDZm5PdXRwdXQodGhpcywgXCJkZWZhdWx0RXZlbnRCdXNOYW1lXCIsIHtcbiAgICAgIGtleTogYGRlZmF1bHRFdmVudEJ1c05hbWVgLFxuICAgICAgdmFsdWU6IGV2ZW50QnJpZGdlLmV2ZW50QnVzTmFtZSxcbiAgICAgIGV4cG9ydE5hbWU6IFwiZGVmYXVsdEV2ZW50QnVzTmFtZVwiXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlZmF1bHRFdmVudEJ1c0FybiA9IG5ldyBDZm5PdXRwdXQodGhpcywgXCJkZWZhdWx0RXZlbnRCdXNBcm5cIiwge1xuICAgICAga2V5OiBgZGVmYXVsdEV2ZW50QnVzQXJuYCxcbiAgICAgIHZhbHVlOiBldmVudEJyaWRnZS5ldmVudEJ1c0FybixcbiAgICAgIGV4cG9ydE5hbWU6IFwiZGVmYXVsdEV2ZW50QnVzQXJuXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ import { Construct } from "constructs";
2
+ import { Group } from "../../resources/aws/iam/identityCenter/group";
3
+ import { Accounts } from "../../patterns/aws/managedOrganisation";
4
+ interface IdentityCenterProps {
5
+ accounts: Accounts;
6
+ }
7
+ export declare class IdentityCenter extends Construct {
8
+ identityStoreId: string;
9
+ identityCenterArn: string;
10
+ identityCenterGroups: Group[];
11
+ constructor(scope: Construct, id: string, props: IdentityCenterProps);
12
+ }
13
+ export {};
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IdentityCenter = void 0;
4
+ const customResources = require("aws-cdk-lib/custom-resources");
5
+ const constructs_1 = require("constructs");
6
+ const cfnOutput_1 = require("../../resources/aws/utilities/cfnOutput");
7
+ const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
8
+ const group_1 = require("../../resources/aws/iam/identityCenter/group");
9
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
10
+ const permissionSet_1 = require("../../resources/aws/iam/identityCenter/permissionSet");
11
+ const assignment_1 = require("../../resources/aws/iam/identityCenter/assignment");
12
+ const stripAndCamelCase_1 = require("../../utils/stripAndCamelCase");
13
+ class IdentityCenter extends constructs_1.Construct {
14
+ constructor(scope, id, props) {
15
+ super(scope, id);
16
+ this.identityCenterGroups = [];
17
+ // TODO: Should only use this if no groups are provided by the end user
18
+ const defaultPermissionSets = {
19
+ AdministratorAccess: {
20
+ Policy: "arn:aws:iam::aws:policy/AdministratorAccess"
21
+ },
22
+ Billing: {
23
+ Policy: "arn:aws:iam::aws:policy/job-function/Billing"
24
+ },
25
+ ReadOnlyAccess: {
26
+ Policy: "arn:aws:iam::aws:policy/ReadOnlyAccess"
27
+ },
28
+ SystemAdministrator: {
29
+ Policy: "arn:aws:iam::aws:policy/job-function/SystemAdministrator"
30
+ }
31
+ };
32
+ const customResource = new awsCustomResource_1.AwsCustomResource(this, "listIdentityCenterInstance", {
33
+ functionName: "listIdentityCenterInstance",
34
+ onCreate: {
35
+ service: "sso-admin",
36
+ action: "ListInstancesCommand",
37
+ parameters: {
38
+ MaxResults: 1
39
+ },
40
+ physicalResourceId: customResources.PhysicalResourceId.of("listIdentityCenterInstance")
41
+ },
42
+ policy: customResources.AwsCustomResourcePolicy.fromStatements([
43
+ new aws_iam_1.PolicyStatement({
44
+ actions: ["sso:ListInstances"],
45
+ resources: ["*"]
46
+ })
47
+ ]),
48
+ resourceType: "Custom::IamIdentityCenter"
49
+ });
50
+ this.identityCenterArn = customResource.getResponseField("Instances.0.InstanceArn");
51
+ this.identityStoreId = customResource.getResponseField("Instances.0.IdentityStoreId");
52
+ new cfnOutput_1.CfnOutput(this, "identityCenterArn", {
53
+ key: "identityCenterArn",
54
+ value: this.identityCenterArn,
55
+ exportName: "identityCenterArn"
56
+ });
57
+ new cfnOutput_1.CfnOutput(this, "identityStoreId", {
58
+ key: "identityStoreID",
59
+ value: this.identityStoreId,
60
+ exportName: "identityStoreId"
61
+ });
62
+ for (const [permissionSet, permissionSetAssociation] of Object.entries(defaultPermissionSets)) {
63
+ const permSet = new permissionSet_1.PermissionSet(this, `${permissionSet}PermissionSet`, {
64
+ name: permissionSet,
65
+ instanceArn: this.identityCenterArn,
66
+ description: `Permission set for associated ${permissionSet} policy`,
67
+ managedPolicies: [permissionSetAssociation.Policy],
68
+ tags: [
69
+ {
70
+ key: "fjall:costAllocation:environment",
71
+ value: "management"
72
+ }
73
+ ]
74
+ });
75
+ const group = new group_1.Group(this, `${permissionSet}Group`, {
76
+ displayName: permissionSet,
77
+ identityStoreId: this.identityStoreId,
78
+ description: `Group for associated ${permissionSet} permission set`
79
+ });
80
+ this.identityCenterGroups.push(group);
81
+ new cfnOutput_1.CfnOutput(this, `${permissionSet}GroupId`, {
82
+ key: `${permissionSet}GroupId`,
83
+ value: group.attrGroupId,
84
+ exportName: `${permissionSet}GroupId`
85
+ });
86
+ for (const [accountName, accountId] of Object.entries(props.accounts)) {
87
+ if (!accountId)
88
+ continue;
89
+ new assignment_1.Assignment(this, `${(0, stripAndCamelCase_1.stripAndCamelCase)(accountName)}${permissionSet}Association`, {
90
+ instanceArn: this.identityCenterArn,
91
+ permissionSetArn: permSet.attrPermissionSetArn,
92
+ principalType: "GROUP",
93
+ principalId: group.attrGroupId,
94
+ targetType: "AWS_ACCOUNT",
95
+ targetId: accountId
96
+ });
97
+ }
98
+ }
99
+ }
100
+ }
101
+ exports.IdentityCenter = IdentityCenter;
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHlDZW50ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9pZGVudGl0eUNlbnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnRUFBZ0U7QUFDaEUsMkNBQXVDO0FBRXZDLHVFQUFvRTtBQUNwRSx1RkFBb0Y7QUFDcEYsd0VBQXFFO0FBQ3JFLGlEQUFzRDtBQUN0RCx3RkFBcUY7QUFDckYsa0ZBQStFO0FBRS9FLHFFQUFrRTtBQUtsRSxNQUFhLGNBQWUsU0FBUSxzQkFBUztJQUszQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFIWix5QkFBb0IsR0FBWSxFQUFFLENBQUM7UUFLeEMsdUVBQXVFO1FBQ3ZFLE1BQU0scUJBQXFCLEdBQUc7WUFDNUIsbUJBQW1CLEVBQUU7Z0JBQ25CLE1BQU0sRUFBRSw2Q0FBNkM7YUFDdEQ7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsTUFBTSxFQUFFLDhDQUE4QzthQUN2RDtZQUNELGNBQWMsRUFBRTtnQkFDZCxNQUFNLEVBQUUsd0NBQXdDO2FBQ2pEO1lBQ0QsbUJBQW1CLEVBQUU7Z0JBQ25CLE1BQU0sRUFBRSwwREFBMEQ7YUFDbkU7U0FDRixDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQUcsSUFBSSxxQ0FBaUIsQ0FDMUMsSUFBSSxFQUNKLDRCQUE0QixFQUM1QjtZQUNFLFlBQVksRUFBRSw0QkFBNEI7WUFDMUMsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixNQUFNLEVBQUUsc0JBQXNCO2dCQUM5QixVQUFVLEVBQUU7b0JBQ1YsVUFBVSxFQUFFLENBQUM7aUJBQ2Q7Z0JBQ0Qsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FDdkQsNEJBQTRCLENBQzdCO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsZUFBZSxDQUFD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aW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvY2ZuT3V0cHV0XCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9pYW0vaWRlbnRpdHlDZW50ZXIvZ3JvdXBcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2V0IH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvaWFtL2lkZW50aXR5Q2VudGVyL3Blcm1pc3Npb25TZXRcIjtcbmltcG9ydCB7IEFzc2lnbm1lbnQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9pYW0vaWRlbnRpdHlDZW50ZXIvYXNzaWdubWVudFwiO1xuaW1wb3J0IHsgQWNjb3VudHMgfSBmcm9tIFwiLi4vLi4vcGF0dGVybnMvYXdzL21hbmFnZWRPcmdhbmlzYXRpb25cIjtcbmltcG9ydCB7IHN0cmlwQW5kQ2FtZWxDYXNlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3N0cmlwQW5kQ2FtZWxDYXNlXCI7XG5cbmludGVyZmFjZSBJZGVudGl0eUNlbnRlclByb3BzIHtcbiAgYWNjb3VudHM6IEFjY291bnRzO1xufVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q2VudGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIGlkZW50aXR5U3RvcmVJZDogc3RyaW5nO1xuICBwdWJsaWMgaWRlbnRpdHlDZW50ZXJBcm46IHN0cmluZztcbiAgcHVibGljIGlkZW50aXR5Q2VudGVyR3JvdXBzOiBHcm91cFtdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElkZW50aXR5Q2VudGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gVE9ETzogU2hvdWxkIG9ubHkgdXNlIHRoaXMgaWYgbm8gZ3JvdXBzIGFyZSBwcm92aWRlZCBieSB0aGUgZW5kIHVzZXJcbiAgICBjb25zdCBkZWZhdWx0UGVybWlzc2lvblNldHMgPSB7XG4gICAgICBBZG1pbmlzdHJhdG9yQWNjZXNzOiB7XG4gICAgICAgIFBvbGljeTogXCJhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9BZG1pbmlzdHJhdG9yQWNjZXNzXCJcbiAgICAgIH0sXG4gICAgICBCaWxsaW5nOiB7XG4gICAgICAgIFBvbGljeTogXCJhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9qb2ItZnVuY3Rpb24vQmlsbGluZ1wiXG4gICAgICB9LFxuICAgICAgUmVhZE9ubHlBY2Nlc3M6IHtcbiAgICAgICAgUG9saWN5OiBcImFybjphd3M6aWFtOjphd3M6cG9saWN5L1JlYWRPbmx5QWNjZXNzXCJcbiAgICAgIH0sXG4gICAgICBTeXN0ZW1BZG1pbmlzdHJhdG9yOiB7XG4gICAgICAgIFBvbGljeTogXCJhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9qb2ItZnVuY3Rpb24vU3lzdGVtQWRtaW5pc3RyYXRvclwiXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGN1c3RvbVJlc291cmNlID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKFxuICAgICAgdGhpcyxcbiAgICAgIFwibGlzdElkZW50aXR5Q2VudGVySW5zdGFuY2VcIixcbiAgICAgIHtcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBcImxpc3RJZGVudGl0eUNlbnRlckluc3RhbmNlXCIsXG4gICAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgICAgc2VydmljZTogXCJzc28tYWRtaW5cIixcbiAgICAgICAgICBhY3Rpb246IFwiTGlzdEluc3RhbmNlc0NvbW1hbmRcIixcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBNYXhSZXN1bHRzOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICBcImxpc3RJZGVudGl0eUNlbnRlckluc3RhbmNlXCJcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICAgIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcInNzbzpMaXN0SW5zdGFuY2VzXCJdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgfSlcbiAgICAgICAgXSksXG4gICAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OklhbUlkZW50aXR5Q2VudGVyXCJcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5pZGVudGl0eUNlbnRlckFybiA9IGN1c3RvbVJlc291cmNlLmdldFJlc3BvbnNlRmllbGQoXG4gICAgICBcIkluc3RhbmNlcy4wLkluc3RhbmNlQXJuXCJcbiAgICApO1xuICAgIHRoaXMuaWRlbnRpdHlTdG9yZUlkID0gY3VzdG9tUmVzb3VyY2UuZ2V0UmVzcG9uc2VGaWVsZChcbiAgICAgIFwiSW5zdGFuY2VzLjAuSWRlbnRpdHlTdG9yZUlkXCJcbiAgICApO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJpZGVudGl0eUNlbnRlckFyblwiLCB7XG4gICAgICBrZXk6IFwiaWRlbnRpdHlDZW50ZXJBcm5cIixcbiAgICAgIHZhbHVlOiB0aGlzLmlkZW50aXR5Q2VudGVyQXJuLFxuICAgICAgZXhwb3J0TmFtZTogXCJpZGVudGl0eUNlbnRlckFyblwiXG4gICAgfSk7XG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBcImlkZW50aXR5U3RvcmVJZFwiLCB7XG4gICAgICBrZXk6IFwiaWRlbnRpdHlTdG9yZUlEXCIsXG4gICAgICB2YWx1ZTogdGhpcy5pZGVudGl0eVN0b3JlSWQsXG4gICAgICBleHBvcnROYW1lOiBcImlkZW50aXR5U3RvcmVJZFwiXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IFtwZXJtaXNzaW9uU2V0LCBwZXJtaXNzaW9uU2V0QXNzb2NpYXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgZGVmYXVsdFBlcm1pc3Npb25TZXRzXG4gICAgKSkge1xuICAgICAgY29uc3QgcGVybVNldCA9IG5ldyBQZXJtaXNzaW9uU2V0KHRoaXMsIGAke3Blcm1pc3Npb25TZXR9UGVybWlzc2lvblNldGAsIHtcbiAgICAgICAgbmFtZTogcGVybWlzc2lvblNldCxcbiAgICAgICAgaW5zdGFuY2VBcm46IHRoaXMuaWRlbnRpdHlDZW50ZXJBcm4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGVybWlzc2lvbiBzZXQgZm9yIGFzc29jaWF0ZWQgJHtwZXJtaXNzaW9uU2V0fSBwb2xpY3lgLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtwZXJtaXNzaW9uU2V0QXNzb2NpYXRpb24uUG9saWN5XSxcbiAgICAgICAgdGFnczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogXCJmamFsbDpjb3N0QWxsb2NhdGlvbjplbnZpcm9ubWVudFwiLFxuICAgICAgICAgICAgdmFsdWU6IFwibWFuYWdlbWVudFwiXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgR3JvdXAodGhpcywgYCR7cGVybWlzc2lvblNldH1Hcm91cGAsIHtcbiAgICAgICAgZGlzcGxheU5hbWU6IHBlcm1pc3Npb25TZXQsXG4gICAgICAgIGlkZW50aXR5U3RvcmVJZDogdGhpcy5pZGVudGl0eVN0b3JlSWQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgR3JvdXAgZm9yIGFzc29jaWF0ZWQgJHtwZXJtaXNzaW9uU2V0fSBwZXJtaXNzaW9uIHNldGBcbiAgICAgIH0pO1xuICAgICAgdGhpcy5pZGVudGl0eUNlbnRlckdyb3Vwcy5wdXNoKGdyb3VwKTtcblxuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwZXJtaXNzaW9uU2V0fUdyb3VwSWRgLCB7XG4gICAgICAgIGtleTogYCR7cGVybWlzc2lvblNldH1Hcm91cElkYCxcbiAgICAgICAgdmFsdWU6IGdyb3VwLmF0dHJHcm91cElkLFxuICAgICAgICBleHBvcnROYW1lOiBgJHtwZXJtaXNzaW9uU2V0fUdyb3VwSWRgXG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCBbYWNjb3VudE5hbWUsIGFjY291bnRJZF0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMuYWNjb3VudHMpKSB7XG4gICAgICAgIGlmICghYWNjb3VudElkKSBjb250aW51ZTtcblxuICAgICAgICBuZXcgQXNzaWdubWVudChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3N0cmlwQW5kQ2FtZWxDYXNlKGFjY291bnROYW1lKX0ke3Blcm1pc3Npb25TZXR9QXNzb2NpYXRpb25gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluc3RhbmNlQXJuOiB0aGlzLmlkZW50aXR5Q2VudGVyQXJuLFxuICAgICAgICAgICAgcGVybWlzc2lvblNldEFybjogcGVybVNldC5hdHRyUGVybWlzc2lvblNldEFybixcbiAgICAgICAgICAgIHByaW5jaXBhbFR5cGU6IFwiR1JPVVBcIixcbiAgICAgICAgICAgIHByaW5jaXBhbElkOiBncm91cC5hdHRyR3JvdXBJZCxcbiAgICAgICAgICAgIHRhcmdldFR5cGU6IFwiQVdTX0FDQ09VTlRcIixcbiAgICAgICAgICAgIHRhcmdldElkOiBhY2NvdW50SWRcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=