如何設定含 SNS 主題的跨帳戶 AWS Lambda 訂閱?

2 分的閱讀內容
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 主控台,然後在左側面板上選取主題
  2. 選擇建立主題,選取主題類型,然後輸入主題名稱
  3. 向下捲動並選擇建立主題

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

  1. 編輯主題存取政策,向帳戶 B 授予 sns:Subscribe 權限。
  2. 新增如下所示的政策聲明並儲存
{
  "Sid": "Allow-AccountB-To-Subscribe",
  "Effect": "Allow",
  "Principal": {
    "AWS": ""
  },
  "Action": "sns:Subscribe",
  "Resource": ""
}

注意:對於主體,請替換為 <AccountB> 具有 Lambda 函數的帳戶號碼。對於資源欄位,請替換為 <SNSTopicARN> SNS 主題的 Amazon Resource Name (ARN)。

在帳戶 B 中建立 Lambda 函數

  1. AWS Lambda 主控台上開啟函數頁面。然後,選擇建立函數
  2. 輸入函數名稱
  3. 對於執行角色,請選擇使用基本 Lambda 權限建立新角色。Lambda 會建立一個執行角色,向函數授予將日誌上傳到 Amazon CloudWatch 的權限。
  4. 向下捲動並選擇建立函數按鈕。

透過在 Lambda 主控台上新增觸發器來訂閱 Lambda 函數 (選項 1)

  1. AWS Lambda 主控台上開啟函數頁面,然後選取您先前建立的函數。
  2. 選擇新增觸發器按鈕。
  3. 在觸發器組態頁面上,從下拉式清單中選取 SNS
  4. SNS 主題欄位上,貼上主題 ARN。
  5. 選取新增按鈕。

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

測試組態

透過向 SNS 主題發佈訊息進行測試。
注意: 當您從 Lambda 主控台新增觸發器時,Lambda 會自動為 Amazon SNS 新增必要的權限,以便從此觸發器調用您的 Lambda 函數。

透過從 SNS 主控台新增訂閱來訂閱 Lambda 函數 (選項 2)

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

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

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

  1. 選擇組態索引標籤,然後選擇權限
  2. 向下捲動至以資源為基礎的政策區段。然後,選擇新增權限按鈕。
  3. 選取 AWS 服務,然後從下拉式清單中選擇 SNS。接著,填充欄位:
    對於陳述式 ID,將其設定為 AllowSNSToInvokeFunction
    對於來源 ARN,貼上先前建立的 SNS 主題的 ARN
    對於動作,選擇 lambda:InvokeFunction
  4. 選擇儲存
  5. 建立 Lambda 的 SNS 訂閱。

在帳戶 B 中,開啟 Amazon SNS 主控台

  1. 在左側面板中,選擇訂閱
  2. 選擇建立訂閱按鈕。
  3. 主題 ARN 欄位中貼上帳戶 A 中 SNS 主題的 ARN。
  4. 協定下拉式清單中選取 AWS Lambda
  5. 端點欄位上貼上 Lambda 函數的 ARN
  6. 向下捲動並選擇建立訂閱按鈕。

**注意:**請確保您從具有 Lambda 函數 (帳戶 B) 的 AWS 帳戶將 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

相關資訊

使用 AWS Lambda 搭配 Amazon Simple Notification Service

當我嘗試將 Lambda 函數訂閱至我的 Amazon SNS 主題時,為什麼會收到授權錯誤?

AWS 官方
AWS 官方已更新 8 個月前