我在 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。通过此阈值调整,您可以完成更新。