Skip to content

Instantly share code, notes, and snippets.

@jeshan
Last active October 26, 2024 13:15
Show Gist options
  • Save jeshan/52cb021fd20d871c56ad5ce6d2654d7b to your computer and use it in GitHub Desktop.
Save jeshan/52cb021fd20d871c56ad5ce6d2654d7b to your computer and use it in GitHub Desktop.
AWS Lambda: Determine Event Source from event object. Note that this is an approximation as anybody can send a payload that resembles the real thing.
function getLambdaEventSource(event) {
if (event.Records && event.Records[0].cf) return 'isCloudfront';
if (event.configRuleId && event.configRuleName && event.configRuleArn) return 'isAwsConfig';
if (event.Records && (event.Records[0].eventSource === 'aws:codecommit')) return 'isCodeCommit';
if (event.authorizationToken === "incoming-client-token") return 'isApiGatewayAuthorizer';
if (event.StackId && event.RequestType && event.ResourceType) return 'isCloudFormation';
if (event.Records && (event.Records[0].eventSource === 'aws:ses')) return 'isSes';
if (event.pathParameters && event.pathParameters.proxy) return 'isApiGatewayAwsProxy';
if (event.source === 'aws.events') return 'isScheduledEvent';
if (event.awslogs && event.awslogs.data) return 'isCloudWatchLogs';
if (event.Records && (event.Records[0].EventSource === 'aws:sns')) return 'isSns';
if (event.Records && (event.Records[0].eventSource === 'aws:dynamodb')) return 'isDynamoDb';
if (event.records && event.records[0].approximateArrivalTimestamp) return 'isKinesisFirehose';
if (event.records && event.deliveryStreamArn && event.deliveryStreamArn.startsWith('arn:aws:kinesis:')) return 'isKinesisFirehose';
if (event.eventType === 'SyncTrigger' && event.identityId && event.identityPoolId) return 'isCognitoSyncTrigger';
if (event.Records && event.Records[0].eventSource === 'aws:kinesis') return 'isKinesis';
if (event.Records && event.Records[0].eventSource === 'aws:s3') return 'isS3';
if (event.operation && event.message) return 'isMobileBackend';
if (event.Records && (event.Records[0].eventSource === 'aws:sqs')) return 'isSqs';
}
@silvav
Copy link

silvav commented Apr 15, 2018

I would like to show this code block on my master thesis. Can you confirm that this code is licensed under public domain?
Alternatively, could you grant me permission to publish it?

@CowChris
Copy link

For SQS:

if (event.Records && (event.Records[0].eventSource === 'aws:sqs')) return 'isSqs';

@jeshan
Copy link
Author

jeshan commented Dec 10, 2019

Guys, this slipped under my radar. I don't know why github does not send notifications for gists.
silvav: if it's still relevant for you, then yes you can use it under public domain.
CowChris: thanks, I'll add it

@pauloapi
Copy link

pauloapi commented May 7, 2020

For Python: You can check this out https://gist.github.com/Necromancerx/abed07138690d37d170a6cf15b40d749. This is just based on your gist. Thank you.

@Cevinlo88
Copy link

Would you kindly add a if statement for a lambda being triggered by application load balancer?

@pauloapi
Copy link

pauloapi commented Feb 2, 2021

For API Gateway HTTP:

if (event.requestContext && event.requestContext.resourceId) return 'isApiGatewayHttp';

@jeremy-brooks
Copy link

jeremy-brooks commented Jun 14, 2022

This is probably not the best idea as it relies on AWS implementation details which may change.

@gpmilliken
Copy link

Interesting and useful. I have struggled with the best approach to knowing my invoker. Although this may not persist well over time it is better than putting a caller flag in the payload. The only other option I see is multiple similar functions, which leads to logic sprawl but avoids the conditional overhead.

@gpmilliken
Copy link

For SQS add this

elif 'Records' in event and len(event['Records']) > 0 and 'eventSource' in event['Records'][0] and event['Records'][0]['eventSource'] == 'aws:sqs':
return 'sqs'

@bullett445
Copy link

if (event.requestContext.elb.targetGroupArn) return 'is ALBEvent'

@jonathan-dowling
Copy link

if (event.source === 'aws.scheduler') return 'isScheduler';

@magnuslidman
Copy link

This is awesome! this should be an NPM module - are you planning to do this? (Or if not, are you ok with me adding it? I would attribute it to you and put a link to this page)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment