簡體   English   中英

AWS CDK - 如何在本地運行 API 和 Lambdas?

[英]AWS CDK - How to run API and Lambdas locally?

編輯:原來解決方案在文檔中。 我安裝了標准的普通“sam”,但我需要他們所謂的“公共預覽版”又名“sam-beta-cdk”。 安裝后,API 可以使用sam-betacdk start-api在本地啟動並且運行良好。 雖然我很欣賞建議應該使用純 TDD 進行開發的答案,但我覺得這種更具交互性的手動模式也很有價值,因為它允許更快地探索問題空間。

我正在嘗試使用 API 網關、Lambdas 和 DynamoDB 使用 CDK + Typescript 構建我的第一個應用程序。 我已經構建了幾個 Lambda 並部署了它們,它們在 web 上運行良好。但是,我不希望將一分鍾長的部署周期和各種相關的 AWS 成本作為我工作流程的一部分。 我想要的是能夠在本地測試我的 API。

我一直在努力尋找有關如何執行此操作的文檔。 Amazon 似乎建議在這里使用 SAM CLI,這就是我一直在嘗試的。

文檔聲稱運行sam local xyz運行cdk synth以在./aws-sam/build中進行“可能的組裝”,但我沒有看到這方面的證據。 相反,我得到的是 sam 找不到“template.yml”的投訴。 所以我手動運行cdk synth > template.yml在根文件夾中創建一個。 然后我運行sam local start-api似乎很高興啟動。

然后我嘗試使用 CURL 命中我的測試 lambda: curl 'http://127.0.0.1:3000/test'我得到{"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 但這比丑陋的大錯誤消息還要長,所以我沒有。

所以我有三個問題(實際上是一百萬個問題,但我不想太厚顏無恥!)

  1. 這實際上是本地測試使用 CDK 制作的應用程序的規范方法嗎
  2. 如果是這樣,我哪里錯了?
  3. 如果不是,更好/正確的方法是什么?

您的文件目錄一定有問題。 你的 index.js 在哪里? 如果生成模板.json,目錄是否正確? 另外,您在什么目錄中執行 Sam local 命令?

測試無服務器應用程序的關鍵是您不必測試整個應用程序。 您需要依靠 AWS API 網關、dynamodb 和 lambda 完美運行。 您唯一需要測試的是您實現的邏輯。

在這里,您確保您的 function 打印出一些東西並返回 200。這就是您要做的全部。 查看'jest'以測試js。

如果你想測試 cdk,你應該進入https://docs.aws.amazon.com/cdk/latest/guide/testing.html

“在本地運行 Aws”也不是好的做法。 它與它在現實生活中(即雲)中的運行方式完全不同。 你為此使用插件,為此使用工具......本地與雲中不同。

如果您還有其他問題,請隨時提問。

Lambda 處理程序只是函數。 它們不需要任何特殊環境到 function - 它們在 Lambda 調用過程中的特定點被調用,並提供一個事件(一個 json 對象)和一個上下文(另一個 json 對象)

您可以(並且應該)像您的語言/測試框架中的任何其他個體 function 一樣對它們進行單元測試。

正如@Lucasz 所提到的,您應該依賴這樣一個事實,即如果設置正確,API 網關和 Lambda 每次都會以相同的方式進行交互。 一旦你運行了一個端到端測試並且你知道基礎工作,任何進一步的實現都可以通過單元測試來完成

在單元測試中有許多用於 mocking AWS 服務調用的庫,對於更難模擬的服務有很多好的實踐解決方法(即:很難從另一個 lambda 內部模擬 Lambda 調用 - 但如果你包裝那個 lambda 調用它自己的 function,你可以模擬 function 本身返回你想要的任何東西 - 這也是測試的好習慣!)

使用開玩笑,在編碼單元測試中,您可以調用 lambda 處理程序,給它存根或模擬事件 json,以及上下文 json(可能只是空白,因為您沒有使用它)並且 lambda 處理程序將像任何其他處理程序一樣工作function 有兩個你曾經寫過的參數,包括返回你想要它返回的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM