diff --git a/modules/aws-backup-source/README.md b/modules/aws-backup-source/README.md index 6129c28..8057f95 100644 --- a/modules/aws-backup-source/README.md +++ b/modules/aws-backup-source/README.md @@ -84,6 +84,7 @@ No modules. | [parameter_store_backup_config](#input_parameter_store_backup_config) | Configuration for the scheduled Lambda function to backup tagged Parameter Store parameters to S3. |
object({ enable = bool selection_tag = string selection_tag_value = optional(string) selection_tags = optional(list(object({ key = optional(string) value = optional(string) }))) lambda_backup_cron = optional(string) lambda_timeout_seconds = optional(number) air_gapped_kms_key_arn = optional(string) s3_bucket_name = optional(string) rules = optional(list(object({ name = string schedule = string completion_window = optional(number) enable_continuous_backup = optional(bool) lifecycle = object({ delete_after = number cold_storage_after = optional(number) }) copy_action = optional(object({ delete_after = optional(number) })) }))) }) | { "air_gapped_kms_key_arn": "", "enable": true, "lambda_backup_cron": "cron(0 6 * * ? *)", "lambda_timeout_seconds": 300, "rules": [ { "copy_action": { "delete_after": 365 }, "lifecycle": { "delete_after": 35 }, "name": "daily_kept_5_weeks", "schedule": "cron(0 0 * * ? *)" }, { "copy_action": { "delete_after": 365 }, "lifecycle": { "delete_after": 90 }, "name": "weekly_kept_3_months", "schedule": "cron(0 1 ? * SUN *)" }, { "copy_action": { "delete_after": 365 }, "lifecycle": { "cold_storage_after": 30, "delete_after": 2555 }, "name": "monthly_kept_7_years", "schedule": "cron(0 2 1 * ? *)" }, { "copy_action": { "delete_after": 365 }, "enable_continuous_backup": true, "lifecycle": { "delete_after": 35 }, "name": "point_in_time_recovery", "schedule": "cron(0 5 * * ? *)" } ], "s3_bucket_name": "", "selection_tag": "BackupParameterStore", "selection_tag_value": "True", "selection_tags": [] } | no |
| [bootstrap\_kms\_key\_arn](#input\_bootstrap\_kms\_key\_arn) | The ARN of the bootstrap KMS key used for encryption at rest of the SNS topic. | `string` | n/a | yes |
| [environment\_name](#input\_environment\_name) | The name of the environment where AWS Backup is configured. | `string` | n/a | yes |
+| [lambda\_insights\_enable](#input\_lambda\_insights\_enable) | Enable the Lambda functions to generate lambda-insights. | `bool` | `false` | no |
| [name\_prefix](#input\_name\_prefix) | Optional name prefix for vault resources | `string` | `null` | no |
| [notifications\_target\_email\_address](#input\_notifications\_target\_email\_address) | The email address to which backup notifications will be sent via SNS. | `string` | `""` | no |
| [project\_name](#input\_project\_name) | The name of the project this relates to. | `string` | n/a | yes |
diff --git a/modules/aws-backup-source/lambda_copy_recovery_point.tf b/modules/aws-backup-source/lambda_copy_recovery_point.tf
index 860d150..d97c5a5 100644
--- a/modules/aws-backup-source/lambda_copy_recovery_point.tf
+++ b/modules/aws-backup-source/lambda_copy_recovery_point.tf
@@ -59,6 +59,12 @@ resource "aws_iam_role_policy_attachment" "lambda_copy_recovery_point_policy_att
policy_arn = aws_iam_policy.iam_policy_for_lambda_copy_recovery_point[0].arn
}
+resource "aws_iam_role_policy_attachment" "lambda_copy_recovery_point_cloudwatch_insights" {
+ count = var.lambda_copy_recovery_point_enable && var.lambda_insights_enable ? 1 : 0
+ policy_arn = "arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy"
+ role = aws_iam_role.iam_for_lambda_copy_recovery_point[0].name
+}
+
resource "aws_lambda_function" "lambda_copy_recovery_point" {
count = var.lambda_copy_recovery_point_enable ? 1 : 0
function_name = "${local.resource_name_prefix}_lambda-copy-recovery-point"
@@ -69,6 +75,8 @@ resource "aws_lambda_function" "lambda_copy_recovery_point" {
source_code_hash = data.archive_file.lambda_copy_recovery_point_zip[0].output_base64sha256
timeout = var.lambda_copy_recovery_point_max_wait_minutes * 60
+ layers = var.lambda_insights_enable ? [local.lambda_insights_layer_arn] : []
+
environment {
variables = {
POLL_INTERVAL_SECONDS = var.lambda_copy_recovery_point_poll_interval_seconds
diff --git a/modules/aws-backup-source/lambda_parameter_store_backup.tf b/modules/aws-backup-source/lambda_parameter_store_backup.tf
index db56553..70030c8 100644
--- a/modules/aws-backup-source/lambda_parameter_store_backup.tf
+++ b/modules/aws-backup-source/lambda_parameter_store_backup.tf
@@ -117,6 +117,12 @@ resource "aws_iam_role_policy" "lambda_parameter_store_backup_iam_permissions" {
policy = data.aws_iam_policy_document.lambda_parameter_store_backup_permissions[0].json
}
+resource "aws_iam_role_policy_attachment" "lambda_parameter_store_backup_cloudwatch_insights" {
+ count = var.backup_plan_config_parameter_store.enable && var.lambda_insights_enable ? 1 : 0
+ policy_arn = "arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy"
+ role = aws_iam_role.iam_for_lambda_parameter_store_backup[0].name
+}
+
resource "aws_lambda_function" "lambda_parameter_store_backup" {
count = var.backup_plan_config_parameter_store.enable ? 1 : 0
filename = data.archive_file.lambda_parameter_store_backup_zip[0].output_path
@@ -126,6 +132,9 @@ resource "aws_lambda_function" "lambda_parameter_store_backup" {
handler = "parameter_store_backup.lambda_handler"
runtime = "python3.12"
timeout = var.backup_plan_config_parameter_store.lambda_timeout_seconds
+
+ layers = var.lambda_insights_enable ? [local.lambda_insights_layer_arn] : []
+
environment {
variables = {
KMS_KEY_ARN = var.destination_parameter_store_kms_key_arn
diff --git a/modules/aws-backup-source/lambda_post_build_version.tf b/modules/aws-backup-source/lambda_post_build_version.tf
index 66d5f20..b84fef6 100644
--- a/modules/aws-backup-source/lambda_post_build_version.tf
+++ b/modules/aws-backup-source/lambda_post_build_version.tf
@@ -53,6 +53,12 @@ resource "aws_iam_role_policy" "lambda_post_build_version_iam_permissions" {
policy = data.aws_iam_policy_document.lambda_post_build_version_permissions.json
}
+resource "aws_iam_role_policy_attachment" "lambda_post_build_version_cloudwatch_insights" {
+ count = var.lambda_insights_enable ? 1 : 0
+ policy_arn = "arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy"
+ role = aws_iam_role.iam_for_lambda_post_build_version.name
+}
+
data "archive_file" "lambda_post_build_version_zip" {
type = "zip"
source_dir = "${path.module}/resources/post_build_version/"
@@ -66,6 +72,9 @@ resource "aws_lambda_function" "lambda_post_build_version" {
role = aws_iam_role.iam_for_lambda_post_build_version.arn
handler = "post_build_version.lambda_handler"
runtime = "python3.12"
+
+ layers = var.lambda_insights_enable ? [local.lambda_insights_layer_arn] : []
+
environment {
variables = {
AWS_ACCOUNT_ID = data.aws_caller_identity.current.account_id
diff --git a/modules/aws-backup-source/lambda_restore_to_s3.tf b/modules/aws-backup-source/lambda_restore_to_s3.tf
index d7fead2..d6d53b1 100644
--- a/modules/aws-backup-source/lambda_restore_to_s3.tf
+++ b/modules/aws-backup-source/lambda_restore_to_s3.tf
@@ -67,6 +67,12 @@ resource "aws_iam_role_policy_attachment" "lambda_restore_to_s3_policy_attach" {
policy_arn = aws_iam_policy.iam_policy_for_lambda_restore_to_s3[0].arn
}
+resource "aws_iam_role_policy_attachment" "lambda_restore_to_s3_cloudwatch_insights" {
+ count = var.lambda_restore_to_s3_enable && var.lambda_insights_enable ? 1 : 0
+ policy_arn = "arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy"
+ role = aws_iam_role.iam_for_lambda_restore_to_s3[0].name
+}
+
resource "aws_lambda_function" "lambda_restore_to_s3" {
count = var.lambda_restore_to_s3_enable ? 1 : 0
@@ -79,6 +85,8 @@ resource "aws_lambda_function" "lambda_restore_to_s3" {
source_code_hash = data.archive_file.lambda_restore_to_s3_zip[0].output_base64sha256
timeout = var.lambda_restore_to_s3_max_wait_minutes * 60
+ layers = var.lambda_insights_enable ? [local.lambda_insights_layer_arn] : []
+
environment {
variables = {
POLL_INTERVAL_SECONDS = var.lambda_restore_to_s3_poll_interval_seconds
diff --git a/modules/aws-backup-source/locals.tf b/modules/aws-backup-source/locals.tf
index 64f4d5b..9a5bc56 100644
--- a/modules/aws-backup-source/locals.tf
+++ b/modules/aws-backup-source/locals.tf
@@ -21,4 +21,6 @@ locals {
))
aurora_overrides = var.backup_plan_config_aurora.restore_testing_overrides == null ? null : jsondecode(var.backup_plan_config_aurora.restore_testing_overrides)
terraform_role_arns = length(var.terraform_role_arns) > 0 ? var.terraform_role_arns : [var.terraform_role_arn]
+
+ lambda_insights_layer_arn = "arn:aws:lambda:eu-west-2:580247275435:layer:LambdaInsightsExtension:66"
}
diff --git a/modules/aws-backup-source/variables.tf b/modules/aws-backup-source/variables.tf
index 599072c..9b74a11 100644
--- a/modules/aws-backup-source/variables.tf
+++ b/modules/aws-backup-source/variables.tf
@@ -538,3 +538,9 @@ variable "lambda_restore_to_s3_max_wait_minutes" {
type = number
default = 5
}
+
+variable "lambda_insights_enable" {
+ description = "Enable the Lambda functions to generate insights from backup data."
+ type = bool
+ default = false
+}