EventBridge Lambda concurrency limits on Genesys interaction events

Pushing high-volume interaction events from Genesys Cloud to EventBridge is tanking our Lambda functions. We’re hitting the 1000 concurrency limit within seconds of a campaign launch, causing dropped events and 429 throttling errors in CloudWatch. The handler is just a basic Node.js function parsing the detail object from the EventBridge payload, but the batch size seems to be overwhelming the default provisioned capacity. Anyone got a working pattern for batching these events or configuring the Lambda to handle the burst without manual scaling?

You’re fighting the event bus, not the code. EventBridge batches events based on memory and timeout, not your application logic. If your Lambda is heavy, it processes fewer items per invocation, which tanks your concurrency efficiency.

Check your MaxBatchingWindow and MaximumRetryAttempts. But more importantly, look at the destination config. You can set a BatchSize on the EventBridge rule or the Lambda destination. If you’re using the Genesys Cloud integration directly, you can’t control the batch size from Genesys side easily, but you can control how Lambda handles it.

Try increasing the ReservedConcurrentExecutions on the Lambda. It’s not free, but it stops the 429s. Also, make sure your handler isn’t doing synchronous I/O for every event. If you’re writing to DynamoDB, use batchWriteItem.

Here’s a quick Node.js handler pattern that batches writes internally if you’re stuck with small batches from EventBridge:

const DynamoDB = require('aws-sdk/clients/dynamodb');
const dynamoDB = new DynamoDB.DocumentClient();

exports.handler = async (event) => {
 const records = event.Records || [];
 const batch = [];

 // Group events into chunks of 25 for DynamoDB batch limits
 for (const record of records) {
 batch.push({
 PutRequest: {
 Item: {
 interactionId: record.detail.interactionId,
 timestamp: record.detail.timestamp,
 data: record.detail // or flatten as needed
 }
 }
 });

 if (batch.length >= 25) {
 await writeBatch(batch);
 batch.length = 0; // Clear array
 }
 }

 if (batch.length > 0) {
 await writeBatch(batch);
 }

 return { batchItemFailures: [] };
};

async function writeBatch(items) {
 try {
 await dynamoDB.batchWrite({
 RequestItems: {
 'YourTableName': items
 }
 }).promise();
 } catch (err) {
 console.error('Batch write failed', err);
 // Handle retries or dead letter queue logic here
 }
}

If you’re still hitting limits, check the MaximumRetryAttempts on the Lambda destination. Set it to 0 if you want to fail fast and handle retries in your own queue, like SQS. Letting EventBridge retry indefinitely just clogs the system.