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

Posted

技术标签:

【中文标题】带有 PHP SDK 的 AWS EC2 - 等到实例具有公共 DNS 名称【英文标题】:AWS EC2 with PHP SDK - wait until instance has Public DNS Name 【发布时间】: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! 有趣 - 感谢您的信息。 【参考方案1】:

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

1.) 使用sleep 或某种while 循环/sleep 方法,直到获得PublicDnsName。这有点骇人听闻,会阻塞你的线程。

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

【讨论】:

【参考方案2】:

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

但是如果你想用 dns-name SSH

块引用

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

块引用

【讨论】:

以上是关于带有 PHP SDK 的 AWS EC2 - 等到实例具有公共 DNS 名称的主要内容,如果未能解决你的问题,请参考以下文章

使用boto3 Python SDK返回AWS EC2可用性区域属性

AWS Java SDK - 在 EC2 实例上使用 SSM 运行命令

如何使用 Ruby SDK 从 AWS 获取公共 IP 地址

AWS 安全组难题

使用 aws-sdk ruby​​ gem 知道自己的实例 ID

AWS - ECS - 如何在现有 ECS(带有 1 个 EC2)实例上重新部署更新的 Docker 映像?