Skip to content

Commit 4c838f0

Browse files
committed
created module for lambda
1 parent f60cb2a commit 4c838f0

File tree

13 files changed

+516
-1
lines changed

13 files changed

+516
-1
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
resource "aws_lambda_layer_version" "lambda_layer" {
2+
# filename = var.lambda_layer_filename
3+
layer_name = var.lambda_layer_name
4+
compatible_runtimes = var.lambda_layer_compatible_runtimes
5+
compatible_architectures = var.lambda_layer_compatible_architectures
6+
description = var.lambda_layer_description
7+
s3_bucket = var.lambda_layer_s3_bucket_name
8+
s3_key = var.lambda_layer_s3_key != "" ? var.lambda_layer_s3_key : "${var.lambda_layer_tags["Environment"]}.lambda.layers/${var.lambda_layer_name}/${var.lambda_layer_name}.zip"
9+
skip_destroy = var.lambda_layer_skip_destroy
10+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
output "lambda_layer_arn" { value = aws_lambda_layer_version.lambda_layer.arn }
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# lambda layer variables
2+
3+
variable "lambda_layer_name" {
4+
type = string
5+
}
6+
7+
variable "lambda_layer_compatible_runtimes" {
8+
type = list(string)
9+
}
10+
11+
variable "lambda_layer_compatible_architectures" {
12+
type = list(string)
13+
}
14+
15+
variable "lambda_layer_description" {
16+
type = string
17+
}
18+
19+
variable "lambda_layer_s3_bucket_name" {
20+
type = string
21+
}
22+
23+
variable "lambda_layer_s3_key" {
24+
type = string
25+
}
26+
27+
variable "lambda_layer_skip_destroy" {
28+
type = bool
29+
}
30+
31+
variable "lambda_layer_tags" {}

modules/lambda/lambda_new/lambda.tf

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
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+
}

modules/lambda/lambda_new/outputs.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
output "lambda_function_arn" { value = aws_lambda_function.lambda_function.arn }
2+
output "lambda_function_invoke_arn" { value = aws_lambda_function.lambda_function.invoke_arn }
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
variable "lambda_name" {}
2+
3+
# IAM
4+
variable "lambda_assume_role_policy" {}
5+
variable "lambda_managed_policy_arn_list" {}
6+
variable "lambda_tags" {}
7+
8+
# LAMBDA
9+
variable "lambda_bucket_name" {}
10+
variable "lambda_handler" {}
11+
variable "lambda_runtime" {}
12+
variable "lambda_architectures" {}
13+
variable "lambda_description" {}
14+
variable "lambda_memory_size" {}
15+
variable "lambda_reserved_concurrent_executions" {}
16+
variable "lambda_timeout" {}
17+
variable "lambda_package_type" {}
18+
variable "lambda_enable_vpc" {}
19+
variable "subnet_ids" {}
20+
variable "security_group_ids" {}
21+
variable "lambda_env_variables" {}
22+
variable "lambda_dead_letter_target_arn" {}
23+
variable "lambda_ephemeral_memory_size" {default = 512}
24+
variable "lambda_enable_snap_start" {default = false}
25+
variable "lambda_snap_start_config_list" {
26+
type = map(object({
27+
LAMBDA_SNAP_START_APPLY_ON = string
28+
}))
29+
default = {}
30+
}
31+
variable "lambda_maximum_concurrency" {}
32+
33+
# TRIGGER
34+
variable "lambda_create_trigger" {
35+
type = bool
36+
default = true
37+
}
38+
variable "lambda_enable_trigger" {}
39+
variable "lambda_trigger_resource_type" {}
40+
variable "lambda_trigger_batch_size" {}
41+
variable "lambda_trigger_maximum_batching_window_in_seconds" {}
42+
variable "lambda_trigger_function_response_types" {}
43+
variable "lambda_trigger_resource_name" {}
44+
variable "lambda_trigger_filter_criteria_list" {
45+
type = list(string)
46+
default = []
47+
}
48+
49+
# INVOKE
50+
variable "lambda_asynchronous_invocation_config" {
51+
type = bool
52+
default = true
53+
}
54+
variable "lambda_trigger_maximum_event_age_in_seconds" {}
55+
variable "lambda_trigger_maximum_retry_attempts" {}
56+
57+
58+
#CLOUDWATCH LOG
59+
variable "lambda_cloudwatch_log_group_skip_destroy" {}
60+
variable "lambda_cloudwatch_log_group_retention_in_days" {}
61+
variable "lambda_cloudwatch_log_group_class" {}
62+
63+
variable "optional_config" {
64+
type = map(any)
65+
default = {}
66+
}
67+
68+
variable "destination_config" {
69+
type = map(any)
70+
default = {}
71+
}
72+
73+
variable "lambda_layers_arns" {
74+
type = list(string)
75+
default = null
76+
}

