我可以确定哪个AWS服务触发了我的Lambda函数吗?

时间:2017-03-02 17:40:02

标签: amazon-web-services aws-lambda alexa aws-iot

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

有没有办法阅读递交给处理函数的eventcontext以确定哪个服务触发了该函数(Alexa或IoT)?

3 个答案:

答案 0 :(得分:2)

希望到目前为止AWS可以简化此操作,但遗憾的是事实并非如此。您无法检查任何一个参数来确定所有AWS服务中的事件类型。

但是,在网上here发现了这种清晰的发音

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

}

答案 1 :(得分:1)

无法可靠地实现这一目标。您可以获得的最接近的是熟悉不同服务生成的各种事件的内容,并(希望)识别您感兴趣的每个系列中存在的可靠唯一键,然后您可以在代码中检查,例如与

if 'distinctKey' in event.keys():
    # ...

然而,这不是一种可靠的方法,因为它需要你

  1. 检查每个潜在服务生成的每个可能的事件结构
  2. 成功且自信地为每个感兴趣的服务确定服务事件中始终可靠地出现并且唯一的密钥或密钥集。

答案 2 :(得分:0)

您可以在Cloudwatch中阅读和记录事件,如下所示

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def my_logging_handler(event, context):
logger.info('got event{}'.format(event))

这将在您看到的云监视中记录事件数据,并确定触发lambda的事件