在要重新启动的实例上重新启动EC2实例

时间:2014-08-11 17:59:46

标签: amazon-web-services amazon-ec2

我正在使用AWS实例上的PHP脚本运行循环。根据我使用AWS的经验,只要实例停止,就会停止正在执行的所有代码。我有这个:

<?php
require("vendor/autoload.php");
use Aws\Ec2\Ec2Client;

$instance_id = 'instance_id';
$creds = array('key' => 'key', 
                'secret' => 'secret', 
                'region' => 'us-west-2');
$client = Ec2Client::factory($creds);
$instance = array('InstanceIds' => array($instance_id), 'DryRun' => false);

for($i=0;$i<10;$i++) {
    // Execute irrelevant code
    // .....

    $result = $client->stopInstances($instance);
    sleep(300);
    $result = $client->startInstances($instance);
}
?>

所以,我的问题是:一旦实例停止,之后写的所有内容都不会被执行,因为实例将被停止,对吧?循环不会继续下一次迭代,对吗?如果是这样,那么我怎么能解决这个问题?

3 个答案:

答案 0 :(得分:0)

当您调用stopinstances api时,EC2将开始关闭您的实例(实例中的操作系统将终止正在运行的进程)

我无法保证这需要多长时间,但根据我的经验,你很少会超过几秒钟,所以sleep(300)几乎可以保证对stopInstances的调用是你的代码将做的最后一件事。

除了不停止正在运行的实例之外,没有什么可以做的。为此,您可以查询实例元数据服务,以找出运行代码的实例的ID。您可以通过向http://169.254.169.254/latest/meta-data/instance-id

发出请求来获取此数据

答案 1 :(得分:0)

您无法启动从同一实例停止的实例。您可以在EC2上保留其他(外部)服务器,或以其他方式控制自动关闭/启动。

答案 2 :(得分:0)

继续关注@TJ - 的答案...... 您可以检查实例是否已停止,然后继续执行代码 $client->waitUntil('InstanceStopped', array('InstanceIds' => $instanceId)); 但是你必须从与被终止的实例不同的实例运行它。