Skip to content

Commit 223b250

Browse files
committed
Initial commit
1 parent 563e500 commit 223b250

File tree

10 files changed

+672
-59
lines changed

10 files changed

+672
-59
lines changed

.github/settings.yml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
# Upstream changes from _extends are only recognized when modifications are made to this file in the default branch.
22
_extends: .github
33
repository:
4-
name: template
5-
description: Template for Terraform Components
4+
name: aws-datadog-lambda-forwarder
5+
description: This component is responsible for provision all the necessary infrastructure to deploy [Datadog Lambda forwarders](https://github
66
homepage: https://cloudposse.com/accelerate
77
topics: terraform, terraform-component
8-
9-
10-
11-

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
## PR [#814](https://github.com/cloudposse/terraform-aws-components/pull/814)
2+
3+
### Fix for `enabled = false` or Destroy and Recreate
4+
5+
Previously, when `enabled = false` was set, the component would not necessarily function as desired (deleting any
6+
existing resources and not creating any new ones). Also, previously, when deleting the component, there was a race
7+
condition where the log group could be deleted before the lambda function was deleted, causing the lambda function to
8+
trigger automatic recreation of the log group. This would result in re-creation failing because Terraform would try to
9+
create the log group but it already existed.
10+
11+
These issues have been fixed in this PR.

README.yaml

Lines changed: 196 additions & 48 deletions
Large diffs are not rendered by default.

src/main.tf

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,118 @@
11
locals {
2-
enabled = module.this.enabled
2+
enabled = module.this.enabled
3+
lambda_arn_enabled = local.enabled && var.lambda_arn_enabled
4+
5+
# If any keys contain name_suffix, then use a null label to get the label prefix, and create
6+
# the appropriate input for the upstream module.
7+
cloudwatch_forwarder_log_groups = {
8+
for k, v in var.cloudwatch_forwarder_log_groups :
9+
k => {
10+
name : lookup(v, "name_suffix", null) != null ? format(
11+
"%s%s%s%s",
12+
lookup(v, "name_prefix", "/aws/"),
13+
module.log_group_prefix.id,
14+
module.log_group_prefix.delimiter,
15+
lookup(v, "name_suffix")
16+
) : lookup(v, "name")
17+
filter_pattern : lookup(v, "filter_pattern", "")
18+
}
19+
}
20+
21+
# Only return context tags that are specified
22+
# NOTE: Tags are lowercased automatically by Datadog
23+
# See https://docs.datadoghq.com/developers/guide/what-best-practices-are-recommended-for-naming-metrics-and-tags/#rules-and-best-practices-for-naming-tags
24+
context_tags = var.context_tags_enabled ? {
25+
for k, v in module.this.tags :
26+
k => v
27+
if contains(var.context_tags, lower(k))
28+
} : {}
29+
30+
dd_tags_map = merge(var.dd_tags_map, local.context_tags)
31+
}
32+
33+
module "log_group_prefix" {
34+
source = "cloudposse/label/null"
35+
version = "0.25.0"
36+
37+
label_order = ["namespace", "tenant", "environment", "stage"]
38+
39+
context = module.this.context
40+
}
41+
42+
module "datadog_lambda_forwarder" {
43+
source = "cloudposse/datadog-lambda-forwarder/aws"
44+
version = "1.5.3"
45+
46+
cloudwatch_forwarder_log_groups = local.cloudwatch_forwarder_log_groups
47+
cloudwatch_forwarder_event_patterns = var.cloudwatch_forwarder_event_patterns
48+
dd_api_key_kms_ciphertext_blob = var.dd_api_key_kms_ciphertext_blob
49+
dd_api_key_source = {
50+
resource = lower(module.datadog_configuration.datadog_secrets_store_type)
51+
identifier = module.datadog_configuration.datadog_api_key_location
52+
}
53+
dd_artifact_filename = var.dd_artifact_filename
54+
dd_forwarder_version = var.dd_forwarder_version
55+
dd_module_name = var.dd_module_name
56+
dd_tags_map = local.dd_tags_map
57+
forwarder_lambda_datadog_host = module.datadog_configuration.datadog_site
58+
forwarder_lambda_debug_enabled = var.forwarder_lambda_debug_enabled
59+
forwarder_log_artifact_url = var.forwarder_log_artifact_url
60+
forwarder_log_enabled = var.forwarder_log_enabled
61+
forwarder_log_layers = var.forwarder_log_layers
62+
forwarder_log_retention_days = var.forwarder_log_retention_days
63+
forwarder_rds_artifact_url = var.forwarder_rds_artifact_url
64+
forwarder_rds_enabled = var.forwarder_rds_enabled
65+
forwarder_rds_filter_pattern = var.forwarder_rds_filter_pattern
66+
forwarder_rds_layers = var.forwarder_rds_layers
67+
forwarder_vpc_logs_artifact_url = var.forwarder_vpc_logs_artifact_url
68+
forwarder_vpc_logs_enabled = var.forwarder_vpc_logs_enabled
69+
forwarder_vpc_logs_layers = var.forwarder_vpc_logs_layers
70+
forwarder_vpclogs_filter_pattern = var.forwarder_vpclogs_filter_pattern
71+
kms_key_id = var.kms_key_id
72+
lambda_policy_source_json = var.lambda_policy_source_json
73+
lambda_reserved_concurrent_executions = var.lambda_reserved_concurrent_executions
74+
lambda_runtime = var.lambda_runtime
75+
s3_bucket_kms_arns = var.s3_bucket_kms_arns
76+
s3_buckets = var.s3_buckets
77+
s3_buckets_with_prefixes = var.s3_buckets_with_prefixes
78+
security_group_ids = var.security_group_ids
79+
subnet_ids = var.subnet_ids
80+
tracing_config_mode = var.tracing_config_mode
81+
vpclogs_cloudwatch_log_group = var.vpclogs_cloudwatch_log_group
82+
83+
datadog_forwarder_lambda_environment_variables = var.datadog_forwarder_lambda_environment_variables
84+
85+
api_key_ssm_arn = module.datadog_configuration.api_key_ssm_arn
86+
87+
context = module.this.context
88+
}
89+
90+
# Create a new Datadog - Amazon Web Services integration Lambda ARN
91+
resource "datadog_integration_aws_lambda_arn" "rds_collector" {
92+
count = local.lambda_arn_enabled && var.forwarder_rds_enabled ? 1 : 0
93+
94+
account_id = module.datadog-integration.outputs.aws_account_id
95+
lambda_arn = module.datadog_lambda_forwarder.lambda_forwarder_rds_function_arn
396
}
497

98+
resource "datadog_integration_aws_lambda_arn" "vpc_logs_collector" {
99+
count = local.lambda_arn_enabled && var.forwarder_vpc_logs_enabled ? 1 : 0
5100

101+
account_id = module.datadog-integration.outputs.aws_account_id
102+
lambda_arn = module.datadog_lambda_forwarder.lambda_forwarder_vpc_log_function_arn
103+
}
6104

105+
resource "datadog_integration_aws_lambda_arn" "log_collector" {
106+
count = local.lambda_arn_enabled && var.forwarder_log_enabled ? 1 : 0
7107

108+
account_id = module.datadog-integration.outputs.aws_account_id
109+
lambda_arn = module.datadog_lambda_forwarder.lambda_forwarder_log_function_arn
110+
}
8111

112+
resource "datadog_integration_aws_log_collection" "main" {
113+
count = local.lambda_arn_enabled ? 1 : 0
114+
account_id = module.datadog-integration.outputs.aws_account_id
115+
services = var.log_collection_services
116+
117+
depends_on = [module.datadog_lambda_forwarder]
118+
}

src/outputs.tf

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,29 @@
1-
output "mock" {
2-
description = "Mock output example for the Cloud Posse Terraform component template"
3-
value = local.enabled ? "hello ${basename(abspath(path.module))}" : ""
1+
output "lambda_forwarder_rds_function_arn" {
2+
description = "Datadog Lambda forwarder RDS Enhanced Monitoring function ARN"
3+
value = module.datadog_lambda_forwarder.lambda_forwarder_rds_function_arn
4+
}
5+
6+
output "lambda_forwarder_rds_enhanced_monitoring_function_name" {
7+
description = "Datadog Lambda forwarder RDS Enhanced Monitoring function name"
8+
value = module.datadog_lambda_forwarder.lambda_forwarder_rds_enhanced_monitoring_function_name
9+
}
10+
11+
output "lambda_forwarder_log_function_arn" {
12+
description = "Datadog Lambda forwarder CloudWatch/S3 function ARN"
13+
value = module.datadog_lambda_forwarder.lambda_forwarder_log_function_arn
14+
}
15+
16+
output "lambda_forwarder_log_function_name" {
17+
description = "Datadog Lambda forwarder CloudWatch/S3 function name"
18+
value = module.datadog_lambda_forwarder.lambda_forwarder_log_function_name
19+
}
20+
21+
output "lambda_forwarder_vpc_log_function_arn" {
22+
description = "Datadog Lambda forwarder VPC Flow Logs function ARN"
23+
value = module.datadog_lambda_forwarder.lambda_forwarder_vpc_log_function_arn
24+
}
25+
26+
output "lambda_forwarder_vpc_log_function_name" {
27+
description = "Datadog Lambda forwarder VPC Flow Logs function name"
28+
value = module.datadog_lambda_forwarder.lambda_forwarder_vpc_log_function_name
429
}

src/provider-datadog.tf

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module "datadog_configuration" {
2+
source = "../datadog-configuration/modules/datadog_keys"
3+
enabled = true
4+
context = module.this.context
5+
global_environment_name = var.datadog_configuration_environment
6+
}
7+
8+
provider "datadog" {
9+
api_key = module.datadog_configuration.datadog_api_key
10+
app_key = module.datadog_configuration.datadog_app_key
11+
api_url = module.datadog_configuration.datadog_api_url
12+
validate = local.enabled
13+
}

src/providers.tf

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
provider "aws" {
2+
region = var.region
3+
4+
# Profile is deprecated in favor of terraform_role_arn. When profiles are not in use, terraform_profile_name is null.
5+
profile = module.iam_roles.terraform_profile_name
6+
7+
dynamic "assume_role" {
8+
# module.iam_roles.terraform_role_arn may be null, in which case do not assume a role.
9+
for_each = compact([module.iam_roles.terraform_role_arn])
10+
content {
11+
role_arn = assume_role.value
12+
}
13+
}
14+
}
15+
16+
module "iam_roles" {
17+
source = "../account-map/modules/iam-roles"
18+
context = module.this.context
19+
}

src/remote-state.tf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module "datadog-integration" {
2+
source = "cloudposse/stack-config/yaml//modules/remote-state"
3+
version = "1.5.0"
4+
5+
component = "datadog-integration"
6+
7+
environment = module.iam_roles.global_environment_name
8+
context = module.this.context
9+
}

0 commit comments

Comments
 (0)