使用 API Gateway 叫用 Lambda - AWS SDK for JavaScript

AWS SDK for JavaScript V3 參API考指南詳細描述了 AWS SDK for JavaScript 版本 3(V3)的所有API操作。

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

使用 API Gateway 叫用 Lambda

您可以使用 Amazon API Gateway 來叫用 Lambda 函數,這是一項用於大規模建立、發佈、維護、監控和保護 REST、HTTP 和 WebSocket API 的AWS服務。API 開發人員可以建立 API,以存取 AWS 或其他 Web 服務,以及 AWS 雲端中所存放的資料。身為 API Gateway 開發人員,您可以建立 API,以便在自己的用戶端應用程式中使用。如需詳細資訊,請參閱什麼是 Amazon API Gateway

AWS Lambda是一種運算服務,可讓您在不佈建或管理伺服器的情況下執行程式碼。您可以使用各種程式設計語言建立 Lambda 函數。如需 AWS Lambda 的詳細資訊,請參閱什麼是 AWS Lambda?

在此範例中,您可以使用 Lambda JavaScript 執行階段 API 建立 Lambda 函數。這個範例會調用不同的 AWS 服務來執行特定使用案例。例如,假設某個組織傳送行動文字訊息給其員工,並在一年週年日期祝賀他們,如本圖所示。

DynamoDB 表

此範例大約需要 20 分鐘才能完成。

此範例說明如何使用 JavaScript 邏輯建立執行此使用案例的解決方案。例如,您將學習如何讀取資料庫,以判斷哪些員工已經達到一年週年紀念日、如何處理資料,以及使用 Lambda 函數傳送文字訊息。然後,您將學習如何使用 API Gateway 使用 Rest 端點來調用此AWS Lambda函數。例如,您可以使用以下 curl 命令叫用 Lambda 函數:

curl -XGET "https://xxxxqjko1o3.execute-api.us-east-1.amazonaws.com/cronstage/employee"

本AWS教學課程使用名為員工的 Amazon DynamoDB 表格,其中包含這些欄位。

  • id-表的主鍵。

  • 名字-員工的名字。

  • 電話-員工的電話號碼。

  • 始日期-員工的開始日期。

DynamoDB 表
重要

完成成本:本文件中包含的AWS服務包含在AWS免費方案中。但是,請務必在完成此範例之後終止所有資源,以確保不會向您收費。

必要工作

若要設定和執行此範例,您必須先完成這些任務:

  • 設置項目環境以運行這些節點 TypeScript 示例,並安裝所需AWS SDK for JavaScript的第三方模塊。按照上的說明進行操作 GitHub

  • 透過使用者登入資料建立共用組態檔。有關提供共用認證檔案的詳細資訊,請參閱 AWSSDK 和工具參考指南中的共用設定和認證檔案。

建立資AWS源

本教學課程需要下列資源:

  • Amazon DynamoDB 表格以名為Employee的金鑰命名,以Id及上圖中顯示的欄位。請務必輸入正確的資料,包括您要測試此使用案例的有效行動電話。如需詳細資訊,請參閱建立資料表

  • 具有附加權限的 IAM 角色,可執行 Lambda 函數。

  • 一個 Amazon S3 存儲桶來託管 Lambda 函數。

您可以手動建立這些資源,但我們建議您使用本教學課程中所AWS CloudFormation述來佈建這些資源。

使用建立AWS資源 AWS CloudFormation

AWS CloudFormation 可讓您以可預期和重複的方式建立及佈建 AWS 基礎設施部署。如需有關 AWS CloudFormation 的詳細資訊,請參閱《 使用者指南》AWS CloudFormation

要使用以下命AWS CloudFormation令創建堆棧AWS CLI:

  1. 安裝並設定AWS CLI以下AWS CLI使用者指南中的指示。

  2. 在項目文件夾的根目錄setup.yaml中創建一個名為的文件,然後將此處的內容複製 GitHub到其中。

    注意

    AWS CloudFormation範本是使用中AWS CDK提供的來產生的 GitHub。如需關於 AWS CDK 的詳細資訊,請參閱《AWS Cloud Development Kit (AWS CDK) 開發人員指南》。

  3. 從命令列執行下列命令,並以堆疊的唯一名稱取代 STACK_NAME

    重要

    堆疊名稱在AWS區域和AWS帳戶中必須是唯一的。您最多可以指定 128 個字元,且允許使用數字和連字號。

    aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM

    若要取得有關指create-stack令參數的更多資訊,請參閱《指AWS CLI令參考指南》和《AWS CloudFormation使用指南》

  4. 接下來,依照程序填入資料表填入表格

填入表格

要填充表格,請先創建一個名為的目錄libs,並在其中創建一個名為的文件dynamoClient.js,然後將下面的內容粘貼到其中。

