View a markdown version of this page

亚马逊 EC2 API 的最终一致性 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

亚马逊 EC2 API 的最终一致性

由于支持 Amazon EC2 API 的系统的分布式特性,Amazon API 遵循最终一致性模型。这意味着,您运行的影响您的 Amazon EC2 资源的 API 命令的结果可能不会立即显示给您随后运行的所有命令。在执行紧随上一个 API 命令的 API 命令时,应记住这一点。

最终一致性会影响您管理资源的方式。例如,如果您运行命令创建了某个资源,这个资源最终会对其他命令变得可见。这意味着,如果您立刻运行命令去修改或查询刚创建的资源,由于其 ID 可能尚未在系统中传播完成,您可能会收到资源不存在的错误。

要管理最终一致性,您可以执行以下操作:

  • 在运行修改命令之前,先确认资源的当前状态。使用指数回退算法运行相应的 Describe 命令,来确保有足够的时间让前一个命令传播遍整个系统。为此,请重复运行该Describe命令,从几秒钟的等待时间开始,然后逐渐增加到几分钟的等待时间。

  • 增加后续命令之间的等待时间,即使 Describe 命令返回准确的响应,也是如此。应用指数退避算法,从几秒钟的等待时间开始,然后逐渐增加到几分钟的等待时间。

最终一致性错误示例

以下是一些由于最终一致性而可能遇到的错误代码示例。

  • InvalidInstanceID.NotFound

    如果您成功执行了 RunInstances 命令,然后立刻使用 RunInstances 返回的实例 ID 执行另一个命令,可能会返回 InvalidInstanceID.NotFound 错误。这并不代表该实例不存在。

    以下是可能受影响的一些具体命令:

    • DescribeInstances:要确认实例的实际状态,请使用指数回退算法运行此命令。

    • TerminateInstances:要确认实例状态,请先使用指数回退算法运行 DescribeInstances 命令。

      重要

      如果您在运行 TerminateInstances 之后收到 InvalidInstanceID.NotFound 错误,这并不代表实例已经或即将被终止。实例仍有可能正在运行。因此,您应当首先使用 DescribeInstances 来确认实例状态。

  • InvalidGroup.NotFound

    如果您成功执行了 CreateSecurityGroup 命令,然后立即使用 CreateSecurityGroup 返回的安全组 ID 执行另一个命令,可能会返回 InvalidGroup.NotFound 错误。要确认安全组的状态,请使用指数回退算法运行 DescribeSecurityGroups 命令。

  • InstanceLimitExceeded

    您请求的实例数量超过了当前对指定实例类型的配额上限。如果您在短时间内频繁创建和终止实例,可能会出乎意料地触及此配额限制,因为即使实例已被终止,它们在一段时间内仍会计入您的实例配额。