我想创建一个 ec2 实例,并使用“Waiter”功能等待实例具有公共(public) 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'));
实例创建得很好,但最后一行失败了,因为实例没有公共(public) dns 名称,因为实例在具有 dns 名称之前被视为“正在运行”。有没有我可以用来等待它有 dns 名称的服务员?
这是服务员: http://docs.aws.amazon.com/aws-sdk-php/v3/api/api-ec2-2015-04-15.html#waiters
最佳答案
没有获取公共(public) DNS 名称的等待函数。我能想到的 2 个选项:
1.) 使用sleep
或某种while 循环/sleep
方法,直到您可以获得PublicDnsName
。这有点 hacky,会阻塞您的线程。
2.) 一种更优雅的方法是使用 Queuing 使整个过程异步, 或 PHP implementation of asynchronous .
关于php - 带有 PHP SDK 的 AWS EC2 - 等到实例具有公共(public) DNS 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31565440/
相关文章:
hibernate - Spring-data/Hibernate 不能正确处理空值
php - 使用 Jsonb 绑定(bind)参数?|使用 Postgres 的 Doctrine2
sql - 如何克服 `PERCENTILE_CONT` 参数应为常量的限制?
c# - 在基于 Web 的架构上使用 POCO、DTO 和 ViewModel
c# - Visual Studio : how to use scripts to "build
python - 通过 Mininet 网络发送 "random"流量
algorithm - 生成填字游戏的高效算法(纽约时报的风格)