1
+ data "aws_caller_identity" "current" {}
2
+ data "aws_region" "current" {}
3
+ locals {
4
+ dead_letter_config = {
5
+ lambda_dead_letter_target_arn = {
6
+ arn = var.lambda_dead_letter_target_arn
7
+ }
8
+ }
9
+ is_dynamodb = var. lambda_trigger_resource_type == " dynamodb"
10
+ is_sqs = var. lambda_trigger_resource_type == " sqs"
11
+ }
12
+
13
+ # retrieve dynamodb table stream arn if trigger is dynamo
14
+ data "aws_dynamodb_table" "dynamodb_table" {
15
+ count = var. lambda_create_trigger && local. is_dynamodb ? 1 : 0
16
+ name = var. lambda_trigger_resource_name
17
+ }
18
+
19
+ resource "aws_iam_role" "iam_role" {
20
+ name = substr (" ${ var . lambda_name } -lambda" , 0 , 64 )
21
+ assume_role_policy = var. lambda_assume_role_policy
22
+ managed_policy_arns = var. lambda_managed_policy_arn_list
23
+
24
+ tags = merge (var. lambda_tags , tomap ({" Name" = " ${ var . lambda_name } -lambda" }))
25
+ }
26
+
27
+ resource "aws_lambda_function" "lambda_function" {
28
+ s3_bucket = var. lambda_bucket_name
29
+ s3_key = " ${ var . lambda_tags [" Environment" ]} .lambda/${ var . lambda_name } /${ var . lambda_name } .zip"
30
+ function_name = var. lambda_name
31
+ role = " arn:aws:iam::${ data . aws_caller_identity . current . account_id } :role/${ substr (" ${ var . lambda_name } -lambda" , 0 , 64 )} "
32
+ handler = var. lambda_handler
33
+ runtime = var. lambda_runtime
34
+ architectures = var. lambda_architectures
35
+ description = var. lambda_description
36
+ memory_size = var. lambda_memory_size
37
+ reserved_concurrent_executions = var. lambda_reserved_concurrent_executions
38
+ timeout = var. lambda_timeout
39
+ package_type = var. lambda_package_type
40
+ vpc_config {
41
+ subnet_ids = var. lambda_enable_vpc ? var. subnet_ids : []
42
+ security_group_ids = var. lambda_enable_vpc ? var. security_group_ids : []
43
+ }
44
+ dynamic "snap_start" {
45
+ for_each = var. lambda_enable_snap_start ? var. lambda_snap_start_config_list : {}
46
+ content {
47
+ apply_on = snap_start. value . LAMBDA_SNAP_START_APPLY_ON
48
+ }
49
+ }
50
+ dynamic "dead_letter_config" {
51
+ for_each = {
52
+ for k ,v in local . dead_letter_config : k => v
53
+ if v . arn != null
54
+ }
55
+ content {
56
+ target_arn = var. lambda_dead_letter_target_arn
57
+ }
58
+ }
59
+
60
+ environment {
61
+ variables = try (var. lambda_env_variables , {})
62
+ }
63
+
64
+ ephemeral_storage {
65
+ size = var. lambda_ephemeral_memory_size
66
+ }
67
+
68
+ layers = var. lambda_layers_arns != null ? var. lambda_layers_arns : null
69
+
70
+ tags = merge (var. lambda_tags , tomap ({" Name" = var.lambda_name}))
71
+ }
72
+
73
+ resource "aws_lambda_event_source_mapping" "trigger" {
74
+ count = var. lambda_create_trigger ? 1 : 0
75
+ function_name = aws_lambda_function. lambda_function . arn
76
+ batch_size = var. lambda_trigger_batch_size
77
+ enabled = var. lambda_enable_trigger
78
+ maximum_batching_window_in_seconds = var. lambda_trigger_maximum_batching_window_in_seconds
79
+ function_response_types = var. lambda_trigger_function_response_types
80
+ dynamic "scaling_config" {
81
+ for_each = local. is_sqs && var. lambda_maximum_concurrency > 0 ? [1 ] : []
82
+ content {
83
+ maximum_concurrency = var. lambda_maximum_concurrency
84
+ }
85
+ }
86
+
87
+ dynamic "filter_criteria" {
88
+ for_each = length (var. lambda_trigger_filter_criteria_list ) > 0 ? var. lambda_trigger_filter_criteria_list : []
89
+ content {
90
+ filter {
91
+ pattern = can (jsondecode (filter_criteria. value )) ? jsondecode (filter_criteria. value ) : null
92
+ }
93
+ }
94
+ }
95
+
96
+ bisect_batch_on_function_error = lookup (var. optional_config , " bisect_batch_on_function_error" , null )
97
+ maximum_retry_attempts = lookup (var. optional_config , " maximum_retry_attempts" , null )
98
+ maximum_record_age_in_seconds = lookup (var. optional_config , " maximum_record_age_in_seconds" , null )
99
+ parallelization_factor = lookup (var. optional_config , " parallelization_factor" , null )
100
+ tumbling_window_in_seconds = lookup (var. optional_config , " tumbling_window_in_seconds" , null )
101
+ starting_position = lookup (var. optional_config , " starting_position" , null )
102
+ starting_position_timestamp = lookup (var. optional_config , " starting_position_timestamp" , null )
103
+ event_source_arn = lookup (var. optional_config , " event_source_arn" , " arn:aws:${ var . lambda_trigger_resource_type } :${ data . aws_region . current . name } :${ data . aws_caller_identity . current . account_id } :${ var . lambda_trigger_resource_name } " )
104
+
105
+ dynamic "destination_config" {
106
+ for_each = length (var. destination_config ) > 0 ? [1 ] : []
107
+ content {
108
+ dynamic "on_failure" {
109
+ for_each = lookup (var. destination_config , " on_failure" , null ) != null ? [1 ] : []
110
+ content {
111
+ destination_arn = var. destination_config [" on_failure" ][" destination_arn" ]
112
+ }
113
+ }
114
+ }
115
+ }
116
+
117
+ tags = var. lambda_tags
118
+ depends_on = [ aws_lambda_function . lambda_function ]
119
+ }
120
+
121
+ resource "aws_lambda_function_event_invoke_config" "asynchronous_invocation" {
122
+ count = var. lambda_asynchronous_invocation_config ? 1 : 0
123
+ function_name = var. lambda_name
124
+ maximum_event_age_in_seconds = var. lambda_trigger_maximum_event_age_in_seconds
125
+ maximum_retry_attempts = var. lambda_trigger_maximum_retry_attempts
126
+ depends_on = [ aws_lambda_function . lambda_function ]
127
+ }
128
+
129
+ module "lambda_log_group" {
130
+ source = " ../../cloudwatch/log_group"
131
+ cloudwatch_log_group_name = " /aws/lambda/${ var . lambda_name } "
132
+ cloudwatch_log_group_skip_destroy = var. lambda_cloudwatch_log_group_skip_destroy
133
+ cloudwatch_log_group_retention_in_days = var. lambda_cloudwatch_log_group_retention_in_days
134
+ cloudwatch_log_group_class = var. lambda_cloudwatch_log_group_class
135
+ cloudwatch_log_group_tags = var. lambda_tags
136
+ }
0 commit comments