【问题标题】:AWS Python Boto3 - Getting an instance running time by idAWS Python Boto3 - 通过 id 获取实例运行时间
【发布时间】:2018-08-09 00:29:13
【问题描述】:

我正在尝试使用适用于 aws 的 python boto3 库来查找实例已启动的分钟数。我无法找到直接的方法来做到这一点。我可以使用以下方法获取机器的状态:

ec2 = boto3.resource('ec2')
instance = ec2.Instance(instance_id)

status = instance.state['Name']
print(status)

但我正在寻找一个简单的指标:实例运行的分钟数。请注意,这不是实例的正常运行时间,因为它会在停止时重置。

【问题讨论】:

  • 不清楚。您是在寻找启动时间(实例创建时间)还是正常运行时间(实例上次启动时间)。
  • 我一般会计算ENI的附着时间。用户附加/分离 ENI 的情况非常罕见。没有 1 个命令可以确定实例创建时间。 AWS 仅提供正常运行时间(实例上次启动时)。

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


【解决方案1】:

这是一个您可以尝试的想法。查询“RunInstance”的 CloudTrail 数据 "、"StopInstance" 和 "StartInstance" 计算实例的总运行时间。

这是我创建的脚本。 https://gist.github.com/sudharsans/990dbb67f397d79556dbc02e5835e5ec

样本输出:

i-0xxxxxfcd40ebd6a1 user 0:09:21.263278
i-xxxxxx502450c96aa yser 84 days, 15:13:37.651975
i-xxxxxxfcdf27ec894 yser 6 days, 15:43:52.191147
i-xxxxx386c630af322 user 13 days, 14:08:49.429469
i-xxxxxxxd41bf975eb test 21:37:59.67100

【讨论】:

  • 不处理实例停止的时间。它似乎只在第一次创建实例时处理。
  • 它计算所有的开始和停止时间,而不是基于启动时间。可能有bug,我还没有完全测试过。
  • 这是一个想法,您可能想进一步即兴发挥。
  • 它确实有效,它还需要@SudharsanSivasankaran 什么考虑?
【解决方案2】:

我最终创建了另一个每分钟运行一次的 lambda 函数,如果实例正在运行,它会增加存储在 dynamodb 中的值。这不是一个很好的解决方案,但效果很好。

import boto3
import time

def lambda_handler(event, context):
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1', endpoint_url="https://dynamodb.us-west-1.amazonaws.com")
    table = dynamodb.Table('<table name>')

    response = table.scan()
    data = response['Items']

    for i in data:
        state = get_state(i['instance_id'])
        if (state=='running'):
            response = table.update_item(
                Key={
                'id': i['id']
                },
                UpdateExpression="set runTime = :r",
                ExpressionAttributeValues={
                ':r': i['runTime'] + 1,
                },
                ReturnValues="UPDATED_NEW"
            )

    return response

def get_state(instance_id):
    ec2 = boto3.resource('ec2')
    instance = ec2.Instance(instance_id)
    return instance.state['Name']

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 2021-02-24
    • 2018-04-07
    • 2013-01-05
    • 2020-05-24
    • 1970-01-01
    • 2020-01-28
    • 2020-01-22
    相关资源
    最近更新 更多