Phase 3: proactive heartbeat — EventBridge 30min rule, heartbeat-runner Lambda, HEARTBEAT_OK suppression

This commit is contained in:
daniel
2026-05-08 20:14:16 -05:00
parent eddbd98153
commit 01b258579b
16 changed files with 772 additions and 57 deletions

View File

@@ -8,6 +8,8 @@ import * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';
import * as apigatewayv2integrations from 'aws-cdk-lib/aws-apigatewayv2-integrations';
import * as iam from 'aws-cdk-lib/aws-iam';
import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager';
import * as events from 'aws-cdk-lib/aws-events';
import * as eventsTargets from 'aws-cdk-lib/aws-events-targets';
import { SqsEventSource } from 'aws-cdk-lib/aws-lambda-event-sources';
import { Construct } from 'constructs';
import * as path from 'path';
@@ -303,6 +305,29 @@ export class AgentClawStack extends cdk.Stack {
// Output the URL so it can be manually set in agentcore.json OAUTH_START_URL.
// ── Lambda: heartbeat-runner ──────────────────────────────────────────
const heartbeatRunnerFn = new lambda.Function(this, 'HeartbeatRunner', {
functionName: 'agent-claw-heartbeat-runner',
runtime: lambda.Runtime.PYTHON_3_12,
handler: 'handler.handler',
code: lambda.Code.fromAsset(path.join(__dirname, '../../src/lambdas/heartbeat-runner')),
timeout: cdk.Duration.seconds(60),
memorySize: 128,
environment: {
MESSAGE_QUEUE_URL: messageQueue.queueUrl,
USERS_TABLE_NAME: usersTable.tableName,
},
});
messageQueue.grantSendMessages(heartbeatRunnerFn);
usersTable.grantReadData(heartbeatRunnerFn);
// EventBridge rule: every 30 minutes
const heartbeatRule = new events.Rule(this, 'HeartbeatRule', {
ruleName: 'agent-claw-heartbeat',
schedule: events.Schedule.rate(cdk.Duration.minutes(30)),
});
heartbeatRule.addTarget(new eventsTargets.LambdaFunction(heartbeatRunnerFn));
// ── Lambda: scheduler ─────────────────────────────────────────────────
const schedulerFn = new lambda.Function(this, 'Scheduler', {
functionName: 'agent-claw-scheduler',