Skip to content

Commit 355047a

Browse files
committed
fix migration middy
1 parent 628d79d commit 355047a

4 files changed

Lines changed: 67 additions & 35 deletions

File tree

lambdas/functions/control-plane/src/lambda.ts

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import middy from '@middy/core';
2+
import type { MiddlewareObj } from '@middy/core';
23
import { logger, setContext } from '@aws-github-runner/aws-powertools-util';
34
import { captureLambdaHandler, tracer } from '@aws-github-runner/aws-powertools-util';
45
import { Context, type SQSBatchItemFailure, type SQSBatchResponse, SQSEvent } from 'aws-lambda';
@@ -10,7 +11,13 @@ import { type ActionRequestMessage, type ActionRequestMessageSQS, scaleUp } from
1011
import { SSMCleanupOptions, cleanSSMTokens } from './scale-runners/ssm-housekeeper';
1112
import { checkAndRetryJob } from './scale-runners/job-retry';
1213

13-
async function scaleUpHandlerFn(event: SQSEvent, context: Context): Promise<SQSBatchResponse> {
14+
// Type assertion helper for AWS PowerTools middleware compatibility with Middy v7
15+
// PowerTools returns MiddlewareLikeObj which is runtime-compatible but has stricter types
16+
const asMiddleware = <TEvent, TResult>(
17+
middleware: ReturnType<typeof captureLambdaHandler>,
18+
): MiddlewareObj<TEvent, TResult, Error, Context> => middleware as MiddlewareObj<TEvent, TResult, Error, Context>;
19+
20+
async function handleScaleUp(event: SQSEvent, context: Context): Promise<SQSBatchResponse> {
1421
setContext(context, 'lambda.ts');
1522
logger.logEventIfEnabled(event);
1623

@@ -64,7 +71,7 @@ async function scaleUpHandlerFn(event: SQSEvent, context: Context): Promise<SQSB
6471
}
6572
}
6673

67-
async function scaleDownHandlerFn(event: unknown, context: Context): Promise<void> {
74+
async function handleScaleDown(event: unknown, context: Context): Promise<void> {
6875
setContext(context, 'lambda.ts');
6976
logger.logEventIfEnabled(event);
7077

@@ -75,7 +82,7 @@ async function scaleDownHandlerFn(event: unknown, context: Context): Promise<voi
7582
}
7683
}
7784

78-
async function adjustPoolFn(event: PoolEvent, context: Context): Promise<void> {
85+
async function handleAdjustPool(event: PoolEvent, context: Context): Promise<void> {
7986
setContext(context, 'lambda.ts');
8087
logger.logEventIfEnabled(event);
8188

@@ -87,7 +94,7 @@ async function adjustPoolFn(event: PoolEvent, context: Context): Promise<void> {
8794
return Promise.resolve();
8895
}
8996

90-
async function ssmHousekeeperFn(event: unknown, context: Context): Promise<void> {
97+
async function handleSSMHousekeeper(event: unknown, context: Context): Promise<void> {
9198
setContext(context, 'lambda.ts');
9299
logger.logEventIfEnabled(event);
93100
const config = JSON.parse(process.env.SSM_CLEANUP_CONFIG) as SSMCleanupOptions;
@@ -99,16 +106,20 @@ async function ssmHousekeeperFn(event: unknown, context: Context): Promise<void>
99106
}
100107
}
101108

102-
// Export wrapped handlers for middy v7
103-
const handler = captureLambdaHandler(tracer);
104-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
105-
export const scaleUpHandler = handler ? middy(scaleUpHandlerFn).use(handler as any) : scaleUpHandlerFn;
106-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
107-
export const scaleDownHandler = handler ? middy(scaleDownHandlerFn).use(handler as any) : scaleDownHandlerFn;
108-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
109-
export const adjustPool = handler ? middy(adjustPoolFn).use(handler as any) : adjustPoolFn;
110-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
111-
export const ssmHousekeeper = handler ? middy(ssmHousekeeperFn).use(handler as any) : ssmHousekeeperFn;
109+
// Export handlers with AWS PowerTools middleware
110+
const powertoolsMiddleware = captureLambdaHandler(tracer);
111+
export const scaleUpHandler = powertoolsMiddleware
112+
? middy(handleScaleUp).use(asMiddleware<SQSEvent, SQSBatchResponse>(powertoolsMiddleware))
113+
: handleScaleUp;
114+
export const scaleDownHandler = powertoolsMiddleware
115+
? middy(handleScaleDown).use(asMiddleware<unknown, void>(powertoolsMiddleware))
116+
: handleScaleDown;
117+
export const adjustPool = powertoolsMiddleware
118+
? middy(handleAdjustPool).use(asMiddleware<PoolEvent, void>(powertoolsMiddleware))
119+
: handleAdjustPool;
120+
export const ssmHousekeeper = powertoolsMiddleware
121+
? middy(handleSSMHousekeeper).use(asMiddleware<unknown, void>(powertoolsMiddleware))
122+
: handleSSMHousekeeper;
112123

113124
export async function jobRetryCheck(event: SQSEvent, context: Context): Promise<void> {
114125
setContext(context, 'lambda.ts');

lambdas/functions/gh-agent-syncer/src/lambda.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
import middy from '@middy/core';
2+
import type { MiddlewareObj } from '@middy/core';
23
import { logger, setContext } from '@aws-github-runner/aws-powertools-util';
34
import { captureLambdaHandler, tracer } from '@aws-github-runner/aws-powertools-util';
45
import { Context } from 'aws-lambda';
56

67
import { sync } from './syncer/syncer';
78

9+
// Type assertion helper for AWS PowerTools middleware compatibility with Middy v7
10+
const asMiddleware = <TEvent, TResult>(
11+
middleware: ReturnType<typeof captureLambdaHandler>,
12+
): MiddlewareObj<TEvent, TResult, Error, Context> => middleware as MiddlewareObj<TEvent, TResult, Error, Context>;
13+
814
// eslint-disable-next-line
9-
async function handlerFn(event: any, context: Context): Promise<void> {
15+
async function handleSync(event: any, context: Context): Promise<void> {
1016
setContext(context, 'lambda.ts');
1117
logger.logEventIfEnabled(event);
1218

@@ -20,6 +26,8 @@ async function handlerFn(event: any, context: Context): Promise<void> {
2026
}
2127
}
2228

23-
// Export wrapped handler for middy v7
24-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
25-
export const handler = middy(handlerFn).use(captureLambdaHandler(tracer) as any);
29+
// Export handler with AWS PowerTools middleware
30+
const powertoolsMiddleware = captureLambdaHandler(tracer);
31+
export const handler = powertoolsMiddleware
32+
? middy(handleSync).use(asMiddleware<unknown, void>(powertoolsMiddleware))
33+
: handleSync;
Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import middy from '@middy/core';
2+
import type { MiddlewareObj } from '@middy/core';
23
import { captureLambdaHandler, logger, metrics, setContext, tracer } from '@aws-github-runner/aws-powertools-util';
34
import { logMetrics } from '@aws-lambda-powertools/metrics/middleware';
45
import { Context } from 'aws-lambda';
@@ -8,9 +9,14 @@ import { handle as handleTermination } from './termination';
89
import { BidEvictedDetail, BidEvictedEvent, SpotInterruptionWarning, SpotTerminationDetail } from './types';
910
import { Config } from './ConfigResolver';
1011

12+
// Type assertion helper for AWS PowerTools middleware compatibility with Middy v7
13+
const asMiddleware = <TEvent, TResult>(
14+
middleware: ReturnType<typeof captureLambdaHandler> | ReturnType<typeof logMetrics>,
15+
): MiddlewareObj<TEvent, TResult, Error, Context> => middleware as MiddlewareObj<TEvent, TResult, Error, Context>;
16+
1117
const config = new Config();
1218

13-
async function interruptionWarningFn(
19+
async function handleInterruptionWarning(
1420
event: SpotInterruptionWarning<SpotTerminationDetail>,
1521
context: Context,
1622
): Promise<void> {
@@ -25,7 +31,7 @@ async function interruptionWarningFn(
2531
}
2632
}
2733

28-
async function terminationFn(event: BidEvictedEvent<BidEvictedDetail>, context: Context): Promise<void> {
34+
async function handleBidEvicted(event: BidEvictedEvent<BidEvictedDetail>, context: Context): Promise<void> {
2935
setContext(context, 'lambda.ts');
3036
logger.logEventIfEnabled(event);
3137
logger.debug('Configuration of the lambda', { config });
@@ -37,20 +43,19 @@ async function terminationFn(event: BidEvictedEvent<BidEvictedDetail>, context:
3743
}
3844
}
3945

40-
// Export wrapped handlers for middy v7
41-
const c = captureLambdaHandler(tracer);
42-
const l = logMetrics(metrics);
46+
// Export handlers with AWS PowerTools middleware
47+
const tracingMiddleware = captureLambdaHandler(tracer);
48+
const metricsMiddleware = logMetrics(metrics);
4349

44-
export const interruptionWarning = middy(interruptionWarningFn);
45-
if (c) {
50+
const interruptionWarningHandler = middy(handleInterruptionWarning);
51+
if (tracingMiddleware) {
4652
logger.debug('Adding captureLambdaHandler middleware');
47-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
48-
interruptionWarning.use(c as any);
53+
interruptionWarningHandler.use(asMiddleware<SpotInterruptionWarning<SpotTerminationDetail>, void>(tracingMiddleware));
4954
}
50-
if (l) {
55+
if (metricsMiddleware) {
5156
logger.debug('Adding logMetrics middleware');
52-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
53-
interruptionWarning.use(l as any);
57+
interruptionWarningHandler.use(asMiddleware<SpotInterruptionWarning<SpotTerminationDetail>, void>(metricsMiddleware));
5458
}
5559

56-
export const termination = terminationFn;
60+
export const interruptionWarning = interruptionWarningHandler;
61+
export const termination = handleBidEvicted;

lambdas/functions/webhook/src/lambda.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import middy from '@middy/core';
2+
import type { MiddlewareObj } from '@middy/core';
23
import { logger, setContext, captureLambdaHandler, tracer } from '@aws-github-runner/aws-powertools-util';
34
import { APIGatewayEvent, Context } from 'aws-lambda';
45

@@ -10,12 +11,17 @@ import { WorkflowJobEvent } from '@octokit/webhooks-types';
1011
import { ConfigDispatcher, ConfigWebhook, ConfigWebhookEventBridge } from './ConfigLoader';
1112
import { dispatch } from './runners/dispatch';
1213

14+
// Type assertion helper for AWS PowerTools middleware compatibility with Middy v7
15+
const asMiddleware = <TEvent, TResult>(
16+
middleware: ReturnType<typeof captureLambdaHandler>,
17+
): MiddlewareObj<TEvent, TResult, Error, Context> => middleware as MiddlewareObj<TEvent, TResult, Error, Context>;
18+
1319
export interface Response {
1420
statusCode: number;
1521
body: string;
1622
}
1723

18-
async function directWebhookHandler(event: APIGatewayEvent, context: Context): Promise<Response> {
24+
async function handleDirectWebhook(event: APIGatewayEvent, context: Context): Promise<Response> {
1925
setContext(context, 'lambda.ts');
2026
logger.logEventIfEnabled(event);
2127

@@ -92,6 +98,8 @@ function headersToLowerCase(headers: IncomingHttpHeaders): IncomingHttpHeaders {
9298
return headers;
9399
}
94100

95-
// Export wrapped handlers for middy v7
96-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
97-
export const directWebhook = middy(directWebhookHandler).use(captureLambdaHandler(tracer) as any);
101+
// Export handlers with AWS PowerTools middleware
102+
const powertoolsMiddleware = captureLambdaHandler(tracer);
103+
export const directWebhook = powertoolsMiddleware
104+
? middy(handleDirectWebhook).use(asMiddleware<APIGatewayEvent, Response>(powertoolsMiddleware))
105+
: handleDirectWebhook;

0 commit comments

Comments
 (0)