文档首页/ 配置审计 Config/ 用户指南/ 资源记录器/ 基于组织批量配置资源记录器
更新时间:2024-10-28 GMT+08:00

基于组织批量配置资源记录器

操作场景

当前Config服务的相关功能均依赖于资源记录器收集的资源数据,不开启资源记录器将会影响其他功能的正常使用。

如果您是组织管理员,您可以基于Terraform模板和RFS资源栈集批量为组织成员账号开启并配置资源记录器,而无需登录每个账号进行操作。在组织成员账号较多且均需使用Config服务的场景下,使用此功能将有助于您提升配置效率,减少复杂繁琐的操作。

本章节提供基于组织批量开启并配置资源记录器的操作流程和配置示例,帮助您快速了解和使用该功能。

操作流程

操作流程

说明

步骤一:启用RFS可信服务

在Organizations可信服务列表中启用“资源编排资源栈集服务(RF)”为可信服务。

步骤二:配置OBS桶策略

为OBS桶设置桶策略,授权组织内成员账号的资源记录器可将转储文件存放至此OBS桶。

步骤三:配置SMN主题策略

为SMN主题设置主题访问策略,授权组织内成员账号的资源记录器可通过此主题发送消息。

步骤四:创建RFS资源栈集

使用Terraform模板创建RFS资源栈集,向组织成员账号部署资源栈实例,用于启用和配置资源记录器。

约束与限制

  • 当前单个RFS资源栈集最多仅支持开启100个组织成员账号的资源记录器。
  • 仅组织管理员可以创建资源栈集。
  • 创建资源栈集仅会在组织成员账号下部署资源栈,不会在组织管理员账号下部署资源栈。
  • 当组织成员账号在资源栈集部署前已开启并配置了资源记录器,则通过资源栈集下发的配置不会覆盖成员账号当前的资源记录器配置。

步骤一:启用RFS可信服务

使用此功能前需先开启RFS可信服务,具体步骤如下:

  1. 以组织管理员账号登录管理控制台,进入“组织 Organizations”服务。
  2. 单击左侧导航栏的“可信服务”,进入“可信服务”页面。
  3. 在列表中单击“资源编排资源栈集服务(RF)”操作列的“启用”。
  4. 在弹出的确认框中单击“确定”,RFS可信服务启用成功。

    图1 启用可信服务

步骤二:配置OBS桶策略

当您配置的资源转储OBS桶的桶策略为“公共读写”时,表示任何用户都可以对该OBS桶内对象进行读/写/删除操作,则无需执行此步骤。

开启资源记录器时需配置资源转储OBS桶,用于存储资源变更消息及资源快照。如无OBS桶,则需先创建桶

在当前场景下,您需要为OBS桶设置桶策略,授权组织内成员账号的资源记录器可将转储文件存放至此OBS桶的指定路径内,具体请参见如下步骤:

  1. 用授权账号登录管理控制台,进入OBS管理控制台。

    授权账号指OBS桶所属的账号。

  2. 参考自定义创建桶策略(JSON视图)对待授权账号授予相关OBS桶的权限。

    桶策略的示例如下,配置该桶策略,将允许被授权组织成员账号的资源记录器将转储文件存放至本OBS桶的指定路径内,以下参数需要您根据实际使用场景手动替换:

    • ${account_id}:需要被授权的组织成员账号的账号ID(domain_id),多个账号ID之间以英文逗号分隔;
    • ${agency_name}:被授权的自定义委托的名称。如何创建委托详见委托其他云服务管理资源,授权对象为云服务Config;
    • ${bucket_name}:用于存储文件的OBS桶的桶名;
    • ${folder_name}:用于存储文件的OBS桶内文件夹的名称。如果您未设置OBS桶内文件夹,则需删除“/${folder_name}”。
    {
      "Statement": [
        {
          "Sid": "org-bucket-policy",
          "Effect": "Allow",
          "Principal": {
            "ID": [
              "domain/${account_id}:agency/${agency_name}"
            ]
          },
          "Action": [
            "PutObject"
          ],
          "Resource": [
            "${bucket_name}/${folder_name}/RMSLogs/*/Snapshot/*",
            "${bucket_name}/${folder_name}/RMSLogs/*/Notification/*"
          ]
        }
      ]
    }

    如果需要将资源变更消息和资源快照存储到“使用KMS方式加密的OBS桶”中时,还需参见资源变更消息和资源快照转储至OBS加密桶设置密钥的跨账号权限,其中待授权账号需输入组织成员账号的账号ID(domain_id)。

步骤三:配置SMN主题策略

开启资源记录器时需配置SMN主题,当资源发生变更时,消息通知会推送消息到您所配置的SMN主题。如无SMN主题,则需先创建主题。创建SMN主题后,还需执行“添加订阅”和“请求订阅”操作,消息通知才会生效。

在当前场景下,您需要为SMN主题设置主题访问策略,授权组织内成员账号的资源记录器可通过此主题发送消息,具体请参见如下步骤:

  1. 用授权账号登录管理控制台,进入对应区域的SMN服务控制台。

    授权账号指SMN主题所属的账号。

  2. 参考设置主题策略对待授权账号授予相关SMN主题的权限。

    其中“可发布消息的用户”选择“仅如下用户”,并依次输入组织成员账号的ID。

    如未对某个成员账号进行授权,则该成员账号将无法通过此SMN主题接收资源变更消息通知。

