2017-07-18 6 views
3

私はpython Boto3コードを使用しています。インスタンスがAuto Scalingグループから終了するとSQSにメッセージを発行するSNSに通知します。ラムダは、SNSに通知されるとトリガされ、SQSからメッセージを取得するためにbotoスクリプトを実行します。SNS/SQS自動スケーリングメッセージからEC2InstanceIdを抽出

Sending and Receiving Messages in Amazon SQSの参照コードを使用しています。ここで

は、コードスニペットです:

if messages.get('Messages'): 
    m = messages.get('Messages')[0] 
    body = m['Body'] 

    print('Received and deleted message: %s' % body) 

結果は次のとおりです。

START RequestId: 1234-xxxxxxxx Version: $LATEST 
{ 
    "Type" : "Notification", 
    "MessageId" : "d1234xxxxxx", 
    "TopicArn" : "arn:aws:sns:us-east-1:xxxxxxxxxx:AutoScale-Topic", 
    "Subject" : "Auto Scaling: termination for group \"ASG\"", 
    "Message" : "{\"Progress\":50,\"AccountId\":\"xxxxxxxxx\",\"Description\":\"Terminating EC2 instance: i-123456\",\"RequestId\":\"db-xxxxx\",\"EndTime\":\"2017-07-13T22:17:19.678Z\",\"AutoScalingGroupARN\":\"arn:aws:autoscaling:us-east-1:360695249386:autoScalingGroup:fef71649-b184xxxxxx:autoScalingGroupName/ASG\",\"ActivityId\":\"db123xx\",\"EC2InstanceId\":\"i-123456\",\"StatusCode\"\"}", 
    "Timestamp" : "2017-07-", 
    "SignatureVersion" : "1", 
    "Signature" : "", 
    "SigningCertURL" : "https://sns.us-east-1.amazonaws.com/..", 
    "UnsubscribeURL" : "https://sns.us-east-1.amazonaws.com/ 
} 

私は終了し、インスタンス全体ではなく、メッセージのEC2InstanceIdを必要とします。どのようにIDを抽出できますか?

+0

インスタンスIDを抽出するために正規表現マッチングを行う必要があります – Ashan

答えて

2

あなたの目標は、(パラメータとしてEC2インスタンスIDを持つ)AWSラムダ関数を実行する場合は、もアマゾンSQSキューにメッセージをパブリッシュする必要はありません。実際、SQSキューから取得されるメッセージがラムダ関数の呼び出しと一致することを保証できないため、これは信頼できません。

自動スケーリングがイベントをSNSおよびSNSに送信すると、ラムダ関数がトリガーされ、SNS は必要な情報をラムダ関数に直接渡します。

このコード(または類似)を使用してラムダ関数を起動し

def lambda_handler(event, context): 

    # Dump the event to the log, for debugging purposes 
    print("Received event: " + json.dumps(event, indent=2)) 

    # Extract the EC2 instance ID from the Auto Scaling event notification 
    message = event['Records'][0]['Sns']['Message'] 
    autoscalingInfo = json.loads(message) 
    ec2InstanceId = autoscalingInfo['EC2InstanceId'] 

あなたのコード、その後アマゾンSQSを使用せずに、EC2インスタンスIDを持っています。

+0

Johnさんの作品に感謝します! – Sam

0

インスタンスIDはメッセージ内にあります。それは生のJSONなので、jsonパッケージで解析して情報を得ることができます。

import json 
if messages.get('Messages'): 
    m = messages.get('Messages')[0] 
    body = m['Body'] 
    notification_message = json.loads(body["Message"]) 

    print('instance id is: %s' % notification_message["EC2InstanceId"]) 
+0

ありがとうございます。私はこのエラーが発生しています:lambda_handlerのファイル "/var/task/lambda_function.py"、行20、 notification_message = json.loads(本文["Message"]) TypeError:文字列インデックスはstrではなく整数でなければなりません – Sam

+0

あなたの質問は、すでに 'body'に解析されたオブジェクトがあるように見えます。そうでない場合は、おそらくそれも解析する必要があります。いずれにせよ、あなたはジョンの答えを使うべきです。より完全です。 – kichik

+0

ありがとうございましたkichik、私はジョンの解決策を試しています。 – Sam

関連する問題