@cloudsnorkel/cdk-github-runners 0.9.4 → 0.9.5

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 (93) hide show
  1. package/.gitattributes +3 -3
  2. package/.jsii +315 -267
  3. package/API.md +43 -7
  4. package/README.md +15 -2
  5. package/assets/{providers/image-builders → image-builders}/aws-image-builder/delete-ami.lambda/index.js +2 -2
  6. package/assets/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds.lambda/index.js +1 -1
  7. package/assets/{providers/image-builders → image-builders}/aws-image-builder/versioner.lambda/index.js +2 -2
  8. package/lib/access.js +1 -1
  9. package/lib/image-builders/api.js +47 -0
  10. package/lib/{providers/image-builders → image-builders}/aws-image-builder/ami.d.ts +2 -3
  11. package/lib/image-builders/aws-image-builder/ami.js +93 -0
  12. package/lib/{providers/image-builders → image-builders}/aws-image-builder/builder.d.ts +9 -2
  13. package/lib/image-builders/aws-image-builder/builder.js +529 -0
  14. package/lib/image-builders/aws-image-builder/common.js +46 -0
  15. package/lib/{providers/image-builders → image-builders}/aws-image-builder/container.d.ts +1 -1
  16. package/lib/image-builders/aws-image-builder/container.js +63 -0
  17. package/lib/{providers/image-builders → image-builders}/aws-image-builder/delete-ami-function.d.ts +1 -1
  18. package/lib/image-builders/aws-image-builder/delete-ami-function.js +23 -0
  19. package/lib/image-builders/aws-image-builder/delete-ami.lambda.js +87 -0
  20. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/ami.d.ts +2 -2
  21. package/lib/image-builders/aws-image-builder/deprecated/ami.js +240 -0
  22. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/common.d.ts +1 -1
  23. package/lib/image-builders/aws-image-builder/deprecated/common.js +144 -0
  24. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/container.d.ts +1 -1
  25. package/lib/image-builders/aws-image-builder/deprecated/container.js +222 -0
  26. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/index.js +1 -1
  27. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/linux-components.d.ts +1 -1
  28. package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +172 -0
  29. package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/windows-components.d.ts +1 -1
  30. package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +126 -0
  31. package/lib/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds-function.d.ts +1 -1
  32. package/lib/image-builders/aws-image-builder/filter-failed-builds-function.js +23 -0
  33. package/lib/image-builders/aws-image-builder/filter-failed-builds.lambda.js +18 -0
  34. package/lib/{providers/image-builders → image-builders}/aws-image-builder/index.js +1 -1
  35. package/lib/{providers/image-builders → image-builders}/aws-image-builder/versioner-function.d.ts +1 -1
  36. package/lib/image-builders/aws-image-builder/versioner-function.js +23 -0
  37. package/lib/image-builders/aws-image-builder/versioner.lambda.js +96 -0
  38. package/lib/{providers/image-builders → image-builders}/codebuild-deprecated.d.ts +2 -2
  39. package/lib/image-builders/codebuild-deprecated.js +373 -0
  40. package/lib/{providers/image-builders → image-builders}/codebuild.d.ts +2 -2
  41. package/lib/image-builders/codebuild.js +287 -0
  42. package/lib/{providers/image-builders → image-builders}/common.d.ts +4 -2
  43. package/lib/image-builders/common.js +61 -0
  44. package/lib/{providers/image-builders → image-builders}/components.d.ts +8 -2
  45. package/lib/image-builders/components.js +568 -0
  46. package/lib/{providers/image-builders → image-builders}/index.js +1 -1
  47. package/lib/{providers/image-builders → image-builders}/static.d.ts +1 -1
  48. package/lib/image-builders/static.js +58 -0
  49. package/lib/providers/codebuild.d.ts +1 -1
  50. package/lib/providers/codebuild.js +4 -4
  51. package/lib/providers/common.js +3 -3
  52. package/lib/providers/ec2.d.ts +1 -1
  53. package/lib/providers/ec2.js +4 -4
  54. package/lib/providers/ecs.d.ts +1 -1
  55. package/lib/providers/ecs.js +3 -3
  56. package/lib/providers/fargate.d.ts +1 -1
  57. package/lib/providers/fargate.js +4 -4
  58. package/lib/providers/index.d.ts +1 -1
  59. package/lib/providers/index.js +2 -2
  60. package/lib/providers/lambda.d.ts +1 -1
  61. package/lib/providers/lambda.js +4 -4
  62. package/lib/runner.js +1 -1
  63. package/lib/secrets.js +1 -1
  64. package/package.json +10 -10
  65. package/lib/providers/image-builders/api.js +0 -47
  66. package/lib/providers/image-builders/aws-image-builder/ami.js +0 -81
  67. package/lib/providers/image-builders/aws-image-builder/builder.js +0 -520
  68. package/lib/providers/image-builders/aws-image-builder/common.js +0 -46
  69. package/lib/providers/image-builders/aws-image-builder/container.js +0 -63
  70. package/lib/providers/image-builders/aws-image-builder/delete-ami-function.js +0 -23
  71. package/lib/providers/image-builders/aws-image-builder/delete-ami.lambda.js +0 -87
  72. package/lib/providers/image-builders/aws-image-builder/deprecated/ami.js +0 -240
  73. package/lib/providers/image-builders/aws-image-builder/deprecated/common.js +0 -144
  74. package/lib/providers/image-builders/aws-image-builder/deprecated/container.js +0 -222
  75. package/lib/providers/image-builders/aws-image-builder/deprecated/linux-components.js +0 -172
  76. package/lib/providers/image-builders/aws-image-builder/deprecated/windows-components.js +0 -129
  77. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds-function.js +0 -23
  78. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds.lambda.js +0 -18
  79. package/lib/providers/image-builders/aws-image-builder/versioner-function.js +0 -23
  80. package/lib/providers/image-builders/aws-image-builder/versioner.lambda.js +0 -96
  81. package/lib/providers/image-builders/codebuild-deprecated.js +0 -373
  82. package/lib/providers/image-builders/codebuild.js +0 -287
  83. package/lib/providers/image-builders/common.js +0 -61
  84. package/lib/providers/image-builders/components.js +0 -535
  85. package/lib/providers/image-builders/static.js +0 -58
  86. /package/lib/{providers/image-builders → image-builders}/api.d.ts +0 -0
  87. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/common.d.ts +0 -0
  88. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/delete-ami.lambda.d.ts +0 -0
  89. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/deprecated/index.d.ts +0 -0
  90. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/filter-failed-builds.lambda.d.ts +0 -0
  91. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/index.d.ts +0 -0
  92. /package/lib/{providers/image-builders → image-builders}/aws-image-builder/versioner.lambda.d.ts +0 -0
  93. /package/lib/{providers/image-builders → image-builders}/index.d.ts +0 -0
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImageBuilderObjectBase = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const versioner_function_1 = require("./versioner-function");
7
+ const utils_1 = require("../../utils");
8
+ /**
9
+ * @internal
10
+ */
11
+ class ImageBuilderObjectBase extends cdk.Resource {
12
+ constructor(scope, id) {
13
+ super(scope, id);
14
+ }
15
+ version(type, name, data) {
16
+ return new aws_cdk_lib_1.CustomResource(this, 'Version', {
17
+ serviceToken: this.versionFunction().functionArn,
18
+ resourceType: `Custom::ImageBuilder-${type}-Version`,
19
+ removalPolicy: cdk.RemovalPolicy.RETAIN,
20
+ properties: {
21
+ ObjectType: type,
22
+ ObjectName: name,
23
+ VersionedData: data, // get a new version every time something changes, like Image Builder wants
24
+ },
25
+ }).ref;
26
+ }
27
+ versionFunction() {
28
+ return (0, utils_1.singletonLambda)(versioner_function_1.VersionerFunction, this, 'aws-image-builder-versioner', {
29
+ description: 'Custom resource handler that bumps up Image Builder versions',
30
+ initialPolicy: [
31
+ new aws_cdk_lib_1.aws_iam.PolicyStatement({
32
+ actions: [
33
+ 'imagebuilder:ListComponents',
34
+ 'imagebuilder:ListContainerRecipes',
35
+ 'imagebuilder:ListImageRecipes',
36
+ ],
37
+ resources: ['*'],
38
+ }),
39
+ ],
40
+ logRetention: aws_cdk_lib_1.aws_logs.RetentionDays.ONE_MONTH,
41
+ timeout: cdk.Duration.minutes(5),
42
+ });
43
+ }
44
+ }
45
+ exports.ImageBuilderObjectBase = ImageBuilderObjectBase;
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2F3cy1pbWFnZS1idWlsZGVyL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFDbkMsNkNBQStFO0FBRS9FLDZEQUF5RDtBQUN6RCx1Q0FBOEM7QUFFOUM7O0dBRUc7QUFDSCxNQUFzQixzQkFBdUIsU0FBUSxHQUFHLENBQUMsUUFBUTtJQUMvRCxZQUFzQixLQUFnQixFQUFFLEVBQVU7UUFDaEQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRVMsT0FBTyxDQUFDLElBQXFELEVBQUUsSUFBWSxFQUFFLElBQVM7UUFDOUYsT0FBTyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUN6QyxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLFdBQVc7WUFDaEQsWUFBWSxFQUFFLHdCQUF3QixJQUFJLFVBQVU7WUFDcEQsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTTtZQUN2QyxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixhQUFhLEVBQUUsSUFBSSxFQUFFLDJFQUEyRTthQUNqRztTQUNGLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDVCxDQUFDO0lBRU8sZUFBZTtRQUNyQixPQUFPLElBQUEsdUJBQWUsRUFBQyxzQ0FBaUIsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUU7WUFDN0UsV0FBVyxFQUFFLDhEQUE4RDtZQUMzRSxhQUFhLEVBQUU7Z0JBQ2IsSUFBSSxxQkFBRyxDQUFDLGVBQWUsQ0FBQztvQkFDdEIsT0FBTyxFQUFFO3dCQUNQLDZCQUE2Qjt3QkFDN0IsbUNBQW1DO3dCQUNuQywrQkFBK0I7cUJBQ2hDO29CQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztpQkFDakIsQ0FBQzthQUNIO1lBQ0QsWUFBWSxFQUFFLHNCQUFJLENBQUMsYUFBYSxDQUFDLFNBQVM7WUFDMUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFuQ0Qsd0RBbUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtLCBhd3NfbG9ncyBhcyBsb2dzLCBDdXN0b21SZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgVmVyc2lvbmVyRnVuY3Rpb24gfSBmcm9tICcuL3ZlcnNpb25lci1mdW5jdGlvbic7XG5pbXBvcnQgeyBzaW5nbGV0b25MYW1iZGEgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbWFnZUJ1aWxkZXJPYmplY3RCYXNlIGV4dGVuZHMgY2RrLlJlc291cmNlIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZlcnNpb24odHlwZTogJ0NvbXBvbmVudCcgfCAnSW1hZ2VSZWNpcGUnIHwgJ0NvbnRhaW5lclJlY2lwZScsIG5hbWU6IHN0cmluZywgZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdWZXJzaW9uJywge1xuICAgICAgc2VydmljZVRva2VuOiB0aGlzLnZlcnNpb25GdW5jdGlvbigpLmZ1bmN0aW9uQXJuLFxuICAgICAgcmVzb3VyY2VUeXBlOiBgQ3VzdG9tOjpJbWFnZUJ1aWxkZXItJHt0eXBlfS1WZXJzaW9uYCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5LlJFVEFJTiwgLy8gbm8gcG9pbnQgaW4gZGVsZXRpbmcgYXMgaXQgZG9lc24ndCBldmVuIGNyZWF0ZSBhbnl0aGluZ1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBPYmplY3RUeXBlOiB0eXBlLFxuICAgICAgICBPYmplY3ROYW1lOiBuYW1lLFxuICAgICAgICBWZXJzaW9uZWREYXRhOiBkYXRhLCAvLyBnZXQgYSBuZXcgdmVyc2lvbiBldmVyeSB0aW1lIHNvbWV0aGluZyBjaGFuZ2VzLCBsaWtlIEltYWdlIEJ1aWxkZXIgd2FudHNcbiAgICAgIH0sXG4gICAgfSkucmVmO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJzaW9uRnVuY3Rpb24oKTogVmVyc2lvbmVyRnVuY3Rpb24ge1xuICAgIHJldHVybiBzaW5nbGV0b25MYW1iZGEoVmVyc2lvbmVyRnVuY3Rpb24sIHRoaXMsICdhd3MtaW1hZ2UtYnVpbGRlci12ZXJzaW9uZXInLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0N1c3RvbSByZXNvdXJjZSBoYW5kbGVyIHRoYXQgYnVtcHMgdXAgSW1hZ2UgQnVpbGRlciB2ZXJzaW9ucycsXG4gICAgICBpbml0aWFsUG9saWN5OiBbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAnaW1hZ2VidWlsZGVyOkxpc3RDb21wb25lbnRzJyxcbiAgICAgICAgICAgICdpbWFnZWJ1aWxkZXI6TGlzdENvbnRhaW5lclJlY2lwZXMnLFxuICAgICAgICAgICAgJ2ltYWdlYnVpbGRlcjpMaXN0SW1hZ2VSZWNpcGVzJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDUpLFxuICAgIH0pO1xuICB9XG59XG5cbiJdfQ==
@@ -2,7 +2,7 @@ import { aws_ecr as ecr } from 'aws-cdk-lib';
2
2
  import { Construct } from 'constructs';
