diff --git a/README.md b/README.md index 21d82ae..9ec68e4 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This Terraform module wraps the [aws_lambda_function](https://registry.terraform ``` module "lambda-datadog" { source = "DataDog/lambda-datadog/aws" - version = "1.5.0" + version = "2.0.0" filename = "example.zip" function_name = "example-function" @@ -33,8 +33,8 @@ module "lambda-datadog" { "DD_VERSION" : "1.0.0" } - datadog_extension_layer_version = 65 - datadog_python_layer_version = 99 + datadog_extension_layer_version = 67 + datadog_python_layer_version = 104 } ``` @@ -42,7 +42,7 @@ module "lambda-datadog" { ``` module "lambda-datadog" { source = "DataDog/lambda-datadog/aws" - version = "1.5.0" + version = "2.0.0" filename = "example.zip" function_name = "example-function" @@ -59,8 +59,8 @@ module "lambda-datadog" { "DD_VERSION" : "1.0.0" } - datadog_extension_layer_version = 65 - datadog_node_layer_version = 115 + datadog_extension_layer_version = 67 + datadog_node_layer_version = 117 } ``` @@ -68,7 +68,7 @@ module "lambda-datadog" { ``` module "lambda-datadog" { source = "DataDog/lambda-datadog/aws" - version = "1.5.0" + version = "2.0.0" filename = "example.zip" function_name = "example-function" @@ -85,7 +85,7 @@ module "lambda-datadog" { "DD_VERSION" : "1.0.0" } - datadog_extension_layer_version = 65 + datadog_extension_layer_version = 67 datadog_dotnet_layer_version = 16 } ``` @@ -94,7 +94,7 @@ module "lambda-datadog" { ``` module "lambda-datadog" { source = "DataDog/lambda-datadog/aws" - version = "1.5.0" + version = "2.0.0" filename = "example.jar" function_name = "example-function" @@ -111,7 +111,7 @@ module "lambda-datadog" { "DD_VERSION" : "1.0.0" } - datadog_extension_layer_version = 65 + datadog_extension_layer_version = 67 datadog_java_layer_version = 15 } ``` @@ -149,7 +149,7 @@ resource "aws_lambda_function" "example_lambda_function" { ``` module "lambda-datadog" { source = "DataDog/lambda-datadog/aws" - version = "1.5.0" + version = "2.0.0" function_name = "example-function" ... @@ -200,13 +200,13 @@ Use Environment variables to configure Datadog Serverless Monitoring. Refer to t | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | >= 1.5.0 | -| [aws](#requirement\_aws) | >= 5.32.0 | +| [aws](#requirement\_aws) | >= 5.77.0 | ## Providers | Name | Version | |------|---------| -| [aws](#provider\_aws) | >= 5.32.0 | +| [aws](#provider\_aws) | >= 5.77.0 | ## Modules @@ -225,11 +225,11 @@ No modules. |------|-------------|------|---------|:--------:| | [architectures](#input\_architectures) | Instruction set architecture for your Lambda function. Valid values are ["x86\_64"] and ["arm64"]. | `list(string)` |
["x86_64"]| no | | [code\_signing\_config\_arn](#input\_code\_signing\_config\_arn) | To enable code signing for this function, specify the ARN of a code-signing configuration. A code-signing configuration includes a set of signing profiles, which define the trusted publishers for this function. | `string` | `null` | no | -| [datadog\_extension\_layer\_version](#input\_datadog\_extension\_layer\_version) | Version for the Datadog Extension Layer | `number` | `65` | no | +| [datadog\_extension\_layer\_version](#input\_datadog\_extension\_layer\_version) | Version for the Datadog Extension Layer | `number` | `67` | no | | [datadog\_dotnet\_layer\_version](#input\_datadog\_dotnet\_layer\_version) | Version for the Datadog .NET Layer | `number` | `16` | no | | [datadog\_java\_layer\_version](#input\_datadog\_java\_layer\_version) | Version for the Datadog Java Layer | `number` | `15` | no | -| [datadog\_node\_layer\_version](#input\_datadog\_node\_layer\_version) | Version for the Datadog Node Layer | `number` | `115` | no | -| [datadog\_python\_layer\_version](#input\_datadog\_python\_layer\_version) | Version for the Datadog Python Layer | `number` | `99` | no | +| [datadog\_node\_layer\_version](#input\_datadog\_node\_layer\_version) | Version for the Datadog Node Layer | `number` | `117` | no | +| [datadog\_python\_layer\_version](#input\_datadog\_python\_layer\_version) | Version for the Datadog Python Layer | `number` | `104` | no | | [dead\_letter\_config\_target\_arn](#input\_dead\_letter\_config\_target\_arn) | ARN of an SNS topic or SQS queue to notify when an invocation fails. | `string` | `null` | no | | [description](#input\_description) | Description of what your Lambda Function does. | `string` | `null` | no | | [environment\_variables](#input\_environment\_variables) | Map of environment variables that are accessible from the function code during execution. | `map(string)` | `{}` | no | diff --git a/examples/dotnet/README.md b/examples/dotnet/README.md index b420369..fe468a5 100644 --- a/examples/dotnet/README.md +++ b/examples/dotnet/README.md @@ -28,14 +28,14 @@ If using `arm64` architecture then build the lambda package with the `-farch arm | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | >= 1.5.0 | -| [aws](#requirement\_aws) | >= 5.32.0 | +| [aws](#requirement\_aws) | >= 5.77.0 | ## Providers | Name | Version | |------|---------| | [archive](#provider\_archive) | 2.4.2 | -| [aws](#provider\_aws) | >= 5.32.0 | +| [aws](#provider\_aws) | >= 5.77.0 | ## Modules diff --git a/examples/dotnet/versions.tf b/examples/dotnet/versions.tf index 6661950..008c0ef 100644 --- a/examples/dotnet/versions.tf +++ b/examples/dotnet/versions.tf @@ -4,7 +4,7 @@ terraform { required_providers { aws = { source = "hashicorp/aws" - version = ">= 5.32.0" + version = ">= 5.77.0" } } } diff --git a/examples/java/README.md b/examples/java/README.md index 2e6756b..f5fac40 100644 --- a/examples/java/README.md +++ b/examples/java/README.md @@ -25,14 +25,14 @@ terraform apply | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | >= 1.5.0 | -| [aws](#requirement\_aws) | >= 5.32.0 | +| [aws](#requirement\_aws) | >= 5.77.0 | ## Providers | Name | Version | |------|---------| | [archive](#provider\_archive) | 2.4.2 | -| [aws](#provider\_aws) | >= 5.32.0 | +| [aws](#provider\_aws) | >= 5.77.0 | ## Modules diff --git a/examples/java/versions.tf b/examples/java/versions.tf index 6661950..008c0ef 100644 --- a/examples/java/versions.tf +++ b/examples/java/versions.tf @@ -4,7 +4,7 @@ terraform { required_providers { aws = { source = "hashicorp/aws" - version = ">= 5.32.0" + version = ">= 5.77.0" } } } diff --git a/examples/node/README.md b/examples/node/README.md index ea94629..5703be9 100644 --- a/examples/node/README.md +++ b/examples/node/README.md @@ -24,14 +24,14 @@ terraform apply | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | >= 1.5.0 | -| [aws](#requirement\_aws) | >= 5.32.0 | +| [aws](#requirement\_aws) | >= 5.77.0 | ## Providers | Name | Version | |------|---------| | [archive](#provider\_archive) | 2.4.2 | -| [aws](#provider\_aws) | >= 5.32.0 | +| [aws](#provider\_aws) | >= 5.77.0 | ## Modules diff --git a/examples/node/versions.tf b/examples/node/versions.tf index 6661950..008c0ef 100644 --- a/examples/node/versions.tf +++ b/examples/node/versions.tf @@ -4,7 +4,7 @@ terraform { required_providers { aws = { source = "hashicorp/aws" - version = ">= 5.32.0" + version = ">= 5.77.0" } } } diff --git a/examples/python/README.md b/examples/python/README.md index f80d034..6b4f3fb 100644 --- a/examples/python/README.md +++ b/examples/python/README.md @@ -24,14 +24,14 @@ terraform apply | Name | Version | |------|---------| | [terraform](#requirement\_terraform) | >= 1.5.0 | -| [aws](#requirement\_aws) | >= 5.32.0 | +| [aws](#requirement\_aws) | >= 5.77.0 | ## Providers | Name | Version | |------|---------| | [archive](#provider\_archive) | 2.4.2 | -| [aws](#provider\_aws) | >= 5.32.0 | +| [aws](#provider\_aws) | >= 5.77.0 | ## Modules diff --git a/examples/python/versions.tf b/examples/python/versions.tf index 6661950..008c0ef 100644 --- a/examples/python/versions.tf +++ b/examples/python/versions.tf @@ -4,7 +4,7 @@ terraform { required_providers { aws = { source = "hashicorp/aws" - version = ">= 5.32.0" + version = ">= 5.77.0" } } } diff --git a/main.tf b/main.tf index a095a8b..ff75ce8 100644 --- a/main.tf +++ b/main.tf @@ -87,7 +87,7 @@ locals { } tags = { - dd_sls_terraform_module = "1.5.0" + dd_sls_terraform_module = "2.0.0" } } diff --git a/smoke_tests/README.md b/smoke_tests/README.md new file mode 100644 index 0000000..15c08f7 --- /dev/null +++ b/smoke_tests/README.md @@ -0,0 +1,28 @@ +# Smoke Tests + +A simple smoke test setup that creates one of each of the various functions +that we support, making sure that our default parameters are sensible. + +## Usage + +* Create a [Datadog API Key](https://app.datadoghq.com/organization-settings/api-keys) +* Create a secret in [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) and add the Datadog API Key as the secret value in plaintext +* Create a `terraform.tfvars` file + - Set the `datadog_secret_arn` to the arn of the secret you just created + - Set the `datadog_service_name` to the name of the service you want to use to filter for the resource in Datadog + - Set the `datadog_site` to the [Datadog destination site](https://docs.datadoghq.com/getting_started/site/) for your metrics, traces, and logs +* Run the following commands + +``` +terraform init +terraform plan +terraform apply +``` + +Confirm that the lambdas were all created as expected. + +Run the following commands to clean up the environment: + +``` +terraform destroy +``` diff --git a/smoke_tests/main.tf b/smoke_tests/main.tf new file mode 100644 index 0000000..d48428c --- /dev/null +++ b/smoke_tests/main.tf @@ -0,0 +1,231 @@ +resource "aws_iam_role" "lambda_role" { + name = "terraform-smoketest-${var.datadog_service_name}-role" + assume_role_policy = jsonencode( + { + "Version" : "2012-10-17", + "Statement" : [ + { + "Sid" : "", + "Effect" : "Allow", + "Action" : "sts:AssumeRole", + "Principal" : { + "Service" : "lambda.amazonaws.com" + } + } + ] + }) +} + +resource "aws_iam_policy" "secrets_manager_read_policy" { + name = "terraform-smoketest-${var.datadog_service_name}-secrets-manager-policy" + description = "Policy to allow read access to Secrets Manager" + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Sid = "ReadSecret" + Effect = "Allow" + Action = "secretsmanager:GetSecretValue" + Resource = var.datadog_secret_arn + } + ] + }) +} + +resource "aws_iam_role_policy_attachment" "attach_iam_policy_to_iam_role" { + role = aws_iam_role.lambda_role.name + policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" +} + +resource "aws_iam_role_policy_attachment" "attach_secrets_manager_policy" { + role = aws_iam_role.lambda_role.name + policy_arn = aws_iam_policy.secrets_manager_read_policy.arn +} + +data "archive_file" "zip_python_code" { + type = "zip" + source_dir = "${path.module}/src_python/" + output_path = "${path.module}/build/hello-python.zip" +} + +data "archive_file" "zip_node_code" { + type = "zip" + source_dir = "${path.module}/src_node/" + output_path = "${path.module}/build/hello-node.zip" +} + +module "lambda-python-3-12" { + source = "../" + + filename = "${path.module}/build/hello-python.zip" + function_name = "terraform-smoketest-python-3-12-${var.datadog_service_name}-function" + role = aws_iam_role.lambda_role.arn + handler = "app.lambda_handler" + runtime = "python3.12" + architectures = ["arm64"] + memory_size = 256 + + environment_variables = { + "DD_API_KEY_SECRET_ARN" : var.datadog_secret_arn + "DD_ENV" : "dev" + "DD_SERVICE" : var.datadog_service_name + "DD_SITE": var.datadog_site + "DD_VERSION" : "1.0.0" + } +} + +module "lambda-python-3-11" { + source = "../" + + filename = "${path.module}/build/hello-python.zip" + function_name = "terraform-smoketest-python-3-11-${var.datadog_service_name}-function" + role = aws_iam_role.lambda_role.arn + handler = "app.lambda_handler" + runtime = "python3.11" + architectures = ["arm64"] + memory_size = 256 + + environment_variables = { + "DD_API_KEY_SECRET_ARN" : var.datadog_secret_arn + "DD_ENV" : "dev" + "DD_SERVICE" : var.datadog_service_name + "DD_SITE": var.datadog_site + "DD_VERSION" : "1.0.0" + } +} + +module "lambda-python-3-10" { + source = "../" + + filename = "${path.module}/build/hello-python.zip" + function_name = "terraform-smoketest-python-3-10-${var.datadog_service_name}-function" + role = aws_iam_role.lambda_role.arn + handler = "app.lambda_handler" + runtime = "python3.10" + architectures = ["arm64"] + memory_size = 256 + + environment_variables = { + "DD_API_KEY_SECRET_ARN" : var.datadog_secret_arn + "DD_ENV" : "dev" + "DD_SERVICE" : var.datadog_service_name + "DD_SITE": var.datadog_site + "DD_VERSION" : "1.0.0" + } +} + +module "lambda-python-3-9" { + source = "../" + + filename = "${path.module}/build/hello-python.zip" + function_name = "terraform-smoketest-python-3-9-${var.datadog_service_name}-function" + role = aws_iam_role.lambda_role.arn + handler = "app.lambda_handler" + runtime = "python3.9" + architectures = ["arm64"] + memory_size = 256 + + environment_variables = { + "DD_API_KEY_SECRET_ARN" : var.datadog_secret_arn + "DD_ENV" : "dev" + "DD_SERVICE" : var.datadog_service_name + "DD_SITE": var.datadog_site + "DD_VERSION" : "1.0.0" + } +} + +module "lambda-python-3-8" { + source = "../" + + filename = "${path.module}/build/hello-python.zip" + function_name = "terraform-smoketest-python-3-8-${var.datadog_service_name}-function" + role = aws_iam_role.lambda_role.arn + handler = "app.lambda_handler" + runtime = "python3.8" + architectures = ["arm64"] + memory_size = 256 + + environment_variables = { + "DD_API_KEY_SECRET_ARN" : var.datadog_secret_arn + "DD_ENV" : "dev" + "DD_SERVICE" : var.datadog_service_name + "DD_SITE": var.datadog_site + "DD_VERSION" : "1.0.0" + } +} + +module "lambda-node-22" { + source = "../" + + filename = "${path.module}/build/hello-node.zip" + function_name = "terraform-smoketest-node-22-${var.datadog_service_name}-function" + role = aws_iam_role.lambda_role.arn + handler = "index.lambda_handler" + runtime = "nodejs22.x" + memory_size = 256 + + environment_variables = { + "DD_API_KEY_SECRET_ARN" : var.datadog_secret_arn + "DD_ENV" : "dev" + "DD_SERVICE" : var.datadog_service_name + "DD_SITE": var.datadog_site + "DD_VERSION" : "1.0.0" + } +} + +module "lambda-node-20" { + source = "../" + + filename = "${path.module}/build/hello-node.zip" + function_name = "terraform-smoketest-node-20-${var.datadog_service_name}-function" + role = aws_iam_role.lambda_role.arn + handler = "index.lambda_handler" + runtime = "nodejs20.x" + memory_size = 256 + + environment_variables = { + "DD_API_KEY_SECRET_ARN" : var.datadog_secret_arn + "DD_ENV" : "dev" + "DD_SERVICE" : var.datadog_service_name + "DD_SITE": var.datadog_site + "DD_VERSION" : "1.0.0" + } +} + +module "lambda-node-18" { + source = "../" + + filename = "${path.module}/build/hello-node.zip" + function_name = "terraform-smoketest-node-18-${var.datadog_service_name}-function" + role = aws_iam_role.lambda_role.arn + handler = "index.lambda_handler" + runtime = "nodejs18.x" + memory_size = 256 + + environment_variables = { + "DD_API_KEY_SECRET_ARN" : var.datadog_secret_arn + "DD_ENV" : "dev" + "DD_SERVICE" : var.datadog_service_name + "DD_SITE": var.datadog_site + "DD_VERSION" : "1.0.0" + } +} + +module "lambda-node-16" { + source = "../" + + filename = "${path.module}/build/hello-node.zip" + function_name = "terraform-smoketest-node-16-${var.datadog_service_name}-function" + role = aws_iam_role.lambda_role.arn + handler = "index.lambda_handler" + runtime = "nodejs16.x" + memory_size = 256 + + environment_variables = { + "DD_API_KEY_SECRET_ARN" : var.datadog_secret_arn + "DD_ENV" : "dev" + "DD_SERVICE" : var.datadog_service_name + "DD_SITE": var.datadog_site + "DD_VERSION" : "1.0.0" + } +} diff --git a/smoke_tests/outputs.tf b/smoke_tests/outputs.tf new file mode 100644 index 0000000..31b8280 --- /dev/null +++ b/smoke_tests/outputs.tf @@ -0,0 +1,142 @@ +output "python_3_12_arn" { + description = "Amazon Resource Name (ARN) identifying your Lambda Function." + value = module.lambda-python-3-12.arn +} + +output "python_3_12_invoke_arn" { + description = "ARN to be used for invoking Lambda Function from API Gateway." + value = module.lambda-python-3-12.invoke_arn +} + +output "python_3_12_function_name" { + description = "Unique name for your Lambda Function" + value = module.lambda-python-3-12.function_name +} + + +output "python_3_11_arn" { + description = "Amazon Resource Name (ARN) identifying your Lambda Function." + value = module.lambda-python-3-11.arn +} + +output "python_3_11_invoke_arn" { + description = "ARN to be used for invoking Lambda Function from API Gateway." + value = module.lambda-python-3-11.invoke_arn +} + +output "python_3_11_function_name" { + description = "Unique name for your Lambda Function" + value = module.lambda-python-3-11.function_name +} + + +output "python_3_10_arn" { + description = "Amazon Resource Name (ARN) identifying your Lambda Function." + value = module.lambda-python-3-10.arn +} + +output "python_3_10_invoke_arn" { + description = "ARN to be used for invoking Lambda Function from API Gateway." + value = module.lambda-python-3-10.invoke_arn +} + +output "python_3_10_function_name" { + description = "Unique name for your Lambda Function" + value = module.lambda-python-3-10.function_name +} + + +output "python_3_9_arn" { + description = "Amazon Resource Name (ARN) identifying your Lambda Function." + value = module.lambda-python-3-9.arn +} + +output "python_3_9_invoke_arn" { + description = "ARN to be used for invoking Lambda Function from API Gateway." + value = module.lambda-python-3-9.invoke_arn +} + +output "python_3_9_function_name" { + description = "Unique name for your Lambda Function" + value = module.lambda-python-3-9.function_name +} + + +output "python_3_8_arn" { + description = "Amazon Resource Name (ARN) identifying your Lambda Function." + value = module.lambda-python-3-8.arn +} + +output "python_3_8_invoke_arn" { + description = "ARN to be used for invoking Lambda Function from API Gateway." + value = module.lambda-python-3-8.invoke_arn +} + +output "python_3_8_function_name" { + description = "Unique name for your Lambda Function" + value = module.lambda-python-3-8.function_name +} + + +output "node_22_arn" { + description = "Amazon Resource Name (ARN) identifying your Lambda Function." + value = module.lambda-node-22.arn +} + +output "node_22_invoke_arn" { + description = "ARN to be used for invoking Lambda Function from API Gateway." + value = module.lambda-node-22.invoke_arn +} + +output "node_22_function_name" { + description = "Unique name for your Lambda Function" + value = module.lambda-node-22.function_name +} + + +output "node_20_arn" { + description = "Amazon Resource Name (ARN) identifying your Lambda Function." + value = module.lambda-node-20.arn +} + +output "node_20_invoke_arn" { + description = "ARN to be used for invoking Lambda Function from API Gateway." + value = module.lambda-node-20.invoke_arn +} + +output "node_20_function_name" { + description = "Unique name for your Lambda Function" + value = module.lambda-node-20.function_name +} + + +output "node_18_arn" { + description = "Amazon Resource Name (ARN) identifying your Lambda Function." + value = module.lambda-node-18.arn +} + +output "node_18_invoke_arn" { + description = "ARN to be used for invoking Lambda Function from API Gateway." + value = module.lambda-node-18.invoke_arn +} + +output "node_18_function_name" { + description = "Unique name for your Lambda Function" + value = module.lambda-node-18.function_name +} + + +output "node_16_arn" { + description = "Amazon Resource Name (ARN) identifying your Lambda Function." + value = module.lambda-node-16.arn +} + +output "node_16_invoke_arn" { + description = "ARN to be used for invoking Lambda Function from API Gateway." + value = module.lambda-node-16.invoke_arn +} + +output "node_16_function_name" { + description = "Unique name for your Lambda Function" + value = module.lambda-node-16.function_name +} diff --git a/smoke_tests/src_node/index.js b/smoke_tests/src_node/index.js new file mode 100644 index 0000000..2eaca04 --- /dev/null +++ b/smoke_tests/src_node/index.js @@ -0,0 +1,3 @@ +exports.lambda_handler = function (event, context) { + context.succeed('Hello!'); +}; diff --git a/smoke_tests/src_node/package.json b/smoke_tests/src_node/package.json new file mode 100644 index 0000000..c8c22a1 --- /dev/null +++ b/smoke_tests/src_node/package.json @@ -0,0 +1,11 @@ +{ + "name": "node", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": {}, + "keywords": [], + "author": "", + "license": "ISC" +} + diff --git a/smoke_tests/src_python/app.py b/smoke_tests/src_python/app.py new file mode 100644 index 0000000..1d5a79e --- /dev/null +++ b/smoke_tests/src_python/app.py @@ -0,0 +1,2 @@ +def lambda_handler(event, context): + return {"message": "Hello!"} diff --git a/smoke_tests/variables.tf b/smoke_tests/variables.tf new file mode 100644 index 0000000..a072f36 --- /dev/null +++ b/smoke_tests/variables.tf @@ -0,0 +1,14 @@ +variable "datadog_secret_arn" { + description = "Secret for Datadog API Key" + type = string +} + +variable "datadog_service_name" { + description = "Service used to filter for resources in Datadog" + type = string +} + +variable "datadog_site" { + description = "Destination site for your metrics, traces, and logs" + type = string +} diff --git a/smoke_tests/versions.tf b/smoke_tests/versions.tf new file mode 100644 index 0000000..14db307 --- /dev/null +++ b/smoke_tests/versions.tf @@ -0,0 +1,11 @@ +terraform { + required_version = ">= 1.5.0" + + required_providers { + aws = { + source = "hashicorp/aws" + version = ">= 5.77.0" + } + } +} + diff --git a/variables.tf b/variables.tf index 8a420f3..d31a8a2 100644 --- a/variables.tf +++ b/variables.tf @@ -5,7 +5,7 @@ variable "datadog_extension_layer_version" { description = "Version for the Datadog Extension Layer" type = number - default = 65 + default = 67 } variable "datadog_dotnet_layer_version" { @@ -23,13 +23,13 @@ variable "datadog_java_layer_version" { variable "datadog_node_layer_version" { description = "Version for the Datadog Node Layer" type = number - default = 115 + default = 117 } variable "datadog_python_layer_version" { description = "Version for the Datadog Python Layer" type = number - default = 99 + default = 104 } diff --git a/versions.tf b/versions.tf index 6661950..008c0ef 100644 --- a/versions.tf +++ b/versions.tf @@ -4,7 +4,7 @@ terraform { required_providers { aws = { source = "hashicorp/aws" - version = ">= 5.32.0" + version = ">= 5.77.0" } } }