如何解决更新或删除 AWS CloudFormation 堆栈时遇到的 “Role <ROLE_ARN> is invalid or cannot be assumed”(角色 <ROLE_ARN> 无效或无法代入”错误?
上次更新时间:2020 年 10 月 15 日
我想解决创建、更新或删除 AWS CloudFormation 堆栈时遇到的 “Role <ROLE_ARN> is invalid or cannot be assumed”(角色 <ROLE_ARN> 无效或无法担任该角色”错误。
简短描述
当 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": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
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-stack、my-stack-template.json 和 123456789123 替换为您的值。
2. 要删除堆栈,请运行以下命令:
aws cloudformation delete-stack --stack-name my-stack --role-arn arn:aws:iam::123456789123:role/cloudformation-role
注意:将 my-stack 和 123456789123 替换为您的值。