Статус доставки AWS SNS

Я новичок в 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?

Спасибо в преддверии.


person harish sharma    schedule 28.10.2016    source источник


Ответы (2)


Вы спрашиваете, как получить статус доставки уведомлений о сообщениях, отправленных через Amazon SNS.

Использование атрибутов тем Amazon SNS для статуса доставки сообщений в документации сказано:

Amazon SNS поддерживает логирование состояния доставки уведомлений, отправляемых в темы со следующими конечными точками Amazon SNS:

  • Заявление
  • HTTP
  • лямбда
  • SQS

После настройки атрибутов состояния доставки сообщений записи журнала будут отправляться в журналы CloudWatch для сообщений, отправленных в тему, подписанную на конечную точку Amazon SNS.

Мне не удалось найти конкретный вызов API для запроса статуса message_id. Вместо этого кажется, что информация журнала отправляется в Журналы CloudWatch. Вам нужно будет проанализировать журналы, чтобы узнать статус.

person John Rotenstein    schedule 30.10.2016
comment
Моя конечная точка — Application, и я упомянул, что журнал генерируется, но как я могу получить статус доставки уведомлений, отправленных в темы message_id? Есть ли другой способ узнать? - person harish sharma; 01.11.2016
comment
Также можете ли вы сказать мне, существует ли какой-либо срок действия/действительность журналов в CloudWatch? Или он доступен навсегда? - person harish sharma; 01.11.2016
comment
hy John, Как я могу применить Metric Filter для сгенерированных журналов через PHP? думаю мне будет полезно, буду фильтровать все логи по message_id(Metric Filter), - person harish sharma; 01.11.2016
comment
фильтр метрик CloudWatch Logs будет искать определенный текст в log хранится в журналах CloudWatch и возвращает совпадающие строки. Затем вам нужно будет проанализировать эти строки, чтобы извлечь информацию, которую вы ищете. Попробовать стоит, но придется немного повозиться. - person John Rotenstein; 02.11.2016
comment
хорошо, после долгих исследований я проверил метод filterLogEvents, в его параметре filterPattern(ключ) я передал свой message_id вот так { $.notification.messageId = "1********-a****-5***-9***-5***********" }, и он фильтрует мои данные в соответствии с моими потребностями, это правильный способ фильтрации журналов? Если чего-то не хватает и это полезно для разбора логов, предложите мне. - person harish sharma; 02.11.2016
comment
Когда потоков логов будет много, может этот метод filterLogEvents займет много времени, так как же сделать фильтрацию более точной и быстрой? Также я думаю, что сохраняю эти журналы в своей БД. Итак, через сколько времени я могу хранить информацию журнала в БД? потому что я думаю, что Aws Sns пытается повторно отправить уведомления, если не удалось с первой попытки. - person harish sharma; 02.11.2016

  1. Включите «Журналирование состояния доставки» в AWS Cloudwatch Дополнительная информация
  2. Настройте пользователя (используется в скрипте) для доступа к журналу AWS Cloudwatch.
  3. Прочитайте запись журнала из cloudwatch с помощью awssdk для php

См. пример кода ниже

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>";

Я верю, что это поможет кому-то

person Arun Raj    schedule 21.05.2021