2015-01-08 32 views
0

閱讀AWS狀態檢查警報的消息我使用Python與博託API來:如何與博託

  1. 創建SNS,SQS和訂閱SQS隊列到SNS。
  2. 連接到cloudwatch,併爲「StatusCheckFailed」度量標準創建警報。
  3. 使用put_metric_alarm啓動警報監視和通知。

我啓動了一個我自己的AMI,它將模擬StatusCheckFailed條件。 如果我轉到AWS console> SQS,我可以看到我收到了警報通知。我可以在AWS控制檯中查看JSON格式的內容。

當我使用Python,與SQS API,我可以:

  1. 查找隊列(q = sqs.lookup(queue_name)
  2. 得到的消息(msg = q.read()
  3. 得到消息的主體(b = message.get_body_encoded()
  4. message.get_body()

結果是不可讀。

  1. get_body_encoded給你一個沒有任何分隔符的字符串。例如

    TypeNotificationMessageId02a8ce9dc21e55eaaeca83b5258563ffTopicArnarnawssnsuswest21888888879statuscheckalarm17122223479SubjectStatusCheckAlarmbadvmstatusalarminUSWest2MessageAlarmNamebadvmstatusalarmAlarmDescriptionstatuscheckfori50602c5abadvmAWSAccountId11233333333NewStateValueALARMNewStateReasonThresholdCross....` 
    
  2. get_body讓你不可讀編碼。

如何以JSON格式獲取郵件正文就像AWS控制檯的SQS部分中顯示的那樣?

回答

2

get_body()結果返回一個JSON格式的字符串。

我通過創建SQS隊列和SNS通知主題來重新創建您的情況,將SQS隊列訂閱到SNS主題,然後創建將通知推送到SNS主題的警報。然後我觸發報警狀況和檢索通過Python結果:

$ python 
Python 2.6.9 (unknown, Sep 13 2014, 00:25:11) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import boto, boto.sqs 
>>> from boto.sqs.message import Message 
>>> q_conn = boto.sqs.connect_to_region("ap-southeast-2") 
>>> q = q_conn.get_queue('bob') 
>>> m = q.read(visibility_timeout=15) 
>>> m.get_body() 
u'{\n "Type" : "Notification",\n "MessageId" : "adcad528-680b-5b4f-88bd-98432f1bf252",\n "TopicArn" : "arn:aws:sns:ap-southeast-2:123412341234:bob-topic",\n "Subject" : "ALARM: \\"my-alarm-name\\" in APAC - Sydney",\n "Message" : "{\\"AlarmName\\":\\"my-alarm-name\\",\\"AlarmDescription\\":\\"my-alarm-description\\",\\"AWSAccountId\\":\\"123412341234\\",\\"NewStateValue\\":\\"ALARM\\",\\"NewStateReason\\":\\"Threshold Crossed: 1 datapoint (1459.0) was greater than or equal to the threshold (0.0).\\",\\"StateChangeTime\\":\\"2015-01-11T00:33:20.013+0000\\",\\"Region\\":\\"APAC - Sydney\\",\\"OldStateValue\\":\\"INSUFFICIENT_DATA\\",\\"Trigger\\":{\\"MetricName\\":\\"NetworkIn\\",\\"Namespace\\":\\"AWS/EC2\\",\\"Statistic\\":\\"SUM\\",\\"Unit\\":null,\\"Dimensions\\":[{\\"name\\":\\"InstanceId\\",\\"value\\":\\"i-af41ec91\\"}],\\"Period\\":60,\\"EvaluationPeriods\\":1,\\"ComparisonOperator\\":\\"GreaterThanOrEqualToThreshold\\",\\"Threshold\\":0.0}}",\n "Timestamp" : "2015-01-11T00:33:20.072Z",\n "SignatureVersion" : "1",\n "Signature" : "(removed)",\n "SigningCertURL" : "(removed)",\n "UnsubscribeURL" : "https://sns.ap-southeast-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-southeast-2:123412341234:bob-topic:9bc1234c-1234-4995-927a-72b752866e5e"\n}' 

get_body()的響應是包含JSON的字符串。這可以使用JSON庫解析:

>>> message_string = json.loads(m.get_body())['Message'] 
>>> message_string 
u'{"AlarmName":"my-alarm-name","AlarmDescription":"my-alarm-description","AWSAccountId":"123412341234","NewStateValue":"ALARM","NewStateReason":"Threshold Crossed: 1 datapoint (1459.0) was greater than or equal to the threshold (0.0).","StateChangeTime":"2015-01-11T00:33:20.013+0000","Region":"APAC - Sydney","OldStateValue":"INSUFFICIENT_DATA","Trigger":{"MetricName":"NetworkIn","Namespace":"AWS/EC2","Statistic":"SUM","Unit":null,"Dimensions":[{"name":"InstanceId","value":"i-af41ec91"}],"Period":60,"EvaluationPeriods":1,"ComparisonOperator":"GreaterThanOrEqualToThreshold","Threshold":0.0}}' 
>>> message = json.loads(message_string) 
>>> message['AlarmName'] 
u'my-alarm-name' 
+0

謝謝約翰。這很酷。我想爲你投票,但我至少需要15個名聲才能投票... – user2994125

1

我在AWS論壇上看過類似的文章,它對我很有用。

如果您知道郵件不會以base64編碼,您可以更改從隊列中讀取郵件的代碼,以便它不嘗試解碼郵件,如下所示: sqs = boto.connect_sqs () 隊列= sqs.get_queue( 'myQueue中') queue.set_message_class(boto.sqs.message.RawMessage)