教學課程:使用跨帳戶 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 Command Line Interface (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 ,則必須重新格式化包含內嵌JSON文件的命令CLI。

建立執行角色 (帳戶 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 中,建立可處理 Amazon SQS 訊息的 Lambda 函數。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 中,建立 Amazon SQS佇列,帳戶 A 中的 Lambda 函數可以用作事件來源。Lambda 函數和 Amazon SQS佇列必須位於相同的 中 AWS 區域。

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

  2. 選擇 建立佇列

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

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

    • 名稱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. 在文字輸入欄位中輸入 delete,然後選擇 刪除

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

若要刪除 Amazon SQS佇列
  1. 登入 AWS Management Console 並在 開啟 Amazon SQS主控台https://console.aws.amazon.com/sqs/

  2. 選取您建立的佇列。

  3. 選擇 刪除

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

  5. 選擇 刪除