AWS Python Boto3 - 通过id获取实例运行时间

时间:2018-03-01 01:16:53

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

示例输出:

[0301/112442:INFO:console.cc(52)] [console.log()] IndexedDB.install
[0301/112442:INFO:console.cc(52)] [console.log()] InputEvent.install
[0301/112442:INFO:console.cc(52)] [console.log()] mathRound.install
[0301/112442:INFO:console.cc(52)] [console.log()] MediaKeys.install
[0301/112442:INFO:console.cc(57)] [console.info()] Using native EME as-is.
[0301/112442:INFO:console.cc(52)] [console.log()] MediaSource.install
[0301/112442:INFO:console.cc(57)] [console.info()] Using native MSE as-is.
[0301/112442:INFO:console.cc(52)] [console.log()] VideoPlayPromise.install
[0301/112442:ERROR:console.cc(62)] [console.error()] VTTCue not available.
[0301/112442:INFO:browser_module.cc(534)] Loaded WebModule
[0301/112442:INFO:console.cc(52)] [console.log()] Unload latency:
[0301/112442:INFO:console.cc(52)] [console.log()] load() failed:
[0301/112442:ERROR:console.cc(62)] [console.error()] Error code 

答案 1 :(得分:0)

我最终创建了另一个每分钟运行的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']