如何解决更新或删除 AWS CloudFormation 堆栈时遇到的“Role is invalid or cannot be assumed”(角色 无效或无法代入)错误?

上次更新日期:2021 年 2 月 11 日

我想解决创建、更新或删除 AWS CloudFormation 堆栈时遇到的 “Role is invalid or cannot be assumed”(角色 无效或无法担任该角色”错误。

简短描述

当 AWS CloudFormation 用来代表您调用堆栈中的资源的 AWS Identity and Access Management (IAM) 服务角色出现问题时,您将会收到此错误。

当您尝试以下操作时,可能会收到此错误:

使用 AWS 命令行界面 (AWS CLI) 或 API 调用创建堆栈。 当 AWS CloudFormation 创建更改集时更新堆栈。 删除堆栈。 更新或删除 IAM 角色。如果您修改了更新后的 IAM 角色的信任策略,则 AWS CloudFormation 无法代入该角色。

如果信任策略已修改,则您可以通过允许 AWS CloudFormation 代入 IAM 角色来解决此错误。如果已删除信任策略,则可以通过创建与错误消息中提到的角色同名的角色来解决此错误。最后,从 AWS CLI 中使用 --role-arn 参数覆盖当前使用的角色。

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。

解决方法 确认 IAM 角色存在,如果该角色不存在则创建新 IAM 角色

1.打开 IAM 控制台。

2.在导航窗格中,选择角色

3.在 Role name(角色名称)列中,选择在您收到的错误消息中提到的 IAM 角色。

4.如果角色存在,请完成确认角色信任策略允许 AWS CloudFormation 代入 IAM 角色部分中的步骤。

5.如果角色不存在,请使用与错误中提到的角色相同的名称创建新 IAM 角色。

6.确认新 IAM 角色具有 AWS CloudFormation 对堆栈中的资源执行创建、更新或删除操作必需的所有权限。

7.创建了角色之后,再次创建、更新或删除堆栈。

注意:如果新角色没有所需的 IAM 权限,则堆栈操作可能会失败。例如,如果您尝试删除 IAM 角色对其没有 ec2:TerminateInstances 操作权限的 Amazon Elastic Compute Cloud (Amazon EC2) 实例资源,则删除操作将会失败。

确认角色信任策略允许 AWS CloudFormation 代入 IAM 角色

1.打开 IAM 控制台。

2.在导航窗格中,选择角色

3.在 Role name(角色名称)列中,选择在您收到的错误消息中提到的 IAM 角色。

4.选择信任关系选项卡。

5.确认信任关系是否将 cloudformation.amazonaws.com 显示为受信任实体。

如果 cloudformation.amazonaws.com 未列为受信任实体,请选择 Edit trust relationship(编辑信任关系)。

6.在 Policy Document(策略文档)编辑器中,输入以下 AWS CloudFormation 服务角色信任策略:

{
  "Version": "2012-10-17",
  "Statement": 
}

7.选择 Update Trust Policy(更新信任策略)。

现在,更新后的信任策略允许 AWS CloudFormation 代入 IAM 角色。

8.创建了角色之后,再次创建、更新或删除堆栈。

覆盖 AWS CloudFormation 使用的当前 IAM 角色

您可以使用 AWS CLI 覆盖 AWS CloudFormation 使用的当前 IAM 角色。

1.要更新堆栈,请运行以下命令:

aws cloudformation update-stack --stack-name my-stack --template-body file://my-stack-template.json --role-arn arn:aws:iam::123456789123:role/cloudformation-role

注意:my-stackmy-stack-template.json123456789123 替换为您的值。

2.要删除堆栈,请运行以下命令:

aws cloudformation delete-stack --stack-name my-stack --role-arn arn:aws:iam::123456789123:role/cloudformation-role

注意:my-stack123456789123 替换为您的值。