-
Notifications
You must be signed in to change notification settings - Fork 0
/
sns-sqs.template.yaml
166 lines (148 loc) · 6.18 KB
/
sns-sqs.template.yaml
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
###
### To execute this script you can:
###
### 1. Use the AWS console -> Cloudformation -> Create Stack
###
### or
###
### 2. Use the awscli command line tool:
###
### $ aws cloudformation create-stack \
### --stack-name my-sample-sns-sqs \
### --template-body file:https://sns-sqs.template.yaml \
### --parameters file:https://sample.param.json
###
###
### A parameter file must be in the following format:
###
### [
### { "ParameterKey": "TopicName" , "ParameterValue": "sample" },
### { "ParameterKey": "Tag1Key" , "ParameterValue": "App" },
### { "ParameterKey": "Tag1Value" , "ParameterValue": "sample" },
### { "ParameterKey": "Tag2Key" , "ParameterValue": "Env" },
### { "ParameterKey": "Tag2Value" , "ParameterValue": "test" },
### { "ParameterKey": "QueueRetentionPeriod" , "ParameterValue": "1209600" },
### { "ParameterKey": "QueueAlarmDepth" , "ParameterValue": "10000" }
### ]
###
AWSTemplateFormatVersion: "2010-09-09"
Description: "SNS/SQS/Messaging: with dead letter and depth alarm"
Parameters:
TopicName: { Type: String , Default: sample-topic-for-test , Description: "Name for topic/queue" }
Tag1Key: { Type: String , Default: App , Description: "Key for Tag1: App=sample" }
Tag1Value: { Type: String , Default: sample , Description: "Value for Tag1: App=sample" }
Tag2Key: { Type: String , Default: Env , Description: "Key for Tag2: Env=test" }
Tag2Value: { Type: String , Default: test , Description: "Value for Tag2: Env=test" }
QueueRetentionPeriod: { Type: Number , Default: 1209600 , MinValue: 50 , MaxValue: 1209600 , Description: "SQS MessageRetentionPeriod in seconds (Default: 14d)" }
QueueVisibilityTimeout: { Type: Number , Default: 60 , MinValue: 0 , MaxValue: 43200 , Description: "SQS VisibilityTimeout in seconds. (Default: 60s)" }
QueueReceiveMessageWaitTime: { Type: Number , Default: 5 , MinValue: 0 , MaxValue: 20 , Description: "SQS ReceiveMessageWaitTime in seconds (LongPolling: 5s)" }
QueueMaxReceiveCount: { Type: Number , Default: 5 , MinValue: 3 , MaxValue: 100 , Description: "SQS MaxReceiveCount (Move to DeadLetter if gt count)" }
QueueAlarmDepth: { Type: Number , Default: 10000 , MinValue: 100 , MaxValue: 1000000 , Description: "SQS Alarm if msgs in queue grows beyond this count" }
Resources:
###
### SNS
### https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html
###
MySNSTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: !Ref TopicName
DisplayName: !Ref TopicName
Subscription:
- { "Protocol":"sqs", "Endpoint": !GetAtt [ "MySQSQueue" , "Arn" ] }
###
### SQS
### https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-queues.html
###
# VisibilityTimeout RetentionPeriod ReceiveMessageWaitTime
# ------------------- ------------------------- ----------------------
# 0s Min: 60s - 1m 0s
# 43200s - 12h Max: 1209600s - 14d 20s
# 30s Default: 345600s - 4d 0s
#
MySQSQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Ref TopicName
VisibilityTimeout: !Ref QueueVisibilityTimeout
MessageRetentionPeriod: !Ref QueueRetentionPeriod
ReceiveMessageWaitTimeSeconds: !Ref QueueReceiveMessageWaitTime
RedrivePolicy:
deadLetterTargetArn: !GetAtt [ "MySQSDeadLetter", "Arn" ]
maxReceiveCount: !Ref QueueMaxReceiveCount
Tags:
- { "Key" : !Ref Tag1Key, "Value" : !Ref Tag1Value }
- { "Key" : !Ref Tag2Key, "Value" : !Ref Tag2Value }
# Ref:
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-iam.html
#
MyQueuePolicy:
Type: AWS::SQS::QueuePolicy
Properties:
PolicyDocument:
Id: MyQueuePolicy
Statement:
-
Sid: "Allow-SQSSendMessage-From-SNSTopic"
Effect: "Allow"
Action: "sqs:SendMessage"
Resource: !GetAtt [ "MySQSQueue" , "Arn" ]
Principal: { "Service":"sns.amazonaws.com" }
Condition:
ArnEquals: { "aws:SourceArn": !Ref MySNSTopic }
Queues:
- !Ref MySQSQueue
# k
# Ref:
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-alarm.html#cfn-cloudwatch-alarms-okactions
#
MyQueueDepthAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Join [ '-', [ "sqs-alarm", !Ref TopicName ] ]
AlarmDescription: "Alarm if queue depth grows beyond 'n' messages"
Namespace: "AWS/SQS"
MetricName: "ApproximateNumberOfMessagesVisible"
Dimensions:
-
Name: "QueueName"
Value: !GetAtt [ "MySQSQueue", "QueueName" ]
Statistic: "Sum"
Period: "300"
EvaluationPeriods: "1"
Threshold: !Ref QueueAlarmDepth
ComparisonOperator: "GreaterThanThreshold"
# OkActions:
# - !Ref AlarmTopic
# AlarmActions:
# - !Ref AlarmTopic
# InsufficientDataActions:
# - !Ref AlarmTopic
###
### SQS Dead Letter
### https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html
###
MySQSDeadLetter:
Type: AWS::SQS::Queue
Properties:
QueueName: !Join [ '-', [ !Ref TopicName, "dl" ] ]
MessageRetentionPeriod: 1209600
Tags:
- { "Key" : !Ref Tag1Key, "Value" : !Ref Tag1Value }
- { "Key" : !Ref Tag2Key, "Value" : !Ref Tag2Value }
MySQSDeadLetterDepthAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Join [ '-', [ "sqs-dl-alarm", !Ref TopicName ] ]
AlarmDescription: "Alarm if dead letter queue gets any message"
Namespace: "AWS/SQS"
MetricName: "ApproximateNumberOfMessagesVisible"
Dimensions:
-
Name: "QueueName"
Value: !GetAtt [ "MySQSDeadLetter", "QueueName" ]
Statistic: "Sum"
Period: "300"
EvaluationPeriods: "1"
Threshold: "1"
ComparisonOperator: "GreaterThanThreshold"