使用堆栈集部署 AWS CloudFormation 资源的 IAM 最佳实践有哪些?
我想了解使用堆栈集部署 AWS CloudFormation 资源的 AWS Identity and Access Management (IAM) 最佳实践。
解决方法
识别您收到的错误。然后,按照以下相关部分中的步骤来解决错误。
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
堆栈集中最常见的 IAM 权限错误
错误: “Account 111111111111 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.(账户 111111111111 的“AWSCloudFormationStackSetExecutionRole”角色应具有与角色“AWSCloudFormationStackSetAdministrationRole”的信任关系。)”
此错误通常发生在 IAM 角色 AWSCloudFormationStackSetExecutionRole 或 AWSCloudFormationStackSetAdministrationRole 缺失的情况下。当管理员和目标账户之间的信任关系未正确建立时,也会发生这种情况。
要解决此错误,请完成以下步骤:
-
验证您的管理员账户中是否存在 IAM 角色 AWSCloudFormationStackSetExecutionRole 和 AWSCloudFormationStackSetAdministrationRole。确保角色命名正确。例如,管理角色必须为 AWSCloudFormationStackSetExecutionRole。您的每个目标账户中的角色必须命名为 AWSCloudFormationStackSetExecutionRole。
**注意:**您还可以使用以下 AWS CloudFormation 模板设置堆栈集的基本 IAM 权限: -
如果 IAM 角色存在,请验证角色之间是否存在信任关系。
查看以下激活 IAM 角色之间基本信任关系的示例代码片段。
AWSCloudFormationStackSetAdministrationRole 信任关系:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudformation.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
AWSCloudFormationStackSetAdministrationRole 内联策略:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "sts:AssumeRole" ], "Resource": [ "arn:*:iam::*:role/AWSCloudFormationStackSetExecutionRole" ], "Effect": "Allow" } ] }
AWSCloudFormationStackSetExecutionRole 信任关系部分:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::admin_account_id:root" }, "Action": "sts:AssumeRole" } ] }
错误: “Resource handler returned message: "Account used is not a delegated administrator (Service: CloudFormation, Status Code: 400, Request ID: xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx)" (RequestToken:xxxxx-xxx-xxxxx, HandlerErrorCode: InvalidRequest)" when deploying StackSet using CloudFormation resource type "AWS::CloudFormation::StackSet"(当使用 CloudFormation 资源类型“AWS::CloudFormation::StackSet”部署 StackSet 时,资源处理程序返回消息:“使用的账户不是委派管理员(服务:CloudFormation,状态代码:400,请求 ID:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx)(RequestToken:xxxxx-xxx-xxxxx,HandlerErrorCode:InvalidRequest)”)
-or-
错误 (AWS CLI): “An error occurred (ValidationError) when calling the ListStackSets operation: Account used is not a delegated administrator(调用 ListStackSets 操作时出错 (ValidationError):使用的账户不是委派管理员)”
这些错误表明用于堆栈集部署的 AWS 账户未注册为委托管理员。或者,出错的原因是 IAM 角色没有所需的权限。您的组织一次最多可以有五名注册的委派管理员。委派管理员可以选择部署到组织中的所有账户或特定组织单位 (OU)。
要解决此错误,请完成以下步骤:
-
使用以下 AWS CLI 命令验证该账户是否已注册为委派管理员账户:
aws organizations list-delegated-administrators \ --service-principal=member.org.stacksets.cloudformation.amazonaws.com
-
如果该账户未注册为委派管理员,请将其注册。或者,使用以下 AWS CLI 命令注册委派管理员:
aws organizations register-delegated-administrator \ --service-principal=member.org.stacksets.cloudformation.amazonaws.com \ --account-id="memberAccountId"
**注意:**将 memberAccountId 替换为您的 AWS 账户 ID。
-
如果该账户是委派管理员,请验证您的 IAM 角色的以下 IAM 权限:
organizations:ListDelegatedAdministrators cloudformation:TagResource cloudformation:CreateStackSet
**注意:**委派管理员拥有部署到组织中账户的完全权限。管理账户无法限制委派管理员部署到特定 OU 或执行特定堆栈集操作的权限。
错误: “ResourceStatusReason:Invalid principal in policy: "AWS":"arn:aws:iam::111111111111:role/myDeploymentRole" (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument; Request ID: xxxxxx-xxxx-xxxx-xxxx-xxxxxx; Proxy: null)(策略中的 ResourceStatusReason:Invalid 主体:“AWS":"arn:aws:iam::111111111111:role/myDeploymentRole”(服务:AmazonIdentityManagement;状态代码:400;错误代码:MalformedPolicyDocument;请求 ID:xxxxxx-xxxx-xxxx-xxxx-xxxxxx;代理:null))”
此错误消息表明您的 IAM 信任策略中的 Principal 元素的值不正确。有关解决此错误的详细信息,请参阅如何解决 IAM 信任策略错误“Failed to update trust policy.Invalid principal in policy(更新信任策略失败。策略中的主体无效)”?
错误: “ResourceLogicalId:myDeploymentRole, ResourceType:AWS::IAM::Role, ResourceStatusReason:myDeploymentRole already exist(ResourceLogicalId:myDeploymentRole、ResourceType:AWS::IAM::Role、ResourceStatusReason:myDeploymentRole 已存在)”
错误: “ResourceLogicalId:myDeploymentRolePolicy, ResourceType:AWS::IAM::ManagedPolicy, ResourceStatusReason:myDeploymentRolePolicy already exist(ResourceLogicalId:myDeploymentRolePolicy、ResourceType:AWS::IAM::ManagedPolicy、ResourceStatusReason:myDeploymentRolePolicy 已存在)”
之所以发生这些错误,是因为 AWS IAM 是一项全球可用的服务,而不是区域服务。AWS 服务在 AWS 区域处理和存储区域服务的内容。由于 IAM 是一项全球服务,因此当您在一个区域创建 IAM 角色或策略时,可以在所有区域使用该角色或策略。
通过在 CloudFormation 堆栈集模板中定义条件来解决此错误,如下所列。当您指定区域条件时,堆栈仅在一个区域 (us-east-1) 中部署 IAM 资源。完成后,该操作成功更新了该区域中的所有堆栈账户。
以下 YAML 模板片段显示了如何仅将 IAM 资源部署到 us-east-1 区域:
AWSTemplateFormatVersion: "2010-09-09" Conditions: RoleCreate: !Equals - !Ref AWS::Region - us-east-1 Resources: myIAMRole: Type: 'AWS::IAM::Role' Condition: RoleCreate Properties: RoleName: 'TestingIAMRole2' AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - ec2.amazonaws.com Action: - 'sts:AssumeRole'
相关内容
- AWS 官方已更新 3 个月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 6 个月前