AWS SAM 使用 AWS Toolkit - AWS Cloud9

AWS Cloud9 不再提供給新客戶。的現有客戶 AWS Cloud9 可以繼續正常使用服務。進一步了解

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS SAM 使用 AWS Toolkit

Toolkit 為無伺服器應用程式 AWS 提供支援。您可以使用 AWS Toolkit 建立包含 AWS Lambda 函數的無伺服器應用程式,然後將應用程式部署到 AWS CloudFormation 堆疊。

建立無伺服器應用程式

此範例示範如何使用 AWS Toolkit 建立無伺服器應用程式。如需了解如何執行與除錯無伺服器應用程式,請參閱 執行與除錯無伺服器應用程式

建立無伺服器應用程式的必要先決條件包括 AWS SAM CLIAWS CLI。這些包含在 中 AWS Cloud9。如果 AWS SAM CLI 未安裝,或如果已過時,您可能需要執行安裝或升級。如需如何安裝 的指示 AWS SAM CLI,請參閱安裝 AWS SAM CLI和 以取得如何升級 的指示 AWS SAM CLI,請參閱升級 AWS SAM CLI

使用 AWS Toolkit 建立無伺服器應用程式

此範例說明如何使用 AWS Toolkit 建立無伺服器應用程式,方法是使用 AWS Serverless Application Model (AWS SAM)

  1. AWS Explorer 中,開啟 Lambda 節點的內容 (按一下滑鼠右鍵) 選單,然後選擇建立 Lambda SAM 應用程式

    注意

    或者,您可以從 AWS: Explorer 標題中選取跨越 的選單圖示,然後選擇建立 Lambda SAM 應用程式

  2. 選擇SAM應用程式的執行時間。在此範例中,請選擇 nodejs12.x

    注意

    如果您選取了包含「(Image)」的執行時間,您的應用程式就是 Image 套件類型。如果您選取了不包含「(Image)」的執行時間,您的應用程式就是 Zip 類型。如需詳細了解 ImageZip 套件類型的差異,請參閱 AWS Lambda 開發人員指南中的 Lambda 部署套件

  3. 為您的無伺服器應用程式選擇下列其中一個範本:

    • AWS SAM Hello World :具有 Lambda 函數的基本範本,會傳回傳統「Hello World」訊息。

    • AWS Step Functions 範例應用程式 :執行庫存交易工作流程的範例應用程式。Step Functions 會協調 Lambda 函數有參與的互動。

  4. 您可以選擇新專案的位置。若已存在,您可以選取現有的工作空間資料夾。否則,請瀏覽其他資料夾。如果選擇 Select a different folder (選取其他資料夾),畫面會顯示一個對話方塊,您可以從中選取資料夾位置。

  5. 輸入新應用程式的名稱。在此範例中,使用 my-sam-app-nodejs。按 Enter 後, AWS Toolkit 會花費一些時間來建立專案。

建立專案時,您可以在「Environment」(環境) 視窗中檢視應用程式的檔案。列於 Explorer 視窗中。

顯示SAM應用程式可用執行時間的螢幕擷取畫面。

執行與除錯無伺服器應用程式

您可以使用 AWS Toolkit 來設定如何偵錯無伺服器應用程式,並在開發環境中於本機執行這些應用程式。您可以偵錯由 AWS Serverless Application Model (AWS SAM) 範本定義的無伺服器應用程式。此範本使用簡單的YAML語法來描述資源,例如組成無伺服器應用程式的函數、、APIs資料庫和事件來源映射。

如需範本的詳細資訊 AWS SAM ,請參閱 開發人員指南中的AWS SAM 範本結構AWS Serverless Application Model

或者,您可以快速偵錯尚未遞交至SAM範本的無伺服器應用程式。

您開始使用內嵌動作來識別合格的 AWS Lambda 函數,以開始設定偵錯行為。若要使用SAM範本定義的基礎設施,請在相關的 YAML格式化檔案中使用內嵌動作。若要在不使用範本的情況下直接測試函數,請使用應用程式檔案中 Lambda 處理常式的內容感知連結。

注意

在此範例中,我們正在偵錯使用 的應用程式 JavaScript。但是,您可以使用 AWS Toolkit 中提供的偵錯功能搭配下列語言和執行時間:

  • JavaScript – Node.js 10.x、12.x、14.x

  • Python – 3.7、3.8、3.9、3.10 (Python 2.7 和 3.6 無伺服器應用程式可以執行,但無法透過 AWS Toolkit 進行除錯。)

您的語言選擇也會在內容感知連結指出符合資格的 Lambda 處理常式時產生影響。如需詳細資訊,請參閱直接從程式碼執行和除錯無伺服器函數

