我想创建一个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
2 回答
获取公共DNS名称没有服务器功能 . 我能想到的2个选项:
1.)使用
sleep
或某种while循环/sleep
方法,直到你得到PublicDnsName
. 这有点hacky并阻止你的线程 .2.)更优雅的方法是使用Queuing或PHP implementation of asynchronous使整个事情异步 .
尝试$ dnsName = $ result ['Reservations'] [0] ['Instances'] [0] ['PublicDnsName']
但如果你想用dns-name ssh
你必须使用密钥对* .pem文件并在循环中使用ssh shell命令ping主机名,直到它连接为止 . 一旦它可连接,你就会返回true . 仅仅因为实例正在运行并不意味着你可以通过SSH进入它 . API中没有任何内容可以让您知道是否可以SSH . 这样做的方法是使用自定义服务员 . 创建自定义服务员的过程在用户指南的“自定义服务员”部分中进行了描述 . @skyzyx你有兴趣实现这个吗? 1