无法删除 cfn 堆栈,角色无效或无法代入

Posted

技术标签:

【中文标题】无法删除 cfn 堆栈,角色无效或无法代入【英文标题】:Unable to delete cfn stack, role is invalid or cannot be assumed 【发布时间】:2018-07-20 10:27:45 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

请务必使用具有足够权限的其他角色。

【讨论】:

如果可以的话,我会投票两次。每次都帮助我。 这有助于我创建与已删除角色同名的角色。 这对我帮助很大。我试图删除一个嵌套堆栈,但即使在创建新角色之后也不断收到role is invalid or cannot be assumed。我创建了一个具有足够权限的 cloudformation-admin 角色来删除堆栈中的项目,并且此命令有效。谢谢。 优秀。谢谢你。 “官方”方法(@​​987654321@)对我不起作用。太老套了......很难相信他们记录了它而不是想出一种在控制台中执行此操作的方法。 现在知识中心有一篇稍微清晰一点的文章aws.amazon.com/premiumsupport/knowledge-center/…【参考方案2】:

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

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

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

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

【讨论】:

非常感谢,黑客对我有用!以下其他建议的解决方案不太奏效,但感谢大家帮助我! 谢谢,这不是破解,而是一个很好的解决方案。正如您所提到的,这很可能是因为删除堆栈所需的 IAM 角色已被意外删除【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

很遗憾,没有办法强制删除 CF 堆栈。

你可以尝试的几件事:

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

【讨论】:

【参考方案5】:

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

选项 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:
            - "*" 

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

【讨论】:

【参考方案6】:

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

    创建具有正确权限的角色 选择要删除的堆栈并创建更改集 在更改集中,使用现有模板,浏览向导,但更改它使用的 IAM 角色 然后创建并执行更改集。

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于无法删除 cfn 堆栈,角色无效或无法代入的主要内容,如果未能解决你的问题,请参考以下文章

删除文件或文件夹出错:无法删除Chess:指定的文件名无效或太长。请指定另以文件名

指定的文件名无效或太长,请指定另一个文件名

.gitignore不起作用/无效,.idea文件夹无法删除

为啥密码错误会导致“填充无效,无法删除”?

.gitignore不起作用/无效,.idea文件夹无法删除

Discord.JS 能够添加角色但无法删除角色?