Skip to content

Commit ae39420

Browse files
authored
Add support for DataDog metrics extension/lambdajs wrapper (#20)
* Add support for DataDog metrics extension/lambdajs wrapper * Provide API key even when datadog_metrics is set to 'extension' * Take DataDog layers from the region that the lambda is being installed into
1 parent 48212ec commit ae39420

File tree

3 files changed

+92
-28
lines changed

3 files changed

+92
-28
lines changed

iam.tf

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,22 @@ resource "aws_iam_role_policy_attachment" "vpc_permissions" {
3434

3535
count = length(var.subnet_ids) != 0 ? 1 : 0
3636
}
37+
38+
resource "aws_iam_role_policy" "read_datadog_api_key" {
39+
count = local.datadog_install_extension ? 1 : 0
40+
role = aws_iam_role.iam_for_lambda.id
41+
name = "read_datadog_api_key"
42+
policy = data.aws_iam_policy_document.read_datadog_api_key.json
43+
}
44+
45+
data "aws_iam_policy_document" "read_datadog_api_key" {
46+
statement {
47+
sid = "ReadSecrets"
48+
actions = [
49+
"secretsmanager:GetSecretValue"
50+
]
51+
resources = [
52+
data.aws_secretsmanager_secret.datadog_api_key.arn,
53+
]
54+
}
55+
}

main.tf

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,76 @@
11
locals {
22
security_group_ids = var.use_default_security_group == false ? var.security_group_ids : [data.aws_security_group.default[0].id]
3+
4+
datadog_extension_layers_available = {
5+
x86_64 = "arn:aws:lambda:${data.aws_region.current.region}:464622532012:layer:Datadog-Extension:${var.datadog_extension_layer_version}"
6+
arm64 = "arn:aws:lambda:${data.aws_region.current.region}:464622532012:layer:Datadog-Extension-ARM:${var.datadog_extension_layer_version}"
7+
}
8+
datadog_lambdajs_layers_available = {
9+
"nodejs18.x" = "arn:aws:lambda:${data.aws_region.current.region}:464622532012:layer:Datadog-Node18-x:${var.datadog_lambdajs_layer_version}"
10+
"nodejs20.x" = "arn:aws:lambda:${data.aws_region.current.region}:464622532012:layer:Datadog-Node20-x:${var.datadog_lambdajs_layer_version}"
11+
"nodejs22.x" = "arn:aws:lambda:${data.aws_region.current.region}:464622532012:layer:Datadog-Node22-x:${var.datadog_lambdajs_layer_version}"
12+
}
13+
datadog_install_extension = var.datadog_metrics != "none"
14+
datadog_install_lambdajs = var.datadog_metrics == "lambdajs"
15+
datadog_extension_layer = local.datadog_install_extension ? [local.datadog_extension_layers_available[var.architectures[0]]] : []
16+
datadog_extension_env = local.datadog_install_extension ? {
17+
DD_SITE = "datadoghq.com"
18+
DD_API_KEY_SECRET_ARN = data.aws_secretsmanager_secret.datadog_api_key.arn
19+
} : {}
20+
datadog_lambdajs_layer = local.datadog_install_lambdajs ? [local.datadog_lambdajs_layers_available[var.runtime]] : []
21+
datadog_lambdajs_env = local.datadog_install_lambdajs ? {
22+
DD_LAMBDA_HANDLER = var.handler
23+
} : {}
24+
}
25+
26+
data "aws_region" "current" {
327
}
428

529
data "aws_security_group" "default" {
6-
count = var.use_default_security_group == true ? 1 : 0
7-
name = "${terraform.workspace}-default-lambda-sg"
30+
count = var.use_default_security_group == true ? 1 : 0
31+
name = "${terraform.workspace}-default-lambda-sg"
832
vpc_id = var.vpc_id
933
}
1034

35+
data "aws_secretsmanager_secret" "datadog_api_key" {
36+
name = "${terraform.workspace == "live" ? "live" : "dev"}/datadog-agent-service"
37+
}
1138

1239
resource "aws_lambda_function" "lambda_function" {
13-
image_uri = var.image_uri
14-
s3_bucket = var.s3_bucket
15-
s3_key = var.s3_key
16-
function_name = var.function_name
17-
role = aws_iam_role.iam_for_lambda.arn
18-
handler = var.handler
19-
runtime = var.runtime
20-
timeout = var.timeout
21-
memory_size = var.memory_size
22-
reserved_concurrent_executions = var.reserved_concurrent_executions
23-
tags = var.tags
24-
package_type = var.image_uri != null ? "Image" : "Zip"
25-
layers = var.layers
26-
architectures = var.architectures
40+
image_uri = var.image_uri
41+
s3_bucket = var.s3_bucket
42+
s3_key = var.s3_key
43+
function_name = var.function_name
44+
role = aws_iam_role.iam_for_lambda.arn
45+
handler = local.datadog_install_lambdajs ? "/opt/nodejs/node_modules/datadog-lambda-js/handler.handler" : var.handler
46+
runtime = var.runtime
47+
timeout = var.timeout
48+
memory_size = var.memory_size
49+
reserved_concurrent_executions = var.reserved_concurrent_executions
50+
tags = var.tags
51+
package_type = var.image_uri != null ? "Image" : "Zip"
52+
layers = concat(var.layers, local.datadog_lambdajs_layer, local.datadog_extension_layer)
53+
architectures = var.architectures
2754

2855
dynamic "image_config" {
2956
for_each = var.image_uri != null ? [1] : []
30-
content {
31-
command = var.image_config_command
32-
entry_point = var.image_config_entry_point
33-
working_directory = var.image_config_working_directory
57+
content {
58+
command = var.image_config_command
59+
entry_point = var.image_config_entry_point
60+
working_directory = var.image_config_working_directory
3461
}
3562
}
3663

37-
dynamic vpc_config {
38-
for_each = local.security_group_ids != null ? [1] : []
39-
content {
40-
subnet_ids = var.subnet_ids
41-
security_group_ids = local.security_group_ids
42-
}
64+
dynamic "vpc_config" {
65+
for_each = local.security_group_ids != null ? [1] : []
66+
content {
67+
subnet_ids = var.subnet_ids
68+
security_group_ids = local.security_group_ids
69+
}
4370
}
4471

4572
environment {
46-
variables = var.lambda_env
73+
variables = merge(var.lambda_env, local.datadog_extension_env, local.datadog_lambdajs_env)
4774
}
4875

4976
tracing_config {

variables.tf

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,22 @@ variable "tracing_mode" {
154154
type = string
155155
description = "Tracing mode for the Lambda. Valid options: PassThrough (default) and Active."
156156
default = "PassThrough"
157-
}
157+
}
158+
159+
variable "datadog_extension_layer_version" {
160+
type = number
161+
description = "Version number of DataDog extension layer to add"
162+
default = 88
163+
}
164+
165+
variable "datadog_lambdajs_layer_version" {
166+
type = number
167+
description = "Version number of DataDog NodeJS lambda layer to add"
168+
default = 130
169+
}
170+
171+
variable "datadog_metrics" {
172+
type = string
173+
description = "Add DataDog metrics extension ('extension') and optional NodeJS handler wrapper ('lambdajs')"
174+
default = "none"
175+
}

0 commit comments

Comments
 (0)