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 服務來執行特定使用案例。例如,假設某個組織傳送行動文字訊息給其員工,並在一年週年日期祝賀他們,如本圖所示。
此範例大約需要 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-表的主鍵。
名字-員工的名字。
電話-員工的電話號碼。
開始日期-員工的開始日期。
重要
完成成本:本文件中包含的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:
安裝並設定AWS CLI以下AWS CLI使用者指南中的指示。
在項目文件夾的根目錄
setup.yaml
中創建一個名為的文件,然後將此處的內容複製 GitHub到其中。 注意
AWS CloudFormation範本是使用中AWS CDK提供的來產生的 GitHub
。如需關於 AWS CDK 的詳細資訊,請參閱《AWS Cloud Development Kit (AWS CDK) 開發人員指南》。 從命令列執行下列命令,並以
堆疊的唯一名稱取代 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使用指南》。-
接下來,依照程序填入資料表填入表格。
填入表格
要填充表格,請先創建一個名為的目錄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 };
此程式碼可在此處取
接下來,在項目文件夾的根目錄populate-table.js
中創建一個名為的文件,然後將此處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();
此程式碼可在此處取
建立 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區域」。此程式碼可在此處取
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區域」。此程式碼可在此處取
首先,導入所需的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
。
如果您還沒有,請按照此示例中必要工作的安裝 webpack。
注意
如需 Webpack 的相關資訊,請參閱捆綁應用程序與網絡包。
在命令列中執行下列命令,將此範例中 JavaScript 的內容捆綁到名為的檔案中
<index.js>
:webpack mylambdafunction.ts --mode development --target node --devtool false --output-library-target umd -o index.js
重要
請注意輸出已命名
index.js
。這是因為 Lambda 函數必須具有index.js
處理常式才能運作。將隨附的輸出檔案壓縮成一個名為的 ZIP 檔案
mylambdafunction.zip
。index.js
上傳
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
此程式碼範例可在此處取
設定 API Gateway 以叫用 Lambda 函數
若要建置應用程式:
創建其餘的 API
您可以使用 API Gateway 主控台為 Lambda 函數建立休息端點。完成後,您可以使用寧靜的調用調用 Lambda 函數。
在 [其餘 API] 下,選擇 [建置]。
選取 [新增 API]。
指定員工作為 API 名稱並提供說明。
選擇建立 API。
選擇員工部分下的資源。
在名稱欄位中,指定員工。
選擇 Create Resource (建立資源)。
從「動作」 下拉式清單中選擇「建立資源」
選擇 /employee,從「動作」中選取「建立方法」,然後從/employee 下方的下拉式功能表中選取「GET」。選擇核取記號圖示。
選擇 Lambda 函數,然後輸入 MyLambda 函數作為 Lambda 函數名稱。選擇儲存。
測試 API Gateway 方法
此時在教學課程中,您可以測試叫用 Mylambda 函數 Lambda 函數的 API Gateway 方法。若要測試方法,請選擇「測試」(Test),如下圖所示。
叫用 Lambda 函數之後,您可以檢視記錄檔以查看成功的訊息。
部署 API Gateway 方法
測試成功後,您可以從 Amazon API Gateway 主控台
選擇 [取得]。
從動作下拉式清單中,選取部署 API。
填寫「部署 API」表單,然後選擇「部署」。
選擇 Save Changes (儲存變更)。
再次選擇 [取得],請注意 URL 已變更。這是您可以用來叫用 Lambda 函數的叫用網址。
刪除資源
恭喜您!您已經使用 Amazon API Gateway 叫用 Lambda 函數AWS SDK for JavaScript。如本教程開頭所述,請務必終止所有你創建的資源,同時通過本教程,以確保你不收費。您可以透過刪除您在本教學課程建立資AWS源 主題中建立的AWS CloudFormation堆疊來執行此操作,如下所示:
開啟「堆疊」頁面,然後選取堆疊。
選擇 刪除。