Search code examples
typescriptamazon-web-servicesaws-lambdaterraformterraform-provider-aws

Error: Cannot find module '\nRequire stack:\n- /var/runtime/index.mjs when invoking Lambda function created with Terraform and Node.js >= 18


I have created a Lambda function using Terraform, and my Node.js version is >= 18. I setup the infra based on article. However, when I try to invoke the Lambda function, I encounter the following error in CloudWatch:

     "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module 'slack-notification'\nRequire stack:\n- /var/runtime/index.mjs",

I'm unsure what is causing this error. Can someone help me understand what could be causing the "Error: Cannot find module 'slack-notification'" when trying to invoke the Lambda function?

Terraform Infrastructure:

resource "null_resource" "lambda_dependencies" {
  triggers = {
    updated_at = timestamp()
  }

  provisioner "local-exec" {
    command     = <<EOF
      npm install
      EOF
    working_dir = "${path.module}${var.lambda_relative_path}"
  }
}

data "archive_file" "lambda-zip" {
  type        = "zip"
  source_dir  = var.lambda_path
  output_path = "lambda_function.zip"
  depends_on  = [null_resource.lambda_dependencies]
}

resource "aws_lambda_function" "lambda_module" {
  filename         = data.archive_file.lambda-zip.output_path
  function_name    = "gitlab-slack-integration-${var.environment}"
  role             = aws_iam_role.iam_for_lambda.arn
  handler          = "slack-notification.handler"
  source_code_hash = data.archive_file.lambda-zip.output_base64sha256
  runtime          = "nodejs18.x"
 
  environment {
    variables = {
      env = var.environment
    }
  }
}

slack-notification.ts file:

import { SNSEvent, Context } from "aws-lambda";

export const handler = async (event: SNSEvent, context: Context) => {
  const snsMessage = JSON.parse(event.Records[0].Sns.Message);

  console.log({ snsMessage });
  return context.logStreamName;
};

Directory structure:

├── src
│   ├── functions
│   │   └── slack-notification.ts
│   ├── package-lock.json
│   ├── package.json
│   └── tsconfig.json
└── terra-infra
    ├── backend-dev.tf
    ├── dev
    │   └── functions
    │       ├── api-gateway.tf
    │       ├── backend.tf
    │       ├── lambda.tf
    │       ├── lambda_function.zip
    │       ├── provider.tf
    │       ├── sns-topic.tf
    │       ├── variables.auto.tfvars
    │       └── variables.tf
    ├── module
    ├── remote-state
    │   ├── main.tf
    │   ├── provider.tf
    │   ├── terraform.tfstate.backup
    │   ├── variables.auto.tfvars
    │   └── variables.tf
    └── run-env.sh


Solution

  • Node JS lambda does not support Typescript directly and must be transpiled first with tsc command: https://docs.aws.amazon.com/lambda/latest/dg/lambda-typescript.html