在 lambda 中从 SNS 确定 EC2 实例 public IP

Determining EC2 instance public IP from SNS in lambda

我有一个 lambda 函数,其中包含 SSH ec2 实例和 运行 一些命令。此 lambda 函数从 SNS 主题触发。 SNS 主题与 cloudwatch 警报集成。我在这个线程 https://aws.amazon.com/blogs/compute/scheduling-ssh-jobs-using-aws-lambda/ 之后的 lambda 函数中使用 python 2.7。是否可以获得实际触发警报的 EC2 public IP 地址?

这取决于您用于触发 SNS 发布的 CloudWatch 警报。 我的建议是在你的函数中打印出整个 event 字典,并检查是否有任何关于 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 轻松检索实例 public 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 函数执行 SSH 到您的 EC2 实例时,请记住,VPC 之外的 Lambda 函数获得一个动态 public IP,因此不可能限制您的 EC2 实例安全组用于 SSH .从安全角度来看,让 SSH 对全世界开放并不是一个好的做法。

我建议 运行 VPC 中的 EC2 和 Lambda 功能限制仅从 Lambda vpc 安全组对您的 EC2 实例进行 SSH 访问。在这种情况下,您需要检索私有 IP 地址而不是 public 才能对您的实例进行 ssh(python 逻辑与上面相同,唯一的区别是您使用'PrivateIpAddress' 而不是 'PublicIpAddress') 。这比使用 public 互联网更安全。

希望对您有所帮助。

G