【问题标题】:Count Running and Stopped Ec2 Instances with AWS Lambda使用 AWS Lambda 计算正在运行和停止的 Ec2 实例
【发布时间】:2021-05-30 01:09:47
【问题描述】:

如何使用 boto3 和 AWS Lambda 函数计算特定区域中正在运行和停止的 EC2 实例的数量?

【问题讨论】:

  • 请更具体地说明您到目前为止所尝试的内容或问题所在。

标签: python amazon-web-services amazon-ec2 aws-lambda boto3


【解决方案1】:

下面是一些检索实例列表并计算stoppedrunning 实例数量的代码:

import boto3

def lambda_handler(event, context):
    
    ec2_resource = boto3.resource('ec2')
    instances = [instance.state["Name"] for instance in ec2_resource.instances.all()]
    
    print('Running: ', instances.count('running'))
    print('Stopped: ', instances.count('stopped'))

ec2_resource.instances.all() 的调用检索所有实例的列表,并且有一个state 属性包含状态的Name

这将在 Lambda 函数的默认区域中运行。如果您想更改区域,请指定区域名称,如下所示:

ec2_resource = boto3.resource('ec2', region_name='ap-southeast-2')

更新:如何通过 SNS 获得通知。

如果您想通过 SNS 收到通知,有两种选择:

  • 让 Lambda 函数使用 publish(PhoneNumber='123') 命令通过 Amazon SNS 直接向您的手机发送 SMS 消息,
  • 让 Lambda 函数使用 publish(TopicArn=xxx) 命令向 Amazon SNS 主题发送消息,然后通过首选方法(例如电子邮件、短信)订阅 SNS 主题。

请注意,实例启动/停止需要一分钟左右,因此如果将此与启动/停止实例的代码结合使用,发出这些命令后计数将不会立即准确。

【讨论】:

  • 该脚本在我测试时似乎运行良好,但是当该脚本运行时如何通过 SNS 获得通知?我有一个启动和停止 EC2 实例的 lambda 脚本,我希望一个 lambda 函数在触发停止和启动 lambda 函数时自动计数并通知我停止和运行的 EC2 实例的数量。我已经使用预定规则和 SNS 主题创建了 CloudWatch 事件,但我仍然没有收到任何通知。我还在每个 lambda 函数中添加了 SN​​S 主题作为触发器,但这似乎效果不佳。任何建议将不胜感激。
  • 我很困惑为什么你会添加 SNS 作为 Lambda 函数的触发器——这似乎有点倒退,因为它会在 SNS 收到消息后触发 Lambda,但看起来你想要相反.我在回答中添加了一些细节。
  • 我的问题是,我如何将您编写的这个函数(运行和停止状态函数)连接到我拥有的停止和启动 EC2 lambda 函数,以及如何将这个精确的 EC2 计数函数作为电子邮件当 EC2 停止并由 lambda 启动时,通过 SNS? publish(TopicArn=xxx) 对我来说不太管用。我想我糟糕的 python 技能在这里对我没有好处。同时,cloudwatch 事件规则也不适用于我。
  • 我怀疑您将许多概念混合在一起,这会混淆您的目标。如果您有一个现有的 Lambda 函数来停止和启动实例,那么您可以将此代码添加到该函数。 (您是否自己编写了停止/启动功能?)您应该尝试调试为什么publish() 不起作用——首先,手动向控制台中的主题发送消息以确认您收到电子邮件。然后,尝试使用publish() 命令并查看它是否给出错误消息。可能是 Lambda 函数没有被分配调用 SNS publish() 命令的权限。
  • 这是我的脚本,可以按时停止 ec2 实例,我还有另一个脚本也可以按时启动 Ec2。上面的脚本给出了停止和运行的实例的数量,我想在下面的脚本被触发时得到通知。我在哪里放置发布功能? import boto3 region = 'us-east-1' instances = ['i-053'] ec2 = boto3.client('ec2', region_name=region) def lambda_handler(event, context): ec2.stop_instances(InstanceIds=instances) print('实例停止:' + str(instances))
猜你喜欢
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2016-06-25
  • 2013-04-05
  • 2016-01-01
  • 2016-12-25
相关资源
最近更新 更多