本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:搭配 Amazon SQS 使用 Lambda
在本教學課程中,您將建立一個 Lambda 函數,該函數取用 Amazon Simple Queue Service (Amazon SQS) 佇列中的訊息。只要有新訊息加入佇列,Lambda 函數就會執行。函數會將訊息寫入 Amazon CloudWatch Logs 串流。下圖顯示可用來完成教學課程的 AWS 資源。

請執行下列步驟以完成本教學課程:
-
建立將訊息寫入 CloudWatch Logs 的 Lambda 函數。
-
建立 Amazon SQS 佇列。
-
建立 Lambda 事件來源映射。事件來源映射會讀取 Amazon SQS 佇列,並在新增訊息時調用 Lambda 函數。
-
透過將訊息新增至佇列並監控 CloudWatch Logs 中的結果來測試設定。
必要條件
如果您沒有 AWS 帳戶,請完成下列步驟來建立一個 。
註冊 AWS 帳戶
開啟 https://portal.aws.amazon.com/billing/signup
。 請遵循線上指示進行。
部分註冊程序需接收來電,並在電話鍵盤輸入驗證碼。
當您註冊 時 AWS 帳戶,AWS 帳戶根使用者會建立 。根使用者有權存取該帳戶中的所有 AWS 服務 和資源。作為安全最佳實務,請將管理存取權指派給使用者,並且僅使用根使用者來執行需要根使用者存取權的任務。
AWS 會在註冊程序完成後傳送確認電子郵件給您。您可以隨時登錄 https://aws.amazon.com/
註冊 後 AWS 帳戶,請保護 AWS 帳戶根使用者、啟用 AWS IAM Identity Center和建立管理使用者,以免將根使用者用於日常任務。
保護您的 AWS 帳戶根使用者
-
選擇根使用者並輸入 AWS 帳戶 您的電子郵件地址,以帳戶擁有者AWS Management Console
身分登入 。在下一頁中,輸入您的密碼。 如需使用根使用者登入的說明,請參閱 AWS 登入 使用者指南中的以根使用者身分登入。
-
若要在您的根使用者帳戶上啟用多重要素驗證 (MFA)。
如需說明,請參閱《IAM 使用者指南》中的為您的 AWS 帳戶 根使用者 (主控台) 啟用虛擬 MFA 裝置。
建立具有管理存取權的使用者
-
啟用 IAM Identity Center。
如需指示,請參閱《AWS IAM Identity Center 使用者指南》中的啟用 AWS IAM Identity Center。
-
在 IAM Identity Center 中,將管理存取權授予使用者。
如需使用 IAM Identity Center 目錄 做為身分來源的教學課程,請參閱AWS IAM Identity Center 《 使用者指南》中的使用預設值設定使用者存取權 IAM Identity Center 目錄。
以具有管理存取權的使用者身分登入
-
若要使用您的 IAM Identity Center 使用者簽署,請使用建立 IAM Identity Center 使用者時傳送至您電子郵件地址的簽署 URL。
如需使用 IAM Identity Center 使用者登入的說明,請參閱AWS 登入 《 使用者指南》中的登入 AWS 存取入口網站。
如果您尚未安裝 AWS Command Line Interface,請依照安裝或更新最新版本 AWS CLI的步驟進行安裝。
本教學課程需使用命令列終端機或 Shell 來執行命令。在 Linux 和 macOS 中,使用您偏好的 Shell 和套件管理工具。
注意
在 Windows 中,作業系統的內建終端不支援您常與 Lambda 搭配使用的某些 Bash CLI 命令 (例如 zip
)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本,請安裝適用於 Linux 的 Windows 子系統
建立執行角色

執行角色是 AWS Identity and Access Management (IAM) 角色,授予 Lambda 函數存取 AWS 服務 和資源的許可。若要允許函數從 Amazon SQS 中讀取項目,請連接 AWSLambdaSQSQueueExecutionRole 許可政策。
建立執行角色並連接 Amazon SQS 許可政策
-
開啟 IAM 主控台中的角色頁面
。 -
選擇 建立角色。
-
針對信任的實體類型,請選擇 AWS 服務。
-
針對使用案例,請選擇 Lambda。
-
選擇 Next (下一步)。
-
在許可政策搜尋方塊中,輸入
AWSLambdaSQSQueueExecutionRole
。 -
選取 AWSLambdaSQSQueueExecutionRole 政策,然後選擇下一步。
-
針對角色詳細資訊下的角色名稱,請輸入
lambda-sqs-role
,然後選擇建立角色。
角色建立後,請記下執行角色的 Amazon Resource Name (ARN)。在後續步驟中會需要用到它。
建立函數

建立 Lambda 函數,它處理 Amazon SQS 訊息。函數程式碼會將 Amazon SQS 的訊息內文記錄到 Amazon CloudWatch Logs。
本教學課程使用 Node.js 18.x 執行期,但我們也有提供其他執行期語言的範例程式碼。您可以在下列方塊中選取索引標籤,查看您感興趣的執行期程式碼。此步驟要使用的 JavaScript 程式碼,位於 JavaScript 索引標籤中顯示的第一個範例。
若要建立 Node.js Lambda 函數
-
建立專案的目錄,然後切換至該目錄。
mkdir sqs-tutorial cd sqs-tutorial
-
將範例 JavaScript 程式碼複製到名為
index.js
的新檔案。 -
使用以下
zip
命令建立部署套件。zip function.zip index.js
-
使用 create-function
AWS CLI 命令建立 Lambda 函數。針對 role
參數,輸入您之前建立的執行角色 ARN。注意
該 Lambda 函數和 Amazon SQS 佇列必須位於相同的 AWS 區域。
aws lambda create-function --function-name ProcessSQSRecord \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \
--role arn:aws:iam::
111122223333
:role/lambda-sqs-role
測試函數

