2
2
# AWS LAMBDA CERTBOT FOR CLOUDFLARE DOMAINS
3
3
# -----------------------------------------------------------------
4
4
5
- terraform {
6
- required_version = " ~> 0.11.11"
7
- }
8
-
9
5
provider "aws" {
10
- region = " ${ var . aws_region } "
11
-
12
- version = " ~> 2.0"
6
+ region = var. aws_region
7
+ version = " >= 2.12"
13
8
}
14
9
15
10
# Create random two digit number suffix (used to prevent duplicate names)
16
11
resource "random_integer" "id" {
17
12
keepers = {
18
13
# generate new ID when value of domains changes
19
- domains = " ${ var . letsencrypt_domains } "
14
+ domains = var.letsencrypt_domains
20
15
}
21
16
22
17
min = 1000
@@ -28,22 +23,23 @@ resource "random_integer" "id" {
28
23
# -----------------------------------------------------------------
29
24
30
25
data "template_file" "cloudflare_ini" {
31
- count = " ${ length (var. cloudflare_api_key ) > 0 ? length (var. cloudflare_email ) > 0 ? 1 : 0 : 0 } "
26
+ count = length (var. cloudflare_api_key ) > 0 ? length (var. cloudflare_email ) > 0 ? 1 : 0 : 0
32
27
33
- template = " ${ file (" templates/cloudflare_ini.tmpl" )} "
28
+ template = file (" templates/cloudflare_ini.tmpl" )
34
29
35
30
vars = {
36
- cloudflare_email = " ${ var . cloudflare_email } "
37
- cloudflare_api_key = " ${ var . cloudflare_api_key } "
31
+ cloudflare_email = var.cloudflare_email
32
+ cloudflare_api_key = var.cloudflare_api_key
38
33
}
39
34
}
40
35
41
36
resource "aws_s3_bucket_object" "cloudflare_ini" {
42
- count = " ${ length (var. cloudflare_api_key ) > 0 ? length (var. cloudflare_email ) > 0 ? 1 : 0 : 0 } "
37
+ count = length (var. cloudflare_api_key ) > 0 ? length (var. cloudflare_email ) > 0 ? 1 : 0 : 0
43
38
44
- bucket = " ${ var . s3_bucket } "
45
- key = " ${ var . s3_path } /dns/cloudflare.ini"
46
- content = " ${ join (" " , data. template_file . cloudflare_ini . * . rendered )} "
39
+ bucket = var. s3_bucket
40
+ key = " ${ var . s3_path } /dns/cloudflare.ini"
41
+ # content = join("", data.template_file.cloudflare_ini.*.rendered)
42
+ content = data. template_file . cloudflare_ini [0 ]. rendered
47
43
server_side_encryption = " AES256"
48
44
}
49
45
@@ -53,12 +49,12 @@ resource "aws_s3_bucket_object" "cloudflare_ini" {
53
49
54
50
resource "aws_lambda_layer_version" "certbot_base" {
55
51
filename = " ${ path . root } /base_${ var . lambda_runtime } .zip"
56
- source_code_hash = " ${ base64sha256 ( file ( " ${ path . root } /base_${ var . lambda_runtime } .zip" )) } "
52
+ source_code_hash = filebase64sha256 ( " ${ path . root } /base_${ var . lambda_runtime } .zip" )
57
53
58
- layer_name = " certbot-cloudflare-base-${ replace (var. lambda_runtime ," ." ," " )} "
54
+ layer_name = " certbot-cloudflare-base-${ replace (var. lambda_runtime , " ." , " " )} "
59
55
description = " certbot with cloudflare dns plugin"
60
56
61
- compatible_runtimes = [" ${ var . lambda_runtime } " ]
57
+ compatible_runtimes = [var . lambda_runtime ]
62
58
}
63
59
64
60
# -----------------------------------------------------------------
@@ -74,31 +70,31 @@ data "archive_file" "lambda_function" {
74
70
75
71
# create lambda using function only zip on top of base layer
76
72
resource "aws_lambda_function" "certbot_cloudflare" {
77
- layers = [" ${ aws_lambda_layer_version . certbot_base . arn } " ]
73
+ layers = [aws_lambda_layer_version . certbot_base . arn ]
78
74
79
75
filename = " ${ path . root } /lambda.zip"
80
- source_code_hash = " ${ data . archive_file . lambda_function . output_base64sha256 } "
76
+ source_code_hash = data. archive_file . lambda_function . output_base64sha256
81
77
82
78
function_name = " ${ var . lambda_func_name } -${ random_integer . id . result } "
83
79
description = " ${ var . lambda_description } : ${ var . letsencrypt_domains } "
84
80
85
- publish = " ${ var . lambda_publish_func ? 1 : 0 } "
86
- role = " ${ aws_iam_role . lambda_new_funct . arn } "
87
- runtime = " ${ var . lambda_runtime } "
81
+ publish = var. lambda_publish_func ? true : false
82
+ role = aws_iam_role. lambda_new_funct . arn
83
+ runtime = var. lambda_runtime
88
84
handler = " certbot_cloudflare.main"
89
- timeout = " ${ var . lambda_timeout } "
90
- memory_size = " ${ var . lambda_mem_size } "
85
+ timeout = var. lambda_timeout
86
+ memory_size = var. lambda_mem_size
91
87
92
- tags = " ${ var . lambda_tags } "
88
+ tags = var. lambda_tags
93
89
94
90
environment {
95
91
variables = {
96
- letsencrypt_domains = " ${ var . letsencrypt_domains } "
97
- letsencrypt_email = " ${ var . letsencrypt_email } "
98
- s3_bucket = " ${ var . s3_bucket } "
99
- s3_path = " ${ var . s3_path } "
100
- test_cert = " ${ var . get_test_cert } "
101
- sns_topic_arn = " ${ length (var. sns_topic ) > 0 ? join ( " " , data. aws_sns_topic . sns_log_topic . * . arn ) : " " } "
92
+ letsencrypt_domains = var.letsencrypt_domains
93
+ letsencrypt_email = var.letsencrypt_email
94
+ s3_bucket = var.s3_bucket
95
+ s3_path = var.s3_path
96
+ test_cert = var.get_test_cert
97
+ sns_topic_arn = length (var. sns_topic ) > 0 ? data.aws_sns_topic.sns_log_topic[ 0 ]. arn : " "
102
98
}
103
99
}
104
100
}
@@ -110,22 +106,22 @@ resource "aws_lambda_function" "certbot_cloudflare" {
110
106
# Create base IAM role
111
107
resource "aws_iam_role" "lambda_new_funct" {
112
108
name = " lambda-${ lower (var. lambda_func_name )} -${ random_integer . id . result } "
113
- assume_role_policy = " ${ data . aws_iam_policy_document . lambda_new_funct . json } "
109
+ assume_role_policy = data. aws_iam_policy_document . lambda_new_funct . json
114
110
}
115
111
116
112
# Add policy enabling access to other AWS services
117
113
resource "aws_iam_role_policy" "lambda_new_funct_polcy" {
118
114
name = " lambda-${ lower (var. lambda_func_name )} -policy-${ random_integer . id . result } "
119
- role = " ${ aws_iam_role . lambda_new_funct . id } "
120
- policy = " ${ length (var. sns_topic ) > 0 ? join ( " " , data. aws_iam_policy_document . lambda_new_funct_policy_sns . * . json ) : join ( " " , data. aws_iam_policy_document . lambda_new_funct_policy . * . json ) } "
115
+ role = aws_iam_role. lambda_new_funct . id
116
+ policy = length (var. sns_topic ) > 0 ? data. aws_iam_policy_document . lambda_new_funct_policy_sns [ 0 ] . json : data. aws_iam_policy_document . lambda_new_funct_policy [ 0 ] . json
121
117
}
122
118
123
119
# JSON POLICY - assume role
124
120
data "aws_iam_policy_document" "lambda_new_funct" {
125
121
statement {
126
122
actions = [" sts:AssumeRole" ]
127
123
128
- principals = {
124
+ principals {
129
125
type = " Service"
130
126
identifiers = [" lambda.amazonaws.com" ]
131
127
}
@@ -134,7 +130,7 @@ data "aws_iam_policy_document" "lambda_new_funct" {
134
130
135
131
# JSON POLICY - Logs and S3 only (no SNS)
136
132
data "aws_iam_policy_document" "lambda_new_funct_policy" {
137
- count = " ${ length (var. sns_topic ) > 0 ? 0 : 1 } "
133
+ count = length (var. sns_topic ) > 0 ? 0 : 1
138
134
139
135
statement {
140
136
actions = [
@@ -166,13 +162,13 @@ data "aws_iam_policy_document" "lambda_new_funct_policy" {
166
162
167
163
# find sns topic arn, if specified (used by JSON policy)
168
164
data "aws_sns_topic" "sns_log_topic" {
169
- count = " ${ length (var. sns_topic ) > 0 ? 1 : 0 } "
170
- name = " ${ var . sns_topic } "
165
+ count = length (var. sns_topic ) > 0 ? 1 : 0
166
+ name = var. sns_topic
171
167
}
172
168
173
169
# JSON POLICY - Logs, S3 and SNS
174
170
data "aws_iam_policy_document" "lambda_new_funct_policy_sns" {
175
- count = " ${ length (var. sns_topic ) > 0 ? 1 : 0 } "
171
+ count = length (var. sns_topic ) > 0 ? 1 : 0
176
172
177
173
statement {
178
174
actions = [
@@ -190,7 +186,7 @@ data "aws_iam_policy_document" "lambda_new_funct_policy_sns" {
190
186
" sns:Publish" ,
191
187
]
192
188
193
- resources = [" ${ join ( " " , data. aws_sns_topic . sns_log_topic . * . arn ) } " ]
189
+ resources = [data . aws_sns_topic . sns_log_topic [ 0 ] . arn ]
194
190
}
195
191
196
192
statement {
@@ -216,7 +212,7 @@ data "aws_iam_policy_document" "lambda_new_funct_policy_sns" {
216
212
217
213
# create cloudwatch event to run every 15 days
218
214
resource "aws_cloudwatch_event_rule" "sched" {
219
- count = " ${ var . create_sched_event ? 1 : 0 } "
215
+ count = var. create_sched_event ? 1 : 0
220
216
221
217
name = " cert_renewal-${ random_integer . id . result } "
222
218
description = " Trigger cert renewal via ${ var . lambda_func_name } "
@@ -225,11 +221,11 @@ resource "aws_cloudwatch_event_rule" "sched" {
225
221
226
222
# set event target as certbot_cloudflare lambda function
227
223
resource "aws_cloudwatch_event_target" "sched" {
228
- count = " ${ var . create_sched_event ? 1 : 0 } "
224
+ count = var. create_sched_event ? 1 : 0
229
225
230
- rule = " ${ aws_cloudwatch_event_rule . sched . name } "
226
+ rule = aws_cloudwatch_event_rule. sched [ 0 ] . name
231
227
target_id = " Lambda"
232
- arn = " ${ var . lambda_publish_func ? aws_lambda_function . certbot_cloudflare . qualified_arn : aws_lambda_function . certbot_cloudflare . arn } "
228
+ arn = var. lambda_publish_func ? aws_lambda_function. certbot_cloudflare . qualified_arn : aws_lambda_function. certbot_cloudflare . arn
233
229
234
230
input = << JSON
235
231
{
@@ -238,6 +234,7 @@ resource "aws_cloudwatch_event_target" "sched" {
238
234
}]
239
235
}
240
236
JSON
237
+
241
238
}
242
239
243
240
# -----------------------------------------------------------------
@@ -246,24 +243,35 @@ JSON
246
243
# -----------------------------------------------------------------
247
244
248
245
# function published - "qualifier" parameter set to function version
249
- resource "aws_lambda_permission" "sched_published" {
250
- count = " ${ var . create_sched_event ? var . lambda_publish_func ? 1 : 0 : 0 } "
251
-
252
- statement_id = " AllowExecutionFromCloudWatch"
253
- action = " lambda:InvokeFunction"
254
- function_name = " ${ aws_lambda_function . certbot_cloudflare . function_name } "
255
- principal = " events.amazonaws.com"
256
- source_arn = " ${ aws_cloudwatch_event_rule . sched . arn } "
257
- qualifier = " ${ aws_lambda_function . certbot_cloudflare . version } "
258
- }
259
-
260
- # function not published - "qualifier" parameter not be set
261
- resource "aws_lambda_permission" "sched" {
262
- count = " ${ var . create_sched_event ? var . lambda_publish_func ? 0 : 1 : 0 } "
263
-
264
- statement_id = " AllowExecutionFromCloudWatch"
265
- action = " lambda:InvokeFunction"
266
- function_name = " ${ aws_lambda_function . certbot_cloudflare . function_name } "
267
- principal = " events.amazonaws.com"
268
- source_arn = " ${ aws_cloudwatch_event_rule . sched . arn } "
246
+ # resource "aws_lambda_permission" "sched_published" {
247
+ # count = var.create_sched_event ? var.lambda_publish_func ? 1 : 0 : 0
248
+
249
+ # statement_id = "AllowExecutionFromCloudWatch"
250
+ # action = "lambda:InvokeFunction"
251
+ # function_name = aws_lambda_function.certbot_cloudflare.function_name
252
+ # principal = "events.amazonaws.com"
253
+ # source_arn = aws_cloudwatch_event_rule.sched[0].arn
254
+ # qualifier = aws_lambda_function.certbot_cloudflare.version
255
+ # }
256
+
257
+ # # function not published - "qualifier" parameter not be set
258
+ # resource "aws_lambda_permission" "sched" {
259
+ # count = var.create_sched_event ? var.lambda_publish_func ? 0 : 1 : 0
260
+
261
+ # statement_id = "AllowExecutionFromCloudWatch"
262
+ # action = "lambda:InvokeFunction"
263
+ # function_name = aws_lambda_function.certbot_cloudflare.function_name
264
+ # principal = "events.amazonaws.com"
265
+ # source_arn = aws_cloudwatch_event_rule.sched[0].arn
266
+ # }
267
+
268
+ resource "aws_lambda_permission" "sched_multi" {
269
+ count = var. create_sched_event ? 1 : 0
270
+
271
+ statement_id = " AllowExecutionFromCloudWatch"
272
+ action = " lambda:InvokeFunction"
273
+ function_name = aws_lambda_function. certbot_cloudflare . function_name
274
+ principal = " events.amazonaws.com"
275
+ source_arn = aws_cloudwatch_event_rule. sched [0 ]. arn
276
+ qualifier = var. lambda_publish_func ? aws_lambda_function. certbot_cloudflare . version : null
269
277
}
0 commit comments