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
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