我创建3个EC2实例,然后迭代和标记他们每个人。 有时标签请求失败,尽管后来情况似乎正在运行。
难道这是一个时机的问题? 我应该标记之前创建实例后,等待几秒钟? 有没有一种确定的方式来等待它开始?
我创建3个EC2实例,然后迭代和标记他们每个人。 有时标签请求失败,尽管后来情况似乎正在运行。
难道这是一个时机的问题? 我应该标记之前创建实例后,等待几秒钟? 有没有一种确定的方式来等待它开始?
AWS已同时增加更详细的文档排除API请求错误 ,包括部分解决最终一致性 ,基本证实了我下面最初的回答进行分析:
亚马逊EC2 API如下的最终一致性模型,由于系统支持API的分布式特性。 这意味着,您运行的API命令的结果会影响您的Amazon EC2资源可能不能立即看到你运行所有后续命令 。 [...]
[...]例如,[...] 如果你运行一个命令来修改或描述您刚刚创建的资源,其ID可能不会在整个系统中传播时,你会得到一个错误响应,资源不不存在 。
要管理最终一致性,可以做到以下几点:
确认资源的状态运行命令之前对其进行修改。 运行相应的使用指数退避算法 ,以确保你有足够的时间为前一个命令通过系统传播描述命令 。 [...]
添加等待时间的后续命令之间,即使描述命令返回一个准确的响应 。 应用开始与一对夫妇的等待时间秒的指数退避算法,并逐渐增加至约五分钟的等待时间。
[重点煤矿]
请注意 :大多数AWS SDK的同时会自动应用这些建议,包括期权调整默认的重试策略,甚至添加自定义的实现-看在AWS的错误重试和指数退避为指导如何实现它自己,如果需要的话。
AWS的API的最终一贯的设计越来越多地被各种大型AWS的用户,谁自然需要更深入,并相应地解决它,例如参见下面的文章中遇到:
正如已经评价由@datasage,在AWS的API显然需要被普遍视为最终一致性只有-这当然是意外的时候第一次遇到,但实际上不是太奇怪了事后大规模的服务,即工程RESP。 操作折衷解决CAP定理 。
另请参见我的亚历克斯Ciminian的问题意见的AWS现货实例请求实现幂等 ,在那里他讨论他的关于类似的一致性问题的测试结果:
有趣的问题- [...]我遇到的各种类似的API延误的背景下竹AWS插件 ,并得出结论认为,AWS API需要将视为是最终一致性只有一刀切; 例如,我甚至遇到过,我收到资源ID从建立呼叫的情况下,可以标记基于其ID资源,但无法描述它仍然其后,因为它理应不存在(还)。
关于提到的案件的细节,你可能想寻找到AWS API的频繁进行轮询,导致油门限制 ,在这里我总结了我们的分析与探讨通过中可用但有限的重试/后退的功能,以提高处理AWS SDK的Java -解决方案几乎是理想的,但它似乎大大改善的事情暂且。
类似的说明,重新设计的AWS SDK为PHP 2推出专门的“店小二”的对象,让你查询的资源,直到它在希望的状态到内解决这个问题,见服务员 快速入门的详细信息:
一个由SDK提供的高层次的抽象是“服务员”的理念。 服务员帮助更容易地与最终一致的系统通过提供一种简单的方法来等待一个资源通过查询进入特定状态的资源工作。 [...]与任何起始@method标签“最好推迟到”将利用一个服务员。
$client->waitUntil('BucketExists', array('Bucket' => 'my-bucket'));
不能创建标签名称,直到实例启动。 你可以尝试给KEY_NAME在创建实例。 如果您使用的博托,它可以通过完成
reservation = conn.run_instances(1, 1, instance_type='m1.small', key_name='samplename')
然后实例可以通过传递KEY_NAME进行检索,一旦他们处于运行状态,你也可以给他们的标签名。