使用 SAM 範本執行和偵錯無伺服器應用程式

對於使用 SAM 範本執行和偵錯的應用程式,YAML格式化檔案會描述應用程式的行為及其使用的資源。如果您使用 AWS Toolkit 建立無伺服器應用程式,template.yaml系統會自動為您的專案產生名為 的檔案。

在此程序中,請使用建立於 建立無伺服器應用程式 的範例應用程式。

使用SAM範本執行和偵錯無伺服器應用程式

  1. 若要檢視無伺服器應用程式內含的應用程式檔案,請前往 Environment (環境) 視窗。

  2. 從應用程式資料夾 (例如 my-sample-app) 開啟 template.yaml 檔案。

  3. 針對 template.yaml,選取 Edit Launch Configuration (編輯啟動組態)。

    新的編輯器會顯示 launch.json 檔案,該檔案提供的除錯組態採用預設屬性。

  4. 編輯或確認下列組態屬性的值:

    • "name" – 輸入方便識讀的名稱,讓它顯示在 Run (執行) 檢視的 Configuration (組態) 下拉式欄位中。

    • "target" – 確保該值是 "template"。如此一來,SAM範本即為偵錯工作階段的進入點。

    • "templatePath" – 輸入 template.yaml 檔案的相對或絕對路徑。

    • "logicalId" – 確保名稱與SAM範本的資源區段中指定的名稱相符。在此例中,此名稱為 AWS::Serverless::Function 類型的 HelloWorldFunction

    如需詳細了解 launch.json 檔案中的上述與其他項目,請參閱 除錯無伺服器應用程式的組態選項

  5. 如果您認為除錯組態沒有問題,請儲存 launch.json。然後,選擇旁邊的綠色「播放」按鈕RUN以開始偵錯。

    注意

    如果您的SAM應用程式無法執行,請檢查輸出視窗,查看錯誤是否由未建置的 Docker 映像造成。您可能需要釋放環境中的磁碟空間。

    如需詳細資訊,請參閱在 AWS Toolkit 中本機執行SAM應用程式時發生錯誤,因為 AWS Cloud9 環境沒有足夠的磁碟空間

    當偵錯工作階段開始時,DEBUGCONSOLE面板會顯示偵錯輸出,並顯示 Lambda 函數傳回的任何值。偵錯SAM應用程式時,會在輸出面板中選取 AWS Toolkit 作為輸出頻道。

    注意

    如果 Windows 使用者在此程序中遇到 Docker 掛載問題,您可能需要重新整理自己的共用磁碟機的憑證 (在 Docker 設定中)。Docker 掛載錯誤類似如下。

    Fetching lambci/lambda:nodejs10.x Docker container image...... 2019-07-12 13:36:58 Mounting C:\Users\<username>\AppData\Local\Temp\ ... as /var/task:ro,delegated inside runtime container Traceback (most recent call last): ...requests.exceptions.HTTPError: 500 Server Error: Internal Server Error ...

直接從程式碼執行和除錯無伺服器函數

測試 AWS SAM 應用程式時,您可以選擇僅執行 Lambda 函數並對其進行偵錯。排除由 SAM 範本定義的其他資源。這種方法必須使用內嵌動作,在可以直接叫用的來源程式碼中識別 Lambda 函數處理常式。

內容感知連結偵測到的 Lambda 處理常式取決於您用於應用程式的語言和執行時間。

語言/執行時間 內容感知連結識別 Lambda 函數的條件

JavaScript (Node.js 10.x、12.x 和 14.x)

函式具備以下特性:
  • 它是經過匯出的函式,最多有三個參數。

  • 它在工作空間資料夾中的父項資料夾有一個 package.json 檔案。

Python (3.7、3.8、3.9 和 3.10)

函式具備以下特性:
  • 它是最上層函數。

  • 它在工作空間資料夾中的父項資料夾有一個 requirements.txt 檔案。

