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

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

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

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

必要條件

此教學課程假設您具備基本的 Lambda 操作知識並了解 Lambda 主控台。若您尚未了解,請遵循 使用主控台建立一個 Lambda 函數 中的指示,建立您的第一個 Lambda 函數。

若要完成下列步驟,您需要 AWS CLI 版本 2。命令和預期的輸出會列在不同的區塊中:

aws --version

您應該會看到下列輸出:

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

對於長命令,逸出字元 (\) 用於將命令分割為多行。

在 Linux 和 macOS 上,使用您偏好的 shell 和套件軟體管理工具。

注意

在 Windows 中,作業系統的內建終端不支援您常與 Lambda 搭配使用的某些 Bash CLI 命令 (例如 zip)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本,請安裝適用於 Linux 的 Windows 子系統。本指南中的 CLI 命令範例使用 Linux 格式。如果您使用的是 Windows CLI,必須重新格式化包含內嵌 JSON 文件的命令。

建立執行角色 (帳戶 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 18 程式碼範例將每個訊息寫入 CloudWatch Logs 的日誌中。

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

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

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

  2. 建立部署套件。

    zip function.zip index.mjs
  3. 使用 create-function AWS Command Line Interface (AWS CLI) 命令建立 函數。

    aws lambda create-function --function-name CrossAccountSQSExample \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::<AccountA_ID>: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 政策中:

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

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

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

設定事件來源 (帳戶 A)

帳戶 A 中,執行下列create-event-source-mapping AWS CLI 命令,在帳戶 B 中的 Amazon SQS 佇列和 Lambda 函數之間建立事件來源映射。

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

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

aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \ --event-source-arn arn:aws:sqs:us-east-1:<AccountB_ID>: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 Management Console ,並在 https://console.aws.amazon.com/sqs/:// 開啟 Amazon SQS 主控台。

  2. 選取您建立的佇列。

  3. 選擇 刪除

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

  5. 選擇 刪除