0

Ich habe eine Lambda-Funktion, die SSH ec2-Instanz und einige Befehle ausführen. Diese Lambda-Funktion wird vom SNS-Thema ausgelöst. SNS-Thema ist mit einem Cloudwatch-Alarm integriert. Ich benutze Python 2.7 in Lambda-Funktion, gefolgt von diesem Thread https://aws.amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/. Ist es möglich, die öffentliche IP-Adresse von EC2 zu erhalten, die tatsächlich Alarm ausgelöst hat?Ermitteln der EC2-Instanz öffentliche IP von SNS in Lambda

Antwort

2

Es hängt vom CloudWatch-Alarm ab, den Sie zum Auslösen der SNS-Veröffentlichung verwenden. Mein Vorschlag ist, das gesamte Ereignis Wörterbuch in Ihrer Funktion auszudrucken und zu überprüfen, ob es eine Erwähnung über die EC2-Instanz-ID gibt.

Im Falle eines CloudWatch EC2-Alarms (z. B. CPU-Auslastung) finden Sie die Instanz-ID in der metrischen Dimension.

# Python example 
import json 
message = json.loads(event['Records'][0]['Sns']['Message']) 
instance_id = message['Trigger']['Dimensions'][0] 

Wenn Sie die Instanz-ID haben, können Sie leicht die Instanz öffentliche IP mit boto3 abrufen wie folgt:

# Python example 
import boto3 
instance_id = 'xxxx' # This is the instance ID from the event 
ec2 = boto3.client('ec2') 
instances = ec2.describe_instances(InstanceIds=[instance_id]) 
public_ip = instances[0]['Reservations'][0]['Instances'][0]['PublicIpAddress'] 

Schließlich, wie Sie SSH von Lambda-Funktion auf Ihre EC2-Instanz ausführen im Auge behalten dass Lambda-Funktionen außerhalb von VPC eine dynamische öffentliche IP erhalten, ist es daher unmöglich, Ihre EC2-Instanz-Sicherheitsgruppe für SSH einzuschränken. SSH für die ganze Welt offen zu lassen, ist aus Sicherheitssicht keine gute Praxis.

Ich empfehle, sowohl EC2 und Lambda-Funktion in VPC ausführen SSH-Zugriff auf Ihre EC2-Instanzen nur von Lambda VPC Sicherheitsgruppe beschränken. In diesem Fall müssen Sie die private IP-Adresse statt der öffentlichen IP-Adresse abrufen, um Ihre Instanz ssh zu starten (die Python-Logik ist dieselbe wie oben). Der einzige Unterschied besteht darin, dass Sie 'PrivateIpAddress' anstelle von verwenden 'PublicIpAddress'). Dies ist viel sicherer als das öffentliche Internet.

Ich hoffe, das hilft.

G

Verwandte Themen