22# AWS LAMBDA CERTBOT FOR CLOUDFLARE DOMAINS
33# -----------------------------------------------------------------
44
5- terraform {
6- required_version = " ~> 0.11.11"
7- }
8-
95provider "aws" {
10- region = " ${ var . aws_region } "
11-
12- version = " ~> 2.0"
6+ region = var. aws_region
7+ version = " >= 2.12"
138}
149
1510# Create random two digit number suffix (used to prevent duplicate names)
1611resource "random_integer" "id" {
1712 keepers = {
1813 # generate new ID when value of domains changes
19- domains = " ${ var . letsencrypt_domains } "
14+ domains = var.letsencrypt_domains
2015 }
2116
2217 min = 1000
@@ -28,22 +23,23 @@ resource "random_integer" "id" {
2823# -----------------------------------------------------------------
2924
3025data "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
3227
33- template = " ${ file (" templates/cloudflare_ini.tmpl" )} "
28+ template = file (" templates/cloudflare_ini.tmpl" )
3429
3530 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
3833 }
3934}
4035
4136resource "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
4338
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
4743 server_side_encryption = " AES256"
4844}
4945
@@ -53,12 +49,12 @@ resource "aws_s3_bucket_object" "cloudflare_ini" {
5349
5450resource "aws_lambda_layer_version" "certbot_base" {
5551 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" )
5753
58- layer_name = " certbot-cloudflare-base-${ replace (var. lambda_runtime ," ." ," " )} "
54+ layer_name = " certbot-cloudflare-base-${ replace (var. lambda_runtime , " ." , " " )} "
5955 description = " certbot with cloudflare dns plugin"
6056
61- compatible_runtimes = [" ${ var . lambda_runtime } " ]
57+ compatible_runtimes = [var . lambda_runtime ]
6258}
6359
6460# -----------------------------------------------------------------
@@ -74,31 +70,31 @@ data "archive_file" "lambda_function" {
7470
7571# create lambda using function only zip on top of base layer
7672resource "aws_lambda_function" "certbot_cloudflare" {
77- layers = [" ${ aws_lambda_layer_version . certbot_base . arn } " ]
73+ layers = [aws_lambda_layer_version . certbot_base . arn ]
7874
7975 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
8177
8278 function_name = " ${ var . lambda_func_name } -${ random_integer . id . result } "
8379 description = " ${ var . lambda_description } : ${ var . letsencrypt_domains } "
8480
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
8884 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
9187
92- tags = " ${ var . lambda_tags } "
88+ tags = var. lambda_tags
9389
9490 environment {
9591 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 : " "
10298 }
10399 }
104100}
@@ -110,22 +106,22 @@ resource "aws_lambda_function" "certbot_cloudflare" {
110106# Create base IAM role
111107resource "aws_iam_role" "lambda_new_funct" {
112108 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
114110}
115111
116112# Add policy enabling access to other AWS services
117113resource "aws_iam_role_policy" "lambda_new_funct_polcy" {
118114 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
121117}
122118
123119# JSON POLICY - assume role
124120data "aws_iam_policy_document" "lambda_new_funct" {
125121 statement {
126122 actions = [" sts:AssumeRole" ]
127123
128- principals = {
124+ principals {
129125 type = " Service"
130126 identifiers = [" lambda.amazonaws.com" ]
131127 }
@@ -134,7 +130,7 @@ data "aws_iam_policy_document" "lambda_new_funct" {
134130
135131# JSON POLICY - Logs and S3 only (no SNS)
136132data "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
138134
139135 statement {
140136 actions = [
@@ -166,13 +162,13 @@ data "aws_iam_policy_document" "lambda_new_funct_policy" {
166162
167163# find sns topic arn, if specified (used by JSON policy)
168164data "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
171167}
172168
173169# JSON POLICY - Logs, S3 and SNS
174170data "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
176172
177173 statement {
178174 actions = [
@@ -190,7 +186,7 @@ data "aws_iam_policy_document" "lambda_new_funct_policy_sns" {
190186 " sns:Publish" ,
191187 ]
192188
193- resources = [" ${ join ( " " , data. aws_sns_topic . sns_log_topic . * . arn ) } " ]
189+ resources = [data . aws_sns_topic . sns_log_topic [ 0 ] . arn ]
194190 }
195191
196192 statement {
@@ -216,7 +212,7 @@ data "aws_iam_policy_document" "lambda_new_funct_policy_sns" {
216212
217213# create cloudwatch event to run every 15 days
218214resource "aws_cloudwatch_event_rule" "sched" {
219- count = " ${ var . create_sched_event ? 1 : 0 } "
215+ count = var. create_sched_event ? 1 : 0
220216
221217 name = " cert_renewal-${ random_integer . id . result } "
222218 description = " Trigger cert renewal via ${ var . lambda_func_name } "
@@ -225,11 +221,11 @@ resource "aws_cloudwatch_event_rule" "sched" {
225221
226222# set event target as certbot_cloudflare lambda function
227223resource "aws_cloudwatch_event_target" "sched" {
228- count = " ${ var . create_sched_event ? 1 : 0 } "
224+ count = var. create_sched_event ? 1 : 0
229225
230- rule = " ${ aws_cloudwatch_event_rule . sched . name } "
226+ rule = aws_cloudwatch_event_rule. sched [ 0 ] . name
231227 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
233229
234230 input = << JSON
235231{
@@ -238,6 +234,7 @@ resource "aws_cloudwatch_event_target" "sched" {
238234 }]
239235}
240236JSON
237+
241238}
242239
243240# -----------------------------------------------------------------
@@ -246,24 +243,35 @@ JSON
246243# -----------------------------------------------------------------
247244
248245# 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
269277}
0 commit comments