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

Posted

技术标签:

【中文标题】AWS SQS - CDK - 如何创建主题过滤器【英文标题】:AWS SQS - CDK - how to create topic filter 【发布时间】: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 主题订阅者接收发布到该主题的每条消息。要接收消息的子集,订阅者必须为主题订阅分配过滤策略。

【问题讨论】:

【参考方案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 。

【讨论】:

以上是关于AWS SQS - CDK - 如何创建主题过滤器的主要内容,如果未能解决你的问题,请参考以下文章

到 Kafka 的 AWS Sqs 源连接器

AWS CDK - 角色和策略创建

如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

AWS CDK - 云观察

如何覆盖 AWS CDK 中的资源?

aws cloudformation 模板 sns sqs