Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
為什麼 Amazon SNS 沒有在 CloudWatch 警示觸發 Lambda 函數時調用該函數?
我想要 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 指標: NumberOfMessagesPublished、NumberOfNotificationsDelivered 或 NumberOfNotificationsFailed
解決方法
**注意:**如果您在執行 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 CLI 或 AWS 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-name、your-aws-region、your-aws-account-id 和 your-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 函數的非同步事件最大存留期可長達六小時。

相關內容
- 已提問 5 個月前lg...
- 已提問 2 年前lg...
- 已提問 3 個月前lg...
- 已提問 5 個月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前