亚马逊 EC2 API 的最终一致性 - Amazon Elastic Compute Cloud

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

亚马逊 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

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