為什麼 Amazon SNS 沒有在 CloudWatch 警示觸發 Lambda 函數時調用該函數?

2 分的閱讀內容
0

我想要 Amazon Simple Notification Service (Amazon SNS) 在 Amazon CloudWatch 警示觸發 AWS Lambda 函數時調用該函數。

簡短描述

在下列情況下,會阻止您調用 Lambda 函數:

  • Lambda 函數的資源政策尚未授予從 SNS 主題調用該函數的存取權。針對此情況,請完成檢查 Lambda 函數的資源型政策文件區段中的步驟。
  • Lambda 函數調用延遲。針對此情況,請完成檢查您的 Amazon SNS 交付日誌區段中的步驟。

注意:解決方法假設您可以在 SNS 主題上呼叫發佈 API,但收到 Amazon SNS 和 Lambda 整合之間的錯誤。如果在 SNS 主題上看不到任何活動,請參閱為什麼我沒有收到 CloudWatch 警示觸發的 SNS 通知?該活動可能包括下列 CloudWatch 指標: NumberOfMessagesPublishedNumberOfNotificationsDeliveredNumberOfNotificationsFailed

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

檢查 Lambda 函數的資源型政策文件

當 Amazon SNS 以非同步方式調用 Lambda 函數時,Lambda 會將 202 HTTP 狀態代碼傳回至 Amazon SNS。狀態代碼顯示 Lambda 已接受該訊息以供稍後處理。如需詳細資訊,請參閱非同步調用。如果您收到失敗的回應,請檢查 Amazon SNS 交付日誌以取得詳細資訊。

根據帳戶中的情況選擇解決方法。

如果 SNS 主題和 Lambda 函數位於同一個帳戶:

1.    開啟 Lambda 主控台

2.    在導覽窗格中,選擇函數,然後選擇您的函數。

3.    選擇組態標籤,然後選擇許可

4.    在資源型政策區段中,從陳述式 ID 中選擇該政策陳述式,以檢視您的政策文件。您會看到下列政策文件:

statement id
your-statement-id

principal:
sns.amazonaws.com

effect
allow

action
Lambda:InvokeFunction

conditions
{ "arnlike": { "aws:sourcearn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name" }

注意:若要在 JSON 中查看政策文件,請在資源型政策區段中選擇檢視政策文件

如果遺失授予 Amazon SNS 存取權以調用該函數的 Lambda 資源政策,請將下列函數新增至您的政策文件。使用 Lambda 主控台或 AWS CLIAWS CloudShell

使用命令列,如下所示:

aws lambda add-permission \
--function-name your-lambda-function-name \
--statement-id triggerfromsns-statement-id \
--action lambda:invokefunction \
--principal sns.amazonaws.com \
--source-arn arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name

**注意:**將 your-lambda-function-nameyour-aws-regionyour-aws-account-idyour-sns-topic-name 取代為您的值。AWS CLI 命令使用預設 AWS 區域。如果您的 Lambda 函數位於不同的區域,您可以使用 --region 旗標覆寫預設區域。

使用 Lambda 主控台,如下所示:

1.    開啟 Lambda 主控台

2.    在導覽窗格中,選擇函數,然後選擇您的函數。

3.    選擇組態標籤,然後選擇許可

4.    在資源型政策區段中,選擇新增許可

5.    對於主體,選取 sns.amazonaws.com

6.    對於動作,選取 Lambda:InvokeFunction

7.    對於陳述式 ID,輸入唯一 ID。

8.    選擇儲存

如果 SNS 主題和 Lambda 函數位於不同帳戶:

1.    設定跨帳戶許可

2.    在 CloudWatch 日誌中,使用交付狀態記錄確認 Amazon SNS 已成功將訊息傳送至 Lambda 或 NumberOfNotificationsDelivered CloudWatch 指標。

Amazon SNS 和 Lambda 之間的成功回應範例:

{
    "notification": {
        "messagemd5sum": "your-md5-sum",
        "messageid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "topicarn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic",
        "timestamp": "2021-04-04 14:08:48.083"
    },
    "delivery": {
        "deliveryid": "your-sns-delivery-id",
        "destination": "arn:aws:lambda:your-aws-region:your-aws-account-id:function:your-function-name",
        "providerresponse": "{\ "lambdarequestid\":\ "your-lambda-request-id\"}",
        "dwelltimems": 92,
        "attempts": 1,
        "statuscode": 202
    },
        "status": "success"
}

檢查您的 Amazon SNS 交付日誌

檢查您的 SNS 主題的 Lambda 函數交付日誌。如果回應成功,您會看到 202 狀態代碼。

若要檢視 SNS 主題的 CloudWatch 日誌,請執行下列操作:

1.    開啟 CloudWatch 主控台

2.    在導覽窗格中,展開日誌,然後選擇日誌群組

3.    在篩選條件搜尋方塊中,輸入 SNS 主題的名稱。會出現 SNS 主題的兩個日誌群組:一個為成功,一個為失敗。

4.    選擇成功日誌群組。

5.    在日誌串流區段中,選擇搜尋全部

注意:您也可以在上次事件時間欄位中檢查該請求的時間戳記。然後,搜尋 Lambda 函數的 Amazon Resource Name (ARN) 和名稱。

6.    從日誌串流欄位中,選擇日誌串流以將其開啟。

如果您沒有看到任何結果,請執行下列操作:

1.    選擇日誌群組,然後選擇失敗日誌群組。

2.    在日誌串流區段中,選擇搜尋全部

3.    從日誌串流欄位中,選擇日誌串流以將其開啟。

若要對失敗日誌群組進行疑難排解,請執行下列操作:

1.    檢查 Lambda 函數的 X-Ray 追蹤暫留時間是否較長。如果是這樣,請使用 CloudWatch 主控台確認該區域中的 Lambda 函數的錯誤和限流數量是否最少。請務必選取所有函數,然後選取錯誤限流指標。

**注意:**當以非同步方式調用的函數之間存在數百個錯誤和限流時,可能會備份內部 Lambda 佇列。  此備份可能會延遲函數調用。最佳實務是將錯誤和限流率降至最低,以避免不必要的延遲。如需詳細資訊,請參閱非同步調用

2.    設定目的地 Amazon Simple Queue Service (Amazon SQS) 佇列或 Lambda 函數,以個別處理。這可防止訊息丟失,這是因為 Lambda 函數的非同步事件最大存留期可長達六小時。

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