View a markdown version of this page

教學課程:使用跨帳戶 Amazon SQS 佇列做為事件來源 - AWS Lambda

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

教學課程:使用跨帳戶 Amazon SQS 佇列做為事件來源

在本教學課程中,您會建立 Lambda 函數,使用來自不同 AWS 帳戶中 Amazon Simple Queue Service (Amazon SQS) 佇列的訊息。本教學課程涉及兩個 AWS 帳戶:帳戶 A 是指包含 Lambda 函數的帳戶,帳戶 B 是指包含 Amazon SQS 佇列的帳戶。

先決條件

如果您尚未安裝 AWS Command Line Interface,請依照安裝或更新最新版本的 AWS CLI中的步驟進行安裝。

本教學課程需使用命令列終端機或 Shell 來執行命令。在 Linux 和 macOS 中,使用您偏好的 Shell 和套件管理工具。

注意

在 Windows 中,作業系統的內建終端不支援您常與 Lambda 搭配使用的某些 Bash CLI 命令 (例如 zip)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本,請安裝適用於 Linux 的 Windows 子系統。

建立執行角色 (帳戶 A)

在帳戶 A 中,建立 執行角色,授予您的函數存取所需 AWS 資源的許可。

若要建立執行角色
  1. 在 AWS Identity and Access Management (IAM) 主控台中開啟角色頁面。

  2. 選擇建立角色。

  3. 建立具備下列屬性的角色。

    • 信任實體 – AWS Lambda。

    • 許可 - AWSLambdaSQSQueueExecutionRole

    • 角色名稱 - cross-account-lambda-sqs-role。

AWSLambdaSQSQueueExecutionRole 政策具備函數自 Amazon SQS 讀取項目以及寫入日誌到 Amazon CloudWatch Logs 時所需的許可。

建立函數 (帳戶 A)

在帳戶 A 中建立 Lambda 函數,它會處理 Amazon SQS 訊息。該 Lambda 函數和 Amazon SQS 佇列必須位於相同的 AWS 區域。

下列 Node.js 程式碼範例將每則訊息寫入 CloudWatch Logs 的日誌中。

範例 index.mjs
export const handler = async function(event, context) { event.Records.forEach(record => { const { body } = record; console.log(body); }); return {}; }
建立函數
注意

遵循這些步驟,建立 Node.js 函式。對於其他語言,步驟類似,但有些細節不同。

  1. 將程式碼範例儲存為名為 index.mjs 的檔案。

  2. 建立部署套件。

    zip function.zip index.mjs
  3. 使用 create-function AWS Command Line Interface (AWS CLI) 命令建立 函數。將 arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role 取代為先前建立之執行角色的 ARN。

    aws lambda create-function --function-name CrossAccountSQSExample \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \ --role arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role

測試函數 (帳戶 A)

在帳戶 A 中,使用 invoke AWS CLI 命令和範例 Amazon SQS 事件手動測試 Lambda 函數。

如果處理常式均正常傳回而無例外情況,Lambda 會認為訊息已成功處理,並開始讀取佇列中的新訊息。成功處理訊息之後,Lambda 從佇列中自動刪除它。如果處理常式擲出例外情況,Lambda 會認為訊息批次未成功處理,並且 Lambda 會調用具有相同訊息批次的函數。

  1. 將下面的 JSON 儲存為名為 input.txt 的檔案。

    { "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:example-queue", "awsRegion": "us-east-1" } ] }

    上述 JSON 會模擬 Amazon SQS 可能傳送至 Lambda 函數的事件,其中 "body" 包含佇列中的實際訊息。

  2. 執行下列 invoke AWS CLI 命令。

    aws lambda invoke --function-name CrossAccountSQSExample \ --cli-binary-format raw-in-base64-out \ --payload file://input.txt outputfile.txt

    如果您使用的是第 2 AWS CLI 版,則需要 cli-binary-format選項。若要讓此成為預設的設定,請執行 aws configure set cli-binary-format raw-in-base64-out。若要取得更多資訊,請參閱《AWS Command Line Interface 使用者指南第 2 版》中 AWS CLI 支援的全域命令列選項。

  3. 在檔案 outputfile.txt 中確認輸出。

建立 Amazon SQS 佇列 (帳戶 B)

在帳戶 B 中,建立帳戶 A 中 Lambda 函數可用作事件來源的 Amazon SQS 佇列。該 Lambda 函數和 Amazon SQS 佇列必須位於相同的 AWS 區域。

建立佇列
  1. 開啟 Amazon SQS 主控台。

  2. 選擇 建立佇列 。

  3. 建立具備下列屬性的佇列。

    • Type (類型) - Standard (標準)

    • Name (名稱) - LambdaCrossAccountQueue

    • Configuration (組態) - 保留預設設定。

    • 存取政策 - 選擇進階。貼入下列 JSON 政策中。取代以下的值:

      • 111122223333帳戶 A 的 : AWS 帳戶 ID

      • 444455556666帳戶 B 的 : AWS 帳戶 ID

      JSON
      { "Version":"2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [ { "Sid": "Queue1_AllActions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role" ] }, "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue" } ] }

      此政策許可帳戶 A 中的 Lambda 執行角色取用此 Amazon SQS 佇列中的訊息。

  4. 建立佇列後,記錄其 Amazon Resource Name (ARN)。在下個步驟中,將佇列與您的 Lambda 函數建立關聯時會需要用到它。

設定事件來源 (帳戶 A)

在帳戶 A 中,執行下列create-event-source-mapping AWS CLI 命令,在帳戶 B 中的 Amazon SQS 佇列與 Lambda 函數之間建立事件來源映射。將 arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue 取代為您在上一個步驟中建立的 Amazon SQS 佇列 ARN。

aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \ --event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue

若要取得事件來源映射的清單,請執行下列命令。

aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \ --event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue

測試設定

現在您可以測試設定,如下所示:

  1. 在帳戶 B 中,開啟 Amazon SQS 主控台。

  2. 選擇您先前建立的 LambdaCrossAccountQueue。

  3. 選擇傳送及接收訊息。

  4. 在 Message body (訊息主體) 中,輸入測試訊息。

  5. 選擇傳送訊息。

帳戶 A 中您的 Lambda 函數應該會收到訊息。Lambda 會繼續輪詢佇列以進行更新。當有新訊息時,Lambda 會使用佇列中的此新事件資料來調用您的函數。您的函數會執行並在 Amazon CloudWatch 中建立日誌。可在 CloudWatch 主控台中檢視日誌。

清除您的資源

除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除您不再使用 AWS 的資源,您可以避免不必要的 費用 AWS 帳戶。

在帳戶 A 中,清除您的執行角色和 Lambda 函數。

刪除執行角色
  1. 開啟 IAM 主控台中的 角色頁面 。

  2. 選取您建立的執行角色。

  3. 選擇刪除。

  4. 在文字輸入欄位中輸入角色的名稱,然後選擇 刪除 。

若要刪除 Lambda 函數
  1. 開啟 Lambda 主控台中的 函數頁面。

  2. 選擇您建立的函數。

  3. 選擇 Actions (動作)、Delete (刪除)。

  4. 在文字輸入欄位中輸入 confirm,然後選擇 刪除 。

在帳戶 B 中,清除 Amazon SQS 佇列。

刪除 Amazon SQS 佇列
  1. 登入 AWS 管理主控台 並開啟位於 https://https://console.aws.amazon.com/sqs/ 的 Amazon SQS 主控台。

  2. 選取您建立的佇列。

  3. 選擇 刪除 。

  4. 在文字輸入欄位中輸入 confirm。

  5. 選擇 刪除 。