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 主题订阅者接收发布到主题的每条消息。要接收消息的子集,订阅者必须为主题订阅分配过滤策略。
AWS 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\" ] }}}` }],
});
}
}
我能够创建 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 主题订阅者接收发布到主题的每条消息。要接收消息的子集,订阅者必须为主题订阅分配过滤策略。
AWS 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\" ] }}}` }],
});
}
}