如何從應用程式程式碼直接執行與除錯無伺服器應用程式

  1. 若要檢視無伺服器應用程式檔案,請選擇編輯器旁邊的資料夾圖示,導覽至應用程式資料夾。

  2. 從應用程式資料夾 (例如 my-sample-app),展開函數資料夾 (在此範例中為 hello-world ),然後開啟 app.js 檔案。

  3. 在用於識別符合資格的 Lambda 處理常式函數的內嵌動作中,選擇 Add Debug Configuration。如未顯示新增除錯組態選項,您必須啟用程式碼濾鏡。若要啟用程式碼濾鏡,請參閱 啟用 AWS Toolkit 程式碼鏡頭

    在內嵌動作中,針對 Lambda 函式處理常式存取 Add Debug Configuration (新增除錯組態) 選項。
  4. 選取SAM應用程式執行的執行時間。

  5. launch.json 檔案的編輯器中編輯或確認下列組態屬性的值:

    • "name" – 輸入方便識讀的名稱。

    • "target" – 確認值為 "code",以便直接叫用 Lambda 函式處理常式。

    • "lambdaHandler" – 輸入程式碼中所用方法的名稱,Lambda 會呼叫此程式碼來叫用您的函數。例如,對於 中的應用程式 JavaScript,預設值為 app.lambdaHandler

    • "projectRoot" – 為包含 Lambda 函式的應用程式輸入檔案路徑。

    • "runtime" – 輸入或確認 Lambda 執行環境的有效執行時間 (例如 "nodejs.12x")。

    • "payload" – 選擇下列其中一個選項來定義您想要提供給 Lambda 函式作為輸入的事件酬載:

      • "json":定義事件承載的JSON格式化鍵值對。

      • "path":作為事件酬載的檔案的路徑。

  6. 如果您對偵錯組態感到滿意,請選擇綠色播放箭頭旁邊的 RUN以開始偵錯。

    偵錯工作階段開始時,DEBUGCONSOLE面板會顯示偵錯輸出,並顯示 Lambda 函數傳回的任何值。偵錯SAM應用程式時,會在輸出面板中選取 AWS Toolkit 作為輸出頻道。

    注意

    如果錯誤訊息提及 Docker,請參閱本注意事項

執行和偵錯本機 Amazon API Gateway 資源

您可以執行或偵錯 AWS SAM API 中指定的閘道本機資源template.yaml。使用 執行 的 AWS Cloud9 啟動組態type=aws-sam來執行此操作invokeTarget.target=api

注意

API Gateway 支援兩種類型的 APIs。它們是 REST和 HTTP APIs。不過,使用 AWS Toolkit 的API閘道功能僅支援 REST APIs。有時HTTPAPIs稱為「API閘道 V2」APIs。

執行和偵錯本機API閘道資源
  1. 選擇下列其中一種方法來建立 AWS SAM API閘道資源的啟動組態:

    • 選項 1:前往您 AWS SAM 的處理常式來源程式碼 (尤其是.js、.cs 或 .py 檔案) 專案,將游標懸浮在 Lambda 處理常式上,然後選擇 Add Debug Configuration (新增除錯組態)。如果未顯示新增除錯組態選項,請啟用程式碼濾鏡。若要啟用程式碼濾鏡,請參閱 啟用 AWS Toolkit 程式碼鏡頭 。然後,在功能表中,選擇標記為 API Event 的項目。

    • 選項 2:編輯 launch.json,並使用以下語法建立新的啟動組態。

      { "type": "aws-sam", "request": "direct-invoke", "name": "myConfig", "invokeTarget": { "target": "api", "templatePath": "n12/template.yaml", "logicalId": "HelloWorldFunction" }, "api": { "path": "/hello", "httpMethod": "post", "payload": { "json": {} } }, "sam": {}, "aws": {} }
  2. Run (執行) 按鈕旁邊的下拉式選單中,選擇啟動組態 (在上面的範例中名稱為 myConfig)。

  3. (選用) 在 Lambda 專案程式碼中新增中斷點。

  4. 選擇綠色「播放」按鈕旁邊的 Run (執行) 按鈕。

  5. 在輸出窗格中檢視結果。

組態

如果您使用 invokeTarget.target 屬性值 api,Toolkit 會變更啟動組態驗證和行為,以便支援 api 欄位。

{ "type": "aws-sam", "request": "direct-invoke", "name": "myConfig", "invokeTarget": { "target": "api", "templatePath": "n12/template.yaml", "logicalId": "HelloWorldFunction" }, "api": { "path": "/hello", "httpMethod": "post", "payload": { "json": {} }, "querystring": "abc=def&qrs=tuv", "headers": { "cookie": "name=value; name2=value2; name3=value3" } }, "sam": {}, "aws": {} }

將範例中的值更換為如下所示:

invokeTarget.logicalId

API 資源。

路徑

啟動組態請求的API路徑 (例如 "path": "/hello")。

必須是從 template.yaml指定的 解析的有效API路徑invokeTarget.templatePath

httpMethod

使用以下其中一個動詞:「delete」、「get」、「head」、「options」、「patch」、「post」、「put」。

payload

傳送請求的JSON承載 (HTTP內文),其結構和規則與 lambda.payload 欄位相同。

payload.path 指向包含JSON承載的檔案。

payload.json 指定承載JSON內嵌。

標頭