步骤四:创建RFS资源栈集

  1. 以组织管理员账号登录管理控制台。
  2. 单击页面左上角的图标,在弹出的服务列表中,选择“管理与监管”下的“资源编排服务 RFS”。
  3. 单击左侧导航栏的“资源栈集”,进入“资源栈集”页面。
  4. 单击页面右上角的“创建资源栈集”。

    图2 创建资源栈集

  5. 进入“选择模板”页面,根据如下示例完成配置后,单击“下一步”。

    • 权限模型:选择“服务管理权限”。
    • 开启并行操作:选择“关闭”或“开启”均可。 推荐选择“开启”,将提高资源栈的运行速度。
    • 选择模板:根据需要选择任意模板来源。模板的内容请参见“Terraform模板内容”。
    图3 选择模板

  6. 进入“参数配置”页面,根据如下示例完成配置后,单击“下一步”。

    图4 参数配置
    • 资源栈集名称:使用系统自动生成的名称或自定义,不可与已有资源栈集名称重复。
    • 配置参数
      • AllSupported:(必选,Bool类型)指定是否记录Config所有支持的资源类型,可选值为“true”和“false”。
      • ResourceTypes:(可选,列表类型)指定资源类型列表。当AllSupported设置为“false”时,此处需输入具体的资源类型,例如["vpc.vpcs", "rds.instances"]。
      • BucketName:(必选,字符串类型)指定用于资源转储的OBS桶的名称。
      • BucketRegion:(必选,字符串类型)指定该OBS桶所在的区域。
      • AccountRegion:(必选,字符串类型)指定账号所在的站点,输入cn-north-4表示组织内账号均属于中国站,输入ap-southeast-1表示组织内账号均属于国际站。
      • TopicUrn:(必选,字符串类型)指定用于发送消息通知的SMN主题URN。
      • TopicRegion:(必选,字符串类型)指定该SMN主题所在的区域。
      • ConfigAgencyName:(必选,字符串类型)指定自定义IAM委托的名称。此委托必须包含可以让资源记录器正常工作的权限(调用SMN发送通知的权限和OBS的写入权限)。

  7. 进入“部署设置”页面,根据如下示例完成配置后,单击“下一步”。

    图5 部署设置
    • 部署设置
      • 组织单元IDs:输入组织单元(OU)的ID。当指定根组织单元(Root)的ID时,表示资源栈集将部署于整个组织。
      • 筛选条件:根据需要筛选条件,用于筛选部署的账号。
      • 部署区域:选择资源栈集部署的区域。
    • 部署参数
      • 最大并发账户:建议选择“数字”类型,值设置为5。
      • 容错:建议选择“百分比”类型,值设置为100。
      • Region部署方式和并发模式根据界面提示按需选择。

  8. 进入“配置确认”界面,确认资源栈集配置无误后,单击“部署”。
  9. 在弹出的确认框中单击“确定”,资源栈集部署成功。

    资源栈集会向所选组织成员账号中均部署一个资源栈实例,部署完成后,组织成员账号的资源记录器将会被开启并基于Terraform模板内容进行配置。

    图6 部署资源栈集

    资源栈集创建并部署成功后,所部署的组织成员账号随时可以修改和关闭自身的资源记录器。您也可以随时更新资源栈集删除资源栈集,删除资源栈集后,所部署成员账号的资源记录器均将被关闭。

Terraform模板内容

Terraform模板示例如下,您可以使用此模板的内容创建RFS私有模板,或在本地保存为tf格式的文件,用于在创建资源栈集时选择此模板:

terraform {
  required_providers {
    huaweicloud = {
      source  = "huawei.com/provider/huaweicloud"
      version = ">=1.49.0"
    }
  }
}

provider "huaweicloud" {
}

variable "AllSupported" {
  description = "Specifies whether to select all supported resources."
  type        = bool
  default     = true

  validation {
    condition     = can(regex("^(true|false)$", var.AllSupported))
    error_message = "Must be true or false."
  }
}

variable "ResourceTypes" {
  description = "Specifies the resource type list. "
  type        = list(string)
  default     = []
}

variable "BucketName" {
  description = "Specifies the OBS bucket name used for data dumping."
  type        = string
}

variable "BucketRegion" {
  description = "Specifies the region where this bucket is located."
  type        = string
}

variable "TopicRegion" {
  description = "Specifies the region where the smn topic is located."
  type        = string
}

variable "AccountRegion" {
  description = "Specifies the region where the account is located."
  type        = string
}


variable "TopicUrn" {
  description = "Specifies the SMN topic URN used to send notifications."
  type        = string
}

variable "ConfigAgencyName" {
  description = "Specifies the IAM agency name which must include permissions for sending notifications through SMN and for writing data into OBS."
  type        = string
}

data "huaweicloud_identity_projects" "CurrentAccountProject" {
  name = var.AccountRegion
}

resource "huaweicloud_identity_agency" "identity_agency" {
  name                   = var.ConfigAgencyName
  delegated_service_name = "op_svc_eps"
  all_resources_roles = ["SMN Administrator", "OBS Administrator", "KMS Administrator"]
}

resource "huaweicloud_rms_resource_recorder" "ConfigRecorder" {
  agency_name = var.ConfigAgencyName

  selector {
    all_supported  = var.AllSupported
    resource_types = var.ResourceTypes
  }

  obs_channel {
    bucket = var.BucketName
    region = var.BucketRegion
  }

  smn_channel {
    region = var.TopicRegion
    topic_urn = var.TopicUrn
    project_id = data.huaweicloud_identity_projects.CurrentAccountProject.projects[0].id
  }
  depends_on = [huaweicloud_identity_agency.identity_agency]
}