3
3
  import { ImageBuilderComponent } from './builder';
4
4
  import { ImageBuilderObjectBase } from './common';
5
- import { Os } from '../../common';
5
+ import { Os } from '../../providers/common';
6
6
  /**
7
7
  * Properties for ContainerRecipe construct.
8
8
  *
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultBaseDockerImage = exports.ContainerRecipe = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const common_1 = require("./common");
6
+ const common_2 = require("../../providers/common");
7
+ const common_3 = require("../common");
8
+ /**
9
+ * Image builder recipe for a Docker container image.
10
+ *
11
+ * @internal
12
+ */
13
+ class ContainerRecipe extends common_1.ImageBuilderObjectBase {
14
+ constructor(scope, id, props) {
15
+ super(scope, id);
16
+ const name = (0, common_3.uniqueImageBuilderName)(this);
17
+ let components = props.components.map(component => {
18
+ return {
19
+ componentArn: component.arn,
20
+ };
21
+ });
22
+ const recipe = new aws_cdk_lib_1.aws_imagebuilder.CfnContainerRecipe(this, 'Recipe', {
23
+ name: name,
24
+ version: this.version('ContainerRecipe', name, {
25
+ platform: props.platform,
26
+ components,
27
+ dockerfileTemplate: props.dockerfileTemplate,
28
+ }),
29
+ parentImage: props.parentImage ?? 'mcr.microsoft.com/windows/servercore:ltsc2019-amd64',
30
+ components,
31
+ containerType: 'DOCKER',
32
+ targetRepository: {
33
+ service: 'ECR',
34
+ repositoryName: props.targetRepository.repositoryName,
35
+ },
36
+ dockerfileTemplateData: props.dockerfileTemplate,
37
+ });
38
+ this.arn = recipe.attrArn;
39
+ this.name = name;
40
+ }
41
+ }
42
+ exports.ContainerRecipe = ContainerRecipe;
43
+ /**
44
+ * Default base Docker image for given OS.
45
+ *
46
+ * @internal
47
+ */
48
+ function defaultBaseDockerImage(os) {
49
+ if (os.is(common_2.Os.WINDOWS)) {
50
+ return 'mcr.microsoft.com/windows/servercore:ltsc2019-amd64';
51
+ }
52
+ else if (os.is(common_2.Os.LINUX_UBUNTU)) {
53
+ return 'public.ecr.aws/lts/ubuntu:22.04';
54
+ }
55
+ else if (os.is(common_2.Os.LINUX_AMAZON_2)) {
56
+ return 'public.ecr.aws/amazonlinux/amazonlinux:2';
57
+ }
58
+ else {
59
+ throw new Error(`OS ${os.name} not supported for Docker runner image`);
60
+ }
61
+ }
62
+ exports.defaultBaseDockerImage = defaultBaseDockerImage;
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2F3cy1pbWFnZS1idWlsZGVyL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBK0U7QUFHL0UscUNBQWtEO0FBQ2xELG1EQUE0QztBQUM1QyxzQ0FBbUQ7QUE0Q25EOzs7O0dBSUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsK0JBQXNCO0lBSXpELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0M7UUFDeEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLElBQUksR0FBRyxJQUFBLCtCQUFzQixFQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2hELE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFNBQVMsQ0FBQyxHQUFHO2FBQzVCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLElBQUksOEJBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ2pFLElBQUksRUFBRSxJQUFJO1lBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFO2dCQUM3QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hCLFVBQVU7Z0JBQ1Ysa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjthQUM3QyxDQUFDO1lBQ0YsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUkscURBQXFEO1lBQ3ZGLFVBQVU7WUFDVixhQUFhLEVBQUUsUUFBUTtZQUN2QixnQkFBZ0IsRUFBRTtnQkFDaEIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsY0FBYyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjO2FBQ3REO1lBQ0Qsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtTQUNqRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBbkNELDBDQW1DQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxFQUFNO0lBQzNDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDckIsT0FBTyxxREFBcUQsQ0FBQztLQUM5RDtTQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7UUFDakMsT0FBTyxpQ0FBaUMsQ0FBQztLQUMxQztTQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFFLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDbkMsT0FBTywwQ0FBMEMsQ0FBQztLQUNuRDtTQUFNO1FBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLHdDQUF3QyxDQUFDLENBQUM7S0FDeEU7QUFDSCxDQUFDO0FBVkQsd0RBVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhd3NfZWNyIGFzIGVjciwgYXdzX2ltYWdlYnVpbGRlciBhcyBpbWFnZWJ1aWxkZXIgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEltYWdlQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4vYnVpbGRlcic7XG5pbXBvcnQgeyBJbWFnZUJ1aWxkZXJPYmplY3RCYXNlIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgT3MgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvY29tbW9uJztcbmltcG9ydCB7IHVuaXF1ZUltYWdlQnVpbGRlck5hbWUgfSBmcm9tICcuLi9jb21tb24nO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIENvbnRhaW5lclJlY2lwZSBjb25zdHJ1Y3QuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyUmVjaXBlUHJvcGVydGllcyB7XG4gIC8qKlxuICAgKiBUYXJnZXQgcGxhdGZvcm0uIE11c3QgbWF0Y2ggYnVpbGRlciBwbGF0Zm9ybS5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtOiAnTGludXgnIHwgJ1dpbmRvd3MnO1xuXG4gIC8qKlxuICAgKiBDb21wb25lbnRzIHRvIGFkZCB0byB0YXJnZXQgY29udGFpbmVyIGltYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50czogSW1hZ2VCdWlsZGVyQ29tcG9uZW50W107XG5cbiAgLyoqXG4gICAqIEVDUiByZXBvc2l0b3J5IHdoZXJlIHJlc3VsdGluZyBjb250YWluZXIgaW1hZ2Ugd2lsbCBiZSB1cGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFJlcG9zaXRvcnk6IGVjci5JUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogRG9ja2VyZmlsZSB0ZW1wbGF0ZSB3aGVyZSBhbGwgdGhlIGNvbXBvbmVudHMgd2lsbCBiZSBhZGRlZC5cbiAgICpcbiAgICogTXVzdCBjb250YWluIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgcGxhY2Vob2xkZXJzOlxuICAgKlxuICAgKiBgYGBcbiAgICogRlJPTSB7e3sgaW1hZ2VidWlsZGVyOnBhcmVudEltYWdlIH19fVxuICAgKiB7e3sgaW1hZ2VidWlsZGVyOmVudmlyb25tZW50cyB9fX1cbiAgICoge3t7IGltYWdlYnVpbGRlcjpjb21wb25lbnRzIH19fVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlcmZpbGVUZW1wbGF0ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXJlbnQgaW1hZ2UgZm9yIHRoZSBuZXcgRG9ja2VyIEltYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnbWNyLm1pY3Jvc29mdC5jb20vd2luZG93cy9zZXJ2ZXJjb3JlOmx0c2MyMDE5LWFtZDY0J1xuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50SW1hZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW1hZ2UgYnVpbGRlciByZWNpcGUgZm9yIGEgRG9ja2VyIGNvbnRhaW5lciBpbWFnZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRhaW5lclJlY2lwZSBleHRlbmRzIEltYWdlQnVpbGRlck9iamVjdEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENvbnRhaW5lclJlY2lwZVByb3BlcnRpZXMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgbmFtZSA9IHVuaXF1ZUltYWdlQnVpbGRlck5hbWUodGhpcyk7XG5cbiAgICBsZXQgY29tcG9uZW50cyA9IHByb3BzLmNvbXBvbmVudHMubWFwKGNvbXBvbmVudCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21wb25lbnRBcm46IGNvbXBvbmVudC5hcm4sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVjaXBlID0gbmV3IGltYWdlYnVpbGRlci5DZm5Db250YWluZXJSZWNpcGUodGhpcywgJ1JlY2lwZScsIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24oJ0NvbnRhaW5lclJlY2lwZScsIG5hbWUsIHtcbiAgICAgICAgcGxhdGZvcm06IHByb3BzLnBsYXRmb3JtLFxuICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICBkb2NrZXJmaWxlVGVtcGxhdGU6IHByb3BzLmRvY2tlcmZpbGVUZW1wbGF0ZSxcbiAgICAgIH0pLFxuICAgICAgcGFyZW50SW1hZ2U6IHByb3BzLnBhcmVudEltYWdlID8/ICdtY3IubWljcm9zb2Z0LmNvbS93aW5kb3dzL3NlcnZlcmNvcmU6bHRzYzIwMTktYW1kNjQnLFxuICAgICAgY29tcG9uZW50cyxcbiAgICAgIGNvbnRhaW5lclR5cGU6ICdET0NLRVInLFxuICAgICAgdGFyZ2V0UmVwb3NpdG9yeToge1xuICAgICAgICBzZXJ2aWNlOiAnRUNSJyxcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHByb3BzLnRhcmdldFJlcG9zaXRvcnkucmVwb3NpdG9yeU5hbWUsXG4gICAgICB9LFxuICAgICAgZG9ja2VyZmlsZVRlbXBsYXRlRGF0YTogcHJvcHMuZG9ja2VyZmlsZVRlbXBsYXRlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hcm4gPSByZWNpcGUuYXR0ckFybjtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG59XG5cbi8qKlxuICogRGVmYXVsdCBiYXNlIERvY2tlciBpbWFnZSBmb3IgZ2l2ZW4gT1MuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0QmFzZURvY2tlckltYWdlKG9zOiBPcykge1xuICBpZiAob3MuaXMoT3MuV0lORE9XUykpIHtcbiAgICByZXR1cm4gJ21jci5taWNyb3NvZnQuY29tL3dpbmRvd3Mvc2VydmVyY29yZTpsdHNjMjAxOS1hbWQ2NCc7XG4gIH0gZWxzZSBpZiAob3MuaXMoT3MuTElOVVhfVUJVTlRVKSkge1xuICAgIHJldHVybiAncHVibGljLmVjci5hd3MvbHRzL3VidW50dToyMi4wNCc7XG4gIH0gZWxzZSBpZiAob3MuaXMoT3MuTElOVVhfQU1BWk9OXzIpKSB7XG4gICAgcmV0dXJuICdwdWJsaWMuZWNyLmF3cy9hbWF6b25saW51eC9hbWF6b25saW51eDoyJztcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9TICR7b3MubmFtZX0gbm90IHN1cHBvcnRlZCBmb3IgRG9ja2VyIHJ1bm5lciBpbWFnZWApO1xuICB9XG59XG5cbiJdfQ==
@@ -6,7 +6,7 @@ import { Construct } from 'constructs';
6
6
  export interface DeleteAmiFunctionProps extends lambda.FunctionOptions {
7
7
  }
