无法删除 cfn 堆栈,角色无效或无法承担

Unable to delete cfn stack, role is invalid or cannot be assumed

我是 aws cloudformation 的新手;我想知道是否有人知道在堆栈不会删除时强制删除堆栈的方法。它失败并出现此错误:

Failed to delete stack: Role arn:aws:iam::role/CloudFormationRole-NestedCFN-CodePipeline is invalid or cannot be assumed

当我尝试删除嵌套的子堆栈而不是先删除父堆栈时,通常会发生此错误。如果我不小心删除了父堆栈,有没有办法删除嵌套堆栈?

遗憾的是,无法强制删除 CF 堆栈。

您可以尝试的几件事:

  1. 手动删除冲突资源,然后重新启动堆栈 删除。
  2. 删除CF模板中的冲突资源 用它更新堆栈。

这个问题我遇到过几次。解决方案有点麻烦。在您的情况下,您需要创建一个名为 CloudFormationRole-NestedCFN-CodePipeline 的新角色。当您创建此角色时,您可能需要 select CloudFormation 服务,当它要求您 选择将使用此角色的服务 然后 附加权限策略。创建角色后,再次尝试删除堆栈。
其中一些是猜谜游戏,因为您需要选择 "trusted entity" 的正确资源(即 AWS 服务)。根据您的角色名称,它可以是 CloudFormation 或 CodePipeline。

删除CloudFormation堆栈后,您可以删除刚刚创建的IAM角色。

您收到此错误的原因是您可能删除了一个 CloudFormation 堆栈,该堆栈具有您尝试删除的堆栈正在使用的 IAM 角色。

我希望 AWS 有一个更优雅的解决方案,但这是我的解决方法。

我遇到了同样的问题,删除堆栈的唯一方法是使用 AWS CLI 并执行以下命令:

aws cloudformation delete-stack --role-arn arn:aws:iam::xxxx:role/anyrolewithpermissions --stack-name StuckStack

请确保使用具有足够权限的另一个角色。

在我的例子中,我删除了创建堆栈的管道,这删除了堆栈使用的角色。

选项 1) 从管道堆栈中启用另一个管道,然后 "update" 您无法删除的堆栈,但告诉它使用管道创建的新角色。然后删除堆栈(即使更新失败,新的作用还在,可以删除)。

选项 2) 创建一个与您删除的角色相匹配的角色(在我的例子中如下),然后使用该角色更新堆栈,然后删除。

CloudformationServiceRole:
  Type: AWS::IAM::Role
  Properties:
    AssumeRolePolicyDocument:
      Statement:
      - Action:
        - sts:AssumeRole
        Effect: Allow
        Principal:
          Service:
          - cloudformation.amazonaws.com
      Version: '2012-10-17'
    Path: "/"
    Policies:
      - PolicyName: DeployCloudformationStack
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
          - Resource: "*"
            Effect: Allow
            Action:
            - "*" 

之后可能还有其他维修工作要做!

解决此问题的更简单方法是使用更改集。可以按照以下步骤进行

  1. 创建具有正确权限的角色
  2. Select 您希望删除和创建更改集的堆栈
  3. 在更改集中,使用现有模板,通过向导导航但更改它使用的 IAM 角色
  4. 然后创建并执行变更集。

然后你可以相应地删除堆栈

这通常发生在嵌套堆栈的情况下。只需创建一个具有相同名称的角色并授予完全管理员访问权限 role.With 此权限角色将能够删除堆栈。删除栈成功后删除角色

这通常发生在需要删除堆栈的角色被意外删除时。您可能会收到错误消息

Role arn:aws:iam::<account>:role/<role name> is invalid or cannot be assumed

转到 IAM > roles > create role > 点击 cloudformation 获取服务 > 确保你给它正确的 permissions 以便cloudformation 可以删除堆栈。 (在我的例子中,我给了它管理员权限,因为我打算在删除堆栈后立即删除该角色 > Role name 在错误消息中使用相同的角色名称。

您现在应该可以删除堆栈了