1
- # -------------------------------------------------------------------------------------------------------------
1
+ # -----------------------------------------------------------------
2
2
# AWS SNS TO CLOUDWATCH LOGS LAMBDA GATEWAY
3
- # -------------------------------------------------------------------------------------------------------------
3
+ # -----------------------------------------------------------------
4
4
5
- # Only tested on Terraform 0.11.1+
6
5
terraform {
7
- required_version = " >= 0.11.1 "
6
+ required_version = " ~> 0.11.7 "
8
7
}
9
8
10
- # -------------------------------------------------------------------------------------------------------------
9
+ # -----------------------------------------------------------------
11
10
# CREATE LAMBDA FUNCTION - SNS TO CLOUDWATCH LOGS GATEWAY
12
- # environment variables used for the log_group and log_stream so they aren't hardcoded into the function
13
- # function can be published (versioned) by setting the optional lambda_publish_func flag
14
- # -------------------------------------------------------------------------------------------------------------
11
+ # environment variables used for the ' log_group' and ' log_stream'
12
+ # function published if ' lambda_publish_func' set
13
+ # -----------------------------------------------------------------
15
14
16
15
resource "aws_lambda_function" "sns_cloudwatchlog" {
17
16
function_name = " ${ var . lambda_func_name } "
@@ -36,72 +35,69 @@ resource "aws_lambda_function" "sns_cloudwatchlog" {
36
35
}
37
36
}
38
37
39
- # -------------------------------------------------------------------------------------------------------------
38
+ # -----------------------------------------------------------------
40
39
# SNS TOPIC
41
- # create new topic if create_sns_topic == true
42
- # otherwise retrieve existing topic metadata
43
- # topic arn used in "lambda_permssion" and "aws_sns_topic_subscription"
44
- # -------------------------------------------------------------------------------------------------------------
40
+ # create new topic (if create_sns_topic set), else use existing topic
41
+ # arn referenced by "lambda_permssion" and "aws_sns_topic_subscription"
42
+ # -----------------------------------------------------------------
45
43
46
44
# create if specified
47
45
resource "aws_sns_topic" "sns_log_topic" {
48
46
count = " ${ var . create_sns_topic ? 1 : 0 } "
49
47
name = " ${ var . sns_topic_name } "
50
48
}
51
49
52
- # find existing if not creating
50
+ # retrieve topic if not created, arn referenced
53
51
data "aws_sns_topic" "sns_log_topic" {
54
52
count = " ${ var . create_sns_topic ? 0 : 1 } "
55
53
name = " ${ var . sns_topic_name } "
56
54
}
57
55
58
- # -------------------------------------------------------------------------------------------------------------
56
+ # -----------------------------------------------------------------
59
57
# CLOUDWATCH LOG GROUP
60
- # create new log_group if create_log_group == true
61
- # -------------------------------------------------------------------------------------------------------------
58
+ # create new log_group ( if create_log_group set)
59
+ # -----------------------------------------------------------------
62
60
63
61
resource "aws_cloudwatch_log_group" "sns_logged_item_group" {
64
62
count = " ${ var . create_log_group ? 1 : 0 } "
65
63
name = " ${ var . log_group_name } "
66
64
retention_in_days = " ${ var . log_group_retention_days } "
67
65
}
68
66
69
- # retrieve metadata for log group if no created, so arn can be included in outputs
67
+ # retrieve log group if not created, arn included in outputs
70
68
data "aws_cloudwatch_log_group" "sns_logged_item_group" {
71
69
count = " ${ var . create_log_group ? 0 : 1 } "
72
70
name = " ${ var . log_group_name } "
73
71
}
74
72
75
- # -------------------------------------------------------------------------------------------------------------
76
- # CLOUDWATCH LOG STREAM IF create_log_stream == true
77
- # stream created in log_group specified or created
78
- # -------------------------------------------------------------------------------------------------------------
73
+ # -----------------------------------------------------------------
74
+ # CLOUDWATCH LOG STREAM
75
+ # created new log stream (if create_log_stream set)
76
+ # -----------------------------------------------------------------
79
77
78
+ # create stream in log_group previously created or specified
80
79
resource "aws_cloudwatch_log_stream" "sns_logged_item_stream" {
81
80
count = " ${ var . create_log_stream ? 1 : 0 } "
82
81
name = " ${ var . log_stream_name } "
83
82
log_group_name = " ${ var . create_log_group ? join (" " , aws_cloudwatch_log_group. sns_logged_item_group . * . name ) : var . log_group_name } "
84
83
}
85
84
86
- # -------------------------------------------------------------------------------------------------------------
85
+ # -----------------------------------------------------------------
87
86
# SUBSCRIBE LAMBDA FUNCTION TO SNS TOPIC
88
- # Lambda function subscription to sns topic
89
- # -------------------------------------------------------------------------------------------------------------
87
+ # -----------------------------------------------------------------
90
88
91
89
resource "aws_sns_topic_subscription" "lambda" {
92
90
topic_arn = " ${ var . create_sns_topic ? join (" " , aws_sns_topic. sns_log_topic . * . arn ) : join (" " , data. aws_sns_topic . sns_log_topic . * . arn )} "
93
91
protocol = " lambda"
94
- endpoint = " ${ var . lambda_publish_func ? aws_lambda_function . sns_cloudwatchlog . qualified_arn : aws_lambda_function . sns_cloudwatchlog . arn } "
92
+ endpoint = " ${ var . lambda_publish_func ? aws_lambda_function . sns_cloudwatchlog . qualified_arn : aws_lambda_function . sns_cloudwatchlog . arn } "
95
93
}
96
94
97
- # -------------------------------------------------------------------------------------------------------------
98
- # ENABLE SNS TOPIC AS LAMBDA FUNCTION TRIGGER
99
- # use multiple resource blocks as condition parameters aren't possible until Terraform v0.12.0
100
- # -------------------------------------------------------------------------------------------------------------
101
-
102
95
# -----------------------------------------------------------------
103
- # function published - "qualifier" parameter set to function version
96
+ # ENABLE SNS TOPIC AS LAMBDA FUNCTION TRIGGER
97
+ # multiple resource blockss until 'null' parameter feature in Terraform v0.12.0
104
98
# -----------------------------------------------------------------
99
+
100
+ # function published - "qualifier" set to function version
105
101
resource "aws_lambda_permission" "sns_cloudwatchlog_published" {
106
102
count = " ${ var . lambda_publish_func ? 1 : 0 } "
107
103
statement_id = " AllowExecutionFromSNS"
@@ -112,9 +108,7 @@ resource "aws_lambda_permission" "sns_cloudwatchlog_published" {
112
108
qualifier = " ${ aws_lambda_function . sns_cloudwatchlog . version } "
113
109
}
114
110
115
- # -----------------------------------------------------------------
116
- # function not published - "qualifier" parameter not be set
117
- # -----------------------------------------------------------------
111
+ # function not published - dont specify "qualifier" parameter
118
112
resource "aws_lambda_permission" "sns_cloudwatchlog" {
119
113
count = " ${ var . lambda_publish_func ? 0 : 1 } "
120
114
statement_id = " AllowExecutionFromSNS"
@@ -124,30 +118,24 @@ resource "aws_lambda_permission" "sns_cloudwatchlog" {
124
118
source_arn = " ${ var . create_sns_topic ? join (" " , aws_sns_topic. sns_log_topic . * . arn ) : join (" " , data. aws_sns_topic . sns_log_topic . * . arn )} "
125
119
}
126
120
127
- # -------------------------------------------------------------------------------------------------------------
121
+ # -------------------------------------------------------------------------------------
128
122
# CREATE IAM ROLE AND POLICIES FOR LAMBDA FUNCTION
129
- # -------------------------------------------------------------------------------------------------------------
123
+ # -------------------------------------------------------------------------------------
130
124
131
- # -----------------------------------------------------------------
132
- # Create base IAM role
133
- # -----------------------------------------------------------------
125
+ # Create IAM role
134
126
resource "aws_iam_role" "lambda_cloudwatch_logs" {
135
127
name = " lambda_${ lower (var. lambda_func_name )} "
136
128
assume_role_policy = " ${ data . aws_iam_policy_document . lambda_cloudwatch_logs . json } "
137
129
}
138
130
139
- # -----------------------------------------------------------------
140
- # Add policy enabling access to other AWS services
141
- # -----------------------------------------------------------------
131
+ # Add base Lambda Execution policy
142
132
resource "aws_iam_role_policy" "lambda_cloudwatch_logs_polcy" {
143
133
name = " lambda_${ lower (var. lambda_func_name )} _policy"
144
134
role = " ${ aws_iam_role . lambda_cloudwatch_logs . id } "
145
135
policy = " ${ data . aws_iam_policy_document . lambda_cloudwatch_logs_policy . json } "
146
136
}
147
137
148
- # -----------------------------------------------------------------
149
- # JSON POLICY - execution
150
- # -----------------------------------------------------------------
138
+ # JSON POLICY - assume role
151
139
data "aws_iam_policy_document" "lambda_cloudwatch_logs" {
152
140
statement {
153
141
actions = [" sts:AssumeRole" ]
@@ -159,9 +147,7 @@ data "aws_iam_policy_document" "lambda_cloudwatch_logs" {
159
147
}
160
148
}
161
149
162
- # -----------------------------------------------------------------
163
- # JSON POLICY - enable access to other AWS services
164
- # -----------------------------------------------------------------
150
+ # JSON POLICY - base Lambda Execution policy
165
151
data "aws_iam_policy_document" "lambda_cloudwatch_logs_policy" {
166
152
statement {
167
153
actions = [
@@ -174,13 +160,11 @@ data "aws_iam_policy_document" "lambda_cloudwatch_logs_policy" {
174
160
}
175
161
}
176
162
177
- # -------------------------------------------------------------------------------------------------------------
178
- # CREATE CLOUDWATCH TRIGGER EVENT TO PERIODICALLY CONTACT THE LAMBDA FUNCTION AND PREVENT IT FROM SUSPENDING
179
- # -------------------------------------------------------------------------------------------------------------
180
-
181
163
# -----------------------------------------------------------------
182
- # create cloudwatch event to run every 15 minutes
164
+ # CREATE CLOUDWATCH EVENT TO PREVENT LAMBDA FUNCTION SUSPENSION
183
165
# -----------------------------------------------------------------
166
+
167
+ # create cloudwatch event to run every 15 minutes
184
168
resource "aws_cloudwatch_event_rule" "warmer" {
185
169
count = " ${ var . create_warmer_event ? 1 : 0 } "
186
170
@@ -189,9 +173,7 @@ resource "aws_cloudwatch_event_rule" "warmer" {
189
173
schedule_expression = " rate(15 minutes)"
190
174
}
191
175
192
- # -----------------------------------------------------------------
193
- # set event target as sns_to_cloudwatch_logs lambda function
194
- # -----------------------------------------------------------------
176
+ # set event target as sns_to_cloudwatch_logs lambda function
195
177
resource "aws_cloudwatch_event_target" "warmer" {
196
178
count = " ${ var . create_warmer_event ? 1 : 0 } "
197
179
@@ -208,14 +190,12 @@ resource "aws_cloudwatch_event_target" "warmer" {
208
190
JSON
209
191
}
210
192
211
- # -------------------------------------------------------------------------------------------------------------
212
- # ENABLE CLOUDWATCH EVENT AS LAMBDA FUNCTION TRIGGER
213
- # use multiple resource blocks as condition parameters aren't possible until Terraform v0.12.0
214
- # -------------------------------------------------------------------------------------------------------------
215
-
216
193
# -----------------------------------------------------------------
217
- # function published - "qualifier" parameter set to function version
194
+ # ENABLE CLOUDWATCH EVENT AS LAMBDA FUNCTION TRIGGER
195
+ # multiple resource blockss until 'null' parameter feature in Terraform v0.12.0
218
196
# -----------------------------------------------------------------
197
+
198
+ # function published - "qualifier" set to function version
219
199
resource "aws_lambda_permission" "warmer_published" {
220
200
count = " ${ var . create_warmer_event ? var . lambda_publish_func ? 1 : 0 : 0 } "
221
201
@@ -227,9 +207,7 @@ resource "aws_lambda_permission" "warmer_published" {
227
207
qualifier = " ${ aws_lambda_function . sns_cloudwatchlog . version } "
228
208
}
229
209
230
- # -----------------------------------------------------------------
231
- # function not published - "qualifier" parameter not be set
232
- # -----------------------------------------------------------------
210
+ # function not published - dont specify "qualifier" parameter
233
211
resource "aws_lambda_permission" "warmer" {
234
212
count = " ${ var . create_warmer_event ? var . lambda_publish_func ? 0 : 1 : 0 } "
235
213
0 commit comments