testing/smoketest/main.tf (146 lines of code) (raw):

provider "aws" { region = var.aws_region default_tags { tags = module.tags.tags } } module "tags" { source = "../tf-modules/tags" project = local.user_name build = var.github_workflow_id } module "ec_deployment" { source = "github.com/elastic/apm-server//testing/infra/terraform/modules/ec_deployment?depth=1" deployment_name_prefix = "apm-aws-lambda-smoke-testing" integrations_server = true elasticsearch_size = "1g" elasticsearch_zone_count = 1 apm_server_expvar = false apm_server_pprof = false region = var.ess_region deployment_template = var.ess_deployment_template stack_version = var.ess_version tags = module.tags.tags } locals { runtimeVars = { "nodejs" = { "source_file" = "./function/index.js" "handler" = "index.handler" "runtime" = "nodejs18.x" "agent_layer" = "arn:aws:lambda:${var.aws_region}:267093732750:layer:elastic-apm-node-ver-4-3-0:1" "envvars" = { "NODE_OPTIONS" = "-r elastic-apm-node/start" } } "python" = { "source_file" = "./function/main.py" "handler" = "main.handler" "runtime" = "python3.9" "agent_layer" = "arn:aws:lambda:${var.aws_region}:267093732750:layer:elastic-apm-python-ver-6-22-3:1" "envvars" = { "AWS_LAMBDA_EXEC_WRAPPER" = "/opt/python/bin/elasticapm-lambda" } } } } data "aws_iam_policy_document" "assume_role" { statement { effect = "Allow" principals { type = "Service" identifiers = ["lambda.amazonaws.com"] } actions = ["sts:AssumeRole"] } } resource "aws_iam_role" "lambda" { name_prefix = "apm-aws-lambda-smoke-testing-iam-role" assume_role_policy = data.aws_iam_policy_document.assume_role.json } data "archive_file" "lambda" { type = "zip" source_file = local.runtimeVars[var.function_runtime]["source_file"] output_path = "lambda_function_payload.zip" } resource "aws_lambda_function" "test_lambda" { filename = "lambda_function_payload.zip" function_name = "${local.user_name}-smoke-testing-test" role = aws_iam_role.lambda.arn handler = local.runtimeVars[var.function_runtime]["handler"] runtime = local.runtimeVars[var.function_runtime]["runtime"] source_code_hash = data.archive_file.lambda.output_base64sha256 layers = [ aws_lambda_layer_version.lambda_layer.arn, local.runtimeVars[var.function_runtime]["agent_layer"] ] environment { variables = merge({ ELASTIC_APM_LOG_LEVEL = var.log_level ELASTIC_APM_LAMBDA_APM_SERVER = module.ec_deployment.apm_url ELASTIC_APM_SECRETS_MANAGER_SECRET_TOKEN_ID = aws_secretsmanager_secret.apm_secret_token.id }, local.runtimeVars[var.function_runtime]["envvars"]) } depends_on = [ aws_iam_role_policy_attachment.lambda_logs, aws_iam_role_policy_attachment.secrets_manager_elastic_apm_policy_attach, aws_cloudwatch_log_group.example, ] } resource "aws_cloudwatch_log_group" "example" { name = "/aws/lambda/${local.user_name}-smoke-testing-test-${var.github_workflow_id}" retention_in_days = 1 } data "aws_iam_policy_document" "lambda_logging" { statement { effect = "Allow" actions = [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", ] resources = ["arn:aws:logs:*:*:*"] } } resource "aws_iam_policy" "lambda_logging" { name = "${local.user_name}-smoke-testing-test-${var.github_workflow_id}" path = "/" description = "IAM policy for logging during smoketest for apm aws lambda extension" policy = data.aws_iam_policy_document.lambda_logging.json } resource "aws_iam_role_policy_attachment" "lambda_logs" { role = aws_iam_role.lambda.name policy_arn = aws_iam_policy.lambda_logging.arn } resource "aws_secretsmanager_secret" "apm_secret_token" { name_prefix = "apm-aws-lambda-smoke-testing-secret" recovery_window_in_days = 0 } resource "aws_secretsmanager_secret_version" "apm_secret_token_version" { secret_id = aws_secretsmanager_secret.apm_secret_token.id secret_string = module.ec_deployment.apm_secret_token } data "aws_iam_policy_document" "policy" { statement { effect = "Allow" resources = [aws_secretsmanager_secret.apm_secret_token.arn] actions = ["secretsmanager:GetSecretValue"] } } resource "aws_iam_policy" "secrets_manager_elastic_apm_policy" { name_prefix = "apm-aws-lambda-smoke-testing-iam-policy" description = "Allows the lambda function to access the APM secret token stored in AWS Secrets Manager." policy = data.aws_iam_policy_document.policy.json } resource "aws_iam_role_policy_attachment" "secrets_manager_elastic_apm_policy_attach" { role = aws_iam_role.lambda.name policy_arn = aws_iam_policy.secrets_manager_elastic_apm_policy.arn } locals { zip_files = tolist(fileset("../../dist/", "*-linux-amd64.zip")) } resource "aws_lambda_layer_version" "lambda_layer" { filename = "../../dist/${local.zip_files[0]}" layer_name = "apm-aws-lambda-smoke-testing-lambda_layer_name" description = "AWS Lambda Extension Layer for Elastic APM - smoke testing" }