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 - 如何创建主题过滤器的主要内容,如果未能解决你的问题,请参考以下文章