跳至內容

如何使用 SNS 主題設定跨帳戶 AWS Lambda 訂閱?

3 分的閱讀內容
0

我想要將 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 主題

  1. 開啟 Amazon SNS console (Amazon SNS 主控台),然後選取左側面板上的 Topics (主題)。
  2. 選擇 Create topic (建立主題),選取 Topic type (主題類型),然後輸入 Topic name (主題名稱)。
  3. 向下捲動並選擇 Create Topic (建立主題)。

允許帳戶 B 對主題執行訂閱動作。

  1. 編輯主題存取政策,以授予帳戶 B sns:Subscribe 權限。
  2. 新增以下顯示的政策陳述式並 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 函式

  1. AWS Lambda 主控台上開啟 Function (函式) 頁面。然後,選擇 Create function (建立函式)。
  2. 輸入 Function name (函式名稱)。
  3. Execution role (執行角色),選擇 Create a new role with basic Lambda permissions (建立具有基本 Lambda 權限的新角色)。Lambda 會建立執行角色,授予函式將日誌上傳至 Amazon CloudWatch 的權限。
  4. 向下捲動並選擇 Create function (建立函式) 按鈕。

在 Lambda 主控台上新增觸發程序以訂閱 Lambda 函式 (選項 1)

  1. AWS Lambda 主控台上開啟 Function (函式) 頁面,並選取您先前建立的函式。
  2. 選擇 Add Trigger (新增觸發程序) 按鈕。
  3. 在 Trigger configuration 頁面上,從下拉式清單中選取 SNS
  4. SNS Topic (SNS 主題) 欄位中,貼上主題 ARN。
  5. 選取 Add (新增) 按鈕。

帳戶 A 中的 SNS 主題現在可以調用帳戶 B 中的 Lambda 函式。

測試組態

透過將訊息發佈至 SNS 主題來測試。
注意: 當您從 Lambda 主控台新增觸發程序時,Lambda 會自動新增 Amazon SNS 從此觸發程序調用 Lambda 函式所需的權限。

從 SNS 主控台新增訂閱以訂閱 Lambda 函式 (選項 2)

此選項需要您明確授予 SNS 服務主體執行 lambda:InvokeFunction 動作的權限。

允許 SNS 服務主體調用 Lambda 函式。

在 Lambda 主控台的 Functions page (函式頁面) 上,選取您先前建立的函式。然後完成以下步驟:

  1. 選擇 Configuration (組態) 索引標籤,然後選擇 Permissions (權限)。
  2. 向下捲動至 Resource-based policy (資源型政策) 區段。然後,選擇 Add Permissions (新增權限) 按鈕。
  3. 選取 AWS Service (AWS 服務),然後從下拉式清單中選擇 SNS。然後,填入欄位:
    對於 Statement ID,將其設定為 AllowSNSToInvokeFunction
    對於 Source ARN,貼上先前建立的 SNS 主題 ARN
    對於 Action,選擇 lambda:InvokeFunction
  4. 選擇 Save (儲存)。
  5. 為 Lambda 建立 SNS 訂閱。

從帳戶 B,開啟 Amazon SNS console (Amazon SNS 主控台)。

  1. 在左側面板上,選擇 Subscriptions (訂閱)。
  2. 選擇 Create Subscription (建立訂閱) 按鈕。
  3. Topic ARN (主題 ARN) 欄位中,貼上帳戶 A 的 SNS 主題 ARN。
  4. Protocol (通訊協定) 下拉式清單中選取 AWS Lambda
  5. Endpoint (端點) 欄位中貼上 Lambda 函式的 ARN
  6. 向下捲動並選擇 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 主題時會收到授權錯誤?