当我尝试更新 Amazon EBS 卷类型 (AWS::EC2::Volume) 时,如何解决 CloudFormation 中的“无法在修改状态 OPTIMIZING 下修改卷 vol-XXXXXXXXXX”错误?

上次更新时间:2021 年 5 月 5 日

我在 AWS CloudFormation 中收到“无法在修改状态 OPTIMIZING 下修改卷 vol-XXXXXXXXXX”错误或类似错误。当我尝试更新 Amazon Elastic Block Store (Amazon EBS) 卷类型时,会发生此错误。我的 EBS 卷 (AWS::EC2::Volume) 长时间卡在 UPDATE_IN_PROGRESS 状态,最终无法更新卷类型。我的堆栈无法更新,并且随后的更新回滚也失败。然后,堆栈最终处于 UPDATE_ROLLBACK_FAILED 状态。

简短描述

如果您在 CloudFormation 堆栈修改 EBS 卷时使用凭证,则该卷的超时时间段约为 7 个小时。如果您改为使用 AWS Identity and Access Management (IAM) 服务角色运行堆栈,则 CloudFormation 会将超时时间段延长至 36 小时。

注意:卷的超时时间段仅适用于使用 CloudFormation 进行的卷修改。超时时间段因不同类型的资源和操作而异。

通常,充分利用的 1TiB EBS 卷大约需要六个小时才能迁移到新的性能配置。有关更多信息,请参阅监控卷修改的进度

重要提示:如果您已经使用 CloudFormation 启动了堆栈更新,则必须等待大约七个小时直到堆栈稳定,然后才能完成以下步骤。当堆栈进入 UPDAT_ROLBACK_FAIALK 状态时,它将稳定下来。

解决方法

注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时收到错误讯息,请确保您运行的是最新版本的 AWS CLI

等待堆栈稳定后恢复堆栈

请考虑以下示例。如果将 EBS 卷类型从 st1 更改为 gp3,则由于卷大小,堆栈可能无法更新卷类型。在这种情况下,您可以通过对堆栈执行 continue-update-rollback 操作来恢复堆栈。对于恢复操作,您必须跳过无法更新的资源的逻辑 ID。您的堆栈最终将处于 UPDATE_ROLLBACK_COMPLETE 状态。

使用 AWS CLI 或 CloudFormation 控制台恢复堆栈。

AWS CLI:

aws cloudformation continue-update-rollback --stack-name your-stack-name --resources-to-skip logical-ID-of-EBS-volume

CloudFormation 控制台:

1.    打开 CloudFormation 控制台

2.    在导航窗格中,选择堆栈

3.    在 Stack name(堆栈名称)列中,选择停滞在 UPDATE_ROLLBACK_FAILED 状态的堆栈。

4.    选择 Stack actions(堆栈操作),然后选择 Continue update rollback(继续更新回滚)。

5.    在 Continue update rollback(继续更新回滚)对话框中,展开 Advanced troubleshooting(高级故障排除)。

6.    在 Resources to skip - optional(跳过的资源 - 可选)部分中,选择您要跳过的资源。

注意:请务必选择无法更新的卷的逻辑 ID。

7.    选择 Continue update rollback(继续更新回滚)。

更新堆栈以匹配 EBS 卷的当前状态

您必须更新堆栈以匹配 EBS 卷的当前状态。您的 CloudFormation 模板通过堆栈更新进行更新,并且堆栈将更改为 UPDATE_COMPLETE 状态。

例如,您可以将卷类型 (AWS::EC2::Volume) 从 st1 修改为 gp3。但是,由于回滚操作,即使在 Amazon EBS 中准确反映了对 gp3 的更新,CloudFormation 中的卷类型仍为 st1

1.    要监控 EBS 卷的状态,请使用 Amazon EC2 控制台或运行以下命令:

aws ec2 describe-volumes-modifications --volume-ids your-volume-ID

2.    在 Amazon EBS 中将卷类型更改为 gp3 后,请将 CloudFormation 堆栈中的卷类型更新为 gp3

注意:您可以通过将卷类型更改为 gp3 来修改 CloudFormation 模板。然后,执行更新操作。

3.    使用偏差检测来验证您的 EBS 卷资源 (AWS::EC2::Volume) 是否与堆栈同步。

重要提示:如果未使用服务角色或卷大小很大(约 8TiB),则堆栈更新可能需要超过 36 个小时的时间。在这种情况下,即使使用可在 36 个小时内保持稳定的服务角色,堆栈更新也可能会失败。然后,您必须等到堆栈稳定下来。在此期间,您无法修改任何其他资源类型。要解决此问题,请完成以下操作:

1.    使用保留删除策略从堆栈中移除 EBS 卷,而不删除该卷。

2.    改为使用 Amazon EBS 控制台在 CloudFormation 之外更新您的 EBS 卷。

3.    将 EBS 卷导入回堆栈中。

如果要始终将卷保留在堆栈中,则必须使卷大小保持在阈值以下。例如,如果迁移 8TiB 数据需要 64 个小时,那么您可以估计 36 个小时的最大大小,并将数据大小降低到 4TiB。通过此阈值调整,您可以完成更新。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?