2015-01-08 5 views
0

으로 AWS 상태 확인 알람 메시지를 읽을 어떻게에 BOTO API를 사용하여 파이썬을 사용는 BOTO

  1. 는 SNS, SQS를 작성하고 SNS로 SQS 대기열을 구독.
  2. cloudwatch에 연결하고 "StatusCheckFailed"측정 항목에 대한 경보를 생성하십시오.
  3. 알람 모니터링 및 알림을 시작하려면 put_metric_alarm을 사용하십시오.

나는 StatusCheckFailed 조건을 시뮬레이트 할 내 자신의 AMI 중 하나를 시작했습니다. AWS 콘솔> SQS로 이동하면 알림 메시지가 나타납니다. AWS 콘솔에서도 JSON 형식의 콘텐츠를 볼 수 있습니다.

내가 SQS API를 파이썬을 사용하는 경우, 내가 할 수

  1. 는 큐 (q = sqs.lookup(queue_name))
  2. 메시지 본문을 얻을 수 (b = message.get_body_encoded()를) 메시지 (msg = q.read())
  3. 를 얻을 수를 조회

결과

  • 또는 message.get_body() 읽을 수 없다.

    1. get_body_encoded은 분리 자없이 하나의 문자열을 가져옵니다. 예 :

      TypeNotificationMessageId02a8ce9dc21e55eaaeca83b5258563ffTopicArnarnawssnsuswest21888888879statuscheckalarm17122223479SubjectStatusCheckAlarmbadvmstatusalarminUSWest2MessageAlarmNamebadvmstatusalarmAlarmDescriptionstatuscheckfori50602c5abadvmAWSAccountId11233333333NewStateValueALARMNewStateReasonThresholdCross....` 
      
    2. get_body

      당신에게 않은 읽을 수있는 코드를 가져옵니다.

    어떻게 메시지 본문을 JSON 형식으로 가져올 수 있습니까? AWS 콘솔의 SQS 섹션에 표시된 것과 비슷합니까?

  • 답변

    2

    .

    SQS 대기열 및 SNS 알림 항목을 작성하고 SQ 주제에 SQS 대기열을 가입시킨 다음 알림을 SNS 주제에 푸시하는 경보를 작성하여 상황을 재현했습니다. 나는 그 알람 상황을 트리거 파이썬을 통해 결과 검색 :

    $ 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) get_body()의 결과가 JSON 형식 문자열을 반환