我正在使用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);
}
?>
所以,我的问题是:一旦实例停止,之后写的所有内容都不会被执行,因为实例将被停止,对吧?循环不会继续下一次迭代,对吗?如果是这样,那么我怎么能解决这个问题?
答案 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));
但是你必须从与被终止的实例不同的实例运行它。