Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从lambda中的SNS确定EC2实例公共IP_Python_Amazon Ec2_Aws Lambda_Amazon Sns_Amazon Cloudwatch - Fatal编程技术网

Python 从lambda中的SNS确定EC2实例公共IP

Python 从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

我有一个lambda函数,可以SSH ec2实例并运行一些命令。此lambda函数是从SNS主题触发的。SNS主题与cloudwatch闹钟集成。我在lambda中使用Python2.7函数遵循这个线程。是否可能获取实际触发警报的EC2公共IP地址?

这取决于您用于触发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

这取决于您用来触发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