AWS CDK配置嵌套SNS订阅过滤策略报错求助
解决AWS CDK配置SNS订阅过滤策略的类型错误
问题背景
我在测试账户中手动配置了SNS订阅过滤策略,仅将S3特定子文件夹(test/test1)下的ObjectCreated类事件发送至SQS队列,策略运行完全符合预期,手动配置的JSON如下:
{ "Records": { "s3": { "object": { "key": [ { "prefix": "test/test1" } ] } }, "eventName": [ { "prefix": "ObjectCreated:" } ] } }
但尝试用AWS CDK代码实现相同策略时触发类型错误,CDK代码:
topic.addSubscription(new subs.SqsSubscription(queue, { filterPolicyWithMessageBody: { "Records": { "s3": { "object": { "key": [ { "prefix": "test/test1" } ] } }, "eventName": [ { "prefix": "ObjectCreated:" } ] } } }))
错误信息:
Type '{ s3: { object: { key: { prefix: string; }[]; }; }; eventName: { prefix: string; }[]; }' is not assignable to type 'FilterOrPolicy'. Object literal may only specify known properties, and 's3' does not exist in type 'FilterOrPolicy'.
解决方案
CDK的filterPolicyWithMessageBody要求使用AWS CDK提供的FilterCondition类构建过滤条件,不能直接传入原始JSON结构的字面量(TypeScript类型系统会拦截非预期结构)。修正后的代码如下:
import { FilterCondition } from 'aws-cdk-lib/aws-sns'; // ... 其他业务代码 topic.addSubscription(new subs.SqsSubscription(queue, { filterPolicyWithMessageBody: { "Records": FilterCondition.all( FilterCondition.isObject({ "s3": FilterCondition.isObject({ "object": FilterCondition.isObject({ "key": FilterCondition.prefix("test/test1") }) }), "eventName": FilterCondition.prefix("ObjectCreated:") }) ) } }));
关键说明
- 用
FilterCondition.isObject()定义嵌套对象结构,对应手动策略中的层级关系 - 用
FilterCondition.prefix()创建前缀匹配条件,替代手动JSON里的{ "prefix": "xxx" }格式 - 用
FilterCondition.all()组合多个条件(默认逻辑与,和手动策略的预期一致)
此配置会生成与手动设置完全一致的过滤策略,同时通过TypeScript的类型检查。
内容的提问来源于stack exchange,提问作者Asim
相关产品推荐
相关产品推荐

