本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:使用跨帳戶 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 子系統
建立執行角色 (帳戶 A)
在帳戶 A 中,建立執行角色,讓您的函數有權存取所需的 AWS 資源。
若要建立執行角色
-
在 AWS Identity and Access Management (IAM) 主控台中開啟角色頁面
。 -
選擇 建立角色。
-
建立具備下列屬性的角色。
-
信任實體 – 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 中建立函數。對於其他語言,步驟類似,但有些細節不同。
-
將程式碼範例 儲存為名為
index.mjs
的檔案。 -
建立部署套件。
zip function.zip index.mjs
-
使用
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 會調用具有相同訊息批次的函數。
-
將下列項目儲存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"
包含來自佇列的實際訊息。 -
執行下列
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 支援的全域命令列選項。 -
在檔案
outputfile.txt
中確認輸出。
建立 Amazon SQS佇列 (帳戶 B)
在帳戶 B 中,建立 Amazon SQS佇列,帳戶 A 中的 Lambda 函數可以用作事件來源。Lambda 函數和 Amazon SQS佇列必須位於相同的 中 AWS 區域。
建立佇列
-
開啟 Amazon SQS主控台
。 -
選擇 建立佇列 。
-
建立具備下列屬性的佇列。
-
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佇列的訊息。
-
-
建立佇列後,請記錄其 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
測試設定
現在您可以測試設定,如下所示:
-
在帳戶 B 中,開啟 Amazon SQS主控台
。 -
選擇您先前建立LambdaCrossAccountQueue的 。
-
選擇傳送及接收訊息。
-
在 Message body (訊息主體) 中,輸入測試訊息。
-
選擇 傳送訊息 。
帳戶 A 中您的 Lambda 函數應該會收到訊息。Lambda 會繼續輪詢佇列是否有更新。當有新訊息時,Lambda 會使用佇列中的此新事件資料來調用您的函數。您的函數會在 Amazon 中執行和建立日誌 CloudWatch。您可以在CloudWatch 主控台
清除您的資源
除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除不再使用 AWS 的資源,您可以避免不必要的 費用 AWS 帳戶。
在 帳戶 A 中,清除您的執行角色和 Lambda 函數。
刪除執行角色
-
開啟IAM主控台的角色頁面
。 -
選取您建立的執行角色。
-
選擇 刪除 。
-
在文字輸入欄位中輸入角色的名稱,然後選擇 刪除 。
若要刪除 Lambda 函數
-
開啟 Lambda 主控台中的 函數頁面
。 -
選擇您建立的函數。
-
選擇 Actions (動作)、Delete (刪除)。
-
在文字輸入欄位中輸入
delete
,然後選擇 刪除 。
在帳戶 B 中,清除 Amazon SQS佇列。
若要刪除 Amazon SQS佇列
-
登入 AWS Management Console 並在 開啟 Amazon SQS主控台https://console.aws.amazon.com/sqs/
。 -
選取您建立的佇列。
-
選擇 刪除 。
-
在文字輸入欄位中輸入
confirm
。 -
選擇 刪除 。