【发布时间】:2021-11-10 13:50:57
【问题描述】:
编辑:原来解决方案在文档中。我安装了沼泽标准普通“sam”,但我需要他们所谓的“公共预览版”AKA“sam-beta-cdk”。安装后,API 可以在本地使用sam-betacdk start-api 启动并且运行良好。虽然我很欣赏建议应该使用纯 TDD 来完成开发的答案,但我觉得这种更具交互性的手动模式也很有价值,因为它允许更快地探索问题空间。
我正在尝试使用 API Gateway、Lambdas 和 DynamoDB 使用 CDK + Typescript 构建我的第一个应用程序。我已经构建了几个 Lambdas 并部署了它们,它们在网络上运行良好。但是,我不希望将一分钟的部署周期和各种相关的 AWS 成本作为我工作流程的一部分。我想要的是能够在本地测试我的 API。
我一直在努力寻找有关如何执行此操作的文档。亚马逊似乎建议使用 SAM CLI here,这就是我一直在尝试的。
文档声称运行 sam local xyz 运行 cdk synth 以在 ./aws-sam/build 中进行“可以组装”,但我没有看到这方面的证据。相反,我得到的是 sam 找不到“template.yml”的投诉。所以我手动运行cdk synth > template.yml,它会在根文件夹中创建一个。然后我运行sam local start-api,它似乎很高兴启动。
然后我尝试使用 CURL:curl 'http://127.0.0.1:3000/test' 命中我的测试 lambda,我得到 {"message":"Internal server error"} 和一个巨大的丑陋堆栈跟踪在运行 sam local start-api 的控制台中
lambda 是这个...
exports.handler = async function() {
console.log("WooHoo! Test handler ran")
return {statusCode: 200, headers: {"Content-Type": "application/json"}, body: "Test handler ran!"}
}
巨大的丑陋堆栈跟踪的开始......
Mounting /home/user/code/image-cache/asset.beeaa749e012b5921018077f0a5e4fc3ab271ef1c191bd12a82aa9a92148782e as /var/task:ro,delegated inside runtime container
START RequestId: 99f53642-b294-4ce5-a1b4-8c967db80ce1 Version: $LATEST
2021-09-15T12:33:37.086Z undefined ERROR Uncaught Exception {"errorType":"Runtime.ImportModuleError","errorMessage":"Error: Cannot find module 'test'\nRequire stack:\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js","stack":["Runtime.ImportModuleError: Error: Cannot find module 'test'","Require stack:","- /var/runtime/UserFunction.js","- /var/runtime/index.js"," at _loadUserApp (/var/runtime/UserFunction.js:100:13)"," at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
巨大丑陋的堆栈跟踪结束...
Invalid lambda response received: Lambda response must be valid json
所以看起来sam local start-api 找不到test 并抛出错误,这意味着API 网关没有得到有效的“lambda 响应”。到目前为止,这并没有帮助我解决问题:/ 它似乎确实意识到测试是一条路线,因为尝试命中其他端点给出了经典的{"message":"Missing Authentication Token"},但尽管我同时拥有functions/test.ts,但试图实现它却很难实现它和编译后的functions/test.js 存在。
我在我的 CDK 堆栈定义中定义了测试路由和处理程序,如下所示...
const testLambda = new lambda.Function(this, "testLambdaHandler", {
runtime: lambda.Runtime.NODEJS_14_X,
code: lambda.Code.fromAsset("functions"),
handler: "test.handler"
})
api.root
.resourceForPath("test")
.addMethod("GET", new apigateway.LambdaIntegration(testLambda))
我考虑过发布我的 template.yml,但这比大而丑陋的错误消息还要长,所以我没有。
所以我有三个问题(实际上是一百万,但我不想太厚脸皮!)
- 这实际上是本地测试使用 CDK 制作的应用程序的规范方式吗
- 如果是这样,我哪里出错了?
- 如果不是,更好/正确的方法是什么?
【问题讨论】:
-
你好,@Roger。当
cdk synth命令执行时,你能把它贴在这里template.yaml文件,以便我们检查正在创建的资源吗? -
@MateusArruda 当然,都在这里:github.com/Roger-Heathcote/image-cache
-
这很奇怪,但我有一个猜测:你的
image-cache-stack.ts在<rootDir>/lib中,对吗?在addLambda函数中,您指向一个名为“functions”的目录,但在您现在所在的文件中,没有名为functions的目录。所以我认为您可以执行以下操作: 1. 使用code: lambda.Code.fromAsset("../../functions"),或者像this documentation 一样将根目录设置为函数。让我们知道这是否适合您。 -
感谢马特乌斯。我刚刚发现了问题,根本不是代码,我没有安装最新的“公共预览”版本的 sam。我被顶部的示例抛出,没有使用'sam-beta-cdk'。我安装了一切都很好。非常感谢您的宝贵时间!
-
我很高兴听到这个消息!我会继续关注,这样也不会发生在我身上
标签: amazon-web-services aws-lambda aws-cdk aws-sam-cli