@cloudsnorkel/cdk-github-runners 0.8.1 → 0.8.3

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 (96) hide show
  1. package/.gitattributes +9 -0
  2. package/.jsii +447 -263
  3. package/API.md +1714 -500
  4. package/README.md +20 -3
  5. package/{lib/providers/docker-images/lambda/linux-x64 → assets/docker-images/lambda/linux-arm64}/runner.sh +6 -0
  6. package/{lib/providers/docker-images/lambda/linux-arm64 → assets/docker-images/lambda/linux-x64}/runner.sh +6 -0
  7. package/{lib/lambdas/aws-image-builder-versioner → assets/lambdas/aws-image-builder-versioner.lambda}/index.js +5 -5
  8. package/{lib/lambdas/build-image → assets/lambdas/build-image.lambda}/index.js +5 -5
  9. package/{lib/lambdas/delete-ami → assets/lambdas/delete-ami.lambda}/index.js +2 -2
  10. package/{lib/lambdas/delete-runner → assets/lambdas/delete-runner.lambda}/index.js +1 -1
  11. package/{lib/lambdas/setup → assets/lambdas/setup.lambda}/index.js +2 -2
  12. package/{lib/lambdas/status → assets/lambdas/status.lambda}/index.js +2 -2
  13. package/{lib/lambdas/token-retriever → assets/lambdas/token-retriever.lambda}/index.js +1 -1
  14. package/{lib/lambdas/update-lambda → assets/lambdas/update-lambda.lambda}/index.js +4 -4
  15. package/{lib/lambdas/webhook-handler → assets/lambdas/webhook-handler.lambda}/index.js +2 -2
  16. package/lib/lambdas/aws-image-builder-versioner-function.d.ts +13 -0
  17. package/lib/lambdas/aws-image-builder-versioner-function.js +23 -0
  18. package/lib/lambdas/aws-image-builder-versioner.lambda.d.ts +2 -0
  19. package/lib/lambdas/aws-image-builder-versioner.lambda.js +80 -0
  20. package/lib/lambdas/build-image-function.d.ts +13 -0
  21. package/lib/lambdas/build-image-function.js +23 -0
  22. package/lib/lambdas/build-image.lambda.d.ts +2 -0
  23. package/lib/lambdas/build-image.lambda.js +92 -0
  24. package/lib/lambdas/delete-ami-function.d.ts +13 -0
  25. package/lib/lambdas/delete-ami-function.js +23 -0
  26. package/lib/lambdas/delete-ami.lambda.d.ts +1 -0
  27. package/lib/lambdas/delete-ami.lambda.js +87 -0
  28. package/lib/lambdas/delete-runner-function.d.ts +13 -0
  29. package/lib/lambdas/delete-runner-function.js +23 -0
  30. package/lib/lambdas/delete-runner.lambda.d.ts +1 -0
  31. package/lib/lambdas/delete-runner.lambda.js +69 -0
  32. package/lib/lambdas/github.d.ts +7 -0
  33. package/lib/lambdas/github.js +50 -0
  34. package/lib/lambdas/helpers.d.ts +12 -0
  35. package/lib/lambdas/helpers.js +66 -0
  36. package/lib/lambdas/setup-function.d.ts +13 -0
  37. package/lib/lambdas/setup-function.js +23 -0
  38. package/lib/lambdas/setup.lambda.d.ts +1 -0
  39. package/lib/lambdas/setup.lambda.js +148 -0
  40. package/lib/lambdas/status-function.d.ts +13 -0
  41. package/lib/lambdas/status-function.js +23 -0
  42. package/lib/lambdas/status.lambda.d.ts +1 -0
  43. package/lib/lambdas/status.lambda.js +285 -0
  44. package/lib/lambdas/token-retriever-function.d.ts +13 -0
  45. package/lib/lambdas/token-retriever-function.js +23 -0
  46. package/lib/lambdas/token-retriever.lambda.d.ts +1 -0
  47. package/lib/lambdas/token-retriever.lambda.js +15 -0
  48. package/lib/lambdas/update-lambda-function.d.ts +13 -0
  49. package/lib/lambdas/update-lambda-function.js +23 -0
  50. package/lib/lambdas/update-lambda.lambda.d.ts +7 -0
  51. package/lib/lambdas/update-lambda.lambda.js +34 -0
  52. package/lib/lambdas/webhook-handler-function.d.ts +13 -0
  53. package/lib/lambdas/webhook-handler-function.js +23 -0
  54. package/lib/lambdas/webhook-handler.lambda.d.ts +1 -0
  55. package/lib/lambdas/webhook-handler.lambda.js +107 -0
  56. package/lib/providers/codebuild.d.ts +10 -3
  57. package/lib/providers/codebuild.js +17 -9
  58. package/lib/providers/common.js +3 -3
  59. package/lib/providers/ec2.d.ts +11 -4
  60. package/lib/providers/ec2.js +14 -6
  61. package/lib/providers/fargate.d.ts +10 -3
  62. package/lib/providers/fargate.js +17 -9
  63. package/lib/providers/image-builders/ami.js +6 -3
  64. package/lib/providers/image-builders/codebuild.js +5 -3
  65. package/lib/providers/image-builders/common.js +5 -3
  66. package/lib/providers/image-builders/container.js +5 -3
  67. package/lib/providers/image-builders/linux-components.js +1 -1
  68. package/lib/providers/image-builders/static.js +3 -3
  69. package/lib/providers/image-builders/windows-components.js +1 -1
  70. package/lib/providers/lambda.d.ts +10 -3
  71. package/lib/providers/lambda.js +20 -10
  72. package/lib/runner.js +17 -10
  73. package/lib/secrets.js +1 -1
  74. package/lib/utils.d.ts +2 -6
  75. package/lib/utils.js +11 -26
  76. package/lib/webhook.d.ts +2 -2
  77. package/lib/webhook.js +5 -3
  78. package/package.json +29 -13
  79. package/setup/index.html +0 -12
  80. package/setup/src/App.svelte +0 -291
  81. package/setup/src/app.scss +0 -15
  82. package/setup/src/main.ts +0 -8
  83. package/setup/src/vite-env.d.ts +0 -2
  84. package/setup/svelte.config.mjs +0 -7
  85. package/setup/tsconfig.json +0 -21
  86. package/setup/tsconfig.node.json +0 -8
  87. package/setup/vite.config.ts +0 -15
  88. /package/{lib/providers → assets}/docker-images/codebuild/linux-arm64/Dockerfile +0 -0
  89. /package/{lib/providers → assets}/docker-images/codebuild/linux-x64/Dockerfile +0 -0
  90. /package/{lib/providers → assets}/docker-images/fargate/linux-arm64/Dockerfile +0 -0
  91. /package/{lib/providers → assets}/docker-images/fargate/linux-x64/Dockerfile +0 -0
  92. /package/{lib/providers → assets}/docker-images/lambda/linux-arm64/Dockerfile +0 -0
  93. /package/{lib/providers → assets}/docker-images/lambda/linux-arm64/runner.js +0 -0
  94. /package/{lib/providers → assets}/docker-images/lambda/linux-x64/Dockerfile +0 -0
  95. /package/{lib/providers → assets}/docker-images/lambda/linux-x64/runner.js +0 -0
  96. /package/{lib/lambdas/setup → assets/lambdas/setup.lambda}/index.html +0 -0
