skuba 8.2.1 → 9.0.0-main-20240918063050
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/buildkite/annotate.d.ts +2 -0
- package/lib/api/buildkite/annotate.js +14 -1
- package/lib/api/buildkite/annotate.js.map +2 -2
- package/lib/api/github/issueComment.js.map +2 -2
- package/lib/cli/configure/analyseDependencies.js +0 -2
- package/lib/cli/configure/analyseDependencies.js.map +2 -2
- package/lib/cli/configure/analysis/package.d.ts +1 -2
- package/lib/cli/configure/analysis/package.js +0 -27
- package/lib/cli/configure/analysis/package.js.map +2 -2
- package/lib/cli/configure/dependencies/skubaDeps.js +4 -3
- package/lib/cli/configure/dependencies/skubaDeps.js.map +2 -2
- package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/index.d.ts +2 -0
- package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/index.js +35 -0
- package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/index.js.map +7 -0
- package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/patchDockerCompose.d.ts +2 -0
- package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/patchDockerCompose.js +99 -0
- package/lib/cli/lint/internalLints/upgrade/patches/8.2.1/patchDockerCompose.js.map +7 -0
- package/lib/cli/node.d.ts +2 -1
- package/lib/cli/node.js +23 -18
- package/lib/cli/node.js.map +3 -3
- package/lib/cli/start.js +3 -3
- package/lib/cli/start.js.map +2 -2
- package/lib/utils/template.d.ts +4 -4
- package/lib/wrapper/requestListener.js.map +2 -2
- package/package.json +13 -12
- package/template/express-rest-api/.buildkite/pipeline.yml +1 -1
- package/template/express-rest-api/Dockerfile.dev-deps +1 -1
- package/template/express-rest-api/package.json +2 -2
- package/template/greeter/.buildkite/pipeline.yml +1 -1
- package/template/greeter/Dockerfile +1 -1
- package/template/greeter/package.json +2 -2
- package/template/koa-rest-api/.buildkite/pipeline.yml +1 -1
- package/template/koa-rest-api/Dockerfile.dev-deps +1 -1
- package/template/koa-rest-api/package.json +6 -6
- package/template/koa-rest-api/src/framework/server.ts +3 -5
- package/template/lambda-sqs-worker/.buildkite/pipeline.yml +3 -3
- package/template/lambda-sqs-worker/Dockerfile +1 -1
- package/template/lambda-sqs-worker/package.json +2 -2
- package/template/lambda-sqs-worker-cdk/.buildkite/pipeline.yml +2 -2
- package/template/lambda-sqs-worker-cdk/Dockerfile +1 -1
- package/template/lambda-sqs-worker-cdk/infra/__snapshots__/appStack.test.ts.snap +435 -891
- package/template/lambda-sqs-worker-cdk/infra/appStack.test.ts +4 -1
- package/template/lambda-sqs-worker-cdk/infra/appStack.ts +5 -84
- package/template/lambda-sqs-worker-cdk/infra/config.ts +1 -1
- package/template/lambda-sqs-worker-cdk/infra/index.ts +20 -3
- package/template/lambda-sqs-worker-cdk/package.json +4 -3
- package/template/oss-npm-package/.github/workflows/release.yml +1 -1
- package/template/oss-npm-package/_package.json +1 -1
- package/template/private-npm-package/_package.json +1 -1
- package/template/lambda-sqs-worker-cdk/src/postHook.ts +0 -154
- package/template/lambda-sqs-worker-cdk/src/preHook.ts +0 -95
|
@@ -50,8 +50,11 @@ it.each(['dev', 'prod'])(
|
|
|
50
50
|
.replaceAll(
|
|
51
51
|
/workerCurrentVersion([0-9a-zA-Z]+)"/g,
|
|
52
52
|
(_, hash) => `workerCurrentVersion${'x'.repeat(hash.length)}"`,
|
|
53
|
+
)
|
|
54
|
+
.replaceAll(
|
|
55
|
+
/"Value":"\d+\.\d+\.\d+-([^"]+)"/g,
|
|
56
|
+
(_, hash) => `"Value": "x.x.x-${'x'.repeat(hash.length)}"`,
|
|
53
57
|
);
|
|
54
|
-
|
|
55
58
|
expect(JSON.parse(json)).toMatchSnapshot();
|
|
56
59
|
},
|
|
57
60
|
);
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
+
import { LambdaDeployment } from '@seek/aws-codedeploy-infra';
|
|
1
2
|
import {
|
|
2
3
|
Duration,
|
|
3
4
|
Stack,
|
|
4
5
|
type StackProps,
|
|
5
|
-
aws_cloudwatch,
|
|
6
|
-
aws_codedeploy,
|
|
7
6
|
aws_iam,
|
|
8
7
|
aws_kms,
|
|
9
8
|
aws_lambda,
|
|
@@ -99,90 +98,12 @@ export class AppStack extends Stack {
|
|
|
99
98
|
reservedConcurrentExecutions: config.workerLambda.reservedConcurrency,
|
|
100
99
|
});
|
|
101
100
|
|
|
102
|
-
const
|
|
103
|
-
|
|
101
|
+
const workerDeployment = new LambdaDeployment(this, 'workerDeployment', {
|
|
102
|
+
lambdaFunction: worker,
|
|
104
103
|
});
|
|
105
104
|
|
|
106
|
-
alias.addEventSource(
|
|
107
|
-
new aws_lambda_event_sources.SqsEventSource(queue,
|
|
108
|
-
maxConcurrency: config.workerLambda.reservedConcurrency,
|
|
109
|
-
}),
|
|
105
|
+
workerDeployment.alias.addEventSource(
|
|
106
|
+
new aws_lambda_event_sources.SqsEventSource(queue),
|
|
110
107
|
);
|
|
111
|
-
|
|
112
|
-
const preHook = new aws_lambda_nodejs.NodejsFunction(
|
|
113
|
-
this,
|
|
114
|
-
'worker-pre-hook',
|
|
115
|
-
{
|
|
116
|
-
...defaultWorkerConfig,
|
|
117
|
-
entry: './src/preHook.ts',
|
|
118
|
-
timeout: Duration.seconds(120),
|
|
119
|
-
bundling: defaultWorkerBundlingConfig,
|
|
120
|
-
functionName: '<%- serviceName %>-pre-hook',
|
|
121
|
-
environment: {
|
|
122
|
-
...defaultWorkerEnvironment,
|
|
123
|
-
...config.workerLambda.environment,
|
|
124
|
-
FUNCTION_NAME_TO_INVOKE: worker.functionName,
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
);
|
|
128
|
-
|
|
129
|
-
worker.grantInvoke(preHook);
|
|
130
|
-
|
|
131
|
-
const postHook = new aws_lambda_nodejs.NodejsFunction(
|
|
132
|
-
this,
|
|
133
|
-
'worker-post-hook',
|
|
134
|
-
{
|
|
135
|
-
...defaultWorkerConfig,
|
|
136
|
-
entry: './src/postHook.ts',
|
|
137
|
-
timeout: Duration.seconds(30),
|
|
138
|
-
bundling: defaultWorkerBundlingConfig,
|
|
139
|
-
functionName: '<%- serviceName %>-post-hook',
|
|
140
|
-
environment: {
|
|
141
|
-
...defaultWorkerEnvironment,
|
|
142
|
-
...config.workerLambda.environment,
|
|
143
|
-
FUNCTION_NAME_TO_PRUNE: worker.functionName,
|
|
144
|
-
},
|
|
145
|
-
},
|
|
146
|
-
);
|
|
147
|
-
|
|
148
|
-
const prunePermissions = new aws_iam.PolicyStatement({
|
|
149
|
-
actions: [
|
|
150
|
-
'lambda:ListAliases',
|
|
151
|
-
'lambda:ListVersionsByFunction',
|
|
152
|
-
'lambda:DeleteFunction',
|
|
153
|
-
],
|
|
154
|
-
resources: [worker.functionArn, `${worker.functionArn}:*`],
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
postHook.addToRolePolicy(prunePermissions);
|
|
158
|
-
|
|
159
|
-
const application = new aws_codedeploy.LambdaApplication(
|
|
160
|
-
this,
|
|
161
|
-
'codedeploy-application',
|
|
162
|
-
);
|
|
163
|
-
|
|
164
|
-
const deploymentGroup = new aws_codedeploy.LambdaDeploymentGroup(
|
|
165
|
-
this,
|
|
166
|
-
'codedeploy-group',
|
|
167
|
-
{
|
|
168
|
-
application,
|
|
169
|
-
alias,
|
|
170
|
-
deploymentConfig: aws_codedeploy.LambdaDeploymentConfig.ALL_AT_ONCE,
|
|
171
|
-
},
|
|
172
|
-
);
|
|
173
|
-
|
|
174
|
-
const alarm = new aws_cloudwatch.Alarm(this, 'codedeploy-alarm', {
|
|
175
|
-
metric: alias.metricErrors({
|
|
176
|
-
period: Duration.seconds(60),
|
|
177
|
-
}),
|
|
178
|
-
threshold: 1,
|
|
179
|
-
evaluationPeriods: 1,
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
deploymentGroup.addAlarm(alarm);
|
|
183
|
-
|
|
184
|
-
deploymentGroup.addPreHook(preHook);
|
|
185
|
-
|
|
186
|
-
deploymentGroup.addPostHook(postHook);
|
|
187
108
|
}
|
|
188
109
|
}
|
|
@@ -4,7 +4,7 @@ const ENVIRONMENTS = ['dev', 'prod'] as const;
|
|
|
4
4
|
|
|
5
5
|
type Environment = (typeof ENVIRONMENTS)[number];
|
|
6
6
|
|
|
7
|
-
const environment = Env.oneOf(ENVIRONMENTS)('ENVIRONMENT');
|
|
7
|
+
export const environment = Env.oneOf(ENVIRONMENTS)('ENVIRONMENT');
|
|
8
8
|
|
|
9
9
|
interface Config {
|
|
10
10
|
appName: string;
|
|
@@ -1,11 +1,28 @@
|
|
|
1
|
+
import { HookStack } from '@seek/aws-codedeploy-infra';
|
|
1
2
|
import { App } from 'aws-cdk-lib';
|
|
2
3
|
|
|
3
4
|
import { AppStack } from './appStack';
|
|
4
|
-
import { config } from './config';
|
|
5
|
+
import { config, environment } from './config';
|
|
5
6
|
|
|
6
7
|
const app = new App();
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
new AppStack(app, 'appStack', {
|
|
9
|
+
const appStack = new AppStack(app, 'appStack', {
|
|
10
10
|
stackName: config.appName,
|
|
11
|
+
tags: {
|
|
12
|
+
'seek:env:label': environment,
|
|
13
|
+
'seek:source:sha': process.env.BUILDKITE_COMMIT ?? 'na',
|
|
14
|
+
// 'seek:source:url': 'TODO: add source URL',
|
|
15
|
+
// 'seek:system:name': 'TODO: add system name',
|
|
16
|
+
},
|
|
11
17
|
});
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* TODO: If deploying multiple stacks in one AWS account, deploy HookStack centrally rather than here
|
|
21
|
+
* You can find the envisioned workflow here: {@link https://github.com/seek-oss/skuba/issues/1640#issuecomment-2323854827}
|
|
22
|
+
*/
|
|
23
|
+
const hookStack = new HookStack(app, 'hookStack');
|
|
24
|
+
|
|
25
|
+
// ensure that hookStack (codedeploy preTraffic) is deployed before appStack
|
|
26
|
+
appStack.addDependency(hookStack);
|
|
27
|
+
|
|
28
|
+
app.synth();
|
|
@@ -21,15 +21,16 @@
|
|
|
21
21
|
"zod": "^3.19.1"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
+
"@seek/aws-codedeploy-infra": "^2.1.0",
|
|
24
25
|
"@types/aws-lambda": "^8.10.82",
|
|
25
|
-
"@types/node": "^20.
|
|
26
|
+
"@types/node": "^20.16.5",
|
|
26
27
|
"aws-cdk": "^2.109.0",
|
|
27
28
|
"aws-cdk-lib": "^2.109.0",
|
|
28
29
|
"constructs": "^10.0.17",
|
|
29
30
|
"pino-pretty": "^11.0.0",
|
|
30
|
-
"skuba": "
|
|
31
|
+
"skuba": "9.0.0-main-20240918063050"
|
|
31
32
|
},
|
|
32
|
-
"packageManager": "pnpm@9.
|
|
33
|
+
"packageManager": "pnpm@9.10.0",
|
|
33
34
|
"engines": {
|
|
34
35
|
"node": ">=20"
|
|
35
36
|
}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
/* istanbul ignore file */
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
CodeDeploy,
|
|
6
|
-
PutLifecycleEventHookExecutionStatusCommand,
|
|
7
|
-
} from '@aws-sdk/client-codedeploy';
|
|
8
|
-
import {
|
|
9
|
-
type AliasConfiguration,
|
|
10
|
-
DeleteFunctionCommand,
|
|
11
|
-
type FunctionConfiguration,
|
|
12
|
-
LambdaClient,
|
|
13
|
-
ListAliasesCommand,
|
|
14
|
-
ListVersionsByFunctionCommand,
|
|
15
|
-
} from '@aws-sdk/client-lambda';
|
|
16
|
-
import { z } from 'zod';
|
|
17
|
-
|
|
18
|
-
const lambda = new LambdaClient();
|
|
19
|
-
const codeDeploy = new CodeDeploy();
|
|
20
|
-
|
|
21
|
-
const listLambdaVersions = async (
|
|
22
|
-
functionName: string,
|
|
23
|
-
marker?: string,
|
|
24
|
-
): Promise<FunctionConfiguration[]> => {
|
|
25
|
-
const result = await lambda.send(
|
|
26
|
-
new ListVersionsByFunctionCommand({
|
|
27
|
-
FunctionName: functionName,
|
|
28
|
-
Marker: marker,
|
|
29
|
-
}),
|
|
30
|
-
);
|
|
31
|
-
const versions = result.Versions ?? [];
|
|
32
|
-
if (result.NextMarker) {
|
|
33
|
-
return [
|
|
34
|
-
...versions,
|
|
35
|
-
...(await listLambdaVersions(functionName, result.NextMarker)),
|
|
36
|
-
];
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return versions;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const listAliases = async (
|
|
43
|
-
functionName: string,
|
|
44
|
-
marker?: string,
|
|
45
|
-
): Promise<AliasConfiguration[]> => {
|
|
46
|
-
const result = await lambda.send(
|
|
47
|
-
new ListAliasesCommand({
|
|
48
|
-
FunctionName: functionName,
|
|
49
|
-
Marker: marker,
|
|
50
|
-
}),
|
|
51
|
-
);
|
|
52
|
-
const aliases = result.Aliases ?? [];
|
|
53
|
-
if (result.NextMarker) {
|
|
54
|
-
return [
|
|
55
|
-
...aliases,
|
|
56
|
-
...(await listAliases(functionName, result.NextMarker)),
|
|
57
|
-
];
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return aliases;
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const pruneLambdas = async (
|
|
64
|
-
functionName: string,
|
|
65
|
-
numberToKeep: number,
|
|
66
|
-
): Promise<void> => {
|
|
67
|
-
const [aliases, versions] = await Promise.all([
|
|
68
|
-
listAliases(functionName),
|
|
69
|
-
listLambdaVersions(functionName),
|
|
70
|
-
]);
|
|
71
|
-
|
|
72
|
-
const aliasMap = new Map(
|
|
73
|
-
aliases.flatMap((alias) =>
|
|
74
|
-
alias.FunctionVersion ? [[alias.FunctionVersion, alias]] : [],
|
|
75
|
-
),
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
const versionsToPrune = versions
|
|
79
|
-
.filter(
|
|
80
|
-
(version) =>
|
|
81
|
-
version.Version &&
|
|
82
|
-
!aliasMap.has(version.Version) &&
|
|
83
|
-
version.Version !== '$LATEST',
|
|
84
|
-
)
|
|
85
|
-
.sort((a, b) => Number(b.Version) - Number(a.Version))
|
|
86
|
-
.slice(numberToKeep);
|
|
87
|
-
|
|
88
|
-
if (!versionsToPrune.length) {
|
|
89
|
-
console.log('No function versions to prune');
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
console.log(
|
|
94
|
-
`Pruning function versions: ${versionsToPrune
|
|
95
|
-
.map((version) => version.Version)
|
|
96
|
-
.join(', ')}`,
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
await Promise.all(
|
|
100
|
-
versionsToPrune.map((version) =>
|
|
101
|
-
lambda.send(
|
|
102
|
-
new DeleteFunctionCommand({
|
|
103
|
-
FunctionName: version.FunctionName,
|
|
104
|
-
Qualifier: version.Version,
|
|
105
|
-
}),
|
|
106
|
-
),
|
|
107
|
-
),
|
|
108
|
-
);
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
const EnvSchema = z.object({
|
|
112
|
-
FUNCTION_NAME_TO_PRUNE: z.string(),
|
|
113
|
-
NUMBER_OF_VERSIONS_TO_KEEP: z.coerce.number().default(0),
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
type Status = 'Succeeded' | 'Failed';
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* The event supplied to a CodeDeploy lifecycle hook Lambda function.
|
|
120
|
-
*
|
|
121
|
-
* {@link https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorial-ecs-with-hooks-create-hooks.html}
|
|
122
|
-
*/
|
|
123
|
-
interface CodeDeployLifecycleHookEvent {
|
|
124
|
-
DeploymentId: string;
|
|
125
|
-
LifecycleEventHookExecutionId: string;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* A handler to clean up old Lambda function versions and layers
|
|
130
|
-
*/
|
|
131
|
-
export const handler = async (
|
|
132
|
-
event: CodeDeployLifecycleHookEvent,
|
|
133
|
-
): Promise<void> => {
|
|
134
|
-
let status: Status = 'Succeeded';
|
|
135
|
-
try {
|
|
136
|
-
const {
|
|
137
|
-
FUNCTION_NAME_TO_PRUNE: functionName,
|
|
138
|
-
NUMBER_OF_VERSIONS_TO_KEEP: numberToKeep,
|
|
139
|
-
} = EnvSchema.parse(process.env);
|
|
140
|
-
|
|
141
|
-
await pruneLambdas(functionName, numberToKeep);
|
|
142
|
-
} catch (err) {
|
|
143
|
-
console.error('Exception:', err);
|
|
144
|
-
status = 'Failed';
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
await codeDeploy.send(
|
|
148
|
-
new PutLifecycleEventHookExecutionStatusCommand({
|
|
149
|
-
deploymentId: event.DeploymentId,
|
|
150
|
-
lifecycleEventHookExecutionId: event.LifecycleEventHookExecutionId,
|
|
151
|
-
status,
|
|
152
|
-
}),
|
|
153
|
-
);
|
|
154
|
-
};
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
/* istanbul ignore file */
|
|
3
|
-
|
|
4
|
-
// Use minimal dependencies to reduce the chance of crashes on module load.
|
|
5
|
-
import {
|
|
6
|
-
CodeDeployClient,
|
|
7
|
-
PutLifecycleEventHookExecutionStatusCommand,
|
|
8
|
-
} from '@aws-sdk/client-codedeploy';
|
|
9
|
-
import { InvokeCommand, LambdaClient } from '@aws-sdk/client-lambda';
|
|
10
|
-
|
|
11
|
-
const codeDeploy = new CodeDeployClient({
|
|
12
|
-
apiVersion: '2014-10-06',
|
|
13
|
-
maxAttempts: 5,
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
const lambda = new LambdaClient({
|
|
17
|
-
apiVersion: '2015-03-31',
|
|
18
|
-
maxAttempts: 5,
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
type Status = 'Succeeded' | 'Failed';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Synchronously invokes a Lambda function with a smoke test event.
|
|
25
|
-
*
|
|
26
|
-
* Any non-error response is treated as a success.
|
|
27
|
-
*/
|
|
28
|
-
const smokeTestLambdaFunction = async (): Promise<Status> => {
|
|
29
|
-
const functionName = process.env.FUNCTION_NAME_TO_INVOKE;
|
|
30
|
-
|
|
31
|
-
if (!functionName) {
|
|
32
|
-
console.error('Missing process.env.FUNCTION_NAME_TO_INVOKE');
|
|
33
|
-
return 'Failed';
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
console.info('Function:', functionName);
|
|
37
|
-
|
|
38
|
-
const response = await lambda.send(
|
|
39
|
-
new InvokeCommand({
|
|
40
|
-
FunctionName: functionName,
|
|
41
|
-
InvocationType: 'RequestResponse',
|
|
42
|
-
// Treat an empty object as our smoke test event.
|
|
43
|
-
Payload: Buffer.from('{}'),
|
|
44
|
-
}),
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
console.info('Version:', response.ExecutedVersion ?? '?');
|
|
48
|
-
console.info('Status', response.StatusCode ?? '?');
|
|
49
|
-
|
|
50
|
-
if (response.FunctionError) {
|
|
51
|
-
console.error('Error:', response.FunctionError);
|
|
52
|
-
if (response.Payload) {
|
|
53
|
-
console.error(response.Payload.transformToString());
|
|
54
|
-
}
|
|
55
|
-
return 'Failed';
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return response.StatusCode === 200 ? 'Succeeded' : 'Failed';
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* The event supplied to a CodeDeploy lifecycle hook Lambda function.
|
|
63
|
-
*
|
|
64
|
-
* {@link https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorial-ecs-with-hooks-create-hooks.html}
|
|
65
|
-
*/
|
|
66
|
-
interface CodeDeployLifecycleHookEvent {
|
|
67
|
-
DeploymentId: string;
|
|
68
|
-
LifecycleEventHookExecutionId: string;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* A handler to smoke test a new Lambda function version before it goes live.
|
|
73
|
-
*
|
|
74
|
-
* This tries to be exception safe so that a status reaches CodeDeploy. If we
|
|
75
|
-
* crash or otherwise fail to report back, the deployment will hang for an hour.
|
|
76
|
-
*/
|
|
77
|
-
export const handler = async (
|
|
78
|
-
event: CodeDeployLifecycleHookEvent,
|
|
79
|
-
): Promise<void> => {
|
|
80
|
-
let status: Status;
|
|
81
|
-
try {
|
|
82
|
-
status = await smokeTestLambdaFunction();
|
|
83
|
-
} catch (err) {
|
|
84
|
-
console.error('Exception:', err);
|
|
85
|
-
status = 'Failed';
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
await codeDeploy.send(
|
|
89
|
-
new PutLifecycleEventHookExecutionStatusCommand({
|
|
90
|
-
deploymentId: event.DeploymentId,
|
|
91
|
-
lifecycleEventHookExecutionId: event.LifecycleEventHookExecutionId,
|
|
92
|
-
status,
|
|
93
|
-
}),
|
|
94
|
-
);
|
|
95
|
-
};
|