Rails/Ruby Parse AWS SNS Topic Notification Data

Есть это приложение rails, которое я создал, чтобы принимать данные уведомлений темы SNS. Летом уведомление SNS генерируется по завершении задания эластичного транскодера. Таким образом, приложение rails просто принимает входящий почтовый запрос от сервиса AWS SNS и все, что мне нужно для анализа этих данных. Что у меня не работает, так это то, что я пытаюсь получить Message => jobId, но не могу понять, как это сделать. Цените любую помощь.

def sns_transcode_completed

      amz_message_type = request.headers['x-amz-sns-message-type']
      amz_sns_topic = request.headers['x-amz-sns-topic-arn']

      if !amz_sns_topic.nil? &&
        amz_sns_topic.to_s.downcase == 'arn:aws:sns:us-east-1:XXXXXXXXXX:MyApp_transcode_completed'

        request_body = JSON.parse(request.body.read, {:symbolize_names => true})

        notification = Hashie::Mash.new(request_body)


        if amz_message_type.to_s.downcase == 'subscriptionconfirmation'
          subscribe_url = request_body['SubscribeURL']
          if !subscribe_url.to_s.empty? && !subscribe_url.nil?
            subscribe_confirm = HTTParty.get subscribe_url

            puts subscribe_confirm
            puts subscribe_url
          end


        end

        if amz_message_type.to_s.downcase == 'notification'

          puts "--------------------------"
          puts notification.inspect # See output 1
          puts "--------------------------"
          puts notification.MessageId # This works I can get the MessageId 
          puts "--------------------------"
          puts notification.Message => # From here I need to get the jobId, but it comes as a String? See output 2
          puts "--------------------------"



        end

      end
      render :nothing => true, :status => 200, :content_type => 'text/html'


    end

Выход 1

          #<Hashie::Mash Message="{\n \"state\" : \"COMPLETED\",\n \"version\" : \"2012-09-25\",\n \"jobId\" : \"1440122777052-XXXXXX\",\n \"pipelineId\" :
   \"1432361831290-XXXXX\",\n \"input\" : {\n \"key\" : \"web-b796ab20-297c-0133-4ccf-378cf690e3b1.mp3\"\n },\n \"outputKeyPrefix\" :
   \"hlsv4/246-21632840-29d7-0133-1d8e-XXXXXXXX/\",\n \"outputs\" : [ {\n \"id\" : \"1\",\n \"presetId\" : \"1351620000001-200071\",\n \"key\" : \"hls_64k\",\n
   \"segmentDuration\" : 10.0,\n \"status\" : \"Complete\",\n \"duration\" : 60\n } ],\n \"playlists\" : [ {\n \"name\" : \"index\",\n \"format\" : \"HLSv4\",\n
   \"outputKeys\" : [ \"hls_64k\" ],\n \"status\" : \"Complete\"\n } ]\n}" MessageId="2d26f6d0-1715-5edb-af39-b8809eff521f" Signature="XXXXXX" SignatureVersion="1"
   SigningCertURL="https://sns.us-east-1.amazonaws.com/SimpleNotificationService-d6d679a1d18e95c2f9ffcf11fXXXXXXX.pem" Subject="Amazon Elastic Transcoder has
   finished transcoding job 1440122777052-XXXXXX." Timestamp="2015-08-21T02:06:34.523Z" TopicArn="arn:aws:sns:us-east-1:005550634774:MyApp_transcode_completed"
   Type="Notification"
   UnsubscribeURL="https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:005550634774:MyApp_transcode_completed:8c0e48fe-c34
   9-4185- bb94-XXXXXXXXXX">

Вывод 2

 {
  "state": "COMPLETED",
  "version": "2012-09-25",
  "jobId": "1440122777052-XXXXX",
  "pipelineId": "1432361831290-XXXXXX",
  "input": {
    "key": "web-b796ab20-297c-0133-4ccf-378cf690e3b1.mp3"
  },
  "outputKeyPrefix": "hlsv4/246-21632840-29d7-0133-1d8e-35ebbdecd855/",
  "outputs": [
    {
      "id": "1",
      "presetId": "1351620000001-200071",
      "key": "hls_64k",
      "segmentDuration": 10,
      "status": "Complete",
      "duration": 60
    }
  ],
  "playlists": [
    {
      "name": "index",
      "format": "HLSv4",
      "outputKeys": [
        "hls_64k"
      ],
      "status": "Complete"
    }
  ]
}

person randika    schedule 21.08.2015    source источник
comment
notification.Message — это хеш, который включает в себя ключ "jobId". Таким образом, вы должны иметь доступ к идентификатору задания с помощью notification.Message["jobId"].   -  person steve klein    schedule 21.08.2015
comment
@steveklein Я думал так же, но когда я делаю это puts "Result is #{notification.Message["jobId"]}", вывод становится Result is jobId - Кажется, notification.Message - это строка?   -  person randika    schedule 21.08.2015
comment
Извините, @randika, но как я могу перехватить электронное письмо, отправленное aws SNS? мой эластичный транскодер работает и отправляет мне электронное письмо со статусом и информацией о выполненной работе, но как я могу получить это электронное письмо в ruby? и показать в консоли? спасибо   -  person bsiilvia    schedule 02.05.2017


Ответы (2)


Я снова получил этот рабочий анализ значения notification.Message. Я хочу, если есть лучший способ, чем этот.

parsed_message = JSON.parse(notification.Message, {:symbolize_names => true})

      puts parsed_message.inspect

      puts "--------------------------"

      puts parsed_message[:jobId]
person randika    schedule 21.08.2015

У меня была та же проблема, и в итоге я отказался от Hashie (в этом действительно нет необходимости, кроме возможности использовать точечную запись в этом случае). ). Как только я это понял, объект, который я хотел получить, находился в массиве, поэтому я использовал метод dig, чтобы извлечь объект, а затем получить доступ к нужным мне данным.

def sns_endpoint
notification = JSON.parse(request.raw_post, {:symbolize_names => true})
case notification[:Type]
  when "SubscriptionConfirmation"
    confirm(notification[:TopicArn], notification[:Token])
  when "Notification"
    message_data = JSON.parse(notification[:Message])
    thing_you_are_trying_to_get = message_data["Records"].dig(0)["s3"]...etc...(access the data you need here.)
     else
    Rails.logger.error "Unknown notification type #{notification[:Type]}"
end

render body: nil

конец

person angeleah    schedule 29.07.2017