package/README.md CHANGED
@@ -124,7 +124,7 @@ const myBuilder = new CodeBuildImageBuilder(this, 'image builder', {
124
124
  });
125
125
  myBuilder.setBuildArg('EXTRA_PACKAGES', 'nginx xz-utils');
126
126
 
127
- const myProvider = new FargateRunner(this, 'fargate runner', {
127
+ const myProvider = new FargateRunnerProvider(this, 'fargate runner', {
128
128
  label: 'customized-fargate',
129
129
  vpc: vpc,
130
130
  securityGroup: runnerSg,
@@ -171,11 +171,11 @@ myWindowsBuilder.addComponent(new ImageBuilderComponent(this, 'Ninja Component',
171
171
  }
172
172
  ));
173
173
 
174
- const myProvider = new FargateRunner(this, 'fargate runner', {
174
+ const myProvider = new FargateRunnerProvider(this, 'fargate runner', {
175
175
  label: 'customized-windows-fargate',
176
176
  vpc: vpc,
177
177
  securityGroup: runnerSg,
178
- imageBuiler: myWindowsBuilder,
178
+ imageBuidler: myWindowsBuilder,
179
179
  });
180
180
 
181
181
  // create the runner infrastructure
@@ -184,6 +184,23 @@ new GitHubRunners(stack, 'runners', {
184
184
  });
185
185
  ```
186
186
 
187
+ The runner OS and architecture is determined by the image it is set to use. For example, to create a CodeBuild runner provider for ARM64 set the `architecture` property for the image builder to `Architecture.ARM64` and use the `LINUX_ARM64_DOCKERFILE_PATH` constant.
188
+
189
+ ```typescript
190
+ new GitHubRunners(stack, 'runners', {
191
+ providers: [
192
+ new FargateRunnerProvider(this, 'fargate runner', {
193
+ labels: ['arm64', 'fargate'],
194
+ imageBuidler: new CodeBuildImageBuilder(this, 'image builder', {
195
+ architecture: Architecture.ARM64,
196
+ os: Os.LINUX,
197
+ dockerfilePath: FargateRunner.LINUX_ARM64_DOCKERFILE_PATH,
198
+ }),
199
+ }),
200
+ ],
201
+ });
202
+ ```
203
+
187
204
  ## Architecture
188
205
 
189
206
  ![Architecture diagram](architecture.svg)
@@ -2,16 +2,22 @@
2
2
 
3
3
  set -e -u -o pipefail
4
4
 
5
+ # cleanup
6
+ find /tmp -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;
7
+ # copy runner code (it needs a writable directory)
5
8
  cp -r /runner /tmp/
6
9
  cd /tmp/runner
10
+ # setup home directory
7
11
  mkdir /tmp/home
8
12
  export HOME=/tmp/home
9
13
 
14
+ # start runner
10
15
  if [ "${RUNNER_VERSION}" = "latest" ]; then RUNNER_FLAGS=""; else RUNNER_FLAGS="--disableupdate"; fi
11
16
  ./config.sh --unattended --url "https://${GITHUB_DOMAIN}/${OWNER}/${REPO}" --token "${RUNNER_TOKEN}" --ephemeral --work _work --labels "${RUNNER_LABEL}" --name "${RUNNER_NAME}" ${RUNNER_FLAGS}
12
17
  echo Config done
13
18
  ./run.sh
14
19
  echo Run done
15
20
 
21
+ # print status for metrics
16
22
  STATUS=$(grep -Phors "finish job request for job [0-9a-f\-]+ with result: \K.*" _diag/ | tail -n1)
17
23
  [ -n "$STATUS" ] && echo CDKGHA JOB DONE "$RUNNER_LABEL" "$STATUS"
@@ -2,16 +2,22 @@
2
2
 
3
3
  set -e -u -o pipefail
4
4
 
5
+ # cleanup
6
+ find /tmp -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;
7
+ # copy runner code (it needs a writable directory)
5
8
  cp -r /runner /tmp/
6
9
  cd /tmp/runner
10
+ # setup home directory
7
11
  mkdir /tmp/home
8
12
  export HOME=/tmp/home
9
13
 
14
+ # start runner
10
15
  if [ "${RUNNER_VERSION}" = "latest" ]; then RUNNER_FLAGS=""; else RUNNER_FLAGS="--disableupdate"; fi
11
16
  ./config.sh --unattended --url "https://${GITHUB_DOMAIN}/${OWNER}/${REPO}" --token "${RUNNER_TOKEN}" --ephemeral --work _work --labels "${RUNNER_LABEL}" --name "${RUNNER_NAME}" ${RUNNER_FLAGS}
12
17
  echo Config done
13
18
  ./run.sh
14
19
  echo Run done
15
20
 
21
+ # print status for metrics
16
22
  STATUS=$(grep -Phors "finish job request for job [0-9a-f\-]+ with result: \K.*" _diag/ | tail -n1)
17
23
  [ -n "$STATUS" ] && echo CDKGHA JOB DONE "$RUNNER_LABEL" "$STATUS"
@@ -2392,12 +2392,12 @@ var require_semver2 = __commonJS({
2392
2392
  }
2393
2393
  });
2394
2394
 
2395
- // src/lambdas/aws-image-builder-versioner/index.ts
2396
- var aws_image_builder_versioner_exports = {};
2397
- __export(aws_image_builder_versioner_exports, {
2395
+ // src/lambdas/aws-image-builder-versioner.lambda.ts
2396
+ var aws_image_builder_versioner_lambda_exports = {};
2397
+ __export(aws_image_builder_versioner_lambda_exports, {
2398
2398
  handler: () => handler
2399
2399
  });
2400
- module.exports = __toCommonJS(aws_image_builder_versioner_exports);
2400
+ module.exports = __toCommonJS(aws_image_builder_versioner_lambda_exports);
2401
2401
  var AWS2 = __toESM(require("aws-sdk"));
2402
2402
  var import_semver = __toESM(require_semver2());
2403
2403
 
@@ -2438,7 +2438,7 @@ async function customResourceRespond(event, responseStatus, reason, physicalReso
2438
2438
  });
2439
2439
  }
2440
2440
 
2441
- // src/lambdas/aws-image-builder-versioner/index.ts
2441
+ // src/lambdas/aws-image-builder-versioner.lambda.ts
2442
2442
  var ib = new AWS2.Imagebuilder();
2443
2443
  async function handler(event, context) {
2444
2444
  console.log(JSON.stringify({ ...event, ResponseURL: "..." }));
@@ -27,12 +27,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
 
30
- // src/lambdas/build-image/index.ts
31
- var build_image_exports = {};
32
- __export(build_image_exports, {
30
+ // src/lambdas/build-image.lambda.ts
31
+ var build_image_lambda_exports = {};
32
+ __export(build_image_lambda_exports, {
33
33
  handler: () => handler
34
34
  });
35
- module.exports = __toCommonJS(build_image_exports);
35
+ module.exports = __toCommonJS(build_image_lambda_exports);
36
36
  var AWS2 = __toESM(require("aws-sdk"));
37
37
 
38
38
  // src/lambdas/helpers.ts
@@ -72,7 +72,7 @@ async function customResourceRespond(event, responseStatus, reason, physicalReso
72
72
  });
73
73
  }
74
74
 
75
- // src/lambdas/build-image/index.ts
75
+ // src/lambdas/build-image.lambda.ts
76
76
  var codebuild = new AWS2.CodeBuild();
77
77
  var ecr = new AWS2.ECR();
78
78
  var ib = new AWS2.Imagebuilder();
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  mod
23
23
  ));
24
24
 
25
- // src/lambdas/delete-ami/index.ts
25
+ // src/lambdas/delete-ami.lambda.ts
26
26
  var AWS2 = __toESM(require("aws-sdk"));
27
27
 
28
28
  // src/lambdas/helpers.ts
@@ -62,7 +62,7 @@ async function customResourceRespond(event, responseStatus, reason, physicalReso
62
62
  });
63
63
  }
64
64
 
65
- // src/lambdas/delete-ami/index.ts
65
+ // src/lambdas/delete-ami.lambda.ts
66
66
  var ec2 = new AWS2.EC2();
67
67
  async function deleteAmis(launchTemplateId, stackName, builderName, deleteAll) {
68
68
  var _a;
@@ -22429,7 +22429,7 @@ async function getOctokit(installationId) {
22429
22429
  };
22430
22430
  }
22431
22431
 
22432
- // src/lambdas/delete-runner/index.ts
22432
+ // src/lambdas/delete-runner.lambda.ts
22433
22433
  async function getRunnerId(octokit, owner, repo, name, idleOnly) {
22434
22434
  let page = 1;
22435
22435
  while (true) {
@@ -9112,7 +9112,7 @@ var require_dist_node12 = __commonJS({
9112
9112
  }
9113
9113
  });
9114
9114
 
9115
- // src/lambdas/setup/index.ts
9115
+ // src/lambdas/setup.lambda.ts
9116
9116
  var crypto = __toESM(require("crypto"));
9117
9117
  var fs = __toESM(require("fs"));
9118
9118
  var import_rest = __toESM(require_dist_node12());
@@ -9148,7 +9148,7 @@ function baseUrlFromDomain(domain) {
9148
9148
  return `https://${domain}/api/v3`;
9149
9149
  }
9150
9150
 
9151
- // src/lambdas/setup/index.ts
9151
+ // src/lambdas/setup.lambda.ts
9152
9152
  var nonce = crypto.randomBytes(64).toString("hex");
9153
9153
  function getHtml(baseUrl, token, domain) {
9154
9154
  return fs.readFileSync("index.html", "utf-8").replace(/INSERT_WEBHOOK_URL_HERE/g, process.env.WEBHOOK_URL).replace(/INSERT_BASE_URL_HERE/g, baseUrl).replace(/INSERT_TOKEN_HERE/g, token).replace(/INSERT_SECRET_ARN_HERE/g, process.env.SETUP_SECRET_ARN).replace(/INSERT_DOMAIN_HERE/g, domain).replace(/<script/g, `<script nonce="${nonce}"`).replace(/<style/g, `<style nonce="${nonce}"`);
@@ -21094,7 +21094,7 @@ var require_dist_node27 = __commonJS({
21094
21094
  }
21095
21095
  });
21096
21096
 
21097
- // src/lambdas/status/index.ts
21097
+ // src/lambdas/status.lambda.ts
21098
21098
  var import_auth_app = __toESM(require_dist_node24());
21099
21099
  var import_core = __toESM(require_dist_node27());
21100
21100
  var AWS2 = __toESM(require("aws-sdk"));
@@ -21124,7 +21124,7 @@ function baseUrlFromDomain(domain) {
21124
21124
  return `https://${domain}/api/v3`;
21125
21125
  }
21126
21126
 
21127
- // src/lambdas/status/index.ts
21127
+ // src/lambdas/status.lambda.ts
21128
21128
  var cfn = new AWS2.CloudFormation();
21129
21129
  var ec2 = new AWS2.EC2();
21130
21130
  var ecr = new AWS2.ECR();
@@ -22429,7 +22429,7 @@ async function getOctokit(installationId) {
22429
22429
  };
22430
22430
  }
22431
22431
 
22432
- // src/lambdas/token-retriever/index.ts
22432
+ // src/lambdas/token-retriever.lambda.ts
22433
22433
  exports.handler = async function(event) {
22434
22434
  const { githubSecrets, octokit } = await getOctokit(event.installationId);
22435
22435
  const response = await octokit.rest.actions.createRegistrationTokenForRepo({
@@ -27,12 +27,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
 
30
- // src/lambdas/update-lambda/index.ts
31
- var update_lambda_exports = {};
32
- __export(update_lambda_exports, {
30
+ // src/lambdas/update-lambda.lambda.ts
31
+ var update_lambda_lambda_exports = {};
32
+ __export(update_lambda_lambda_exports, {
33
33
  handler: () => handler
34
34
  });
35
- module.exports = __toCommonJS(update_lambda_exports);
35
+ module.exports = __toCommonJS(update_lambda_lambda_exports);
36
36
  var AWS = __toESM(require("aws-sdk"));
37
37
  var lambda = new AWS.Lambda();
38
38
  function sleep(ms) {
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  mod
23
23
  ));
24
24
 
25
- // src/lambdas/webhook-handler/index.ts
25
+ // src/lambdas/webhook-handler.lambda.ts
26
26
  var crypto = __toESM(require("crypto"));
27
27
  var AWS2 = __toESM(require("aws-sdk"));
28
28
 
@@ -43,7 +43,7 @@ async function getSecretJsonValue(arn) {
43
43
  return JSON.parse(await getSecretValue(arn));
44
44
  }
45
45
 
46
- // src/lambdas/webhook-handler/index.ts
46
+ // src/lambdas/webhook-handler.lambda.ts
47
47
  var sf = new AWS2.StepFunctions();
48
48
  function verifyBody(event, secret) {
49
49
  const sig = Buffer.from(event.headers["x-hub-signature-256"] || "", "utf8");
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for AwsImageBuilderVersionerFunction
5
+ */
6
+ export interface AwsImageBuilderVersionerFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/lambdas/aws-image-builder-versioner.
10
+ */
11
+ export declare class AwsImageBuilderVersionerFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: AwsImageBuilderVersionerFunctionProps);
13
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AwsImageBuilderVersionerFunction = 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/lambdas/aws-image-builder-versioner.
9
+ */
10
+ class AwsImageBuilderVersionerFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/lambdas/aws-image-builder-versioner.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/aws-image-builder-versioner.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.AwsImageBuilderVersionerFunction = AwsImageBuilderVersionerFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWltYWdlLWJ1aWxkZXItdmVyc2lvbmVyLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYXMvYXdzLWltYWdlLWJ1aWxkZXItdmVyc2lvbmVyLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUE2RTtBQUM3RSw2QkFBNkI7QUFDN0IsaURBQWlEO0FBU2pEOztHQUVHO0FBQ0gsTUFBYSxnQ0FBaUMsU0FBUSxNQUFNLENBQUMsUUFBUTtJQUNuRSxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZDO1FBQ3JGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLG1EQUFtRDtZQUNoRSxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUN0RSxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUseURBQXlELENBQUMsQ0FBQztTQUM3RyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7Q0FDRjtBQVhELDRFQVdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy5qcyBhbmQgcnVuIFwibnB4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBBd3NJbWFnZUJ1aWxkZXJWZXJzaW9uZXJGdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF3c0ltYWdlQnVpbGRlclZlcnNpb25lckZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb25PcHRpb25zIHtcbn1cblxuLyoqXG4gKiBBbiBBV1MgTGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIHNyYy9sYW1iZGFzL2F3cy1pbWFnZS1idWlsZGVyLXZlcnNpb25lci5cbiAqL1xuZXhwb3J0IGNsYXNzIEF3c0ltYWdlQnVpbGRlclZlcnNpb25lckZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBBd3NJbWFnZUJ1aWxkZXJWZXJzaW9uZXJGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NyYy9sYW1iZGFzL2F3cy1pbWFnZS1idWlsZGVyLXZlcnNpb25lci5sYW1iZGEudHMnLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBydW50aW1lOiBuZXcgbGFtYmRhLlJ1bnRpbWUoJ25vZGVqczE0LngnLCBsYW1iZGEuUnVudGltZUZhbWlseS5OT0RFSlMpLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9hc3NldHMvbGFtYmRhcy9hd3MtaW1hZ2UtYnVpbGRlci12ZXJzaW9uZXIubGFtYmRhJykpLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoJ0FXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEJywgJzEnLCB7IHJlbW92ZUluRWRnZTogdHJ1ZSB9KTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,2 @@
1
+ import * as AWSLambda from 'aws-lambda';
2
+ export declare function handler(event: AWSLambda.CloudFormationCustomResourceEvent, context: AWSLambda.Context): Promise<void>;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handler = void 0;
4
+ /* eslint-disable import/no-extraneous-dependencies */
5
+ const AWS = require("aws-sdk");
6
+ const semver_1 = require("semver");
7
+ const helpers_1 = require("./helpers");
8
+ const ib = new AWS.Imagebuilder();
9
+ /* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */
10
+ async function handler(event, context) {
11
+ console.log(JSON.stringify({ ...event, ResponseURL: '...' }));
12
+ try {
13
+ const objectType = event.ResourceProperties.ObjectType;
14
+ const objectName = event.ResourceProperties.ObjectName;
15
+ switch (event.RequestType) {
16
+ case 'Create':
17
+ case 'Update':
18
+ let version = '1.0.0';
19
+ let allVersions = [];
20
+ try {
21
+ switch (objectType) {
22
+ case 'Component': {
23
+ const result = await ib.listComponents({
24
+ filters: [{
25
+ name: 'name',
26
+ values: [objectName],
27
+ }],
28
+ }).promise();
29
+ allVersions = result.componentVersionList.map(i => i.version || '1.0.0');
30
+ break;
31
+ }
32
+ case 'ImageRecipe': {
33
+ const result = await ib.listImageRecipes({
34
+ filters: [{
35
+ name: 'name',
36
+ values: [objectName],
37
+ }],
38
+ }).promise();
39
+ allVersions = result.imageRecipeSummaryList.map(i => i.arn?.split('/').pop() || '1.0.0');
40
+ break;
41
+ }
42
+ case 'ContainerRecipe': {
43
+ const result = await ib.listContainerRecipes({
44
+ filters: [{
45
+ name: 'name',
46
+ values: [objectName],
47
+ }],
48
+ }).promise();
49
+ allVersions = result.containerRecipeSummaryList.map(i => i.arn?.split('/').pop() || '1.0.0');
50
+ break;
51
+ }
52
+ }
53
+ }
54
+ catch (e) {
55
+ if (e.code !== 'ResourceNotFoundException') {
56
+ throw e;
57
+ }
58
+ }
59
+ version = semver_1.maxSatisfying(allVersions, '>=0.0.0');
60
+ if (version === null) {
61
+ version = '1.0.0';
62
+ }
63
+ version = semver_1.inc(version, 'patch');
64
+ if (version === null) {
65
+ throw new Error('Unable to bump version');
66
+ }
67
+ await helpers_1.customResourceRespond(event, 'SUCCESS', 'OK', version, {});
68
+ break;
69
+ case 'Delete':
70
+ await helpers_1.customResourceRespond(event, 'SUCCESS', 'OK', event.PhysicalResourceId, {});
71
+ break;
72
+ }
73
+ }
74
+ catch (e) {
75
+ console.log(e);
76
+ await helpers_1.customResourceRespond(event, 'FAILED', e.message || 'Internal Error', context.logStreamName, {});
77
+ }
78
+ }
79
+ exports.handler = handler;
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWltYWdlLWJ1aWxkZXItdmVyc2lvbmVyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL2F3cy1pbWFnZS1idWlsZGVyLXZlcnNpb25lci5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsc0RBQXNEO0FBQ3RELCtCQUErQjtBQUMvQixtQ0FBNEM7QUFDNUMsdUNBQWtEO0FBRWxELE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBRWxDLDZGQUE2RjtBQUN0RixLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQWtELEVBQUUsT0FBMEI7SUFDMUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU5RCxJQUFJO1FBQ0YsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztRQUN2RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDO1FBRXZELFFBQVEsS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUN6QixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUTtnQkFDWCxJQUFJLE9BQU8sR0FBa0IsT0FBTyxDQUFDO2dCQUNyQyxJQUFJLFdBQVcsR0FBYSxFQUFFLENBQUM7Z0JBQy9CLElBQUk7b0JBQ0YsUUFBUSxVQUFVLEVBQUU7d0JBQ2xCLEtBQUssV0FBVyxDQUFDLENBQUM7NEJBQ2hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQztnQ0FDckMsT0FBTyxFQUFFLENBQUM7d0NBQ1IsSUFBSSxFQUFFLE1BQU07d0NBQ1osTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDO3FDQUNyQixDQUFDOzZCQUNILENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDYixXQUFXLEdBQUcsTUFBTSxDQUFDLG9CQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUM7NEJBQzFFLE1BQU07eUJBQ1A7d0JBQ0QsS0FBSyxhQUFhLENBQUMsQ0FBQzs0QkFDbEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7Z0NBQ3ZDLE9BQU8sRUFBRSxDQUFDO3dDQUNSLElBQUksRUFBRSxNQUFNO3dDQUNaLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQztxQ0FDckIsQ0FBQzs2QkFDSCxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQ2IsV0FBVyxHQUFHLE1BQU0sQ0FBQyxzQkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQzs0QkFDMUYsTUFBTTt5QkFDUDt3QkFDRCxLQUFLLGlCQUFpQixDQUFDLENBQUM7NEJBQ3RCLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLG9CQUFvQixDQUFDO2dDQUMzQyxPQUFPLEVBQUUsQ0FBQzt3Q0FDUixJQUFJLEVBQUUsTUFBTTt3Q0FDWixNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUM7cUNBQ3JCLENBQUM7NkJBQ0gsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDOzRCQUNiLFdBQVcsR0FBRyxNQUFNLENBQUMsMEJBQTJCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksT0FBTyxDQUFDLENBQUM7NEJBQzlGLE1BQU07eUJBQ1A7cUJBQ0Y7aUJBQ0Y7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsSUFBSyxDQUFTLENBQUMsSUFBSSxLQUFLLDJCQUEyQixFQUFFO3dCQUNuRCxNQUFNLENBQUMsQ0FBQztxQkFDVDtpQkFDRjtnQkFFRCxPQUFPLEdBQUcsc0JBQWEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2hELElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtvQkFDcEIsT0FBTyxHQUFHLE9BQU8sQ0FBQztpQkFDbkI7Z0JBQ0QsT0FBTyxHQUFHLFlBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtvQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2lCQUMzQztnQkFDRCxNQUFNLCtCQUFxQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFFakUsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxNQUFNLCtCQUFxQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbEYsTUFBTTtTQUNUO0tBQ0Y7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixNQUFNLCtCQUFxQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUcsQ0FBVyxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ25IO0FBQ0gsQ0FBQztBQXRFRCwwQkFzRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLGltcG9ydC9uby11bnJlc29sdmVkICovXG5pbXBvcnQgKiBhcyBBV1NMYW1iZGEgZnJvbSAnYXdzLWxhbWJkYSc7XG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCB7IGluYywgbWF4U2F0aXNmeWluZyB9IGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBjdXN0b21SZXNvdXJjZVJlc3BvbmQgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBpYiA9IG5ldyBBV1MuSW1hZ2VidWlsZGVyKCk7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMsIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsIGNvbnRleHQ6IEFXU0xhbWJkYS5Db250ZXh0KSB7XG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgLi4uZXZlbnQsIFJlc3BvbnNlVVJMOiAnLi4uJyB9KSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBvYmplY3RUeXBlID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLk9iamVjdFR5cGU7XG4gICAgY29uc3Qgb2JqZWN0TmFtZSA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5PYmplY3ROYW1lO1xuXG4gICAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSAnQ3JlYXRlJzpcbiAgICAgIGNhc2UgJ1VwZGF0ZSc6XG4gICAgICAgIGxldCB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsID0gJzEuMC4wJztcbiAgICAgICAgbGV0IGFsbFZlcnNpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN3aXRjaCAob2JqZWN0VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnQ29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpYi5saXN0Q29tcG9uZW50cyh7XG4gICAgICAgICAgICAgICAgZmlsdGVyczogW3tcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlczogW29iamVjdE5hbWVdLFxuICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICB9KS5wcm9taXNlKCk7XG4gICAgICAgICAgICAgIGFsbFZlcnNpb25zID0gcmVzdWx0LmNvbXBvbmVudFZlcnNpb25MaXN0IS5tYXAoaSA9PiBpLnZlcnNpb24gfHwgJzEuMC4wJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnSW1hZ2VSZWNpcGUnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGliLmxpc3RJbWFnZVJlY2lwZXMoe1xuICAgICAgICAgICAgICAgIGZpbHRlcnM6IFt7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgICAgICB2YWx1ZXM6IFtvYmplY3ROYW1lXSxcbiAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgfSkucHJvbWlzZSgpO1xuICAgICAgICAgICAgICBhbGxWZXJzaW9ucyA9IHJlc3VsdC5pbWFnZVJlY2lwZVN1bW1hcnlMaXN0IS5tYXAoaSA9PiBpLmFybj8uc3BsaXQoJy8nKS5wb3AoKSB8fCAnMS4wLjAnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdDb250YWluZXJSZWNpcGUnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGliLmxpc3RDb250YWluZXJSZWNpcGVzKHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbe1xuICAgICAgICAgICAgICAgICAgbmFtZTogJ25hbWUnLFxuICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbb2JqZWN0TmFtZV0sXG4gICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICAgIH0pLnByb21pc2UoKTtcbiAgICAgICAgICAgICAgYWxsVmVyc2lvbnMgPSByZXN1bHQuY29udGFpbmVyUmVjaXBlU3VtbWFyeUxpc3QhLm1hcChpID0+IGkuYXJuPy5zcGxpdCgnLycpLnBvcCgpIHx8ICcxLjAuMCcpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoKGUgYXMgYW55KS5jb2RlICE9PSAnUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmVyc2lvbiA9IG1heFNhdGlzZnlpbmcoYWxsVmVyc2lvbnMsICc+PTAuMC4wJyk7XG4gICAgICAgIGlmICh2ZXJzaW9uID09PSBudWxsKSB7XG4gICAgICAgICAgdmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgICAgIH1cbiAgICAgICAgdmVyc2lvbiA9IGluYyh2ZXJzaW9uLCAncGF0Y2gnKTtcbiAgICAgICAgaWYgKHZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBidW1wIHZlcnNpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdTVUNDRVNTJywgJ09LJywgdmVyc2lvbiwge30pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgYXdhaXQgY3VzdG9tUmVzb3VyY2VSZXNwb25kKGV2ZW50LCAnU1VDQ0VTUycsICdPSycsIGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCwge30pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdGQUlMRUQnLCAoZSBhcyBFcnJvcikubWVzc2FnZSB8fCAnSW50ZXJuYWwgRXJyb3InLCBjb250ZXh0LmxvZ1N0cmVhbU5hbWUsIHt9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for BuildImageFunction
5
+ */
6
+ export interface BuildImageFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/lambdas/build-image.
10
+ */
11
+ export declare class BuildImageFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: BuildImageFunctionProps);
13
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BuildImageFunction = 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/lambdas/build-image.
9
+ */
10
+ class BuildImageFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/lambdas/build-image.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/build-image.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.BuildImageFunction = BuildImageFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtaW1hZ2UtZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFtYmRhcy9idWlsZC1pbWFnZS1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2RUFBNkU7QUFDN0UsNkJBQTZCO0FBQzdCLGlEQUFpRDtBQVNqRDs7R0FFRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDckQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSxtQ0FBbUM7WUFDaEQsR0FBRyxLQUFLO1lBQ1IsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDdEUsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7U0FDN0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDO0NBQ0Y7QUFYRCxnREFXQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMuanMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgQnVpbGRJbWFnZUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRJbWFnZUZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb25PcHRpb25zIHtcbn1cblxuLyoqXG4gKiBBbiBBV1MgTGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIHNyYy9sYW1iZGFzL2J1aWxkLWltYWdlLlxuICovXG5leHBvcnQgY2xhc3MgQnVpbGRJbWFnZUZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBCdWlsZEltYWdlRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzcmMvbGFtYmRhcy9idWlsZC1pbWFnZS5sYW1iZGEudHMnLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBydW50aW1lOiBuZXcgbGFtYmRhLlJ1bnRpbWUoJ25vZGVqczE0LngnLCBsYW1iZGEuUnVudGltZUZhbWlseS5OT0RFSlMpLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9hc3NldHMvbGFtYmRhcy9idWlsZC1pbWFnZS5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
@@ -0,0 +1,2 @@
1
+ import * as AWSLambda from 'aws-lambda';
2
+ export declare function handler(event: AWSLambda.CloudFormationCustomResourceEvent, context: AWSLambda.Context): Promise<void>;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handler = void 0;
4
+ /* eslint-disable-next-line import/no-extraneous-dependencies */
5
+ const AWS = require("aws-sdk");
6
+ const helpers_1 = require("./helpers");
7
+ const codebuild = new AWS.CodeBuild();
8
+ const ecr = new AWS.ECR();
9
+ const ib = new AWS.Imagebuilder();
10
+ /* eslint-disable @typescript-eslint/no-require-imports, import/no-extraneous-dependencies */
11
+ async function handler(event, context) {
12
+ try {
13
+ console.log(JSON.stringify({ ...event, ResponseURL: '...' }));
14
+ const deleteOnly = event.ResourceProperties.DeleteOnly;
15
+ const repoName = event.ResourceProperties.RepoName;
16
+ const projectName = event.ResourceProperties.ProjectName;
17
+ const ibName = event.ResourceProperties.ImageBuilderName;
18
+ // let physicalResourceId: string;
19
+ // let data: { [key: string]: string } = {};
20
+ switch (event.RequestType) {
21
+ case 'Create':
22
+ case 'Update':
23
+ if (deleteOnly) {
24
+ await helpers_1.customResourceRespond(event, 'SUCCESS', 'OK', 'Deleter', {});
25
+ break;
26
+ }
27
+ console.log(`Starting CodeBuild project ${projectName}`);
28
+ await codebuild.startBuild({
29
+ projectName,
30
+ environmentVariablesOverride: [
31
+ {
32
+ type: 'PLAINTEXT',
33
+ name: 'STACK_ID',
34
+ value: event.StackId,
35
+ },
36
+ {
37
+ type: 'PLAINTEXT',
38
+ name: 'REQUEST_ID',
39
+ value: event.RequestId,
40
+ },
41
+ {
42
+ type: 'PLAINTEXT',
43
+ name: 'LOGICAL_RESOURCE_ID',
44
+ value: event.LogicalResourceId,
45
+ },
46
+ {
47
+ type: 'PLAINTEXT',
48
+ name: 'RESPONSE_URL',
49
+ value: event.ResponseURL,
50
+ },
51
+ ],
52
+ }).promise();
53
+ break;
54
+ case 'Delete':
55
+ const ecrImages = await ecr.listImages({ repositoryName: repoName, maxResults: 100 }).promise();
56
+ if (ecrImages.imageIds && ecrImages.imageIds.length > 0) {
57
+ await ecr.batchDeleteImage({
58
+ imageIds: ecrImages.imageIds.map(i => {
59
+ return { imageDigest: i.imageDigest };
60
+ }),
61
+ repositoryName: repoName,
62
+ }).promise();
63
+ }
64
+ if (ibName) {
65
+ const ibImages = await ib.listImages({ filters: [{ name: 'name', values: [ibName] }] }).promise();
66
+ if (ibImages.imageVersionList) {
67
+ for (const v of ibImages.imageVersionList) {
68
+ if (v.arn) {
69
+ const ibImageVersions = await ib.listImageBuildVersions({ imageVersionArn: v.arn }).promise();
70
+ if (ibImageVersions.imageSummaryList) {
71
+ for (const vs of ibImageVersions.imageSummaryList) {
72
+ if (vs.arn) {
73
+ console.log(`Deleting ${vs.arn}`);
74
+ await ib.deleteImage({ imageBuildVersionArn: vs.arn }).promise();
75
+ }
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ await helpers_1.customResourceRespond(event, 'SUCCESS', 'OK', event.PhysicalResourceId, {});
83
+ break;
84
+ }
85
+ }
86
+ catch (e) {
87
+ console.error(e);
88
+ await helpers_1.customResourceRespond(event, 'FAILED', e.message || 'Internal Error', context.logStreamName, {});
89
+ }
90
+ }
91
+ exports.handler = handler;
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtaW1hZ2UubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYXMvYnVpbGQtaW1hZ2UubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLGdFQUFnRTtBQUNoRSwrQkFBK0I7QUFDL0IsdUNBQWtEO0FBRWxELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBR2xDLDZGQUE2RjtBQUN0RixLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQWtELEVBQUUsT0FBMEI7SUFDMUcsSUFBSTtRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFOUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQWlDLENBQUM7UUFDOUUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztRQUNuRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBc0MsQ0FBQztRQUUvRSxrQ0FBa0M7UUFDbEMsNENBQTRDO1FBRTVDLFFBQVEsS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUN6QixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUTtnQkFDWCxJQUFJLFVBQVUsRUFBRTtvQkFDZCxNQUFNLCtCQUFxQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMs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T0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sK0JBQXFCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRyxDQUFXLENBQUMsT0FBTyxJQUFJLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDbkg7QUFDSCxDQUFDO0FBbEZELDBCQWtGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMsaW1wb3J0L25vLXVucmVzb2x2ZWQgKi9cbmltcG9ydCAqIGFzIEFXU0xhbWJkYSBmcm9tICdhd3MtbGFtYmRhJztcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCB7IGN1c3RvbVJlc291cmNlUmVzcG9uZCB9IGZyb20gJy4vaGVscGVycyc7XG5cbmNvbnN0IGNvZGVidWlsZCA9IG5ldyBBV1MuQ29kZUJ1aWxkKCk7XG5jb25zdCBlY3IgPSBuZXcgQVdTLkVDUigpO1xuY29uc3QgaWIgPSBuZXcgQVdTLkltYWdlYnVpbGRlcigpO1xuXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMsIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsIGNvbnRleHQ6IEFXU0xhbWJkYS5Db250ZXh0KSB7XG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyAuLi5ldmVudCwgUmVzcG9uc2VVUkw6ICcuLi4nIH0pKTtcblxuICAgIGNvbnN0IGRlbGV0ZU9ubHkgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuRGVsZXRlT25seSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcG9OYW1lID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlJlcG9OYW1lO1xuICAgIGNvbnN0IHByb2plY3ROYW1lID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlByb2plY3ROYW1lO1xuICAgIGNvbnN0IGliTmFtZSA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5JbWFnZUJ1aWxkZXJOYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIC8vIGxldCBwaHlzaWNhbFJlc291cmNlSWQ6IHN0cmluZztcbiAgICAvLyBsZXQgZGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gICAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSAnQ3JlYXRlJzpcbiAgICAgIGNhc2UgJ1VwZGF0ZSc6XG4gICAgICAgIGlmIChkZWxldGVPbmx5KSB7XG4gICAgICAgICAgYXdhaXQgY3VzdG9tUmVzb3VyY2VSZXNwb25kKGV2ZW50LCAnU1VDQ0VTUycsICdPSycsICdEZWxldGVyJywge30pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIENvZGVCdWlsZCBwcm9qZWN0ICR7cHJvamVjdE5hbWV9YCk7XG4gICAgICAgIGF3YWl0IGNvZGVidWlsZC5zdGFydEJ1aWxkKHtcbiAgICAgICAgICBwcm9qZWN0TmFtZSxcbiAgICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlc092ZXJyaWRlOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdQTEFJTlRFWFQnLFxuICAgICAgICAgICAgICBuYW1lOiAnU1RBQ0tfSUQnLFxuICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQuU3RhY2tJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdQTEFJTlRFWFQnLFxuICAgICAgICAgICAgICBuYW1lOiAnUkVRVUVTVF9JRCcsXG4gICAgICAgICAgICAgIHZhbHVlOiBldmVudC5SZXF1ZXN0SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnUExBSU5URVhUJyxcbiAgICAgICAgICAgICAgbmFtZTogJ0xPR0lDQUxfUkVTT1VSQ0VfSUQnLFxuICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQuTG9naWNhbFJlc291cmNlSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnUExBSU5URVhUJyxcbiAgICAgICAgICAgICAgbmFtZTogJ1JFU1BPTlNFX1VSTCcsXG4gICAgICAgICAgICAgIHZhbHVlOiBldmVudC5SZXNwb25zZVVSTCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSkucHJvbWlzZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6XG4gICAgICAgIGNvbnN0IGVjckltYWdlcyA9IGF3YWl0IGVjci5saXN0SW1hZ2VzKHsgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lLCBtYXhSZXN1bHRzOiAxMDAgfSkucHJvbWlzZSgpO1xuICAgICAgICBpZiAoZWNySW1hZ2VzLmltYWdlSWRzICYmIGVjckltYWdlcy5pbWFnZUlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgZWNyLmJhdGNoRGVsZXRlSW1hZ2Uoe1xuICAgICAgICAgICAgaW1hZ2VJZHM6IGVjckltYWdlcy5pbWFnZUlkcy5tYXAoaSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGltYWdlRGlnZXN0OiBpLmltYWdlRGlnZXN0IH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSxcbiAgICAgICAgICB9KS5wcm9taXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGliTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGliSW1hZ2VzID0gYXdhaXQgaWIubGlzdEltYWdlcyh7IGZpbHRlcnM6IFt7IG5hbWU6ICduYW1lJywgdmFsdWVzOiBbaWJOYW1lXSB9XSB9KS5wcm9taXNlKCk7XG4gICAgICAgICAgaWYgKGliSW1hZ2VzLmltYWdlVmVyc2lvbkxpc3QpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiBpYkltYWdlcy5pbWFnZVZlcnNpb25MaXN0KSB7XG4gICAgICAgICAgICAgIGlmICh2LmFybikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGliSW1hZ2VWZXJzaW9ucyA9IGF3YWl0IGliLmxpc3RJbWFnZUJ1aWxkVmVyc2lvbnMoeyBpbWFnZVZlcnNpb25Bcm46IHYuYXJuIH0pLnByb21pc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoaWJJbWFnZVZlcnNpb25zLmltYWdlU3VtbWFyeUxpc3QpIHtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdnMgb2YgaWJJbWFnZVZlcnNpb25zLmltYWdlU3VtbWFyeUxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZzLmFybikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGluZyAke3ZzLmFybn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpYi5kZWxldGVJbWFnZSh7IGltYWdlQnVpbGRWZXJzaW9uQXJuOiB2cy5hcm4gfSkucHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGN1c3RvbVJlc291cmNlUmVzcG9uZChldmVudCwgJ1NVQ0NFU1MnLCAnT0snLCBldmVudC5QaHlzaWNhbFJlc291cmNlSWQsIHt9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdGQUlMRUQnLCAoZSBhcyBFcnJvcikubWVzc2FnZSB8fCAnSW50ZXJuYWwgRXJyb3InLCBjb250ZXh0LmxvZ1N0cmVhbU5hbWUsIHt9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for DeleteAmiFunction
5
+ */
6
+ export interface DeleteAmiFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/lambdas/delete-ami.
10
+ */
11
+ export declare class DeleteAmiFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: DeleteAmiFunctionProps);
13
+ }
@@ -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/lambdas/delete-ami.
9
+ */
10
+ class DeleteAmiFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/lambdas/delete-ami.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWFtaS1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL2RlbGV0ZS1hbWktZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkVBQTZFO0FBQzdFLDZCQUE2QjtBQUM3QixpREFBaUQ7QUFTakQ7O0dBRUc7QUFDSCxNQUFhLGlCQUFrQixTQUFRLE1BQU0sQ0FBQyxRQUFRO0lBQ3BELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBOEI7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsa0NBQWtDO1lBQy9DLEdBQUcsS0FBSztZQUNSLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1NBQzVGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNGO0FBWEQsOENBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLmpzIGFuZCBydW4gXCJucHggcHJvamVuXCIuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIERlbGV0ZUFtaUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlQW1pRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbk9wdGlvbnMge1xufVxuXG4vKipcbiAqIEFuIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2ggZXhlY3V0ZXMgc3JjL2xhbWJkYXMvZGVsZXRlLWFtaS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlbGV0ZUFtaUZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBEZWxldGVBbWlGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NyYy9sYW1iZGFzL2RlbGV0ZS1hbWkubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMxNC54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vYXNzZXRzL2xhbWJkYXMvZGVsZXRlLWFtaS5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
@@ -0,0 +1 @@
1
+ export {};