8
8
  /**
9
- * An AWS Lambda function which executes src/providers/image-builders/aws-image-builder/delete-ami.
9
+ * An AWS Lambda function which executes src/image-builders/aws-image-builder/delete-ami.
10
10
  */
11
11
  export declare class DeleteAmiFunction extends lambda.Function {
12
12
  constructor(scope: Construct, id: string, props?: DeleteAmiFunctionProps);
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeleteAmiFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/image-builders/aws-image-builder/delete-ami.
9
+ */
10
+ class DeleteAmiFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/image-builders/aws-image-builder/delete-ami.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs16.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../../assets/image-builders/aws-image-builder/delete-ami.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.DeleteAmiFunction = DeleteAmiFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWFtaS1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbWFnZS1idWlsZGVycy9hd3MtaW1hZ2UtYnVpbGRlci9kZWxldGUtYW1pLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUE2RTtBQUM3RSw2QkFBNkI7QUFDN0IsaURBQWlEO0FBU2pEOztHQUVHO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxNQUFNLENBQUMsUUFBUTtJQUNwRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLDJEQUEyRDtZQUN4RSxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUN0RSxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsb0VBQW9FLENBQUMsQ0FBQztTQUN4SCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7Q0FDRjtBQVhELDhDQVdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy5qcyBhbmQgcnVuIFwibnB4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBEZWxldGVBbWlGdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZUFtaUZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb25PcHRpb25zIHtcbn1cblxuLyoqXG4gKiBBbiBBV1MgTGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIHNyYy9pbWFnZS1idWlsZGVycy9hd3MtaW1hZ2UtYnVpbGRlci9kZWxldGUtYW1pLlxuICovXG5leHBvcnQgY2xhc3MgRGVsZXRlQW1pRnVuY3Rpb24gZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IERlbGV0ZUFtaUZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3JjL2ltYWdlLWJ1aWxkZXJzL2F3cy1pbWFnZS1idWlsZGVyL2RlbGV0ZS1hbWkubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMxNi54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzL2ltYWdlLWJ1aWxkZXJzL2F3cy1pbWFnZS1idWlsZGVyL2RlbGV0ZS1hbWkubGFtYmRhJykpLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoJ0FXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEJywgJzEnLCB7IHJlbW92ZUluRWRnZTogdHJ1ZSB9KTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable-next-line import/no-extraneous-dependencies */
4
+ const AWS = require("aws-sdk");
5
+ const lambda_helpers_1 = require("../../lambda-helpers");
6
+ const ec2 = new AWS.EC2();
7
+ async function deleteAmis(launchTemplateId, stackName, builderName, deleteAll) {
8
+ // this runs daily and images are built once a week, so there shouldn't be a need for pagination
9
+ const images = await ec2.describeImages({
10
+ Owners: ['self'],
11
+ Filters: [
12
+ {
13
+ Name: 'tag:GitHubRunners:Stack',
14
+ Values: [stackName],
15
+ },
16
+ {
17
+ Name: 'tag:GitHubRunners:Builder',
18
+ Values: [builderName],
19
+ },
20
+ ],
21
+ }).promise();
22
+ let imagesToDelete = images.Images ?? [];
23
+ console.log(`Found ${imagesToDelete.length} AMIs`);
24
+ console.log(JSON.stringify(imagesToDelete.map(i => i.ImageId)));
25
+ if (!deleteAll) {
26
+ // get launch template information to filter out the active image
27
+ const launchTemplates = await ec2.describeLaunchTemplateVersions({
28
+ LaunchTemplateId: launchTemplateId,
29
+ Versions: ['$Default'],
30
+ }).promise();
31
+ if (!launchTemplates.LaunchTemplateVersions) {
32
+ console.error(`Unable to describe launch template ${launchTemplateId}`);
33
+ return;
34
+ }
35
+ const launchTemplate = launchTemplates.LaunchTemplateVersions[0];
36
+ // non-active images
37
+ imagesToDelete = imagesToDelete.filter(i => i.ImageId != launchTemplate.LaunchTemplateData?.ImageId);
38
+ // images older than two days to avoid race conditions where an image is created while we're cleaning up
39
+ imagesToDelete = imagesToDelete.filter(i => i.CreationDate && Date.parse(i.CreationDate) < (Date.now() - 1000 * 60 * 60 * 48));
40
+ console.log(`${imagesToDelete.length} AMIs left after filtering by date and excluding AMI used by launch template`);
41
+ }
42
+ // delete all that we found
43
+ for (const image of imagesToDelete) {
44
+ if (!image.ImageId) {
45
+ console.warn(`No image id? ${JSON.stringify(image)}`);
46
+ continue;
47
+ }
48
+ console.log(`Deregistering ${image.ImageId}`);
49
+ await ec2.deregisterImage({
50
+ ImageId: image.ImageId,
51
+ }).promise();
52
+ for (const blockMapping of image.BlockDeviceMappings ?? []) {
53
+ if (blockMapping.Ebs?.SnapshotId) {
54
+ console.log(`Deleting ${blockMapping.Ebs.SnapshotId}`);
55
+ await ec2.deleteSnapshot({
56
+ SnapshotId: blockMapping.Ebs.SnapshotId,
57
+ }).promise();
58
+ }
59
+ }
60
+ }
61
+ }
62
+ /* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */
63
+ exports.handler = async function (event, context) {
64
+ try {
65
+ console.log(JSON.stringify({ ...event, ResponseURL: '...' }));
66
+ switch (event.RequestType) {
67
+ case 'Scheduled':
68
+ await deleteAmis(event.LaunchTemplateId, event.StackName, event.BuilderName, false);
69
+ return;
70
+ case 'Create':
71
+ case 'Update':
72
+ await (0, lambda_helpers_1.customResourceRespond)(event, 'SUCCESS', 'OK', 'DeleteAmis', {});
73
+ break;
74
+ case 'Delete':
75
+ await deleteAmis('', event.ResourceProperties.StackName, event.ResourceProperties.BuilderName, true);
76
+ await (0, lambda_helpers_1.customResourceRespond)(event, 'SUCCESS', 'OK', event.PhysicalResourceId, {});
77
+ break;
78
+ }
79
+ }
80
+ catch (e) {
81
+ console.error(e);
82
+ if (event.RequestType != 'Scheduled') {
83
+ await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', e.message || 'Internal Error', context.logStreamName, {});
84
+ }
85
+ }
86
+ };
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWFtaS5sYW1iZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW1hZ2UtYnVpbGRlcnMvYXdzLWltYWdlLWJ1aWxkZXIvZGVsZXRlLWFtaS5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxnRUFBZ0U7QUFDaEUsK0JBQStCO0FBQy9CLHlEQUE2RDtBQUc3RCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQVMxQixLQUFLLFVBQVUsVUFBVSxDQUFDLGdCQUF3QixFQUFFLFNBQWlCLEVBQUUsV0FBbUIsRUFBRSxTQUFrQjtJQUM1RyxnR0FBZ0c7SUFDaEcsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNoQixPQUFPLEVBQUU7WUFDUDtnQkFDRSxJQUFJLEVBQUUseUJBQXlCO2dCQUMvQixNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDcEI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsMkJBQTJCO2dCQUNqQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUM7YUFDdEI7U0FDRjtLQUNGLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUViLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBRXpDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxjQUFjLENBQUMsTUFBTSxPQUFPLENBQUMsQ0FBQztJQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEUsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNkLGlFQUFpRTtRQUNqRSxNQUFNLGVBQWUsR0FBRyxNQUFNLEdBQUcsQ0FBQyw4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Q0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyRyxNQUFNLElBQUEsc0NBQXFCLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixNQUFNO1NBQ1Q7S0FDRjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksV0FBVyxFQUFFO1lBQ3BDLE1BQU0sSUFBQSxzQ0FBcUIsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFHLENBQVcsQ0FBQyxPQUFPLElBQUksZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNuSDtLQUNGO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyxpbXBvcnQvbm8tdW5yZXNvbHZlZCAqL1xuaW1wb3J0ICogYXMgQVdTTGFtYmRhIGZyb20gJ2F3cy1sYW1iZGEnO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0ICogYXMgQVdTIGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0IHsgY3VzdG9tUmVzb3VyY2VSZXNwb25kIH0gZnJvbSAnLi4vLi4vbGFtYmRhLWhlbHBlcnMnO1xuXG5cbmNvbnN0IGVjMiA9IG5ldyBBV1MuRUMyKCk7XG5cbnR5cGUgRGVsZXRlQW1pSW5wdXQgPSB7XG4gIFJlcXVlc3RUeXBlOiAnU2NoZWR1bGVkJztcbiAgU3RhY2tOYW1lOiBzdHJpbmc7XG4gIEJ1aWxkZXJOYW1lOiBzdHJpbmc7XG4gIExhdW5jaFRlbXBsYXRlSWQ6IHN0cmluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQW1pcyhsYXVuY2hUZW1wbGF0ZUlkOiBzdHJpbmcsIHN0YWNrTmFtZTogc3RyaW5nLCBidWlsZGVyTmFtZTogc3RyaW5nLCBkZWxldGVBbGw6IGJvb2xlYW4pIHtcbiAgLy8gdGhpcyBydW5zIGRhaWx5IGFuZCBpbWFnZXMgYXJlIGJ1aWx0IG9uY2UgYSB3ZWVrLCBzbyB0aGVyZSBzaG91bGRuJ3QgYmUgYSBuZWVkIGZvciBwYWdpbmF0aW9uXG4gIGNvbnN0IGltYWdlcyA9IGF3YWl0IGVjMi5kZXNjcmliZUltYWdlcyh7XG4gICAgT3duZXJzOiBbJ3NlbGYnXSxcbiAgICBGaWx0ZXJzOiBbXG4gICAgICB7XG4gICAgICAgIE5hbWU6ICd0YWc6R2l0SHViUnVubmVyczpTdGFjaycsXG4gICAgICAgIFZhbHVlczogW3N0YWNrTmFtZV0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBOYW1lOiAndGFnOkdpdEh1YlJ1bm5lcnM6QnVpbGRlcicsXG4gICAgICAgIFZhbHVlczogW2J1aWxkZXJOYW1lXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSkucHJvbWlzZSgpO1xuXG4gIGxldCBpbWFnZXNUb0RlbGV0ZSA9IGltYWdlcy5JbWFnZXMgPz8gW107XG5cbiAgY29uc29sZS5sb2coYEZvdW5kICR7aW1hZ2VzVG9EZWxldGUubGVuZ3RofSBBTUlzYCk7XG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGltYWdlc1RvRGVsZXRlLm1hcChpID0+IGkuSW1hZ2VJZCkpKTtcblxuICBpZiAoIWRlbGV0ZUFsbCkge1xuICAgIC8vIGdldCBsYXVuY2ggdGVtcGxhdGUgaW5mb3JtYXRpb24gdG8gZmlsdGVyIG91dCB0aGUgYWN0aXZlIGltYWdlXG4gICAgY29uc3QgbGF1bmNoVGVtcGxhdGVzID0gYXdhaXQgZWMyLmRlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucyh7XG4gICAgICBMYXVuY2hUZW1wbGF0ZUlkOiBsYXVuY2hUZW1wbGF0ZUlkLFxuICAgICAgVmVyc2lvbnM6IFsnJERlZmF1bHQnXSxcbiAgICB9KS5wcm9taXNlKCk7XG4gICAgaWYgKCFsYXVuY2hUZW1wbGF0ZXMuTGF1bmNoVGVtcGxhdGVWZXJzaW9ucykge1xuICAgICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIGRlc2NyaWJlIGxhdW5jaCB0ZW1wbGF0ZSAke2xhdW5jaFRlbXBsYXRlSWR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhdW5jaFRlbXBsYXRlID0gbGF1bmNoVGVtcGxhdGVzLkxhdW5jaFRlbXBsYXRlVmVyc2lvbnNbMF07XG5cbiAgICAvLyBub24tYWN0aXZlIGltYWdlc1xuICAgIGltYWdlc1RvRGVsZXRlID0gaW1hZ2VzVG9EZWxldGUuZmlsdGVyKGkgPT4gaS5JbWFnZUlkICE9IGxhdW5jaFRlbXBsYXRlLkxhdW5jaFRlbXBsYXRlRGF0YT8uSW1hZ2VJZCk7XG4gICAgLy8gaW1hZ2VzIG9sZGVyIHRoYW4gdHdvIGRheXMgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdoZXJlIGFuIGltYWdlIGlzIGNyZWF0ZWQgd2hpbGUgd2UncmUgY2xlYW5pbmcgdXBcbiAgICBpbWFnZXNUb0RlbGV0ZSA9IGltYWdlc1RvRGVsZXRlLmZpbHRlcihpID0+IGkuQ3JlYXRpb25EYXRlICYmIERhdGUucGFyc2UoaS5DcmVhdGlvbkRhdGUpIDwgKERhdGUubm93KCkgLSAxMDAwICogNjAgKiA2MCAqIDQ4KSk7XG5cbiAgICBjb25zb2xlLmxvZyhgJHtpbWFnZXNUb0RlbGV0ZS5sZW5ndGh9IEFNSXMgbGVmdCBhZnRlciBmaWx0ZXJpbmcgYnkgZGF0ZSBhbmQgZXhjbHVkaW5nIEFNSSB1c2VkIGJ5IGxhdW5jaCB0ZW1wbGF0ZWApO1xuICB9XG5cbiAgLy8gZGVsZXRlIGFsbCB0aGF0IHdlIGZvdW5kXG4gIGZvciAoY29uc3QgaW1hZ2Ugb2YgaW1hZ2VzVG9EZWxldGUpIHtcbiAgICBpZiAoIWltYWdlLkltYWdlSWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTm8gaW1hZ2UgaWQ/ICR7SlNPTi5zdHJpbmdpZnkoaW1hZ2UpfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYERlcmVnaXN0ZXJpbmcgJHtpbWFnZS5JbWFnZUlkfWApO1xuXG4gICAgYXdhaXQgZWMyLmRlcmVnaXN0ZXJJbWFnZSh7XG4gICAgICBJbWFnZUlkOiBpbWFnZS5JbWFnZUlkLFxuICAgIH0pLnByb21pc2UoKTtcblxuICAgIGZvciAoY29uc3QgYmxvY2tNYXBwaW5nIG9mIGltYWdlLkJsb2NrRGV2aWNlTWFwcGluZ3MgPz8gW10pIHtcbiAgICAgIGlmIChibG9ja01hcHBpbmcuRWJzPy5TbmFwc2hvdElkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGluZyAke2Jsb2NrTWFwcGluZy5FYnMuU25hcHNob3RJZH1gKTtcblxuICAgICAgICBhd2FpdCBlYzIuZGVsZXRlU25hcHNob3Qoe1xuICAgICAgICAgIFNuYXBzaG90SWQ6IGJsb2NrTWFwcGluZy5FYnMuU25hcHNob3RJZCxcbiAgICAgICAgfSkucHJvbWlzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzLCBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudDogRGVsZXRlQW1pSW5wdXQgfCBBV1NMYW1iZGEuQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50LCBjb250ZXh0OiBBV1NMYW1iZGEuQ29udGV4dCkge1xuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgLi4uZXZlbnQsIFJlc3BvbnNlVVJMOiAnLi4uJyB9KSk7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgICBjYXNlICdTY2hlZHVsZWQnOlxuICAgICAgICBhd2FpdCBkZWxldGVBbWlzKGV2ZW50LkxhdW5jaFRlbXBsYXRlSWQsIGV2ZW50LlN0YWNrTmFtZSwgZXZlbnQuQnVpbGRlck5hbWUsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnQ3JlYXRlJzpcbiAgICAgIGNhc2UgJ1VwZGF0ZSc6XG4gICAgICAgIGF3YWl0IGN1c3RvbVJlc291cmNlUmVzcG9uZChldmVudCwgJ1NVQ0NFU1MnLCAnT0snLCAnRGVsZXRlQW1pcycsIHt9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdEZWxldGUnOlxuICAgICAgICBhd2FpdCBkZWxldGVBbWlzKCcnLCBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuU3RhY2tOYW1lLCBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuQnVpbGRlck5hbWUsIHRydWUpO1xuICAgICAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdTVUNDRVNTJywgJ09LJywgZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkLCB7fSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlICE9ICdTY2hlZHVsZWQnKSB7XG4gICAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdGQUlMRUQnLCAoZSBhcyBFcnJvcikubWVzc2FnZSB8fCAnSW50ZXJuYWwgRXJyb3InLCBjb250ZXh0LmxvZ1N0cmVhbU5hbWUsIHt9KTtcbiAgICB9XG4gIH1cbn07XG4iXX0=
@@ -1,7 +1,7 @@
1
1
  import { aws_ec2 as ec2, aws_logs as logs, Duration, RemovalPolicy } from 'aws-cdk-lib';
2
2
  import { Construct } from 'constructs';
3
3
  import { ImageBuilderBase } from './common';
4
- import { Architecture, Os, RunnerAmi, RunnerImage, RunnerVersion } from '../../../common';
4
+ import { Architecture, Os, RunnerAmi, RunnerImage, RunnerVersion } from '../../../providers/common';
5
5
  import { ImageBuilderComponent } from '../builder';
6
6
  /**
7
7
  * Properties for {@link AmiBuilder} construct.
@@ -82,7 +82,7 @@ export interface AmiBuilderProps {
82
82
  */
83
83
  readonly logRemovalPolicy?: RemovalPolicy;
84
84
  /**
85
- * Install Docker inside the image, so it can be used by the runner. You may want to disable this if you are building a Windows image and don't have a Docker Desktop license.
85
+ * Install Docker inside the image, so it can be used by the runner.
86
86
  *
87
87
  * @default true
88
88
  */
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AmiBuilder = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const cdk = require("aws-cdk-lib");
7
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
8
+ const common_1 = require("./common");
9
+ const linux_components_1 = require("./linux-components");
10
+ const windows_components_1 = require("./windows-components");
11
+ const common_2 = require("../../../providers/common");
12
+ const utils_1 = require("../../../utils");
13
+ const common_3 = require("../../common");
14
+ const ami_1 = require("../ami");
15
+ const delete_ami_function_1 = require("../delete-ami-function");
16
+ /**
17
+ * An AMI builder that uses AWS Image Builder to build AMIs pre-baked with all the GitHub Actions runner requirements. Builders can be used with {@link Ec2Runner}.
18
+ *
19
+ * Each builder re-runs automatically at a set interval to make sure the AMIs contain the latest versions of everything.
20
+ *
21
+ * You can create an instance of this construct to customize the AMI used to spin-up runners. Some runner providers may require custom components. Check the runner provider documentation.
22
+ *
23
+ * For example, to set a specific runner version, rebuild the image every 2 weeks, and add a few packages for the EC2 provider, use:
24
+ *
25
+ * ```
26
+ * const builder = new AmiBuilder(this, 'Builder', {
27
+ * runnerVersion: RunnerVersion.specific('2.293.0'),
28
+ * rebuildInterval: Duration.days(14),
29
+ * });
30
+ * builder.addComponent(new ImageBuilderComponent(scope, id, {
31
+ * platform: 'Linux',
32
+ * displayName: 'p7zip',
33
+ * description: 'Install some more packages',
34
+ * commands: [
35
+ * 'apt-get install p7zip',
36
+ * ],
37
+ * }));
38
+ * new Ec2Runner(this, 'EC2 provider', {
39
+ * label: 'custom-ec2',
40
+ * amiBuilder: builder,
41
+ * });
42
+ * ```
43
+ *
44
+ * @deprecated use RunnerImageBuilder
45
+ */
46
+ class AmiBuilder extends common_1.ImageBuilderBase {
47
+ constructor(scope, id, props) {
48
+ super(scope, id, {
49
+ os: props?.os,
50
+ supportedOs: [common_2.Os.LINUX, common_2.Os.LINUX_UBUNTU, common_2.Os.LINUX_AMAZON_2, common_2.Os.WINDOWS],
51
+ architecture: props?.architecture,
52
+ supportedArchitectures: [common_2.Architecture.X86_64, common_2.Architecture.ARM64],
53
+ instanceType: props?.instanceType,
54
+ vpc: props?.vpc,
55
+ securityGroups: props?.securityGroup ? [props.securityGroup] : props?.securityGroups,
56
+ subnetSelection: props?.subnetSelection,
57
+ logRemovalPolicy: props?.logRemovalPolicy,
58
+ logRetention: props?.logRetention,
59
+ runnerVersion: props?.runnerVersion,
60
+ rebuildInterval: props?.rebuildInterval,
61
+ imageTypeName: 'AMI',
62
+ });
63
+ // add all basic components
64
+ if (this.os.is(common_2.Os.WINDOWS)) {
65
+ this.addBaseWindowsComponents(props?.installDocker ?? true);
66
+ }
67
+ else if (this.os.is(common_2.Os.LINUX) || this.os.is(common_2.Os.LINUX_UBUNTU)) {
68
+ this.addBaseLinuxComponents(props?.installDocker ?? true);
69
+ }
70
+ else {
71
+ throw new Error(`Unsupported OS for AMI builder: ${this.os.name}`);
72
+ }
73
+ }
74
+ addBaseWindowsComponents(installDocker) {
75
+ this.addComponent(windows_components_1.WindowsComponents.cloudwatchAgent(this, 'CloudWatch agent'));
76
+ this.addComponent(windows_components_1.WindowsComponents.awsCli(this, 'AWS CLI'));
77
+ this.addComponent(windows_components_1.WindowsComponents.githubCli(this, 'GitHub CLI'));
78
+ this.addComponent(windows_components_1.WindowsComponents.git(this, 'git'));
79
+ this.addComponent(windows_components_1.WindowsComponents.githubRunner(this, 'GitHub Actions Runner', this.runnerVersion));
80
+ if (installDocker) {
81
+ this.addComponent(windows_components_1.WindowsComponents.docker(this, 'Docker'));
82
+ }
83
+ }
84
+ addBaseLinuxComponents(installDocker) {
85
+ this.addComponent(linux_components_1.LinuxUbuntuComponents.requiredPackages(this, 'Upgrade packages and install basics', this.architecture));
86
+ this.addComponent(linux_components_1.LinuxUbuntuComponents.runnerUser(this, 'User', this.architecture));
87
+ this.addComponent(linux_components_1.LinuxUbuntuComponents.awsCli(this, 'AWS CLI', this.architecture));
88
+ this.addComponent(linux_components_1.LinuxUbuntuComponents.githubCli(this, 'GitHub CLI', this.architecture));
89
+ this.addComponent(linux_components_1.LinuxUbuntuComponents.git(this, 'git', this.architecture));
90
+ this.addComponent(linux_components_1.LinuxUbuntuComponents.githubRunner(this, 'GitHub Actions Runner', this.runnerVersion, this.architecture));
91
+ if (installDocker) {
92
+ this.addComponent(linux_components_1.LinuxUbuntuComponents.docker(this, 'Docker', this.architecture));
93
+ }
94
+ }
95
+ /**
96
+ * Add a component to be installed before any other components. Useful for required system settings like certificates or proxy settings.
97
+ * @param component
98
+ */
99
+ prependComponent(component) {
100
+ if (this.boundAmi) {
101
+ throw new Error('AMI is already bound. Use this method before passing the builder to a runner provider.');
102
+ }
103
+ if (component.platform != this.platform) {
104
+ throw new Error('Component platform doesn\'t match builder platform');
105
+ }
106
+ this.components = [component].concat(this.components);
107
+ }
108
+ /**
109
+ * Add a component to be installed.
110
+ * @param component
111
+ */
112
+ addComponent(component) {
113
+ if (this.boundAmi) {
114
+ throw new Error('AMI is already bound. Use this method before passing the builder to a runner provider.');
115
+ }
116
+ if (component.platform != this.platform) {
117
+ throw new Error('Component platform doesn\'t match builder platform');
118
+ }
119
+ this.components.push(component);
120
+ }
121
+ /**
122
+ * Add extra trusted certificates. This helps deal with self-signed certificates for GitHub Enterprise Server.
123
+ *
124
+ * @param path path to directory containing a file called certs.pem containing all the required certificates
125
+ */
126
+ addExtraCertificates(path) {
127
+ if (this.platform == 'Linux') {
128
+ this.prependComponent(linux_components_1.LinuxUbuntuComponents.extraCertificates(this, 'Extra Certs', path));
129
+ }
130
+ else if (this.platform == 'Windows') {
131
+ this.prependComponent(windows_components_1.WindowsComponents.extraCertificates(this, 'Extra Certs', path));
132
+ }
133
+ else {
134
+ throw new Error(`Unknown platform: ${this.platform}`);
135
+ }
136
+ }
137
+ /**
138
+ * Called by IRunnerProvider to finalize settings and create the AMI builder.
139
+ */
140
+ bindAmi() {
141
+ if (this.boundAmi) {
142
+ return this.boundAmi;
143
+ }
144
+ const launchTemplate = new aws_cdk_lib_1.aws_ec2.LaunchTemplate(this, 'Launch template', {
145
+ requireImdsv2: true,
146
+ });
147
+ const stackName = cdk.Stack.of(this).stackName;
148
+ const builderName = this.node.path;
149
+ const dist = new aws_cdk_lib_1.aws_imagebuilder.CfnDistributionConfiguration(this, 'Distribution', {
150
+ name: (0, common_3.uniqueImageBuilderName)(this),
151
+ description: this.description,
152
+ distributions: [
153
+ {
154
+ region: aws_cdk_lib_1.Stack.of(this).region,
155
+ amiDistributionConfiguration: {
156
+ Name: `${cdk.Names.uniqueResourceName(this, {
157
+ maxLength: 100,
158
+ separator: '-',
159
+ allowedSpecialCharacters: '_-',
160
+ })}-{{ imagebuilder:buildDate }}`,
161
+ AmiTags: {
162
+ 'Name': this.node.id,
163
+ 'GitHubRunners:Stack': stackName,
164
+ 'GitHubRunners:Builder': builderName,
165
+ },
166
+ },
167
+ launchTemplateConfigurations: [
168
+ {
169
+ launchTemplateId: launchTemplate.launchTemplateId,
170
+ },
171
+ ],
172
+ },
173
+ ],
174
+ });
175
+ const recipe = new ami_1.AmiRecipe(this, 'Ami Recipe', {
176
+ platform: this.platform,
177
+ components: this.components,
178
+ architecture: this.architecture,
179
+ baseAmi: (0, ami_1.defaultBaseAmi)(this, this.os, this.architecture),
180
+ });
181
+ const log = this.createLog(recipe.name);
182
+ const infra = this.createInfrastructure([
183
+ aws_cdk_lib_1.aws_iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
184
+ aws_cdk_lib_1.aws_iam.ManagedPolicy.fromAwsManagedPolicyName('EC2InstanceProfileForImageBuilder'),
185
+ ]);
186
+ this.createImage(infra, dist, log, recipe.arn, undefined);
187
+ this.createPipeline(infra, dist, log, recipe.arn, undefined);
188
+ this.boundAmi = {
189
+ launchTemplate: launchTemplate,
190
+ architecture: this.architecture,
191
+ os: this.os,
192
+ logGroup: log,
193
+ runnerVersion: this.runnerVersion,
194
+ };
195
+ this.imageCleaner(launchTemplate, stackName, builderName);
196
+ return this.boundAmi;
197
+ }
198
+ imageCleaner(launchTemplate, stackName, builderName) {
199
+ const deleter = (0, utils_1.singletonLambda)(delete_ami_function_1.DeleteAmiFunction, this, 'delete-ami', {
200
+ description: 'Delete old GitHub Runner AMIs',
201
+ initialPolicy: [
202
+ new aws_cdk_lib_1.aws_iam.PolicyStatement({
203
+ actions: ['ec2:DescribeLaunchTemplateVersions', 'ec2:DescribeImages', 'ec2:DeregisterImage', 'ec2:DeleteSnapshot'],
204
+ resources: ['*'],
205
+ }),
206
+ ],
207
+ timeout: cdk.Duration.minutes(5),
208
+ logRetention: aws_cdk_lib_1.aws_logs.RetentionDays.ONE_MONTH,
209
+ });
210
+ // delete old AMIs on schedule
211
+ const eventRule = new aws_cdk_lib_1.aws_events.Rule(this, 'Delete AMI Schedule', {
212
+ schedule: aws_cdk_lib_1.aws_events.Schedule.rate(cdk.Duration.days(1)),
213
+ description: `Delete old AMIs for ${builderName}`,
214
+ });
215
+ eventRule.addTarget(new aws_cdk_lib_1.aws_events_targets.LambdaFunction(deleter, {
216
+ event: aws_cdk_lib_1.aws_events.RuleTargetInput.fromObject({
217
+ RequestType: 'Scheduled',
218
+ LaunchTemplateId: launchTemplate.launchTemplateId,
219
+ StackName: stackName,
220
+ BuilderName: builderName,
221
+ }),
222
+ }));
223
+ // delete all AMIs when this construct is removed
224
+ new aws_cdk_lib_1.CustomResource(this, 'AMI Deleter', {
225
+ serviceToken: deleter.functionArn,
226
+ resourceType: 'Custom::AmiDeleter',
227
+ properties: {
228
+ StackName: stackName,
229
+ BuilderName: builderName,
230
+ },
231
+ });
232
+ }
233
+ bindDockerImage() {
234
+ throw new Error('AmiBuilder cannot be used to build Docker images');
235
+ }
236
+ }
237
+ _a = JSII_RTTI_SYMBOL_1;
238
+ AmiBuilder[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.AmiBuilder", version: "0.9.5" };
239
+ exports.AmiBuilder = AmiBuilder;
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ltYWdlLWJ1aWxkZXJzL2F3cy1pbWFnZS1idWlsZGVyL2RlcHJlY2F0ZWQvYW1pLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQW1DO0FBQ25DLDZDQVdxQjtBQUVyQixxQ0FBNEM7QUFDNUMseURBQTJEO0FBQzNELDZEQUF5RDtBQUN6RCxzREFBb0c7QUFDcEcsMENBQWlEO0FBQ2pELHlDQUFzRDtBQUN0RCxnQ0FBbUQ7QUFFbkQsZ0VBQTJEO0FBbUczRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFhLFVBQVcsU0FBUSx5QkFBZ0I7SUFHOUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QjtRQUMvRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNiLFdBQVcsRUFBRSxDQUFDLFdBQUUsQ0FBQyxLQUFLLEVBQUUsV0FBRSxDQUFDLFlBQVksRUFBRSxXQUFFLENBQUMsY0FBYyxFQUFFLFdBQUUsQ0FBQyxPQUFPLENBQUM7WUFDdkUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZO1lBQ2pDLHNCQUFzQixFQUFFLENBQUMscUJBQVksQ0FBQyxNQUFNLEVBQUUscUJBQVksQ0FBQyxLQUFLLENBQUM7WUFDakUsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZO1lBQ2pDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRztZQUNmLGNBQWMsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWM7WUFDcEYsZUFBZSxFQUFFLEtBQUssRUFBRSxlQUFlO1lBQ3ZDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxnQkFBZ0I7WUFDekMsWUFBWSxFQUFFLEtBQUss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d0JBQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsV0FBVztnQkFDeEIsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLGdCQUFnQjtnQkFDakQsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFdBQVcsRUFBRSxXQUFXO2FBQ3pCLENBQUM7U0FDSCxDQUFDLENBQUMsQ0FBQztRQUVKLGlEQUFpRDtRQUNqRCxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUN0QyxZQUFZLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDakMsWUFBWSxFQUFFLG9CQUFvQjtZQUNsQyxVQUFVLEVBQUU7Z0JBQ1YsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFdBQVcsRUFBRSxXQUFXO2FBQ3pCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDdEUsQ0FBQzs7OztBQTlNVSxnQ0FBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBhd3NfZWMyIGFzIGVjMixcbiAgYXdzX2V2ZW50cyBhcyBldmVudHMsXG4gIGF3c19ldmVudHNfdGFyZ2V0cyBhcyBldmVudHNfdGFyZ2V0cyxcbiAgYXdzX2lhbSBhcyBpYW0sXG4gIGF3c19pbWFnZWJ1aWxkZXIgYXMgaW1hZ2VidWlsZGVyLFxuICBhd3NfbG9ncyBhcyBsb2dzLFxuICBDdXN0b21SZXNvdXJjZSxcbiAgRHVyYXRpb24sXG4gIFJlbW92YWxQb2xpY3ksXG4gIFN0YWNrLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEltYWdlQnVpbGRlckJhc2UgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBMaW51eFVidW50dUNvbXBvbmVudHMgfSBmcm9tICcuL2xpbnV4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgV2luZG93c0NvbXBvbmVudHMgfSBmcm9tICcuL3dpbmRvd3MtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUsIE9zLCBSdW5uZXJBbWksIFJ1bm5lckltYWdlLCBSdW5uZXJWZXJzaW9uIH0gZnJvbSAnLi4vLi4vLi4vcHJvdmlkZXJzL2NvbW1vbic7XG5pbXBvcnQgeyBzaW5nbGV0b25MYW1iZGEgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyB1bmlxdWVJbWFnZUJ1aWxkZXJOYW1lIH0gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IEFtaVJlY2lwZSwgZGVmYXVsdEJhc2VBbWkgfSBmcm9tICcuLi9hbWknO1xuaW1wb3J0IHsgSW1hZ2VCdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vYnVpbGRlcic7XG5pbXBvcnQgeyBEZWxldGVBbWlGdW5jdGlvbiB9IGZyb20gJy4uL2RlbGV0ZS1hbWktZnVuY3Rpb24nO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHtAbGluayBBbWlCdWlsZGVyfSBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW1pQnVpbGRlclByb3BzIHtcbiAgLyoqXG4gICAqIEltYWdlIGFyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBJbWFnZSBPUy5cbiAgICpcbiAgICogQGRlZmF1bHQgT1MuTElOVVhcbiAgICovXG4gIHJlYWRvbmx5IG9zPzogT3M7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgR2l0SHViIFJ1bm5lcnMgdG8gaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGF0ZXN0IHZlcnNpb24gYXZhaWxhYmxlXG4gICAqL1xuICByZWFkb25seSBydW5uZXJWZXJzaW9uPzogUnVubmVyVmVyc2lvbjtcblxuICAvKipcbiAgICogU2NoZWR1bGUgdGhlIEFNSSB0byBiZSByZWJ1aWx0IGV2ZXJ5IGdpdmVuIGludGVydmFsLiBVc2VmdWwgZm9yIGtlZXBpbmcgdGhlIEFNSSB1cC1kby1kYXRlIHdpdGggdGhlIGxhdGVzdCBHaXRIdWIgcnVubmVyIHZlcnNpb24gYW5kIGxhdGVzdCBPUyB1cGRhdGVzLlxuICAgKlxuICAgKiBTZXQgdG8gemVybyB0byBkaXNhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5kYXlzKDcpXG4gICAqL1xuICByZWFkb25seSByZWJ1aWxkSW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVlBDIHdoZXJlIGJ1aWxkZXIgaW5zdGFuY2VzIHdpbGwgYmUgbGF1bmNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRlZmF1bHQgYWNjb3VudCBWUENcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IGVjMi5JVnBjO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCB0byBhc3NpZ24gdG8gbGF1bmNoZWQgYnVpbGRlciBpbnN0YW5jZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IG5ldyBzZWN1cml0eSBncm91cFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIHNlY3VyaXR5R3JvdXBzfVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cD86IGVjMi5JU2VjdXJpdHlHcm91cDtcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXBzIHRvIGFzc2lnbiB0byBsYXVuY2hlZCBidWlsZGVyIGluc3RhbmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgbmV3IHNlY3VyaXR5IGdyb3VwXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IGVjMi5JU2VjdXJpdHlHcm91cFtdO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBwbGFjZSB0aGUgbmV0d29yayBpbnRlcmZhY2VzIHdpdGhpbiB0aGUgVlBDLiBPbmx5IHRoZSBmaXJzdCBtYXRjaGVkIHN1Ym5ldCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRlZmF1bHQgVlBDIHN1Ym5ldFxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0U2VsZWN0aW9uPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogVGhlIGluc3RhbmNlIHR5cGUgdXNlZCB0byBidWlsZCB0aGUgaW1hZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IG01LmxhcmdlXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZVR5cGU/OiBlYzIuSW5zdGFuY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgbG9nIGV2ZW50cyBhcmUga2VwdCBpbiBDbG91ZFdhdGNoIExvZ3MuIFdoZW4gdXBkYXRpbmdcbiAgICogdGhpcyBwcm9wZXJ0eSwgdW5zZXR0aW5nIGl0IGRvZXNuJ3QgcmVtb3ZlIHRoZSBsb2cgcmV0ZW50aW9uIHBvbGljeS4gVG9cbiAgICogcmVtb3ZlIHRoZSByZXRlbnRpb24gcG9saWN5LCBzZXQgdGhlIHZhbHVlIHRvIGBJTkZJTklURWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEhcbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JldGVudGlvbj86IGxvZ3MuUmV0ZW50aW9uRGF5cztcblxuICAvKipcbiAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIGxvZ3Mgb2YgaW1hZ2UgYnVpbGRzLiBJZiBkZXBsb3ltZW50IGZhaWxzIG9uIHRoZSBjdXN0b20gcmVzb3VyY2UsIHRyeSBzZXR0aW5nIHRoaXMgdG8gYFJlbW92YWxQb2xpY3kuUkVUQUlOYC4gVGhpcyB3YXkgdGhlIGxvZ3MgY2FuIHN0aWxsIGJlIHZpZXdlZCwgYW5kIHlvdSBjYW4gc2VlIHdoeSB0aGUgYnVpbGQgZmFpbGVkLlxuICAgKlxuICAgKiBXZSB0cnkgdG8gbm90IGxlYXZlIGFueXRoaW5nIGJlaGluZCB3aGVuIHJlbW92ZWQuIEJ1dCBzb21ldGltZXMgYSBsb2cgc3RheWluZyBiZWhpbmQgaXMgdXNlZnVsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xuXG4gIC8qKlxuICAgKiBJbnN0YWxsIERvY2tlciBpbnNpZGUgdGhlIGltYWdlLCBzbyBpdCBjYW4gYmUgdXNlZCBieSB0aGUgcnVubmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsRG9ja2VyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBBTUkgYnVpbGRlciB0aGF0IHVzZXMgQVdTIEltYWdlIEJ1aWxkZXIgdG8gYnVpbGQgQU1JcyBwcmUtYmFrZWQgd2l0aCBhbGwgdGhlIEdpdEh1YiBBY3Rpb25zIHJ1bm5lciByZXF1aXJlbWVudHMuIEJ1aWxkZXJzIGNhbiBiZSB1c2VkIHdpdGgge0BsaW5rIEVjMlJ1bm5lcn0uXG4gKlxuICogRWFjaCBidWlsZGVyIHJlLXJ1bnMgYXV0b21hdGljYWxseSBhdCBhIHNldCBpbnRlcnZhbCB0byBtYWtlIHN1cmUgdGhlIEFNSXMgY29udGFpbiB0aGUgbGF0ZXN0IHZlcnNpb25zIG9mIGV2ZXJ5dGhpbmcuXG4gKlxuICogWW91IGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjb25zdHJ1Y3QgdG8gY3VzdG9taXplIHRoZSBBTUkgdXNlZCB0byBzcGluLXVwIHJ1bm5lcnMuIFNvbWUgcnVubmVyIHByb3ZpZGVycyBtYXkgcmVxdWlyZSBjdXN0b20gY29tcG9uZW50cy4gQ2hlY2sgdGhlIHJ1bm5lciBwcm92aWRlciBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEZvciBleGFtcGxlLCB0byBzZXQgYSBzcGVjaWZpYyBydW5uZXIgdmVyc2lvbiwgcmVidWlsZCB0aGUgaW1hZ2UgZXZlcnkgMiB3ZWVrcywgYW5kIGFkZCBhIGZldyBwYWNrYWdlcyBmb3IgdGhlIEVDMiBwcm92aWRlciwgdXNlOlxuICpcbiAqIGBgYFxuICogY29uc3QgYnVpbGRlciA9IG5ldyBBbWlCdWlsZGVyKHRoaXMsICdCdWlsZGVyJywge1xuICogICAgIHJ1bm5lclZlcnNpb246IFJ1bm5lclZlcnNpb24uc3BlY2lmaWMoJzIuMjkzLjAnKSxcbiAqICAgICByZWJ1aWxkSW50ZXJ2YWw6IER1cmF0aW9uLmRheXMoMTQpLFxuICogfSk7XG4gKiBidWlsZGVyLmFkZENvbXBvbmVudChuZXcgSW1hZ2VCdWlsZGVyQ29tcG9uZW50KHNjb3BlLCBpZCwge1xuICogICBwbGF0Zm9ybTogJ0xpbnV4JyxcbiAqICAgZGlzcGxheU5hbWU6ICdwN3ppcCcsXG4gKiAgIGRlc2NyaXB0aW9uOiAnSW5zdGFsbCBzb21lIG1vcmUgcGFja2FnZXMnLFxuICogICBjb21tYW5kczogW1xuICogICAgICdhcHQtZ2V0IGluc3RhbGwgcDd6aXAnLFxuICogICBdLFxuICogfSkpO1xuICogbmV3IEVjMlJ1bm5lcih0aGlzLCAnRUMyIHByb3ZpZGVyJywge1xuICogICAgIGxhYmVsOiAnY3VzdG9tLWVjMicsXG4gKiAgICAgYW1pQnVpbGRlcjogYnVpbGRlcixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGRlcHJlY2F0ZWQgdXNlIFJ1bm5lckltYWdlQnVpbGRlclxuICovXG5leHBvcnQgY2xhc3MgQW1pQnVpbGRlciBleHRlbmRzIEltYWdlQnVpbGRlckJhc2Uge1xuICBwcml2YXRlIGJvdW5kQW1pPzogUnVubmVyQW1pO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogQW1pQnVpbGRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBvczogcHJvcHM/Lm9zLFxuICAgICAgc3VwcG9ydGVkT3M6IFtPcy5MSU5VWCwgT3MuTElOVVhfVUJVTlRVLCBPcy5MSU5VWF9BTUFaT05fMiwgT3MuV0lORE9XU10sXG4gICAgICBhcmNoaXRlY3R1cmU6IHByb3BzPy5hcmNoaXRlY3R1cmUsXG4gICAgICBzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzOiBbQXJjaGl0ZWN0dXJlLlg4Nl82NCwgQXJjaGl0ZWN0dXJlLkFSTTY0XSxcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHM/Lmluc3RhbmNlVHlwZSxcbiAgICAgIHZwYzogcHJvcHM/LnZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBwcm9wcz8uc2VjdXJpdHlHcm91cCA/IFtwcm9wcy5zZWN1cml0eUdyb3VwXSA6IHByb3BzPy5zZWN1cml0eUdyb3VwcyxcbiAgICAgIHN1Ym5ldFNlbGVjdGlvbjogcHJvcHM/LnN1Ym5ldFNlbGVjdGlvbixcbiAgICAgIGxvZ1JlbW92YWxQb2xpY3k6IHByb3BzPy5sb2dSZW1vdmFsUG9saWN5LFxuICAgICAgbG9nUmV0ZW50aW9uOiBwcm9wcz8ubG9nUmV0ZW50aW9uLFxuICAgICAgcnVubmVyVmVyc2lvbjogcHJvcHM/LnJ1bm5lclZlcnNpb24sXG4gICAgICByZWJ1aWxkSW50ZXJ2YWw6IHByb3BzPy5yZWJ1aWxkSW50ZXJ2YWwsXG4gICAgICBpbWFnZVR5cGVOYW1lOiAnQU1JJyxcbiAgICB9KTtcblxuICAgIC8vIGFkZCBhbGwgYmFzaWMgY29tcG9uZW50c1xuICAgIGlmICh0aGlzLm9zLmlzKE9zLldJTkRPV1MpKSB7XG4gICAgICB0aGlzLmFkZEJhc2VXaW5kb3dzQ29tcG9uZW50cyhwcm9wcz8uaW5zdGFsbERvY2tlciA/PyB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3MuaXMoT3MuTElOVVgpIHx8IHRoaXMub3MuaXMoT3MuTElOVVhfVUJVTlRVKSkge1xuICAgICAgdGhpcy5hZGRCYXNlTGludXhDb21wb25lbnRzKHByb3BzPy5pbnN0YWxsRG9ja2VyID8/IHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIE9TIGZvciBBTUkgYnVpbGRlcjogJHt0aGlzLm9zLm5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRCYXNlV2luZG93c0NvbXBvbmVudHMoaW5zdGFsbERvY2tlcjogYm9vbGVhbikge1xuICAgIHRoaXMuYWRkQ29tcG9uZW50KFdpbmRvd3NDb21wb25lbnRzLmNsb3Vkd2F0Y2hBZ2VudCh0aGlzLCAnQ2xvdWRXYXRjaCBhZ2VudCcpKTtcbiAgICB0aGlzLmFkZENvbXBvbmVudChXaW5kb3dzQ29tcG9uZW50cy5hd3NDbGkodGhpcywgJ0FXUyBDTEknKSk7XG4gICAgdGhpcy5hZGRDb21wb25lbnQoV2luZG93c0NvbXBvbmVudHMuZ2l0aHViQ2xpKHRoaXMsICdHaXRIdWIgQ0xJJykpO1xuICAgIHRoaXMuYWRkQ29tcG9uZW50KFdpbmRvd3NDb21wb25lbnRzLmdpdCh0aGlzLCAnZ2l0JykpO1xuICAgIHRoaXMuYWRkQ29tcG9uZW50KFdpbmRvd3NDb21wb25lbnRzLmdpdGh1YlJ1bm5lcih0aGlzLCAnR2l0SHViIEFjdGlvbnMgUnVubmVyJywgdGhpcy5ydW5uZXJWZXJzaW9uKSk7XG4gICAgaWYgKGluc3RhbGxEb2NrZXIpIHtcbiAgICAgIHRoaXMuYWRkQ29tcG9uZW50KFdpbmRvd3NDb21wb25lbnRzLmRvY2tlcih0aGlzLCAnRG9ja2VyJykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQmFzZUxpbnV4Q29tcG9uZW50cyhpbnN0YWxsRG9ja2VyOiBib29sZWFuKSB7XG4gICAgdGhpcy5hZGRDb21wb25lbnQoTGludXhVYnVudHVDb21wb25lbnRzLnJlcXVpcmVkUGFja2FnZXModGhpcywgJ1VwZ3JhZGUgcGFja2FnZXMgYW5kIGluc3RhbGwgYmFzaWNzJywgdGhpcy5hcmNoaXRlY3R1cmUpKTtcbiAgICB0aGlzLmFkZENvbXBvbmVudChMaW51eFVidW50dUNvbXBvbmVudHMucnVubmVyVXNlcih0aGlzLCAnVXNlcicsIHRoaXMuYXJjaGl0ZWN0dXJlKSk7XG4gICAgdGhpcy5hZGRDb21wb25lbnQoTGludXhVYnVudHVDb21wb25lbnRzLmF3c0NsaSh0aGlzLCAnQVdTIENMSScsIHRoaXMuYXJjaGl0ZWN0dXJlKSk7XG4gICAgdGhpcy5hZGRDb21wb25lbnQoTGludXhVYnVudHVDb21wb25lbnRzLmdpdGh1YkNsaSh0aGlzLCAnR2l0SHViIENMSScsIHRoaXMuYXJjaGl0ZWN0dXJlKSk7XG4gICAgdGhpcy5hZGRDb21wb25lbnQoTGludXhVYnVudHVDb21wb25lbnRzLmdpdCh0aGlzLCAnZ2l0JywgdGhpcy5hcmNoaXRlY3R1cmUpKTtcbiAgICB0aGlzLmFkZENvbXBvbmVudChMaW51eFVidW50dUNvbXBvbmVudHMuZ2l0aHViUnVubmVyKHRoaXMsICdHaXRIdWIgQWN0aW9ucyBSdW5uZXInLCB0aGlzLnJ1bm5lclZlcnNpb24sIHRoaXMuYXJjaGl0ZWN0dXJlKSk7XG4gICAgaWYgKGluc3RhbGxEb2NrZXIpIHtcbiAgICAgIHRoaXMuYWRkQ29tcG9uZW50KExpbnV4VWJ1bnR1Q29tcG9uZW50cy5kb2NrZXIodGhpcywgJ0RvY2tlcicsIHRoaXMuYXJjaGl0ZWN0dXJlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbXBvbmVudCB0byBiZSBpbnN0YWxsZWQgYmVmb3JlIGFueSBvdGhlciBjb21wb25lbnRzLiBVc2VmdWwgZm9yIHJlcXVpcmVkIHN5c3RlbSBzZXR0aW5ncyBsaWtlIGNlcnRpZmljYXRlcyBvciBwcm94eSBzZXR0aW5ncy5cbiAgICogQHBhcmFtIGNvbXBvbmVudFxuICAgKi9cbiAgcHJlcGVuZENvbXBvbmVudChjb21wb25lbnQ6IEltYWdlQnVpbGRlckNvbXBvbmVudCkge1xuICAgIGlmICh0aGlzLmJvdW5kQW1pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FNSSBpcyBhbHJlYWR5IGJvdW5kLiBVc2UgdGhpcyBtZXRob2QgYmVmb3JlIHBhc3NpbmcgdGhlIGJ1aWxkZXIgdG8gYSBydW5uZXIgcHJvdmlkZXIuJyk7XG4gICAgfVxuICAgIGlmIChjb21wb25lbnQucGxhdGZvcm0gIT0gdGhpcy5wbGF0Zm9ybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgcGxhdGZvcm0gZG9lc25cXCd0IG1hdGNoIGJ1aWxkZXIgcGxhdGZvcm0nKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb25lbnRzID0gW2NvbXBvbmVudF0uY29uY2F0KHRoaXMuY29tcG9uZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29tcG9uZW50IHRvIGJlIGluc3RhbGxlZC5cbiAgICogQHBhcmFtIGNvbXBvbmVudFxuICAgKi9cbiAgYWRkQ29tcG9uZW50KGNvbXBvbmVudDogSW1hZ2VCdWlsZGVyQ29tcG9uZW50KSB7XG4gICAgaWYgKHRoaXMuYm91bmRBbWkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQU1JIGlzIGFscmVhZHkgYm91bmQuIFVzZSB0aGlzIG1ldGhvZCBiZWZvcmUgcGFzc2luZyB0aGUgYnVpbGRlciB0byBhIHJ1bm5lciBwcm92aWRlci4nKTtcbiAgICB9XG4gICAgaWYgKGNvbXBvbmVudC5wbGF0Zm9ybSAhPSB0aGlzLnBsYXRmb3JtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCBwbGF0Zm9ybSBkb2VzblxcJ3QgbWF0Y2ggYnVpbGRlciBwbGF0Zm9ybScpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBleHRyYSB0cnVzdGVkIGNlcnRpZmljYXRlcy4gVGhpcyBoZWxwcyBkZWFsIHdpdGggc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzIGZvciBHaXRIdWIgRW50ZXJwcmlzZSBTZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIHBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBmaWxlIGNhbGxlZCBjZXJ0cy5wZW0gY29udGFpbmluZyBhbGwgdGhlIHJlcXVpcmVkIGNlcnRpZmljYXRlc1xuICAgKi9cbiAgcHVibGljIGFkZEV4dHJhQ2VydGlmaWNhdGVzKHBhdGg6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtID09ICdMaW51eCcpIHtcbiAgICAgIHRoaXMucHJlcGVuZENvbXBvbmVudChMaW51eFVidW50dUNvbXBvbmVudHMuZXh0cmFDZXJ0aWZpY2F0ZXModGhpcywgJ0V4dHJhIENlcnRzJywgcGF0aCkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wbGF0Zm9ybSA9PSAnV2luZG93cycpIHtcbiAgICAgIHRoaXMucHJlcGVuZENvbXBvbmVudChXaW5kb3dzQ29tcG9uZW50cy5leHRyYUNlcnRpZmljYXRlcyh0aGlzLCAnRXh0cmEgQ2VydHMnLCBwYXRoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwbGF0Zm9ybTogJHt0aGlzLnBsYXRmb3JtfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgSVJ1bm5lclByb3ZpZGVyIHRvIGZpbmFsaXplIHNldHRpbmdzIGFuZCBjcmVhdGUgdGhlIEFNSSBidWlsZGVyLlxuICAgKi9cbiAgYmluZEFtaSgpOiBSdW5uZXJBbWkge1xuICAgIGlmICh0aGlzLmJvdW5kQW1pKSB7XG4gICAgICByZXR1cm4gdGhpcy5ib3VuZEFtaTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXVuY2hUZW1wbGF0ZSA9IG5ldyBlYzIuTGF1bmNoVGVtcGxhdGUodGhpcywgJ0xhdW5jaCB0ZW1wbGF0ZScsIHtcbiAgICAgIHJlcXVpcmVJbWRzdjI6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGFja05hbWUgPSBjZGsuU3RhY2sub2YodGhpcykuc3RhY2tOYW1lO1xuICAgIGNvbnN0IGJ1aWxkZXJOYW1lID0gdGhpcy5ub2RlLnBhdGg7XG5cbiAgICBjb25zdCBkaXN0ID0gbmV3IGltYWdlYnVpbGRlci5DZm5EaXN0cmlidXRpb25Db25maWd1cmF0aW9uKHRoaXMsICdEaXN0cmlidXRpb24nLCB7XG4gICAgICBuYW1lOiB1bmlxdWVJbWFnZUJ1aWxkZXJOYW1lKHRoaXMpLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBkaXN0cmlidXRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByZWdpb246IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbixcbiAgICAgICAgICBhbWlEaXN0cmlidXRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICBOYW1lOiBgJHtjZGsuTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgICAgICAgICAgbWF4TGVuZ3RoOiAxMDAsXG4gICAgICAgICAgICAgIHNlcGFyYXRvcjogJy0nLFxuICAgICAgICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICdfLScsXG4gICAgICAgICAgICB9KX0te3sgaW1hZ2VidWlsZGVyOmJ1aWxkRGF0ZSB9fWAsXG4gICAgICAgICAgICBBbWlUYWdzOiB7XG4gICAgICAgICAgICAgICdOYW1lJzogdGhpcy5ub2RlLmlkLFxuICAgICAgICAgICAgICAnR2l0SHViUnVubmVyczpTdGFjayc6IHN0YWNrTmFtZSxcbiAgICAgICAgICAgICAgJ0dpdEh1YlJ1bm5lcnM6QnVpbGRlcic6IGJ1aWxkZXJOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxhdW5jaFRlbXBsYXRlQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGF1bmNoVGVtcGxhdGVJZDogbGF1bmNoVGVtcGxhdGUubGF1bmNoVGVtcGxhdGVJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZWNpcGUgPSBuZXcgQW1pUmVjaXBlKHRoaXMsICdBbWkgUmVjaXBlJywge1xuICAgICAgcGxhdGZvcm06IHRoaXMucGxhdGZvcm0sXG4gICAgICBjb21wb25lbnRzOiB0aGlzLmNvbXBvbmVudHMsXG4gICAgICBhcmNoaXRlY3R1cmU6IHRoaXMuYXJjaGl0ZWN0dXJlLFxuICAgICAgYmFzZUFtaTogZGVmYXVsdEJhc2VBbWkodGhpcywgdGhpcy5vcywgdGhpcy5hcmNoaXRlY3R1cmUpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbG9nID0gdGhpcy5jcmVhdGVMb2cocmVjaXBlLm5hbWUpO1xuICAgIGNvbnN0IGluZnJhID0gdGhpcy5jcmVhdGVJbmZyYXN0cnVjdHVyZShbXG4gICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ0FtYXpvblNTTU1hbmFnZWRJbnN0YW5jZUNvcmUnKSxcbiAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnRUMySW5zdGFuY2VQcm9maWxlRm9ySW1hZ2VCdWlsZGVyJyksXG4gICAgXSk7XG4gICAgdGhpcy5jcmVhdGVJbWFnZShpbmZyYSwgZGlzdCwgbG9nLCByZWNpcGUuYXJuLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuY3JlYXRlUGlwZWxpbmUoaW5mcmEsIGRpc3QsIGxvZywgcmVjaXBlLmFybiwgdW5kZWZpbmVkKTtcblxuICAgIHRoaXMuYm91bmRBbWkgPSB7XG4gICAgICBsYXVuY2hUZW1wbGF0ZTogbGF1bmNoVGVtcGxhdGUsXG4gICAgICBhcmNoaXRlY3R1cmU6IHRoaXMuYXJjaGl0ZWN0dXJlLFxuICAgICAgb3M6IHRoaXMub3MsXG4gICAgICBsb2dHcm91cDogbG9nLFxuICAgICAgcnVubmVyVmVyc2lvbjogdGhpcy5ydW5uZXJWZXJzaW9uLFxuICAgIH07XG5cbiAgICB0aGlzLmltYWdlQ2xlYW5lcihsYXVuY2hUZW1wbGF0ZSwgc3RhY2tOYW1lLCBidWlsZGVyTmFtZSk7XG5cbiAgICByZXR1cm4gdGhpcy5ib3VuZEFtaTtcbiAgfVxuXG4gIHByaXZhdGUgaW1hZ2VDbGVhbmVyKGxhdW5jaFRlbXBsYXRlOiBlYzIuTGF1bmNoVGVtcGxhdGUsIHN0YWNrTmFtZTogc3RyaW5nLCBidWlsZGVyTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZGVsZXRlciA9IHNpbmdsZXRvbkxhbWJkYShEZWxldGVBbWlGdW5jdGlvbiwgdGhpcywgJ2RlbGV0ZS1hbWknLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0RlbGV0ZSBvbGQgR2l0SHViIFJ1bm5lciBBTUlzJyxcbiAgICAgIGluaXRpYWxQb2xpY3k6IFtcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFsnZWMyOkRlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucycsICdlYzI6RGVzY3JpYmVJbWFnZXMnLCAnZWMyOkRlcmVnaXN0ZXJJbWFnZScsICdlYzI6RGVsZXRlU25hcHNob3QnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICB9KTtcblxuICAgIC8vIGRlbGV0ZSBvbGQgQU1JcyBvbiBzY2hlZHVsZVxuICAgIGNvbnN0IGV2ZW50UnVsZSA9IG5ldyBldmVudHMuUnVsZSh0aGlzLCAnRGVsZXRlIEFNSSBTY2hlZHVsZScsIHtcbiAgICAgIHNjaGVkdWxlOiBldmVudHMuU2NoZWR1bGUucmF0ZShjZGsuRHVyYXRpb24uZGF5cygxKSksXG4gICAgICBkZXNjcmlwdGlvbjogYERlbGV0ZSBvbGQgQU1JcyBmb3IgJHtidWlsZGVyTmFtZX1gLFxuICAgIH0pO1xuICAgIGV2ZW50UnVsZS5hZGRUYXJnZXQobmV3IGV2ZW50c190YXJnZXRzLkxhbWJkYUZ1bmN0aW9uKGRlbGV0ZXIsIHtcbiAgICAgIGV2ZW50OiBldmVudHMuUnVsZVRhcmdldElucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICBSZXF1ZXN0VHlwZTogJ1NjaGVkdWxlZCcsXG4gICAgICAgIExhdW5jaFRlbXBsYXRlSWQ6IGxhdW5jaFRlbXBsYXRlLmxhdW5jaFRlbXBsYXRlSWQsXG4gICAgICAgIFN0YWNrTmFtZTogc3RhY2tOYW1lLFxuICAgICAgICBCdWlsZGVyTmFtZTogYnVpbGRlck5hbWUsXG4gICAgICB9KSxcbiAgICB9KSk7XG5cbiAgICAvLyBkZWxldGUgYWxsIEFNSXMgd2hlbiB0aGlzIGNvbnN0cnVjdCBpcyByZW1vdmVkXG4gICAgbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdBTUkgRGVsZXRlcicsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogZGVsZXRlci5mdW5jdGlvbkFybixcbiAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6QW1pRGVsZXRlcicsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFN0YWNrTmFtZTogc3RhY2tOYW1lLFxuICAgICAgICBCdWlsZGVyTmFtZTogYnVpbGRlck5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYmluZERvY2tlckltYWdlKCk6IFJ1bm5lckltYWdlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FtaUJ1aWxkZXIgY2Fubm90IGJlIHVzZWQgdG8gYnVpbGQgRG9ja2VyIGltYWdlcycpO1xuICB9XG59XG4iXX0=
@@ -1,6 +1,6 @@
1
1
  import { aws_ec2 as ec2, aws_iam as iam, aws_imagebuilder as imagebuilder, aws_logs as logs } from 'aws-cdk-lib';
2
2
  import { Construct } from 'constructs';
3
- import { Architecture, Os, RunnerAmi, RunnerImage, RunnerVersion } from '../../../common';
3
+ import { Architecture, Os, RunnerAmi, RunnerImage, RunnerVersion } from '../../../providers/common';
4
4
  import { ImageBuilderBaseProps, IRunnerImageBuilder } from '../../common';
5
5
  import { ImageBuilderComponent } from '../builder';
6
6
  /**