2017-07-18 2 views
3

J'utilise le code Python Boto3. Lorsqu'une instance est terminée à partir du groupe Auto Scaling, il notifie SNS qui publie le message dans SQS. Lambda est également déclenché lors de la notification de SNS, qui exécute un script boto pour récupérer le message de SQS. J'utilise le code de référence Sending and Receiving Messages in Amazon SQS.Extraction de EC2InstanceId à partir du message Auto Scaling SNS/SQS

Voici l'extrait de code:

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

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

Le résultat est:

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/ 
} 

Je ne ai besoin EC2InstanceId de l'instance terminée et non le message entier. Comment puis-je extraire l'identifiant?

+0

Vous devrez peut-être faire une correspondance regex pour extraire l'ID d'instance – Ashan

Répondre

2

Si votre objectif est d'exécuter une fonction Lambda AWS (ayant le EC2 ID instance comme paramètre), il n'y a pas besoin de publier également le message à une file d'attente Amazon SQS. En fait, cela ne serait pas fiable car vous ne pouvez pas garantir que le message récupéré dans la file d'attente SQS correspond à l'appel de votre fonction Lambda.

Heureusement, lorsque Auto Scaling envoie un événement à SNS et SNS, puis déclenche une fonction Lambda, SNS transmet les informations nécessaires directement à la fonction Lambda.

Commencez votre fonction Lambda avec ce code (ou similaire):

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'] 

Votre code a alors l'EC2 ID instance, sans avoir à utiliser Amazon SQS.

+0

Merci John son travail! – Sam

0

L'ID d'instance se trouve dans le message. C'est JSON brut, donc vous pouvez l'analyser avec le paquet json et obtenir l'information.

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

Merci. Je reçois cette erreur: Fichier "/var/task/lambda_function.py", ligne 20, dans lambda_handler notification_message = json.loads (body ["Message"]) TypeError: les index de chaîne doivent être des entiers, pas str – Sam

+0

Votre question donne l'impression que vous avez déjà un objet analysé dans 'body'. Si ce n'est pas le cas, vous devrez probablement analyser cela aussi. De toute façon, vous devriez utiliser la réponse de John. C'est plus complet. – kichik

+0

Merci kichik, j'essaie la solution de John. – Sam