如何用Serverless Framework创建以Kinesis Firehose为触发源的Lambda
Kinesis Data Firehose作为Lambda事件源的配置方案
问题解答
Kinesis Data Firehose完全可以作为Lambda的事件触发源,主要用于数据转换场景:Firehose在将数据投递至目标存储(如S3、Redshift等)前,会调用Lambda对数据进行预处理。
你当前配置报错的原因是:Serverless Framework内置的stream事件类型仅支持Kinesis数据流(Kinesis Data Streams)、DynamoDB流和SQS,无法直接识别Kinesis Data Firehose的ARN,因此需要通过自定义CloudFormation资源来配置关联。
正确配置方式
1. 基础配置(关联已存在的Firehose交付流)
通过Serverless Framework的resources块手动创建Lambda事件源映射,并赋予Firehose调用Lambda的权限:
service: firehose-lambda-transformer provider: name: aws runtime: nodejs18.x # 替换为你的Lambda运行时 region: us-east-1 # 替换为你的AWS区域 iamRoleStatements: - Effect: Allow Action: lambda:InvokeFunction Resource: !GetAtt TransformerLambdaFunction.Arn Principal: Service: firehose.amazonaws.com functions: transformer: handler: index.handler resources: Resources: FirehoseLambdaEventMapping: Type: AWS::Lambda::EventSourceMapping Properties: EventSourceArn: "arn:aws:firehose:us-east-1:123456789012:deliverystream/your-firehose-name" # 替换为你的Firehose ARN FunctionName: !GetAtt TransformerLambdaFunction.Arn Enabled: true
2. 进阶配置(同时创建Firehose交付流与Lambda关联)
如果需要通过Serverless Framework一并创建Firehose交付流,可以在resources中定义Firehose资源并配置其处理规则:
service: firehose-lambda-transformer provider: name: aws runtime: nodejs18.x region: us-east-1 iamRoleStatements: - Effect: Allow Action: lambda:InvokeFunction Resource: !GetAtt TransformerLambdaFunction.Arn Principal: Service: firehose.amazonaws.com functions: transformer: handler: index.handler resources: Resources: MyFirehoseDeliveryStream: Type: AWS::KinesisFirehose::DeliveryStream Properties: DeliveryStreamType: DirectPut ProcessingConfiguration: Enabled: true Processors: - Type: Lambda Parameters: - ParameterName: LambdaArn ParameterValue: !GetAtt TransformerLambdaFunction.Arn # 配置Firehose目标存储(示例为S3) S3DestinationConfiguration: BucketARN: "arn:aws:s3:::your-bucket-name" RoleARN: !GetAtt FirehoseDeliveryRole.Arn FirehoseDeliveryRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: firehose.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: FirehoseDeliveryPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - s3:PutObject Resource: "arn:aws:s3:::your-bucket-name/*"
关键要点
- 必须为Lambda的执行角色添加权限,允许Firehose服务调用该Lambda函数,否则触发会失败。
- 使用
AWS::Lambda::EventSourceMapping或Firehose的ProcessingConfiguration均可建立关联,选择哪种方式取决于是否需要同时创建Firehose交付流。
配置完成后,执行sls deploy即可完成部署。
内容的提问来源于stack exchange,提问作者Kate B
相关产品推荐
相关产品推荐

