Home > other >  Typescript modules are not been imported in lambda function while its deploying through cdk
Typescript modules are not been imported in lambda function while its deploying through cdk

Time:09-11

I use CDK to develop my serverless application in AWS. When I try to deploy a lambda function post after TS file compilation, its not importing TS modules in lambda function as JS modules.

Due to that, I am facing an Module not found error when I invoke my lambda.

The steps that I follow before I deploy the stack:

  1. tsc -> to complile TS files
  2. cdk synth
  3. cdk deploy

Ts config:

{
  "compilerOptions": {
    "target": "ES2018",
    "module": "commonjs",
    "lib": [
      "es2018"
    ],
    "noEmit": false,
    "declaration": false,
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "noUnusedLocals": false,
    "noUnusedParameters": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": false,
    "inlineSourceMap": true,
    "inlineSources": true,
    "experimentalDecorators": true,
    "strictPropertyInitialization": false,
    "typeRoots": [
      "./node_modules/@types"
    ]
  },
  "exclude": [
    "node_modules",
    "cdk.out"
  ]
}

Code:

import { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from 'aws-lambda';
import { DynamoDBClient, GetItemCommand, GetItemCommandInput } from "@aws-sdk/client-dynamodb";
import { marshall, unmarshall } from "@aws-sdk/util-dynamodb";

export async function handler(event: APIGatewayProxyEventV2,): Promise<APIGatewayProxyResultV2> {
console.log('event', event);

let userLat = event.pathParameters?.lat;
let userLng = event.pathParameters?.lng;    
let tableName = process.env.TABLE_NAME;
let results;

const dbClient: DynamoDBClient = new DynamoDBClient({ region: "ap-south-1" });
let params: GetItemCommandInput;

if (tableName) {
     params = {
        TableName: tableName,
        Key: marshall({
          "lat": userLat, 
          "lng": userLng
        }),
      };
}

const run = async function () {
    try {
        const resp = await dbClient.send(new GetItemCommand(params));
        results = unmarshall(resp.Item || {});
    } catch(err) {
        results = err;
    }
};

run();

return {
    body: JSON.stringify(
        results
    ),
    statusCode: 200
};     }

Details:

  • Node: v14.20.0
  • NPM: 6.14.17
  • CDK: 2.40.0 (build 56ba2ab)
  • Ts: Version 4.8.2

Error :

{ "errorType": "Runtime.ImportModuleError", "errorMessage": "Error: Cannot find module '@aws-sdk/client-dynamodb'\nRequire stack:\n- /var/task/fetchpartner.js\n- /var/runtime/UserFunction.js\n- /var/runtime/Runtime.js\n- /var/runtime/index.js", "trace": [ "Runtime.ImportModuleError: Error: Cannot find module '@aws-sdk/client-dynamodb'", "Require stack:", "- /var/task/fetchpartner.js", "- /var/runtime/UserFunction.js", "- /var/runtime/Runtime.js", "- /var/runtime/index.js", " at _loadUserApp (/var/runtime/UserFunction.js:221:13)", " at Object.module.exports.load (/var/runtime/UserFunction.js:279:17)", " at Object. (/var/runtime/index.js:43:34)", " at Module._compile (internal/modules/cjs/loader.js:1085:14)", " at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)", " at Module.load (internal/modules/cjs/loader.js:950:32)", " at Function.Module._load (internal/modules/cjs/loader.js:790:12)", " at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:75:12)", " at internal/main/run_main_module.js:17:47" ] }

CodePudding user response:

You can run npm init in the directory that contains your lambda code and install the modules you want there. Another way is to use something like webpack to compile and combine your code and modules into a single file.

CodePudding user response:

You can use the NodeJsFunction instead of the Lambda function. That will do an esbuild in the directory before deploying.

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs.NodejsFunction.html

https://github.com/schuettc/single-stack-full-stack-example/blob/9c5c3f51381a4c3d813ed097a298fccc16e81509/src/infrastructure.ts#L38-L51

  • Related