選用的名稱/值組對應。使用它來指定要包含在請求中的HTTP標頭。

"headers": { "accept-encoding": "deflate, gzip;q=1.0, *;q=0.5", "accept-language": "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5", "cookie": "name=value; name2=value2; name3=value3", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36", }
querystring

(選用) 使用此字串來設定請求中的 querystring (例如 "querystring": "abc=def&ghi=jkl")。

aws

如何提供 AWS 連線資訊。如需詳細資訊,請參閱 除錯無伺服器應用程式的組態選項 中的 AWS 連線 (aws) 屬性 資料表。

sam

如何 AWS SAM CLI建置應用程式。如需詳細資訊,請參閱 中的 AWS SAM CLI("sam") 屬性除錯無伺服器應用程式的組態選項

同步無伺服器應用程式

此範例示範如何使用 將上一個主題 (建立無伺服器應用程式) 中建立的無伺服器應用程式同步至 AWS AWS Toolkit for Visual Studio Code。

必要條件

  • 請務必選擇全域唯一的 Amazon S3 儲存貯體名稱。

  • 請確定您在 中設定的憑證包含對下列服務的正確讀取/寫入存取權:Amazon S3 AWS CloudFormation AWS Lambda、 和 Amazon API Gateway。

  • 對於部署類型為 的應用程式Image,請確定您同時擁有全域唯一的 Amazon S3 儲存貯體名稱和 Amazon ECR儲存庫URI,可用於部署。

同步無伺服器應用程式

  1. AWS Explorer 視窗中,開啟 Lambda 節點的內容 (按一下滑鼠右鍵) 選單,然後選取同步SAM應用程式

  2. 選擇要部署的 AWS 區域 。

  3. 選擇要用於部署的 template.yaml 檔案。

  4. 輸入此部署可以使用的 Amazon S3 儲存貯體名稱。儲存貯體必須位於您要部署檔案的 區域。

    警告

    在現有的所有 Amazon S3 儲存貯體名稱中,該 Amazon S3 儲存貯體名稱必須為全域唯一。將唯一識別符新增至在以下範例中指定的名稱,或選擇不同的名稱。

  5. 如果您的無伺服器應用程式包含套件類型 的函數Image,請輸入此部署可以使用的 Amazon ECR儲存庫名稱。儲存庫必須位於您要部署檔案的區域。

  6. 輸入部署之堆疊的名稱,即新堆疊的名稱或現有堆疊的名稱。

  7. Console (主控台)AWS Toolkit 索引標籤上確認部署成功。

    如果發生錯誤,右下角會顯示彈出式訊息。

    如果發生這種情況,請查看 AWS Toolkit 索引標籤中的文字了解詳情。以下是錯誤詳細資訊的範例。

    Error with child process: Unable to upload artifact HelloWorldFunction referenced by CodeUri parameter of HelloWorldFunction resource. S3 Bucket does not exist. Execute the command to create a new bucket aws s3 mb s3://pbart-my-sam-app-bucket An error occurred while deploying a SAM Application. Check the logs for more information by running the "View AWS Toolkit Logs" command from the Command Palette.

    在此範例中,由於 Amazon S3 儲存貯體不存在,因此發生錯誤。

部署完成時,您將看到應用程式在 AWS Explorer 中列出。若要了解如何叫用 Lambda 函式 (該函數是做為應用程式的一部分而建立),請參閱 叫用遠端 Lambda 函式

啟用 AWS Toolkit 程式碼鏡頭

  1. 從選單列選擇 AWS Cloud9、然後選擇Preferences (偏好設定)。

  2. Preferences (偏好設定) 標籤的側邊欄中,選擇 AWS Toolkit

  3. 若要啟用程式碼濾鏡,請選擇 Enable Code Lenses (啟用程式碼濾鏡)。

從 AWS 雲端刪除無伺服器應用程式

刪除無伺服器應用程式涉及刪除您先前部署到 AWS Cloud 的 AWS CloudFormation 堆疊。請注意,此程序不會從本機主機刪除應用程式目錄。

  1. 開啟 AWS Explorer

  2. AWS Explorer 視窗中,展開您要刪除的已部署應用程式所在的區域,然後展開 AWS CloudFormation

  3. 開啟對應至您要刪除之無伺服器應用程式的 AWS CloudFormation 堆疊名稱的內容 (按滑鼠右鍵) 選單。然後,選擇刪除 CloudFormation 堆疊

  4. 如要確認刪除所選堆疊,請選擇 Delete (刪除)。

如果堆疊刪除成功, AWS Toolkit 會從 AWS Explorer 的清單中移除堆疊名稱 AWS CloudFormation 。