Skip to content

CompleteLifecycleAction

Source: src/AWS/AutoScaling/CompleteLifecycleAction.ts

A write binding that lets a Function/Instance complete or heartbeat paused lifecycle actions on an Auto Scaling Group. Grants autoscaling:CompleteLifecycleAction and autoscaling:RecordLifecycleActionHeartbeat scoped to the group ARN.

Signal CONTINUE from a lifecycle handler

const lifecycle = yield* CompleteLifecycleAction(group);
yield* lifecycle.complete({
LifecycleHookName: event.detail.LifecycleHookName,
LifecycleActionToken: event.detail.LifecycleActionToken,
LifecycleActionResult: "CONTINUE",
});

Drain launching instances from a Lambda Function

import * as AWS from "alchemy/AWS";
import {
CompleteLifecycleAction,
CompleteLifecycleActionHttp,
consumeLifecycleActions,
} from "alchemy/AWS/AutoScaling";
export class LifecycleFunction extends AWS.Lambda.Function<AWS.Lambda.Function>()(
"LifecycleFunction",
) {}
export default LifecycleFunction.make(
{ main: import.meta.url },
Effect.gen(function* () {
const lifecycle = yield* CompleteLifecycleAction(group);
yield* consumeLifecycleActions(
group,
{ lifecycleTransition: "LAUNCHING", heartbeatTimeout: "300 seconds" },
(events) =>
Stream.runForEach(events, (event) =>
lifecycle
.complete({
LifecycleHookName: event.detail.LifecycleHookName,
LifecycleActionToken: event.detail.LifecycleActionToken,
LifecycleActionResult: "CONTINUE",
})
.pipe(Effect.orDie),
),
);
return {};
}).pipe(
Effect.provide(
Layer.mergeAll(AWS.Lambda.EventSource, CompleteLifecycleActionHttp),
),
),
);

Buy more time with a heartbeat

// reset the heartbeat timeout while a long drain is still in progress
yield* lifecycle.heartbeat({
LifecycleHookName: event.detail.LifecycleHookName,
LifecycleActionToken: event.detail.LifecycleActionToken,
});