本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程: AWS Lambda 搭配 Amazon Simple Notification Service 使用
在本教學課程中,您會在其中一個 中使用 Lambda 函數 AWS 帳戶 ,以訂閱個別 中的 Amazon Simple Notification Service (Amazon SNS) 主題 AWS 帳戶。當您將訊息發佈至 Amazon SNS主題時,Lambda 函數會讀取訊息的內容,並將其輸出至 Amazon CloudWatch Logs。若要完成本教學課程,您可以使用 AWS Command Line Interface (AWS CLI)。
請執行下列步驟以完成本教學課程:
-
在帳戶 A 中,建立 Amazon SNS主題。
-
在帳戶 B 中建立 Lambda 函數,以讀取主題的訊息。
-
在帳戶 B 中建立主題的訂閱。
-
將訊息發佈至帳戶 A 中的 Amazon SNS主題,並確認帳戶 B 中的 Lambda 函數將其輸出至 CloudWatch Logs。
透過完成這些步驟,您將了解如何設定 Amazon SNS主題來叫用 Lambda 函數。您也將了解如何建立 AWS Identity and Access Management (IAM) 政策,以允許另一個 中的資源 AWS 帳戶 叫用 Lambda。
在此教學課程中,您會使用兩種獨立的 AWS 帳戶。 AWS CLI 命令會使用名為 accountA
和 的兩個具名設定檔來說明這一點accountB
,每個設定檔都設定為與不同的 搭配使用 AWS 帳戶。若要了解如何將 AWS CLI 設定為使用不同的設定檔,請參閱 第 AWS Command Line Interface 2 版使用者指南中的組態和憑證檔案設定。請務必 AWS 區域 為兩個設定檔設定相同的預設值。
如果您為兩個 建立的 AWS CLI 設定檔 AWS 帳戶 使用不同的名稱,或者如果您使用預設設定檔和一個具名設定檔,請視需要在下列步驟中修改 AWS CLI 命令。
必要條件
如果您沒有 AWS 帳戶,請完成下列步驟以建立 。
若要註冊 AWS 帳戶
請遵循線上指示進行。
部分註冊程序需接收來電,並在電話鍵盤輸入驗證碼。
當您註冊 時 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身分中心。
如需指示,請參閱 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 子系統
建立 Amazon SNS主題 (帳戶 A)
若要建立 主題
-
在帳戶 A 中,使用下列 AWS CLI 命令建立 Amazon SNS標準主題。
aws sns create-topic --name sns-topic-for-lambda --profile accountA
您應該會看到類似下列的輸出。
{ "TopicArn": "arn:aws:sns:us-west-2:123456789012:sns-topic-for-lambda" }
記下主題的 Amazon Resource Name (ARN)。當您新增許可到 Lambda 函數以訂閱主題時,稍後會在教學課程中用上它。
建立函數執行角色 (帳戶 B)
執行角色是授予 Lambda 函數存取 AWS 服務和資源的許可IAM。在帳戶 B 中建立函數之前,您可以建立角色,讓函數基本許可將日誌寫入 CloudWatch 日誌。我們將在稍後的步驟中新增從 Amazon SNS主題讀取的許可。
若要建立執行角色
-
在 帳戶 B 中開啟IAM主控台中的角色頁面
。 -
選擇建立角色。
-
針對信任的實體類型,請選擇 AWS 服務。
-
針對使用案例,請選擇 Lambda。
-
選擇 Next (下一步)。
-
透過下列步驟將基本許可政策新增至角色:
-
在許可政策搜尋方塊中,輸入
AWSLambdaBasicExecutionRole
。 -
選擇 Next (下一步)。
-
-
執行下列動作來完成角色的建立:
-
在角色詳細資訊下方的角色名稱中輸入
lambda-sns-role
。 -
選擇建立角色。
-
建立 Lambda 函數 (帳戶 B)
建立處理 Amazon SNS 訊息的 Lambda 函數。函數程式碼會將每個記錄的訊息內容記錄到 Amazon CloudWatch Logs。
本教學課程使用 Node.js 18.x 執行期,但我們也有提供其他執行期語言的範例程式碼。您可以在下列方塊中選取索引標籤,查看您感興趣的執行期程式碼。您將在此步驟中使用的 JavaScript 程式碼位於JavaScript索引標籤中顯示的第一個範例。
建立函數
-
建立專案的目錄,然後切換至該目錄。
mkdir sns-tutorial cd sns-tutorial
-
將範例 JavaScript 程式碼複製到名為 的新檔案中
index.js
。 -
使用以下
zip
命令建立部署套件。zip function.zip index.js
-
執行下列 AWS CLI 命令,在帳戶 B 中建立 Lambda 函數。
aws lambda create-function --function-name Function-With-SNS \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::
<AccountB_ID>
:role/lambda-sns-role \ --timeout 60 --profile accountB您應該會看到類似下列的輸出。
{ "FunctionName": "Function-With-SNS", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:Function-With-SNS", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda_basic_role", "Handler": "index.handler", ... "RuntimeVersionConfig": { "RuntimeVersionArn": "arn:aws:lambda:us-west-2::runtime:7d5f06b69c951da8a48b926ce280a9daf2e8bb1a74fc4a2672580c787d608206" } }
-
記錄函數的 Amazon Resource Name (ARN)。當您新增許可以允許 Amazon SNS調用函數時,稍後需要在教學課程中使用此功能。
為函數新增許可 (帳戶 B)
若要SNS讓 Amazon 調用您的函數,您需要在資源型政策 的陳述式中授予其許可。您可以使用 AWS CLI add-permission
命令新增此陳述式。
授予 Amazon 調用函數的SNS許可
-
在 帳戶 B 中,針對您先前記錄ARN的 Amazon SNS主題,使用 執行下列 AWS CLI 命令。
aws lambda add-permission --function-name Function-With-SNS \ --source-arn arn:aws:sns:
us-east-1:<AccountA_ID>
:sns-topic-for-lambda \ --statement-id function-with-sns --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com --profile accountB您應該會看到類似下列的輸出。
{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\": \"arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"}, \"Sid\":\"function-with-sns\"}" }
注意
如果具有 Amazon SNS主題的帳戶託管在選擇加入 AWS 區域中,您需要在主體中指定 區域。例如,如果您在亞太區域 (香港) 區域使用 Amazon SNS主題,則需要指定 sns.ap-east-1.amazonaws.com
而非 sns.amazonaws.com
委託人。
授予 Amazon SNS訂閱的跨帳戶許可 (帳戶 A)
若要讓帳戶 B 中的 Lambda 函數訂閱您在帳戶 A 中建立的 Amazon SNS主題,您需要授予帳戶 B 訂閱主題的許可。您可以使用 AWS CLI add-permission
命令授予此許可。
若要向帳戶 B 授予訂閱主題的許可
-
在帳戶 A 中,執行下列 AWS CLI 命令。針對您先前記錄ARN的 Amazon SNS主題使用 。
aws sns add-permission --label lambda-access --aws-account-id
<AccountB_ID>
\ --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>
:sns-topic-for-lambda \ --action-name Subscribe ListSubscriptionsByTopic --profile accountA
建立訂閱 (帳戶 B)
在帳戶 B 中,您現在訂閱 Lambda 函數至您在帳戶 A 教學課程開頭建立的 Amazon SNS主題。 當訊息傳送至此主題 (sns-topic-for-lambda
) 時,Amazon 會SNS叫用帳戶 B Function-With-SNS
中的 Lambda 函數。
若要建立訂閱
-
在帳戶 B 中,執行下列 AWS CLI 命令。使用您在 中建立主題的預設區域,以及主題和 Lambda 函數ARNs的 。
aws sns subscribe --protocol lambda \ --region
us-east-1
\ --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>
:sns-topic-for-lambda \ --notification-endpoint arn:aws:lambda:us-east-1:<AccountB_ID>
:function:Function-With-SNS \ --profile accountB您應該會看到類似下列的輸出。
{ "SubscriptionArn": "arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx" }
將訊息發佈至主題 (帳戶 A 和帳戶 B)
現在,帳戶 B 中的 Lambda 函數已訂閱帳戶 A 中的 Amazon SNS主題,現在是將訊息發佈至主題來測試設定的時候了。若要確認 Amazon SNS 已叫用 Lambda 函數,您可以使用 CloudWatch Logs 檢視函數的輸出。
若要將訊息發佈到您的主題並檢視函數的輸出
-
輸入
Hello World
至文字檔,並儲存為message.txt
。 -
從您在 中儲存文字檔案的相同目錄,在帳戶 A 中執行下列 AWS CLI 命令。 將 ARN用於您自己的主題。
aws sns publish --message file://message.txt --subject Test \ --topic-arn arn:aws:sns:
us-east-1:<AccountA_ID>
:sns-topic-for-lambda \ --profile accountA這將傳回具有唯一識別符的訊息 ID,表示 Amazon SNS 已接受訊息。SNS 然後,Amazon 會嘗試將訊息傳遞給主題的訂閱者。若要確認 Amazon SNS 已叫用 Lambda 函數,請使用 CloudWatch Logs 檢視函數的輸出:
-
在帳戶 B 中,開啟 Amazon CloudWatch 主控台的日誌群組
頁面。 -
為函數 (
/aws/lambda/Function-With-SNS
) 選擇日誌群組名稱。 -
選擇最新的日誌串流。
-
如果您的函數有被正確調用,您將會看到類似下方的輸出,顯示您發佈到主題的訊息內容。
2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO Processed message Hello World 2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO done
清除您的資源
除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除不再使用 AWS 的資源,您可以避免不必要的 費用 AWS 帳戶。
在帳戶 A 中,清除您的 Amazon SNS主題。
若要刪除 Amazon SNS主題
-
開啟 Amazon SNS主控台的主題頁面
。 -
選擇您建立的主題。
-
選擇 刪除 。
-
在文字輸入欄位中輸入
delete me
。 -
選擇 刪除 。
在帳戶 B 中,清除您的執行角色、Lambda 函數和 Amazon SNS訂閱。
刪除執行角色
-
開啟IAM主控台的角色頁面
。 -
選取您建立的執行角色。
-
選擇 刪除 。
-
在文字輸入欄位中輸入角色的名稱,然後選擇 刪除 。
若要刪除 Lambda 函數
-
開啟 Lambda 主控台中的 函數頁面
。 -
選擇您建立的函數。
-
選擇 Actions (動作)、Delete (刪除)。
-
在文字輸入欄位中輸入
delete
,然後選擇 刪除 。
若要刪除 Amazon SNS訂閱
-
開啟 Amazon SNS主控台的訂閱頁面
。 -
選取您建立的訂閱。
-
選擇 刪除,刪除。