Python 从lambda中的SNS确定EC2实例公共IP
我有一个lambda函数,可以SSH ec2实例并运行一些命令。此lambda函数是从SNS主题触发的。SNS主题与cloudwatch闹钟集成。我在lambda中使用Python2.7函数遵循这个线程。是否可能获取实际触发警报的EC2公共IP地址?这取决于您用于触发SNS发布的CloudWatch警报。 我的建议是在函数中打印出整个事件字典,并检查是否有提到EC2实例ID 如果出现CloudWatch EC2警报(例如CPU使用),您将在度量维度中找到实例IDPython 从lambda中的SNS确定EC2实例公共IP,python,amazon-ec2,aws-lambda,amazon-sns,amazon-cloudwatch,Python,Amazon Ec2,Aws Lambda,Amazon Sns,Amazon Cloudwatch,我有一个lambda函数,可以SSH ec2实例并运行一些命令。此lambda函数是从SNS主题触发的。SNS主题与cloudwatch闹钟集成。我在lambda中使用Python2.7函数遵循这个线程。是否可能获取实际触发警报的EC2公共IP地址?这取决于您用于触发SNS发布的CloudWatch警报。 我的建议是在函数中打印出整个事件字典,并检查是否有提到EC2实例ID 如果出现CloudWatch EC2警报(例如CPU使用),您将在度量维度中找到实例ID # Python example
# Python example
import json
message = json.loads(event['Records'][0]['Sns']['Message'])
instance_id = message['Trigger']['Dimensions'][0]
如果您有实例ID,则可以使用boto3轻松检索实例公共IP,如下所示:
# 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']
最后,当您执行从Lambda函数到EC2实例的SSH时,请记住,VPC之外的Lambda函数获得动态公共IP,因此不可能为SSH限制EC2实例安全组。从安全角度来看,让SSH向全世界开放并不是一个好的做法
我建议在VPC中同时运行EC2和Lambda函数,限制SSH仅从Lambda VPC安全组访问您的EC2实例。在这种情况下,您需要检索私有Ip地址,而不是公共Ip地址,以便能够对实例进行ssh(python逻辑与上面相同,唯一的区别是使用“PrivateIpAddress”而不是“PublicIpAddress”)。这比使用公共互联网更安全
我希望这有帮助
G这取决于您用来触发SNS发布的CloudWatch警报。 我的建议是在函数中打印出整个事件字典,并检查是否有提到EC2实例ID 如果出现CloudWatch EC2警报(例如CPU使用),您将在度量维度中找到实例ID
# Python example
import json
message = json.loads(event['Records'][0]['Sns']['Message'])
instance_id = message['Trigger']['Dimensions'][0]
如果您有实例ID,则可以使用boto3轻松检索实例公共IP,如下所示:
# 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']
最后,当您执行从Lambda函数到EC2实例的SSH时,请记住,VPC之外的Lambda函数获得动态公共IP,因此不可能为SSH限制EC2实例安全组。从安全角度来看,让SSH向全世界开放并不是一个好的做法
我建议在VPC中同时运行EC2和Lambda函数,限制SSH仅从Lambda VPC安全组访问您的EC2实例。在这种情况下,您需要检索私有Ip地址,而不是公共Ip地址,以便能够对实例进行ssh(python逻辑与上面相同,唯一的区别是使用“PrivateIpAddress”而不是“PublicIpAddress”)。这比使用公共互联网更安全
我希望这有帮助
G