首页 文章

使用PHP SDK的AWS EC2 - 等到实例具有公共DNS名称

提问于
浏览
2

我想创建一个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 回答

  • 0

    获取公共DNS名称没有服务器功能 . 我能想到的2个选项:

    1.)使用 sleep 或某种while循环/ sleep 方法,直到你得到 PublicDnsName . 这有点hacky并阻止你的线程 .

    2.)更优雅的方法是使用QueuingPHP implementation of asynchronous使整个事情异步 .

  • 0

    尝试$ dnsName = $ result ['Reservations'] [0] ['Instances'] [0] ['PublicDnsName']

    但如果你想用dns-name ssh

    Blockquote

    你必须使用密钥对* .pem文件并在循环中使用ssh shell命令ping主机名,直到它连接为止 . 一旦它可连接,你就会返回true . 仅仅因为实例正在运行并不意味着你可以通过SSH进入它 . API中没有任何内容可以让您知道是否可以SSH . 这样做的方法是使用自定义服务员 . 创建自定义服务员的过程在用户指南的“自定义服务员”部分中进行了描述 . @skyzyx你有兴趣实现这个吗? 1

    Blockquote

相关问题