使用 invoke
AWS CLI 命令和範例 Amazon SQS 事件手動叫用 Lambda 函數。
使用範例事件調用 Lambda 函數
-
將下面的 JSON 儲存為名為
input.json
的檔案。此 JSON 會模擬 Amazon SQS 可能傳送至 Lambda 函數的事件,其中"body"
包含佇列中的實際訊息。在此範例中,訊息為"test"
。範例 Amazon SQS 事件
這是測試事件,您不需要變更訊息或帳號。
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "test", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:my-queue", "awsRegion": "us-east-1" } ] }
-
執行下列叫用
AWS CLI 命令。此命令在回應中傳回 CloudWatch 日誌。如需擷取日誌的詳細資訊,請參閱使用 存取日誌 AWS CLI。 aws lambda invoke --function-name ProcessSQSRecord --payload file://input.json out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
如果您使用的是第 2 AWS CLI 版,則需要 cli-binary-format選項。若要讓此成為預設的設定,請執行
aws configure set cli-binary-format raw-in-base64-out
。若要取得更多資訊,請參閱《AWS Command Line Interface 使用者指南第 2 版》中 AWS CLI 支援的全域命令列選項。 -
在回應中查找
INFO
日誌。這是 Lambda 函數記錄訊息內文的位置。您應該會看到類似以下內容的輸出:2023-09-11T22:45:04.271Z 348529ce-2211-4222-9099-59d07d837b60 INFO Processed message test 2023-09-11T22:45:04.288Z 348529ce-2211-4222-9099-59d07d837b60 INFO done
建立 Amazon SQS 佇列

建立 Lambda 函數可用作事件來源的 Amazon SQS 佇列。該 Lambda 函數和 Amazon SQS 佇列必須位於相同的 AWS 區域。
建立佇列
-
開啟 Amazon SQS 主控台
。 -
選擇建立佇列。
-
輸入佇列的名稱。將所有其他選項保留為預設值。
-
選擇建立佇列。
建立佇列後,請記下其 ARN。在下個步驟中,將佇列與您的 Lambda 函數建立關聯時會需要用到它。
設定事件來源

透過建立事件來源映射,將 Amazon SQS 佇列連線至 Lambda 函數。事件來源映射會讀取 Amazon SQS 佇列,並在新增訊息時調用 Lambda 函數。
若要在 Amazon SQS 佇列和 Lambda 函數之間建立映射,請使用 create-event-source-mapping
aws lambda create-event-source-mapping --function-name ProcessSQSRecord --batch-size 10 \ --event-source-arn arn:aws:sqs:
us-east-1:111122223333:my-queue
若要獲取事件來源映射清單,請使用 list-event-source-mappings
aws lambda list-event-source-mappings --function-name ProcessSQSRecord
傳送測試訊息

將 Amazon SQS 訊息傳送至 Lambda 函數
-
開啟 Amazon SQS 主控台
。 -
選擇您稍早建立的佇列。
-
選擇傳送及接收訊息。
-
在訊息內文下,輸入測試訊息,例如「這是測試訊息」。
-
選擇傳送訊息。
Lambda 輪詢佇列以查看是否有更新。當有新訊息時,Lambda 會使用佇列中的此新事件資料來叫用您的函數。如果函數處理常式傳回而無例外情況,則 Lambda 會認為訊息已成功處理,並開始讀取佇列中的新訊息。成功處理訊息之後,Lambda 從佇列中自動刪除它。如果處理常式擲出例外情況,Lambda 會認為訊息批次未成功處理,並且 Lambda 會調用具有相同訊息批次的函數。
檢查 CloudWatch 日誌

確認函數已處理訊息
開啟 Lambda 主控台中的函數頁面
。 -
選擇 ProcessSQSRecord 函數。
-
選擇監控。
-
選擇檢視 CloudWatch 日誌。
-
在 CloudWatch 主控台中,選擇函數的日誌串流。
-
查找
INFO
日誌。這是 Lambda 函數記錄訊息內文的位置。應能看到您從 Amazon SQS 佇列傳送的訊息。範例:2023-09-11T22:49:12.730Z b0c41e9c-0556-5a8b-af83-43e59efeec71 INFO
Processed message this is a test message.
清除您的資源
除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除不再使用 AWS 的資源,您可以避免不必要的費用 AWS 帳戶。
刪除執行角色
-
開啟 IAM 主控台中的 角色頁面
。 -
選取您建立的執行角色。
-
選擇刪除。
-
在文字輸入欄位中輸入角色的名稱,然後選擇 刪除 。
若要刪除 Lambda 函數
-
開啟 Lambda 主控台中的 函數頁面
。 -
選擇您建立的函數。
-
選擇 Actions (動作)、Delete (刪除)。
-
在文字輸入欄位中輸入
confirm
,然後選擇 刪除 。
刪除 Amazon SQS 佇列
-
登入 AWS Management Console ,並在 https://console.aws.amazon.com/sqs/
:// 開啟 Amazon SQS 主控台。 -
選取您建立的佇列。
-
選擇 刪除 。
-
在文字輸入欄位中輸入
confirm
。 -
選擇 刪除 。