使用堆栈集部署 AWS CloudFormation 资源的 IAM 最佳实践有哪些?

2 分钟阅读
0

我想了解使用堆栈集部署 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 角色 AWSCloudFormationStackSetExecutionRoleAWSCloudFormationStackSetAdministrationRole 缺失的情况下。当管理员和目标账户之间的信任关系未正确建立时,也会发生这种情况。

要解决此错误,请完成以下步骤:

  1. 验证您的管理员账户中是否存在 IAM 角色 AWSCloudFormationStackSetExecutionRoleAWSCloudFormationStackSetAdministrationRole。确保角色命名正确。例如,管理角色必须为 AWSCloudFormationStackSetExecutionRole。您的每个目标账户中的角色必须命名为 AWSCloudFormationStackSetExecutionRole
    **注意:**您还可以使用以下 AWS CloudFormation 模板设置堆栈集的基本 IAM 权限

  2. 如果 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)。

要解决此错误,请完成以下步骤:

  1. 使用以下 AWS CLI 命令验证该账户是否已注册为委派管理员账户:

    aws organizations list-delegated-administrators \
      --service-principal=member.org.stacksets.cloudformation.amazonaws.com
  2. 如果该账户未注册为委派管理员,请将其注册。或者,使用以下 AWS CLI 命令注册委派管理员:

    aws organizations register-delegated-administrator \
      --service-principal=member.org.stacksets.cloudformation.amazonaws.com \
      --account-id="memberAccountId"

    **注意:**将 memberAccountId 替换为您的 AWS 账户 ID。

  3. 如果该账户是委派管理员,请验证您的 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 官方
AWS 官方已更新 1 年前