AWS SQS - CDK - 如何创建主题过滤器

AWS SQS - CDK - how to create topic filter

我能够创建 SQS 队列 + lambda 函数并通过 trigger/subscription 连接它们。

如何通过 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 主题订阅者接收发布到主题的每条消息。要接收消息的子集,订阅者必须为主题订阅分配过滤策略。

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

我假设您确实在谈论 SQS。直到两周前 this was added.

之前,过滤 SQS 队列是不可能的

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

目前我不完全确定 CloudFormation 是否完全支持此功能,但您可以尝试使用低级别 CfnEventSourceMapping resource, here are the CloudFormation docs 来实现它。

SQS、DynamoDB 和 Kinesis 事件源的 Lambda 事件过滤在 github 上 announced last month, but is not yet supported in the CDK. There is an open feature request

同时,我们可以使用escape hatch来 在底层 CfnEventSourceMapping 构造上设置过滤器。

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

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\" ] }}}` }],
    });
  }
}