【发布时间】:2015-10-12 11:09:12
【问题描述】:
我想创建一个 ec2 实例,并使用“Waiter”功能等到该实例具有公共 DNS 名称 - 这可能吗?
这是我的代码:
$ec2 = new Aws\Ec2\Ec2Client([credentials]);
$result = $ec2->runInstances(array(
'DryRun' => false,
// ImageId is required
'ImageId' => '[removed]',
// MinCount is required
'MinCount' => 1,
// MaxCount is required
'MaxCount' => 1,
'KeyName' => '[removed]',
'SecurityGroupIds' => array('[removed]'),
'InstanceType' => 'r3.4xlarge',
'Placement' => array(
'AvailabilityZone' => 'us-east-1a',
),
'EbsOptimized' => false,
'Monitoring' => array(
// Enabled is required
'Enabled' => true,
),
));
$arr = $result->toArray();
$instanceId = $arr['Instances'][0]['InstanceId'];
echo 'created instance '.$instanceId."\n";
$ec2->waitUntil('InstanceRunning', ['InstanceIds' => array($instanceId)]);
$result = $ec2->describeInstances(array(
'InstanceIds' => array($instanceId),
));
$dnsName = current($result->getPath('Reservations/*/Instances/*/PublicDnsName'));
实例创建得很好,但最后一行失败,因为实例没有公共 dns 名称,因为实例在具有 dns 名称之前被认为是“正在运行”。有没有一个服务员可以让我等到它有一个 dns 名称?
这里是服务员: http://docs.aws.amazon.com/aws-sdk-php/v3/api/api-ec2-2015-04-15.html#waiters
【问题讨论】:
-
你试过 sleep() 吗?
-
我知道我可以睡觉,或者循环直到dns名称可用,只是想使用很酷的服务员功能。
-
老实说,服务员只是一个循环的抽象,调用了 sleep(),所以这将是一种有效的方法。 SDK 中的很多服务员来自客户针对一个或多个 AWS SDK 的拉取请求,所以如果您有什么想法,请打开 PR!
-
有趣 - 感谢您的信息。
标签: php amazon-web-services amazon-ec2