我想要將 AWS Lambda 函式訂閱至另一個帳戶中的 Amazon Simple Notification Service (Amazon SNS) 主題。
簡短說明
使用 Amazon SNS 主控台,將跨帳戶 AWS Lambda 訂閱新增至 Amazon SNS 主題。
解決方法
先決條件
在開始之前,請確認:
- Lambda 函式資源政策允許 SNS 調用該函式。
- SNS 主題存取政策允許 Lambda 訂閱該主題。
注意: SNS 主題位於帳戶 A,Lambda 函式位於帳戶 B。
訂閱跨帳戶 Lambda 函式
可透過兩種方法將跨帳戶 Lambda 函式訂閱至 SNS 主題:
- 從帳戶 B 的 Lambda 主控台新增 SNS 觸發程序
- 從帳戶 B (具有 Lambda 函式的帳戶) 的 SNS 主控台新增 Lambda 訂閱
建立資源
在帳戶 A 中建立 SNS 主題:
- 開啟 Amazon SNS console (Amazon SNS 主控台),然後選取左側面板上的 Topics (主題)。
- 選擇 Create topic (建立主題),選取 Topic type (主題類型),然後輸入 Topic name (主題名稱)。
- 向下捲動並選擇 Create Topic (建立主題)。
允許帳戶 B 對主題執行訂閱動作。
- 編輯主題存取政策,以授予帳戶 B sns:Subscribe 權限。
- 新增以下顯示的政策陳述式並 Save (儲存):
{
"Sid": "Allow-AccountB-To-Subscribe",
"Effect": "Allow",
"Principal": {
"AWS": ""
},
"Action": "sns:Subscribe",
"Resource": ""
}
**注意:**對於 Principal,請替換 <AccountB> 為具有 Lambda 函式的帳戶號碼。對於 Resource 欄位,請替換 <SNSTopicARN> 為 SNS 主題的 Amazon Resource Name (ARN)。
在帳戶 B 中建立 Lambda 函式:
- 在 AWS Lambda 主控台上開啟 Function (函式) 頁面。然後,選擇 Create function (建立函式)。
- 輸入 Function name (函式名稱)。
- 在 Execution role (執行角色),選擇 Create a new role with basic Lambda permissions (建立具有基本 Lambda 權限的新角色)。Lambda 會建立執行角色,授予函式將日誌上傳至 Amazon CloudWatch 的權限。
- 向下捲動並選擇 Create function (建立函式) 按鈕。
在 Lambda 主控台上新增觸發程序以訂閱 Lambda 函式 (選項 1)
- 在 AWS Lambda 主控台上開啟 Function (函式) 頁面,並選取您先前建立的函式。
- 選擇 Add Trigger (新增觸發程序) 按鈕。
- 在 Trigger configuration 頁面上,從下拉式清單中選取 SNS。
- 在 SNS Topic (SNS 主題) 欄位中,貼上主題 ARN。
- 選取 Add (新增) 按鈕。
帳戶 A 中的 SNS 主題現在可以調用帳戶 B 中的 Lambda 函式。
測試組態
透過將訊息發佈至 SNS 主題來測試。
注意: 當您從 Lambda 主控台新增觸發程序時,Lambda 會自動新增 Amazon SNS 從此觸發程序調用 Lambda 函式所需的權限。
從 SNS 主控台新增訂閱以訂閱 Lambda 函式 (選項 2)
此選項需要您明確授予 SNS 服務主體執行 lambda:InvokeFunction 動作的權限。
允許 SNS 服務主體調用 Lambda 函式。
在 Lambda 主控台的 Functions page (函式頁面) 上,選取您先前建立的函式。然後完成以下步驟:
- 選擇 Configuration (組態) 索引標籤,然後選擇 Permissions (權限)。
- 向下捲動至 Resource-based policy (資源型政策) 區段。然後,選擇 Add Permissions (新增權限) 按鈕。
- 選取 AWS Service (AWS 服務),然後從下拉式清單中選擇 SNS。然後,填入欄位:
對於 Statement ID,將其設定為 AllowSNSToInvokeFunction
對於 Source ARN,貼上先前建立的 SNS 主題 ARN
對於 Action,選擇 lambda:InvokeFunction
- 選擇 Save (儲存)。
- 為 Lambda 建立 SNS 訂閱。
從帳戶 B,開啟 Amazon SNS console (Amazon SNS 主控台)。
- 在左側面板上,選擇 Subscriptions (訂閱)。
- 選擇 Create Subscription (建立訂閱) 按鈕。
- 在 Topic ARN (主題 ARN) 欄位中,貼上帳戶 A 的 SNS 主題 ARN。
- 從 Protocol (通訊協定) 下拉式清單中選取 AWS Lambda。
- 在 Endpoint (端點) 欄位中貼上 Lambda 函式的 ARN
- 向下捲動並選擇 Create subscription (建立訂閱) 按鈕。
**注意:**請確認您從具有 Lambda 函式的 AWS 帳戶 (帳戶 B),將 Lambda 函式訂閱至 SNS 主題。如果您嘗試從具有 SNS 主題的帳戶 (帳戶 A) 建立訂閱,則會收到以下錯誤:
Error code: AccessDeniedException - Error message: User: arn:aws:sts::XXXXXXX:XXXXXXX/XXXXX/XXXXXX is not authorized to perform: lambda:AddPermission on resource: arn:aws:lambda:region:XXXXXXX:function:XXXXXXX
相關資訊
搭配 Amazon Simple Notification Service 使用 AWS Lambda
為什麼我嘗試將 Lambda 函式訂閱至 Amazon SNS 主題時會收到授權錯誤?