templates/lambda/lambda.tf

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
module "lambda_function" {
2+
source = "../../../..//modules/lambda/lambda_new"
3+
for_each = var.LAMBDA_FUNCTION_LIST
4+
lambda_name = "${var.SHORT_ENV}-${each.key}"
5+
lambda_assume_role_policy = each.value.LAMBDA_FUNCTION_ASSUME_ROLE_POLICY
6+
lambda_managed_policy_arn_list = each.value.LAMBDA_FUNCTION_MANAGED_POLICY_ARN_LIST
7+
lambda_tags = local.common_tags
8+
lambda_bucket_name = each.value.LAMBDA_FUNCTION_BUCKET_NAME
9+
lambda_handler = each.value.LAMBDA_FUNCTION_HANDLER
10+
lambda_runtime = each.value.LAMBDA_FUNCTION_RUNTIME
11+
lambda_architectures = each.value.LAMBDA_FUNCTION_ARCHITECTURES
12+
lambda_description = each.value.LAMBDA_FUNCTION_DESCRIPTION
13+
lambda_memory_size = each.value.LAMBDA_FUNCTION_MEMORY_SIZE
14+
lambda_reserved_concurrent_executions = each.value.LAMBDA_FUNCTION_RESERVED_CONCURRENT_EXECUTIONS
15+
lambda_timeout = each.value.LAMBDA_FUNCTION_TIMEOUT
16+
lambda_package_type = each.value.LAMBDA_FUNCTION_PACKAGE_TYPE
17+
lambda_enable_vpc = each.value.ENABLE_LAMBDA_FUNCTION_VPC
18+
subnet_ids = each.value.SUBNET_IDS
19+
security_group_ids = each.value.SECURITY_GROUP_IDS
20+
lambda_env_variables = each.value.LAMBDA_FUNCTION_ENV_VARIABLES
21+
lambda_dead_letter_target_arn = each.value.LAMBDA_FUNCTION_DEAD_LETTER_TARGET_ARN
22+
lambda_enable_trigger = each.value.LAMBDA_FUNCTION_ENABLE_TRIGGER
23+
lambda_trigger_resource_type = each.value.LAMBDA_FUNCTION_TRIGGER_RESOURCE_TYPE
24+
lambda_trigger_batch_size = each.value.LAMBDA_FUNCTION_TRIGGER_BATCH_SIZE
25+
lambda_trigger_maximum_batching_window_in_seconds = each.value.LAMBDA_FUNCTION_TRIGGER_MAXIMUM_BATCHING_WINDOW_IN_SECONDS
26+
lambda_trigger_function_response_types = each.value.LAMBDA_FUNCTION_TRIGGER_FUNCTION_RESPONSE_TYPES
27+
lambda_trigger_resource_name = each.value.LAMBDA_FUNCTION_TRIGGER_RESOURCE_NAME
28+
lambda_trigger_maximum_event_age_in_seconds = each.value.LAMBDA_FUNCTION_TRIGGER_MAXIMUM_EVENT_AGE_IN_SECONDS
29+
lambda_trigger_maximum_retry_attempts = each.value.LAMBDA_FUNCTION_TRIGGER_MAXIMUM_RETRY_ATTEMPTS
30+
lambda_cloudwatch_log_group_skip_destroy = each.value.LAMBDA_CLOUDWATCH_LOG_GROUP_SKIP_DESTROY
31+
lambda_cloudwatch_log_group_class = each.value.LAMBDA_cloudwatch_LOG_GROUP_CLASS
32+
lambda_cloudwatch_log_group_retention_in_days = each.value.LAMBDA_cloudwatch_LOG_GROUP_RETENTION_IN_DAYS
33+
lambda_maximum_concurrency = each.value.LAMBDA_MAXIMUM_CONCURRENCY
34+
lambda_trigger_filter_criteria_list = each.value.LAMBDA_FUNCTION_TRIGGER_FILTER_CRITERIA_LIST
35+
optional_config = each.value.LAMBDA_FUNCTION_TRIGGER_OPTIONAL_CONFIG
36+
destination_config = each.value.LAMBDA_FUNCTION_TRIGGER_DESTINATION_CONFIG
37+
lambda_layers_arns = each.value.LAMBDA_LAYERS_ARNS
38+
depends_on = [ module.sqs, module.lambda_layers]
39+
}

templates/lambda/lambda_layers.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module "lambda_layers" {
2+
source = "../../../..//modules/lambda/lambda_layers"
3+
for_each = var.LAMBDA_LAYERS_LIST
4+
lambda_layer_name = "${var.SHORT_ENV}-${each.key}"
5+
lambda_layer_compatible_runtimes = each.value.LAMBDA_LAYER_COMPATIBLE_RUNTIMES
6+
lambda_layer_compatible_architectures = each.value.LAMBDA_LAYER_COMPATIBLE_ARCHITECTURES
7+
lambda_layer_description = each.value.LAMBDA_LAYER_DESCRIPTION
8+
lambda_layer_s3_bucket_name = each.value.LAMBDA_LAYER_S3_BUCKET_NAME
9+
lambda_layer_s3_key = each.value.LAMBDA_LAYER_S3_KEY
10+
lambda_layer_skip_destroy = each.value.LAMBDA_LAYER_SKIP_DESTROY
11+
lambda_layer_tags = local.common_tags
12+
}

templates/lambda/locals.tf

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
data "aws_caller_identity" "current" {}
2+
data "aws_region" "current" {}
3+
4+
locals {
5+
common_tags = {
6+
"App" = var.APPLICATION
7+
"Environment" = var.LONG_ENV
8+
"Env" = var.SHORT_ENV
9+
"BU" = var.BUSINESS_UNIT
10+
"BUSubcategory" = var.BUSINESS_UNIT_SUBCATEGORY
11+
"BUEmail" = var.BUSINESS_UNIT_EMAIL
12+
"CC" = var.COST_CENTRE
13+
"AwsAccountShort" = var.AWS_ACCOUNT_SHORT
14+
"AwsAccount" = var.AWS_ACCOUNT
15+
"AwsAccountId" = data.aws_caller_identity.current.account_id
16+
"ManagedBy" = "terraform"
17+
}
18+
}

templates/lambda/outputs.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# output "LAMBDA_LAYER_ARN" {value = module.lambda_layers.arn}

0 commit comments

Comments
 (0)