【问题标题】:AWS SNS delivery statusAWS SNS 传送状态
【发布时间】:2017-03-11 06:19:00
【问题描述】:

我是 Aws 的新手,我正在使用 Aws SNS 发送通知,我将通知发送到不同的主题而不是端点。这是完美的工作。

当我publish 通知时,我得到了类似的数组

object(Aws\Result)#84 (1) {
    ["data":"Aws\Result":private]=>
       array(2) {
         ["MessageId"]=>
         string(36) "************-7a29-591f-8765-************"
         ["@metadata"]=>
         array(4) {
         ["statusCode"]=>
         int(200)
         ["effectiveUri"]=>
        string(40) "https://sns.ap-southeast-1.amazonaws.com"
        ["headers"]=>
        array(4) {
            ["x-amzn-requestid"]=>
            string(36) "************-b737-5831-abf4-************"
            ["content-type"]=>
            string(8) "text/xml"
            ["content-length"]=>
            string(3) "294"
            ["date"]=>
            string(29) "Fri, 28 Oct 2016 08:59:05 GMT"
        }
        ["transferStats"]=>
            array(1) {
               ["http"]=>
               array(1) {
               [0]=>
               array(0) {}
            }
        }
    }
}

我在服务器端使用 php, 我如何通过这个message id获得所有收件人的通知发送状态?

感谢期待。

【问题讨论】:

    标签: php amazon-web-services amazon-sns amazon-cloudwatch amazon-cloudwatchlogs


    【解决方案1】:

    您在询问如何获取通过 Amazon SNS 发送的消息的通知传递状态

    Using Amazon SNS Topic Attributes for Message Delivery Status 文档说:

    Amazon SNS 支持记录通知消息的传递状态发送到具有以下 Amazon SNS 终端节点的主题:

    • 应用
    • HTTP
    • 拉姆达
    • SQS

    配置消息传递状态属性后,日志条目将发送到 CloudWatch Logs,以获取发送到订阅了 Amazon SNS 终端节点的主题的消息。

    我找不到通过 message_id 请求状态的特定 API 调用。相反,日志信息似乎被发送到 CloudWatch Logs。您需要解析日志以发现状态。

    【讨论】:

    • 我的端点是Application,我提到正在生成日志,但是如何获取message_id 发送到主题的通知消息的传递状态?有没有其他方法可以查到?
    • 另外,您能否告诉我 CloudWatch 上的日志是否有任何到期期限/有效期?还是永久可用?
    • CloudWatch 日志会一直保留,直到被明确删除。没有通过message_id 获取日志的方法——您需要通过getLogEvents() 以编程方式解析日志并自己查找信息。
    • 你好 John,我如何通过 PHP 应用 Metric Filter 生成日志?我认为这对我有用,我将按message_id(按Metric Filter)过滤所有日志,
    • 好的,经过大量研究,我检查了一个方法filterLogEvents,在它的参数filterPattern(key) 中我像这样{ $.notification.messageId = "1********-a****-5***-9***-5***********" } 传递了我的message_id,它正在根据过滤我的数据我的需要,它是过滤日志的正确方法吗?如果缺少某些内容并且有利于解析日志,请建议我。
    【解决方案2】:
    1. 启用 AWS Cloudwatch More Info 的“交付状态日志记录”
    2. 调整用户(在脚本中使用)以访问 AWS Cloudwatch 日志
    3. 使用 awssdk for php 从 cloudwatch 读取日志条目

    查看下面的示例代码

    require 'inc/awsSdkForPhp/aws-autoloader.php';
    $params = array(
        'credentials' => array(
            'key' => '<YOUR KEY>',
            'secret' => '<YOUR SECRET>',
        ),
        'region' => 'us-east-1', //  your aws from SNS region
        'version' => 'latest'
    );
    $cwClient = new \Aws\CloudWatchLogs\CloudWatchLogsClient($params);
    $queryRes = $cwClient->startQuery([
      'endTime' => 1621231180,  // UNIX TIMESTAMP 
      'logGroupName' => 'sns/us-east-1/***/DirectPublishToPhoneNumber', // YOUR LOG GROUP NAME
      'queryString' => 'fields @timestamp, status, @message
      | filter notification.messageId="5a419afc-c4b3-55b3-85f9-c3e7676b2dd2"', // YOUR MESSAGE ID
      'startTime' => 1620954551 // START UNIX TIMESTAMP 
    ]);
    
    $qryID = $queryRes->get('queryId');
    sleep(3); // To wait the execution to be completed.
    $resultObj =  $cwClient->getQueryResults(array(
      'queryId' => $qryID, // REQUIRED
    ));
    
    //echo "<pre>";print_r($resultObj);echo "</pre>";
    $result = $resultObj->get('results');
    
    $jsnRs = json_decode($result[0][2]['value']); // TO get the delivery array 
    
    echo "<br>status :".$jsnRs->status;
    echo "<br>phone Carrier :".$jsnRs->delivery->phoneCarrier;
    echo "<br>provider Response :".$jsnRs->delivery->providerResponse;
    echo "<pre>";print_r($jsnRs);echo "</pre>";

    我相信它会帮助某人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多