我一生都无法理解如何设置 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 足够聪明,可以自己解决所有这些问题?
这是我已经知道的一些事情
我知道该错误表明 sam local 在它正在查找的任何目录中都找不到该函数。Typescript 代码被转换为具有完全不同结构的 .aws-sam/ 目录(我假设它是独立且将被压缩以进行部署)。
我确实尝试破解 CodeUri 属性以指向 .aws-sam 目录
好吧,我认为只要输入问题就可以让我的大脑开始工作。
顿悟是,如果我只是运行
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 模板文件作为嵌套堆栈调用。
希望有人能通过这次治疗得到帮助