我能否确定哪个 AWS 服务触发了我的 Lambda 函数?

oro*_*ome 7 amazon-web-services alexa aws-lambda aws-iot

我有一个 Python Lambda 函数,可以同时响应 IoT Button 和 Alexa 技能。

有没有办法读取eventcontext传递给处理程序函数以识别哪个服务触发了该函数(Alexa 或 IoT)?

小智 6

希望 AWS 现在已经简化了这一点,但遗憾的是事实并非如此。没有任何一个参数可供您检查以确定所有 AWS 服务中的事件类型。

然而,在这里找到了这个很好的表达

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';

}
Run Code Online (Sandbox Code Playgroud)


oro*_*ome 3

没有办法可靠地实现这一点。您能得到的最接近的结果是熟悉不同服务生成的各种事件的内容,并(希望)识别出您感兴趣的每个系列中存在的可靠唯一密钥,然后您可以在代码中检查该密钥,例如与

if 'distinctKey' in event.keys():
    # ...
Run Code Online (Sandbox Code Playgroud)

然而,这并不是一个可靠的方法,因为它要求您

  1. 检查每个潜在服务生成的每个可能的事件结构,并且
  2. 成功并自信地为每个感兴趣的服务识别一个或一组密钥,该密钥或一组密钥始终可靠地存在于服务的事件中并且对于它们来说是唯一的