0

Python と boto API を使用して、次のことを行います。

  1. sns、sqs を作成し、sqs キューを sns にサブスクライブします。
  2. cloudwatch に接続し、「StatusCheckFailed」メトリクスのアラームを作成します。
  3. put_metric_alarm を使用して、アラームの監視と通知を開始します。

StatusCheckFailed 状態をシミュレートする独自の AMI の 1 つを起動しました。AWS コンソール > 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区切り線なしで 1 つの文字列を取得します。例えば

    TypeNotificationMessageId02a8ce9dc21e55eaaeca83b5258563ffTopicArnarnawssnsuswest21888888879statuscheckalarm17122223479SubjectStatusCheckAlarmbadvmstatusalarminUSWest2MessageAlarmNamebadvmstatusalarmAlarmDescriptionstatuscheckfori50602c5abadvmAWSAccountId11233333333NewStateValueALARMNewStateReasonThresholdCross....`
    
  2. get_body読めないコーディングを取得します。

AWS コンソールの SQS セクションに表示されるような JSON 形式のメッセージ本文を取得するにはどうすればよいですか?

4

2 に答える 2

3

の結果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'
于 2015-01-11T00:55:06.110 に答える
1

AWS フォーラムで同様のものを読みましたが、うまくいきました。

メッセージが base64 でエンコードされないことがわかっている場合は、次のように、キューからメッセージを読み取るコードを変更して、メッセージのデコードを試行しないようにすることができます。 .get_queue('myqueue') queue.set_message_class(boto.sqs.message.RawMessage)

于 2015-01-08T23:53:14.597 に答える