AWS CloudFormation StackSets 故障排除 - AWS CloudFormation

AWS CloudFormation StackSets 故障排除

本主题包含一些常见的 AWS CloudFormation StackSets 问题以及这些问题的建议的解决方案。

堆栈操作失败的常见原因

问题:堆栈操作失败,并且堆栈实例状态为 OUTDATED

原因:有几个导致堆栈操作失败的常见原因。

  • 目标账户中的权限不足,无法创建模板中指定的资源。

  • AWS CloudFormation 模板可能存在错误。验证 AWS CloudFormation 中的模板并修复错误,然后再尝试创建堆栈集。

  • 模板可能尝试创建必须唯一但不唯一的全球资源 (如 S3 存储桶)。

  • 指定的目标账号不存在。检查您在向导的 Set deployment options 页面上指定的目标账号。

  • 管理员账户与目标账户没有信任关系。

  • 目标账户中已存在模板中指定的资源的最大数量。例如,您可能已达到目标账户中允许的 IAM 角色数限制,但模板创建更多 IAM 角色。

  • 您已达到堆栈集中允许的最大堆栈数量。有关每个堆栈集的最大堆栈数,请参阅 AWS CloudFormation 限制

解决方案:有关创建堆栈集之前目标和管理员账户所需的权限的更多信息,请参阅授予管理员账户的所有用户管理所有目标账户中堆栈的权限

重试失败的堆栈创建或更新操作

问题:堆栈创建或更新失败,并且堆栈实例状态为 OUTDATED。要查找堆栈创建或更新失败的原因,请打开 AWS CloudFormation 控制台并查看堆栈的事件,这些事件的状态为 DELETED(对于失败的创建操作)或 FAILED(对于失败的更新操作)。浏览堆栈事件,然后查找 Status reason 列。Status reason 的值解释了堆栈操作失败的原因。

在确定堆栈创建失败的根本原因并准备好重试堆栈创建后,请执行下列步骤。

解决方案:执行下列步骤以重试堆栈操作。

  1. 在控制台中,选择包含操作失败的堆栈的堆栈集。

  2. 操作菜单上,选择 Edit StackSet details (编辑堆栈集详细信息) 以重试创建或更新堆栈。

  3. Specify template (指定模板) 页面上,要使用相同的 AWS CloudFormation 模板,请保留默认选项使用当前模板。如果您的堆栈操作因模板需要更改而失败,并且您想上传修订后的模板,请改为选择 Upload a template to Amazon S3,然后选择 Browse 以选择更新的模板。上传完修订后的模板后,选择 Next

  4. 指定堆栈详细信息页面上,如果您不更改特定于模板的任何参数,请选择下一步

  5. Set deployment options 页上,更改 Maximum concurrent accountsFailure tolerance 的默认值 (如果需要)。有关这些设置的更多信息,请参阅 堆栈集操作选项

  6. 审核页面上,检查所选的内容,然后选中相应的复选框以确认所需的 IAM 功能。选择提交

  7. 如果您的堆栈未成功更新,请在解决任何阻止堆栈创建的基本问题后重复此过程。

堆栈实例删除操作失败

问题:堆栈删除操作失败。

原因:对于任何已启用终止保护的堆栈,堆栈删除操作将失败。

解决方案:确定该堆栈是否已启用终止保护。如果已启用,则禁用终止保护,然后再重新执行堆栈实例删除操作。

堆栈导入操作失败

问题:堆栈导入操作无法将现有堆栈导入新的或现有的堆栈集。堆栈实例处于 INOPERABLE 状态。

解决方案:通过完成以下任务恢复堆栈导入操作。

  1. 使用从 StackSets 删除堆栈选项,并在配置过程中启用 RetainStacks,然后继续从堆栈集中删除堆栈实例。有关更多信息,请参阅 使用 CloudFormation 控制台或 AWS CLI 删除堆栈实例

  2. 您将看到 Stacksets 的堆栈实例已更新,以删除 INOPERABLE 堆栈实例。

  3. 根据导入失败错误修复堆栈实例,然后重试堆栈导入操作。

StackSets 操作的堆栈实例失败计数

如果堆栈实例无法预置或更新,堆栈实例失败计数会发出警报。由于以下一个或多个原因,这些堆栈实例未部署:

  • 现有资源具有类似配置

  • 缺少依赖项,例如 AWS Identity and Access Management(IAM)角色

  • 其他冲突因素

如果您想以最大并发进行部署,则最大并发计数最多比容错计数多一。例如,如果容错计数为 9,则最大并发计数不能超过 10。即使某些堆栈实例无法更新,这也会导致操作返回 SUCCEEDED。新的堆栈实例失败计数让您能够确定,操作是否仅在符合条件的情况下成功,因为容错计数设置为允许所有失败。

您可以使用 AWS Management Console、AWS SDK 或 AWS CLI 获取失败计数并筛选堆栈实例,以确定需要重新部署哪些实例。

使用控制台

若要查看失败堆栈实例的数量,请执行以下操作:
  1. 打开 AWS CloudFormation 控制台并选择 StackSets

  2. 选择您的 StackSet,然后选择 Operations(操作)选项卡。

  3. Status(状态)列中选择状态以查看状态详细信息。您将在状态详细信息中找到特定操作的失败堆栈实例的数量。

