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

54

我是aws cloudformation的新手,想知道是否有办法强制删除无法删除的堆栈。它会出现以下错误:

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

当我尝试删除嵌套子堆栈而不是先删除父堆栈时,通常会出现此错误。如果我意外删除了父堆栈,是否有任何方法可以删除嵌套堆栈?

8个回答

86

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

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

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


11
如果我可以,我会点赞两次。每次都帮了我。 - Milan Cermak
1
这对我很有帮助,因为创建与已删除角色同名的角色并没有起作用。 - AHalbert
1
这对我帮助很大。我一直在尝试删除一个嵌套堆栈,但是即使创建了新角色,仍然收到“角色无效或无法承担”的错误提示。我创建了一个具有足够权限以删除堆栈中项目的cloudformation-admin角色,此命令成功工作了。谢谢。 - robscodebase
1
请确保将xxxx替换为您的帐户ID,将anyrolewithpermission替换为具有所需权限的有效角色。如果您不知道需要哪些权限,请创建一个具有管理员权限的新临时角色。 - Alireza
1
四年过去了,这仍然是最佳解决方案! - Luan Pham
显示剩余5条评论

68
我遇到过这个问题几次。解决方法有点折中。在您的情况下,您需要创建一个名为CloudFormationRole-NestedCFN-CodePipeline的新角色。在创建此角色时,您可能需要在它要求您“选择将使用此角色的服务”和“附加权限策略”时选择CloudFormation服务。一旦角色创建完成,请再次尝试删除堆栈。
其中一些内容是猜测游戏,因为您需要选择正确的资源(即AWS服务)作为“受信任实体”。根据您的角色名称,它可以是CloudFormation或CodePipeline。
在删除CloudFormation堆栈后,您可以删除刚刚创建的IAM角色。
您获得此错误的原因是因为您可能已经删除了一个具有IAM角色的CloudFormation堆栈,该角色正在被您正在尝试删除的堆栈使用。
我希望AWS有更优雅的解决方案,但这是我的解决方法。

4
非常感谢,这个技巧对我有用!下面提出的其他解决方案没有完全起作用,但感谢大家帮助我! - pelican
谢谢,这不是黑客攻击,而是一个好的解决方案。正如你所提到的,最有可能的原因是需要删除堆栈的IAM角色被意外删除了。 - Hom Bahrani

18

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

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

前往 IAM > 角色 > 创建角色 > 点击 云形成 服务 > 确保为其赋予正确的 权限,以便云形成可以删除栈。(在我的情况下,我给它了管理员权限,因为我计划在删除栈后立即删除该角色)> 对于角色名称,请使用错误消息中相同的角色名称。

现在您应该能够删除栈了。


1
“请确保您赋予正确的权限,以便CloudFormation可以删除堆栈。” ……删除堆栈所需的权限名称是什么?每页大约包含20个策略,总共有34页。 - Sebastian Nielsen

3
这通常发生在嵌套堆栈的情况下。只需创建一个与名称相同的角色,并授予该角色完全管理员访问权限即可。通过此权限,该角色将能够删除堆栈。成功删除堆栈后,请删除该角色。

这是唯一对我有效的解决方案。 - user1751825

0
解决这个问题的更简单的方法是使用变更集。可以按照以下步骤进行:
  1. 创建具有正确权限的角色
  2. 选择要删除的堆栈并创建变更集
  3. 在变更集中,使用现有模板,通过向导导航,但更改它使用的IAM角色
  4. 然后创建并执行变更集。

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


0

很遗憾,无法强制删除CF Stack。

你可以尝试以下方法:

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

0

对于那些可能错过了的人,我发现删除CDKToolkit堆栈并再次运行cdk boostrap可以解决这个问题。


0
在我的情况下,我删除了创建堆栈的管道,这也删除了堆栈使用的角色。
选项1)从管道堆栈中升级另一个管道,然后“更新”您无法删除的堆栈,但告诉它使用由管道创建的新角色。然后删除堆栈(即使更新失败,新角色仍在使用中,您可以删除)。
选项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:
            - "*" 

之后可能还要进行其他修复!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接