aws / aws-toolkit-vscode

Amazon Q, CodeCatalyst, Local Lambda debug, SAM/CFN syntax, ECS Terminal, AWS resources
https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.amazon-q-vscode
Apache License 2.0
1.46k stars 401 forks source link

SAM typescript lambda: Unable to debug Hello World Example with Powertools #4899

Closed samshteinman closed 3 months ago

samshteinman commented 4 months ago

Description:

After calling sam init, I cannot run and debug the application.

Breakpoints are not hit and an error is shown

2024-04-29 22:29:18.368 [info] 2024-04-30T02:29:18.365Z undefined   ERROR   Uncaught Exception  {"errorType":"Runtime.ImportModuleError","errorMessage":"Error: Cannot find module 'app'\nRequire stack:\n- /var/runtime/index.mjs","stack":["Runtime.ImportModuleError: Error: Cannot find module 'app'","Require stack:","- /var/runtime/index.mjs","    at _loadUserApp (file:///var/runtime/index.mjs:1087:17)","    at async Object.load (file:///var/runtime/index.mjs:1119:21)","    at async start (file:///var/runtime/index.mjs:1282:23)","    at async file:///var/runtime/index.mjs:1288:1"]}
2024-04-29 22:29:18.376 [info] Waiting for the debugger to disconnect...
2024-04-29 22:29:18.433 [info] 30 Apr 2024 02:29:18,430 [ERROR] (rapid) Init failed InvokeID= error=Runtime exited with error: exit status 129
30 Apr 2024 02:29:18,430 [ERROR] (rapid) Invoke failed error=Runtime exited with error: exit status 129 InvokeID=bf09f315-6705-41df-8995-075ad78661e0
30 Apr 2024 02:29:18,431 [ERROR] (rapid) Invoke DONE failed: Sandbox.Failure

I'm not sure why it's looking for index.mjs The auto-generated aws-toolkit-tsconfig.json contains:

{
    "compilerOptions": {
        "target": "es6",
        "module": "commonjs",
        "inlineSourceMap": true,
        "outDir": "D:\\folderA\\sam-app\\hello-world",
        "rootDir": ".",
        "sourceRoot": "D:/folderA/sam-app/hello-world",
        "typeRoots": [
            "node_modules/@types"
        ],
        "types": [
            "node"
        ]
    }
}

Steps to reproduce:

sam init

Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1

Choose an AWS Quick Start application template 1 - Hello World Example 2 - Data processing 3 - Hello World Example with Powertools for AWS Lambda 4 - Multi-step workflow 5 - Scheduled task 6 - Standalone function 7 - Serverless API 8 - Infrastructure event management 9 - Lambda Response Streaming 10 - Serverless Connector Hello World Example 11 - Multi-step workflow with Connectors 12 - GraphQLApi Hello World Example 13 - Full Stack 14 - Lambda EFS example 15 - DynamoDB Example 16 - Machine Learning Template: 3

Which runtime would you like to use? 1 - dotnet8 2 - dotnet6 3 - java17 4 - java11 5 - java8.al2 6 - nodejs20.x 7 - nodejs18.x 8 - nodejs16.x 9 - python3.9 10 - python3.8 11 - python3.12 12 - python3.11 13 - python3.10 Runtime: 6

Based on your selections, the only Package type available is Zip. We will proceed to selecting the Package type as Zip.

Based on your selections, the only dependency manager available is npm. We will proceed copying the template using npm.

Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N

Would you like to enable monitoring using CloudWatch Application Insights? For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]:

Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]:

Project name [sam-app]:

-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: nodejs20.x
Architectures: x86_64
Dependency Manager: npm
Application Template: hello-world-powertools-typescript
Output Directory: .
Configuration file: sam-app\samconfig.toml

Next steps can be found in the README file at sam-app\README.md

Create a launch configuration

{
  "configurations": [
    {
      "type": "aws-sam",
      "request": "direct-invoke",
      "name": "hello-world:app.lambdaHandler (nodejs20.x)",
      "invokeTarget": {
        "target": "code",
        "projectRoot": "${workspaceFolder}/hello-world",
        "lambdaHandler": "app.lambdaHandler"
      },
      "lambda": {
        "runtime": "nodejs20.x",
        "payload": {},
        "environmentVariables": {}
      }
    }
  ]
}

Observed result:

Code is not executed Breakpoints are not hit in app.ts An error is shown in the AWS Toolkit OUTPUT console

Expected result:

Breakpoints are hit, code is executed

Additional environment details (Ex: Windows, Mac, Amazon Linux etc)

{
  "version": "1.115.0",
  "system": {
    "python": "3.11.8",
    "os": "Windows-10-10.0.19045-SP0"
  },
  "additional_dependencies": {
    "docker_engine": "25.0.3",
    "aws_cdk": "Not available",
    "terraform": "1.6.6"
  },
  "available_beta_feature_env_vars": [
    "SAM_CLI_BETA_FEATURES",
    "SAM_CLI_BETA_BUILD_PERFORMANCE",
    "SAM_CLI_BETA_TERRAFORM_SUPPORT",
    "SAM_CLI_BETA_RUST_CARGO_LAMBDA"
  ]
}

System details (run the AWS: About Toolkit command)

samshteinman commented 4 months ago

Linked issue: https://github.com/aws/aws-sam-cli/issues/6999

justinmk3 commented 4 months ago

I'm not sure why it's looking for index.mjs

AWS Toolkit currently assumes that any node 20.x project will have a .mjs entrypoint.

Since your example appears to be a typescript project, it may be necessary to build it first. Also using invokeTarget.target = template may help.

samshteinman commented 4 months ago

Thanks for your response!

AWS Toolkit currently assumes that any node 20.x project will have a .mjs entrypoint.

I re-created the project and chose node 16, same issue. The template.yaml and the launch configuration both specify nodejs 16

There is no index file specified anywhere, I have an app.ts , the "main" in my package.json specifies "app.js"

Since your example appears to be a typescript project, it may be necessary to build it first.

The project is automatically being built, at least according to the AWS Toolkit output

Also using invokeTarget.target = template may help.

Switching over to template, I see that the function runs successfully, but no breakpoints are being hit.

samshteinman commented 4 months ago

Pulled down the source code and starting to investigate...

One thing I'm noticing is that when sam build is triggered by the toolkit, the generated InputTemplate appvsctktemplate.yaml does not contain the metadata for ESBuild, is it supposed to? (The default template.yaml in the base-dir contains this information)

Either way, the output code in the temp directory, is all still Typescript, it's never transpiled to Javascript.

If I set breakpoints, and add the metadata manually to the appvsctktemplate.yaml, the esbuild step is triggered by sam build, and the code runs successfully, the error I originally talked about is gone... BUT still no breakpoints being hit.

Skipping the toolkit entirely, if I just call sam local invoke -d 5858 and attach, I still can't get the breakpoints to hit. So looks like issue is outside the toolkit?