我无法让我的 sam 本地 start-api 与 Typescript 一起使用

问题描述 投票:0回答:1

我一生都无法理解如何设置 SAM 在本地运行我的 Typescript/nodejs api。

我运行

sam local start-api
,一切都会启动。大量的调试日志记录并没有告诉我任何信息。当我尝试使用 CURL 调用 API 端点时,我收到以下错误消息:

26 Apr 2024 00:43:22,108 [ERROR] (rapid) Init failed error=Runtime exited with error: exit status 129 InvokeID=
26 Apr 2024 00:43:22,109 [ERROR] (rapid) Invoke failed error=Runtime exited with error: exit status 129 InvokeID=3506a416-5cd1-42a3-ba56-45ffa76d2369
26 Apr 2024 00:43:22,110 [ERROR] (rapid) Invoke DONE failed: Sandbox.Failure

以下是我如何在 SAM 模板 yaml 中设置 lambda 函数的示例:

  GetAuthenticatedUserDetailsFunction:
      CodeUri: ../
      Handler: GetAuthenticatedUserDetails.lambdaHandler
      Events:
        GetAuthenticatedUserDetails:
          Type: Api 
          Properties:
            RestApiId: !Ref api
            Path: /gaud
            Method: get
      Policies:
        - Version: '2012-10-17' 
          Statement:
            - Effect: Allow
              Action: "rds-db:connect"
              Resource: !Sub 'arn:aws:rds-db:${AWS::Region}:${AWS::AccountId}:dbuser:${DBProxyPRXID}/*'
    Metadata:
      BuildMethod: esbuild
      BuildProperties:
        Minify: true
        Target: es2020
        Sourcemap: true
        EntryPoints:
        - src/GetAuthenticatedUserDetails.ts

我做错了什么?我认为 sam cli 足够聪明,可以自己解决所有这些问题?

这是我已经知道的一些事情

  • Entrypoints 属性包含“src”目录。如果我将该目录移至 CodeUri 属性,则 sam build 会失败,并显示 esbuild 在我的计算机上不存在(但神奇的是,此配置确实存在)
  • sam build 命令将所有 .ts 代码转换为 ./aws-sam 目录中的 .js 目录。但!它具有不同的结构,其中代码是按函数编译的。

我知道该错误表明 sam local 在它正在查找的任何目录中都找不到该函数。Typescript 代码被转换为具有完全不同结构的 .aws-sam/ 目录(我假设它是独立且将被压缩以进行部署)。

我确实尝试破解 CodeUri 属性以指向 .aws-sam 目录

typescript amazon-web-services local sam
1个回答
0
投票

好吧,我认为只要输入问题就可以让我的大脑开始工作。

顿悟是,如果我只是运行

tsc src/*.ts --outputDir dist
,我将在“dist”目录中获得 Typescript 文件的 javascript 版本,其目录结构完全相同。

因此,如果我只使用 dist dir 作为代码 URI,所有内容都将被 sam local 找到。

解决方案是创建一个如下所示的 shell 脚本:

rm -rf ./dist
tsc ./src/*.ts --outDir ./dist
sudo sam local start-api --debug --region us-east-1 -t ./template-local.yaml 

我制作了两种不同的 sam 模板 - 一种用于本地,一种用于 AWS。这些模板或多或少只是设置了 codeUri,然后我将实际的 API 模板文件作为嵌套堆栈调用。

希望有人能通过这次治疗得到帮助

© www.soinside.com 2019 - 2024. All rights reserved.