【问题标题】:Getting running time for an AWS instance获取 AWS 实例的运行时间
【发布时间】:2016-07-24 20:45:53
【问题描述】:

我正在使用 PHP AWS SDK 来获取我账户中所有正在运行的实例。我使用了以下 API:

$this->ec2Client = Ec2Client::factory(array(
            'profile' => AWS_PROFILE, //contains my credentials
            'region' => 'ap-northeast-1',
            'version' => 'latest',
        ));

$result = $this->ec2Client->DescribeInstances(array(
            'Filters' => array(
                array('Name' => 'instance-state-name', 'Values' => array('running')),
            )
        ));

我可以通过LaunchTimeAvailabilityZone信息获取所有正在运行的实例。

它们的值分别是2014-10-31T10:58:35+00:00ap-northeast-1a

根据这些信息,我想以分钟为单位计算运行时间。这样做的正确方法是什么?

【问题讨论】:

    标签: amazon-ec2 aws-php-sdk


    【解决方案1】:

    为每个实例的LaunchTime 提供的值应该是DateTime 的一个实例。您可以通过获取LaunchTime 和另一个 DateTime 实例之间的差异来了解一个实例运行了多长时间:

    $interval = $launchTime->diff(new \DateTime('now'), true);
    

    【讨论】:

    • 由于EC2客户端和其他实例可能运行在不同的AZ,我们需要考虑时区吗?
    • 没有。 DateTime 对象在计算差异时会考虑时区,从 EC2 的 API 返回的值是整数(纪元)时间戳。
    • 好的,但是为launchTime 返回的值是string,我需要在几分钟内得到结果。所以我尝试了以下方法:$launch_time = new DateTime($instance["LaunchTime"]);$launch_time->diff(new \DateTime('now'), true) 现在echo $launch_time 分别生成小时、分钟、天。然后我应该手动转换为分钟吗?
    • 啊,没想到你用的是v2. LaunchTime 在 v3 中是一个DateTime,在 v2 中是一个字符串,但该字符串可以传递给DateTime 的构造函数。 DateTime::diff 将返回一个DateInterval 对象,可以按照php.net/manual/en/dateinterval.format.php 进行格式化
    【解决方案2】:

    我在 v3 中使用以下方法解决了它:

    function interval_in_minutes($start_time){
            return round(abs($start_time->getTimestamp() -
                (new \DateTime)->getTimestamp()) / 60);
        }
    
    $running_time = interval_in_minutes($instance["LaunchTime"]);
    

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2018-08-09
      • 2020-12-01
      • 1970-01-01
      • 2016-11-15
      • 2015-01-12
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多