const { DynamoDBClient } = require ( "@aws-sdk/client-dynamodb" ); // Set the AWS Region. const REGION = "REGION"; // e.g. "us-east-1" // Create an Amazon Lambda service client object. const dynamoClient = new DynamoDBClient({region:REGION}); module.exports = { dynamoClient };

此程式碼可在此處取得 GitHub。

接下來,在項目文件夾的根目錄populate-table.js中創建一個名為的文件,然後將此處的內容複製 GitHub到其中。對於其中一個項目,請將phone屬性的值取代為 E.164 格式的有效行動電話號碼,並取代為今天日期的值。startDate

從命令行運行以下命令。

node populate-table.js
const { BatchWriteItemCommand } = require ( "aws-sdk/client-dynamodb" ); const {dynamoClient} = require ( "./libs/dynamoClient" ); // Set the parameters. export const params = { RequestItems: { Employees: [ { PutRequest: { Item: { id: { N: "1" }, firstName: { S: "Bob" }, phone: { N: "155555555555654" }, startDate: { S: "2019-12-20" }, }, }, }, { PutRequest: { Item: { id: { N: "2" }, firstName: { S: "Xing" }, phone: { N: "155555555555653" }, startDate: { S: "2019-12-17" }, }, }, }, { PutRequest: { Item: { id: { N: "55" }, firstName: { S: "Harriette" }, phone: { N: "155555555555652" }, startDate: { S: "2019-12-19" }, }, }, }, ], }, }; export const run = async () => { try { const data = await dbclient.send(new BatchWriteItemCommand(params)); console.log("Success", data); } catch (err) { console.log("Error", err); } }; run();

此程式碼可在此處取得 GitHub。

建立 AWS Lambda 函數

設定軟體開發套件

libs目錄中,建立名為snsClient.js和的檔案lambdaClient.js,並將下列內容分別貼到這些檔案中。

const { SNSClient } = require ( "@aws-sdk/client-sns" ); // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon SNS service client object. const snsClient = new SNSClient({ region: REGION }); module.exports = { snsClient };

將「地區」取代為「AWS區域」。此程式碼可在此處取得 GitHub。

const { LambdaClient } = require ( "@aws-sdk/client-lambda" ); // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon Lambda service client object. const lambdaClient = new LambdaClient({ region: REGION }); module.exports = { lambdaClient };

將「地區」取代為「AWS區域」。此程式碼可在此處取得 GitHub。

首先,導入所需的AWS SDK for JavaScript(v3)模塊和命令。然後計算今天的日期並將其分配給參數。第三,建立的參數ScanCommand。將 TABLE_NAME 取代為您在此範建立資AWS源 例中所建立之資料表的名稱。

下列程式碼片段說明此步驟。(如需完整範例,請參閱捆綁 Lambda 函數。)

"use strict"; const { ScanCommand } = require("@aws-sdk/client-dynamodb"); const { PublishCommand } = require("@aws-sdk/client-sns"); const {snsClient} = require ( "./libs/snsClient" ); const {dynamoClient} = require ( "./libs/dynamoClient" ); // Get today's date. const today = new Date(); const dd = String(today.getDate()).padStart(2, "0"); const mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0! const yyyy = today.getFullYear(); const date = yyyy + "-" + mm + "-" + dd; // Set the parameters for the ScanCommand method. const params = { // Specify which items in the results are returned. FilterExpression: "startDate = :topic", // Define the expression attribute value, which are substitutes for the values you want to compare. ExpressionAttributeValues: { ":topic": { S: date }, }, // Set the projection expression, which are the attributes that you want. ProjectionExpression: "firstName, phone", TableName: "Employees", };

掃描 DynamoDB 料表

首先,建立呼叫的異步/等待函數,sendText以使用 Amazon SNS 發佈文字訊息。PublishCommand然後,新增try區塊模式,針對今天的工作週年紀念日掃描 DynamoDB 表格,然後呼叫sendText函數以傳送文字訊息給這些員工。如果發生錯誤,則調用catch塊。

下列程式碼片段說明此步驟。(如需完整範例,請參閱捆綁 Lambda 函數。)

// Helper function to send message using Amazon SNS. exports.handler = async () => { // Helper function to send message using Amazon SNS. async function sendText(textParams) { try { await snsClient.send(new PublishCommand(textParams)); console.log("Message sent"); } catch (err) { console.log("Error, message not sent ", err); } } try { // Scan the table to identify employees with work anniversary today. const data = await dynamoClient.send(new ScanCommand(params)); data.Items.forEach(function (element) { const textParams = { PhoneNumber: element.phone.N, Message: "Hi " + element.firstName.S + "; congratulations on your work anniversary!", }; // Send message using Amazon SNS. sendText(textParams); }); } catch (err) { console.log("Error, could not scan table ", err); } };

捆綁 Lambda 函數