若要查看操作的堆栈实例的账户、区域和状态,请执行以下操作:
  1. 在状态详细信息中,选择失败的堆栈实例计数。示例:Stack instances: <number of failed stack instances>(堆栈实例:)。

  2. 通过选择面板标头来展开侧面板。侧面板中的结果是所选操作完成后堆栈实例的状态。

若要查看操作的当前堆栈实例详细信息,请执行以下操作:
  1. 选择 Stack Instances(堆栈实例)选项卡。

  2. Last operation ID(上次操作 ID)筛选。结果为上次修改实例的操作的当前状态和状态原因。您可以将此筛选条件与 AWS 账户AWS 区域详细状态偏差状态结合使用,以进一步优化搜索结果。

使用 AWS CLI

若要获取失败的堆栈实例数量,请调用 describe-stack-set-operationlist-stack-set-operations 并参阅 StatusDetails

$ aws cloudformation describe-stack-set-operation --stack-set-name ss1 \ --operation-id 5550e62f-c822-4331-88fa-21c1d7bafc60
{ "StackSetOperation": { "OperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60", "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Action": "CREATE", "Status": "SUCCEEDED", "OperationPreferences": { "RegionOrder": [], "FailureToleranceCount": 10, "MaxConcurrentCount": 10 }, "AdministrationRoleARN": "arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole", "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole", "CreationTimestamp": "2022-10-26T17:18:53.947000+00:00", "EndTimestamp": "2022-10-26T17:19:35.304000+00:00", "StatusDetails": { "FailedStackInstancesCount": 3 } } }
aws cloudformation list-stack-set-operations --stack-set-name ss1
{ "Summaries": [ { "OperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60", "Action": "CREATE", "Status": "SUCCEEDED", "CreationTimestamp": "2022-10-26T17:18:53.947000+00:00", "EndTimestamp": "2022-10-26T17:19:35.304000+00:00", "StatusDetails": { "FailedStackInstancesCount": 3 }, "OperationPreferences": { "RegionOrder": [], "FailureToleranceCount": 10, "MaxConcurrentCount": 10 } } ] }

若要获取特定操作的历史概述,请使用 list-stack-set-operation-results 查看操作完成后每个堆栈实例的状态和状态原因。参阅以下实例以找到 StatusStatusReason

aws cloudformation list-stack-set-operation-results --stack-set-name ss1 --operation-id 5550e62f-c822-4331-88fa-21c1d7bafc60 --filters Name=OPERATION_RESULT_STATUS,Values=FAILED
{ "Summaries": [ { "Account": "123456789012", "Region": "us-west-2", "Status": "FAILED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "AccountGateResult": { "Status": "SKIPPED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'." }, "OrganizationalUnitId": "" }, { "Account": "123456789012", "Region": "us-west-1", "Status": "FAILED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "AccountGateResult": { "Status": "SKIPPED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'." }, "OrganizationalUnitId": "" }, { "Account": "123456789012", "Region": "us-east-1", "Status": "FAILED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "AccountGateResult": { "Status": "SKIPPED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'." }, "OrganizationalUnitId": "" } ] }

list-stack-instancesDETAILED_STATUS 以及 LAST_OPERATION_ID 筛选条件一起使用,以获取在上次尝试部署堆栈实例的操作中失败的堆栈实例列表。请参阅示例中带有 DETAILED_STATUSLAST_OPERATION_ID--filters 标志:

aws cloudformation list-stack-instances --stack-set-name ss1 --filters Name=DETAILED_STATUS,Values=FAILED Name=LAST_OPERATION_ID,Values=5550e62f-c822-4331-88fa-21c1d7bafc60
{ "Summaries": [ { "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Region": "us-east-1", "Account": "123456789012", "Status": "OUTDATED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "StackInstanceStatus": { "DetailedStatus": "FAILED" }, "OrganizationalUnitId": "", "DriftStatus": "NOT_CHECKED", "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60" }, { "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Region": "us-west-1", "Account": "123456789012", "Status": "OUTDATED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "StackInstanceStatus": { "DetailedStatus": "FAILED" }, "OrganizationalUnitId": "", "DriftStatus": "NOT_CHECKED", "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60" }, { "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Region": "us-west-2", "Account": "123456789012", "Status": "OUTDATED", "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "StackInstanceStatus": { "DetailedStatus": "FAILED" }, "OrganizationalUnitId": "", "DriftStatus": "NOT_CHECKED", "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60" } ] }

要查找上一个操作 ID 来修改堆栈实例,请使用 list-stack-instancesdescribe-stack-instance 来获取 LastOperationId

aws cloudformation describe-stack-instance --stack-set-name ss1 --stack-instance-account 123456789012 --stack-instance-region us-east-2
{ "StackInstance": { "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f", "Region": "us-west-2", "Account": "123456789012", "ParameterOverrides": [], "Status": "OUTDATED", "StackInstanceStatus": { "DetailedStatus": "FAILED" }, "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.", "OrganizationalUnitId": "", "DriftStatus": "NOT_CHECKED", "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60" } }