【问题标题】:AWS SQS - CDK - how to create topic filterAWS SQS - CDK - 如何创建主题过滤器
【发布时间】:2022-01-18 08:21:39
【问题描述】:

我能够创建一个 SQS 队列 + lambda 函数并通过触发器/订阅连接它们。

如何通过 CDK 创建主题过滤器?

我可以像这样创建主题、lambda 和触发器/订阅:

const queue = new sqs.Queue(this, 'OurSqsQueue', {
  queueName: 'OurSQSQueue',
});
const lambdaFunction = new lambda.Function(this,'test', {
       code: lambda.Code.fromAsset('src'),
       handler: index.lambdaHandler,
       functionName: 'test',
       runtime: lambda.Runtime.NODEJS_14_X,
     });

const eventSource = new lambdaEventSources.SqsEventSource(queue);
lambdaFunction.addEventSource(eventSource);

According to the docs Amazon SQS 主题订阅者接收发布到该主题的每条消息。要接收消息的子集,订阅者必须为主题订阅分配过滤策略。

【问题讨论】:

    标签: amazon-web-services aws-cdk


    【解决方案1】:

    针对 SQS、DynamoDB 和 Kinesis 事件源的 Lambda 事件过滤为 announced last month,但在 CDK 中尚不支持。 github上有open feature request

    与此同时,我们可以使用escape hatch 在底层CfnEventSourceMapping Construct 上设置过滤器。

    这是一个最小的工作示例:

    export class LambdaEventFilterEscape extends cdk.Stack {
      constructor(scope: Construct, id: string, props: cdk.StackProps) {
        super(scope, id, props);
    
        const func = new lambda.Function(this, 'MyFunction', {
          code: new lambda.InlineCode('exports.handler = async (event) => console.log(event)'),
          runtime: lambda.Runtime.NODEJS_14_X,
          handler: 'index.handler',
        });
    
        const queue = new sqs.Queue(this, 'MyQueue');
        queue.grantConsumeMessages(func);
    
        const source = new lambda.EventSourceMapping(this, 'EventSourceMapping', {
          target: func,
          eventSourceArn: queue.queueArn,
        });
    
        // escape hatch
        const cfnSouce = source.node.defaultChild as lambda.CfnEventSourceMapping;
    
        cfnSouce.addPropertyOverride('FilterCriteria', {
          // https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html#filtering-syntax
          Filters: [{ Pattern: `{\"body\": { \"Data\" : { \"Name\": [\"Zaphod\", \"Ford\" ] }}}` }],
        });
      }
    }
    

    【讨论】:

      【解决方案2】:

      AWS SQS 和 SNS 是不同的服务。 SQS 有队列,SNS 有主题。

      我假设您确实在谈论 SQS。直到两周前,this was added 才能过滤 SQS 队列。

      CDK 中尚未实现对该功能的支持。

      我不完全确定 CloudFormation 是否支持这一点,但您可以尝试使用低级 CfnEventSourceMapping 资源,这里是 CloudFormation docs

      【讨论】:

        猜你喜欢
        • 2022-10-02
        • 2021-06-24
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 2022-11-21
        • 2020-03-30
        • 2020-09-17
        • 2016-08-18
        相关资源
        最近更新 更多