本主題說明如何將此範例中的mylambdafunction.ts和所需AWS SDK for JavaScript模組捆綁到名為的隨附檔案中index.js

  1. 如果您還沒有,請按照此示例中必要工作的安裝 webpack。

    注意

    如需 Webpack 的相關資訊,請參閱捆綁應用程序與網絡包

  2. 在命令列中執行下列命令,將此範例中 JavaScript 的內容捆綁到名為的檔案中<index.js>

    webpack mylambdafunction.ts --mode development --target node --devtool false --output-library-target umd -o index.js
    重要

    請注意輸出已命名index.js。這是因為 Lambda 函數必須具有index.js處理常式才能運作。

  3. 將隨附的輸出檔案壓縮成一個名為的 ZIP 檔案mylambdafunction.zipindex.js

  4. 上傳mylambdafunction.zip到您在本教學建立資AWS源 主題中建立的 Amazon S3 儲存貯體。

部署 Lambda 函數。

在項目的根目錄中,創建一個lambda-function-setup.ts文件,然後將下面的內容粘貼到其中。

BUCKET_NAME 取代為您將 Lambda 函數的 ZIP 版本上傳到的 Amazon S3 儲存貯體的名稱。將 ZIP_FILE_NAME 取代為您的 Lambda 函數之 ZIP 版本的名稱。將角色取代為您在本教學建立資AWS源 主題中建立的 IAM 角色的 Amazon 資源編號 (ARN)。將 Lambda 函數名稱取代為 Lambda 函數的名稱。

// Load the required Lambda client and commands. const { CreateFunctionCommand } = require ( "@aws-sdk/client-lambda" ); const { lambdaClient} = require ( "./libs/lambdaClient.js ); // Set the parameters. const params = { Code: { S3Bucket: "BUCKET_NAME", // BUCKET_NAME S3Key: "ZIP_FILE_NAME", // ZIP_FILE_NAME }, FunctionName: "LAMBDA_FUNCTION_NAME", Handler: "index.handler", Role: "IAM_ROLE_ARN", // IAM_ROLE_ARN; e.g., arn:aws:iam::650138640062:role/v3-lambda-tutorial-lambda-role Runtime: "nodejs12.x", Description: "Scans a DynamoDB table of employee details and using Amazon Simple Notification Services (Amazon SNS) to " + "send employees an email on each anniversary of their start-date.", }; const run = async () => { try { const data = await lambdaClient.send(new CreateFunctionCommand(params)); console.log("Success", data); // successful response } catch (err) { console.log("Error", err); // an error occurred } }; run();

在命令列輸入下列命令以部署 Lambda 函數。

node lambda-function-setup.ts

此程式碼範例可在此處取得 GitHub。

設定 API Gateway 以叫用 Lambda 函數

創建其餘的 API

您可以使用 API Gateway 主控台為 Lambda 函數建立休息端點。完成後,您可以使用寧靜的調用調用 Lambda 函數。

  1. 登入 Amazon API Gateway 主控台

  2. 在 [其餘 API] 下,選擇 [建置]。

  3. 選取 [新增 API]。

    DynamoDB 表
  4. 指定員工作為 API 名稱並提供說明。

    DynamoDB 表
  5. 選擇建立 API

  6. 選擇員工部分下的資源

    DynamoDB 表
  7. 在名稱欄位中,指定員工

  8. 選擇 Create Resource (建立資源)

  9. 從「動作」 下拉式清單中選擇「建立資源

    DynamoDB 表
  10. 選擇 /employee,從動作」中選取「建立方法」,然後從/employee 下方的下拉式功能表中選取「GET」。選擇核取記號圖示。

    DynamoDB 表
  11. 選擇 Lambda 函數,然後輸入 MyLambda 函數作為 Lambda 函數名稱。選擇儲存

測試 API Gateway 方法

此時在教學課程中,您可以測試叫用 Mylambda 函數 Lambda 函數的 API Gateway 方法。若要測試方法,請選擇「測試」(Test),如下圖所示。

DynamoDB 表

叫用 Lambda 函數之後,您可以檢視記錄檔以查看成功的訊息。

部署 API Gateway 方法

測試成功後,您可以從 Amazon API Gateway 主控台部署該方法。

  1. 選擇 [取得]。

    DynamoDB 表
  2. 動作下拉式清單中,選取部署 API

    DynamoDB 表
  3. 填寫「部署 API」表單,然後選擇「部署」。

    DynamoDB 表
  4. 選擇 Save Changes (儲存變更)。

  5. 再次選擇 [取得],請注意 URL 已變更。這是您可以用來叫用 Lambda 函數的叫用網址。

    DynamoDB 表

刪除資源

恭喜您!您已經使用 Amazon API Gateway 叫用 Lambda 函數AWS SDK for JavaScript。如本教程開頭所述,請務必終止所有你創建的資源,同時通過本教程,以確保你不收費。您可以透過刪除您在本教學課程建立資AWS源 主題中建立的AWS CloudFormation堆疊來執行此操作,如下所示:

  1. AWS管理主控台AWS CloudFormation中開啟。

  2. 開啟「堆疊」頁面,然後選取堆疊。

  3. 選擇 刪除