亚马逊简单通知服务构建库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
在您的堆栈中添加 SNS 主题 :
const topic = new sns.Topic(this, 'Topic', {
displayName: 'Customer subscription topic',
});
在您的堆栈中添加一个基于内容的 FIFO SNS 主题 :
const topic = new sns.Topic(this, 'Topic', {
contentBasedDeduplication: true,
displayName: 'Customer subscription topic',
fifo: true,
topicName: 'customerTopic',
});
注意FIFO专题需要提供主题名称. 所需数额 .fifo 如果未明确提供,后缀将自动被添加到主题名称中.
订阅
可通过拨打
.addSubscription(...) 专题方法。 它接受一个 订阅 对象,
默认执行,可在
@aws-cdk/aws-sns-subscriptions 软件包 :
在您的话题中添加 HTTPS 订阅 :
const myTopic = new sns.Topic(this, 'MyTopic');
myTopic.addSubscription(new subscriptions.UrlSubscription('https://foobar.com/'));
订阅主题的队列 :
declare const queue: sqs.Queue;
const myTopic = new sns.Topic(this, 'MyTopic');
myTopic.addSubscription(new subscriptions.SqsSubscription(queue));
注意不同账户中队列的订阅需要手动确认 读取队列中的初始信件并访问其中找到的链接.
过滤策略
在一个主题的结尾签名时可以指定过滤策略 .
Lambda 订阅的示例 :
import * as lambda from '@aws-cdk/aws-lambda';
const myTopic = new sns.Topic(this, 'MyTopic');
declare const fn: lambda.Function;
// Lambda should receive only message matching the following conditions on attributes:
// color: 'red' or 'orange' or begins with 'bl'
// size: anything but 'small' or 'medium'
// price: between 100 and 200 or greater than 300
// store: attribute must be present
myTopic.addSubscription(new subscriptions.LambdaSubscription(fn, {
filterPolicy: {
color: sns.SubscriptionFilter.stringFilter({
allowlist: ['red', 'orange'],
matchPrefixes: ['bl'],
}),
size: sns.SubscriptionFilter.stringFilter({
denylist: ['small', 'medium'],
}),
price: sns.SubscriptionFilter.numericFilter({
between: { start: 100, stop: 200 },
greaterThan: 300,
}),
store: sns.SubscriptionFilter.existsFilter(),
},
}));
Firehose 订阅示例
import { DeliveryStream } from '@aws-cdk/aws-kinesisfirehose';
const topic = new sns.Topic(this, 'Topic');
declare const stream: DeliveryStream;
new sns.Subscription(this, 'Subscription', {
topic,
endpoint: stream.deliveryStreamArn,
protocol: sns.SubscriptionProtocol.FIREHOSE,
subscriptionRoleArn: "SAMPLE_ARN", //role with permissions to send messages to a firehose delivery stream
});
SNS 订阅的 DLQ 设置
CDK可以为您的 SNS 订阅提供作为 DLQ 的队列 . 见 SNS DLQ 配置文件 以获取关于此特性的更多信息.
用户提供的DLQ使用实例.
const topic = new sns.Topic(this, 'Topic');
const dlQueue = new sqs.Queue(this, 'DeadLetterQueue', {
queueName: 'MySubscription_DLQ',
retentionPeriod: Duration.days(14),
});
new sns.Subscription(this, 'Subscription', {
endpoint: 'endpoint',
protocol: sns.SubscriptionProtocol.LAMBDA,
topic,
deadLetterQueue: dlQueue,
});
云表事件规则目标
SNS主题可以作为"云表"事件规则的目标.
使用 @aws-cdk/aws-events-targets.SnsTopic数字 :
import * as codecommit from '@aws-cdk/aws-codecommit';
import * as targets from '@aws-cdk/aws-events-targets';
declare const repo: codecommit.Repository;
const myTopic = new sns.Topic(this, 'Topic');
repo.onCommit('OnCommit', {
target: new targets.SnsTopic(myTopic),
});
这将导致在事件规则中添加一个目标,并将修改 主题资源政策允许 Cloud Watch 事件针对主题发布 .
专题政策
当 addToResourcePolicy 如果
已经不存在了 使用 addToResourcePolicy 最简单的方式
添加政策,但一个 TopicPolicy 也可以手动创建.
const topic = new sns.Topic(this, 'Topic');
const topicPolicy = new sns.TopicPolicy(this, 'TopicPolicy', {
topics: [topic],
});
topicPolicy.document.addStatements(new iam.PolicyStatement({
actions: ["sns:Subscribe"],
principals: [new iam.AnyPrincipal()],
resources: [topic.topicArn],
}));
政策文件也可通过 TopicPolicy 建筑业
const topic = new sns.Topic(this, 'Topic');
const policyDocument = new iam.PolicyDocument({
assignSids: true,
statements: [
new iam.PolicyStatement({
actions: ["sns:Subscribe"],
principals: [new iam.AnyPrincipal()],
resources: [topic.topicArn],
}),
],
});
const topicPolicy = new sns.TopicPolicy(this, 'Policy', {
topics: [topic],
policyDocument,
});