-
Notifications
You must be signed in to change notification settings - Fork 3.9k
/
publish-to-topic.ts
86 lines (75 loc) · 2.85 KB
/
publish-to-topic.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import iam = require('@aws-cdk/aws-iam');
import sns = require('@aws-cdk/aws-sns');
import sfn = require('@aws-cdk/aws-stepfunctions');
import { resourceArnSuffix } from './resource-arn-suffix';
/**
* Properties for PublishTask
*/
export interface PublishToTopicProps {
/**
* The text message to send to the topic.
*/
readonly message: sfn.TaskInput;
/**
* If true, send a different message to every subscription type
*
* If this is set to true, message must be a JSON object with a
* "default" key and a key for every subscription type (such as "sqs",
* "email", etc.) The values are strings representing the messages
* being sent to every subscription type.
*
* @see https://docs.aws.amazon.com/sns/latest/api/API_Publish.html#API_Publish_RequestParameters
*/
readonly messagePerSubscriptionType?: boolean;
/**
* Message subject
*/
readonly subject?: string;
/**
* The service integration pattern indicates different ways to call Publish to SNS.
*
* The valid value is either FIRE_AND_FORGET or WAIT_FOR_TASK_TOKEN.
*
* @default FIRE_AND_FORGET
*/
readonly integrationPattern?: sfn.ServiceIntegrationPattern;
}
/**
* A Step Functions Task to publish messages to SNS topic.
*
* A Function can be used directly as a Resource, but this class mirrors
* integration with other AWS services via a specific class instance.
*/
export class PublishToTopic implements sfn.IStepFunctionsTask {
private readonly integrationPattern: sfn.ServiceIntegrationPattern;
constructor(private readonly topic: sns.ITopic, private readonly props: PublishToTopicProps) {
this.integrationPattern = props.integrationPattern || sfn.ServiceIntegrationPattern.FIRE_AND_FORGET;
const supportedPatterns = [
sfn.ServiceIntegrationPattern.FIRE_AND_FORGET,
sfn.ServiceIntegrationPattern.WAIT_FOR_TASK_TOKEN
];
if (!supportedPatterns.includes(this.integrationPattern)) {
throw new Error(`Invalid Service Integration Pattern: ${this.integrationPattern} is not supported to call SNS.`);
}
if (this.integrationPattern === sfn.ServiceIntegrationPattern.WAIT_FOR_TASK_TOKEN) {
if (!sfn.FieldUtils.containsTaskToken(props.message)) {
throw new Error('Task Token is missing in message (pass Context.taskToken somewhere in message)');
}
}
}
public bind(_task: sfn.Task): sfn.StepFunctionsTaskConfig {
return {
resourceArn: 'arn:aws:states:::sns:publish' + resourceArnSuffix.get(this.integrationPattern),
policyStatements: [new iam.PolicyStatement({
actions: ['sns:Publish'],
resources: [this.topic.topicArn]
})],
parameters: {
TopicArn: this.topic.topicArn,
Message: this.props.message.value,
MessageStructure: this.props.messagePerSubscriptionType ? "json" : undefined,
Subject: this.props.subject,
}
};
}
}