2017-01-23 57 views
2

我想知道函數中lambda函數的事件源。如何知道lambda函數本身的事件源

我想要做的是從某些AWS服務(CloudWatch,S3,Step功能等)使用一個lambda函數,並根據服務更改其行爲。

上下文對象(函數的參數之一)具有關於lambda函數的信息,但不包含關於事件源的信息。

有沒有辦法知道?

+0

目前,我不認爲你可以,但即使你這樣做,如果Lambda函數必須處理多個事件源,它也很難維護。如果你想擁有一個可擴展和可維護的應用程序,爲每個事件源分配一個函數會更好。 –

+0

@KhalidT。謝謝你的提議。 – horihiro

回答

3

如果你已經確定室壁運動或DynamoDB流作爲lambda函數與API

aws lambda create-event-source-mapping 

事件源,那麼你可以讓他們與

aws lambda list-event-source-mappings 

如果你不這樣做,那麼你可以用如下函數做出最佳猜測:

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

 
}

我說這是一個最佳猜測,因爲像API網關請求這樣的事件源可能會發送任何東西。如果你確定你不會有這樣的情況,那麼上面的函數可以做到這一點。

相關問題