CREATE USER MAPPING

Hologres从V3.0版本开始,支持给实例内账号配置RAMRole的映射关系,登录账号通过扮演一个RAMRole来实现跨账号访问外部系统,当前仅支持使用RAMRole的方式访问DLF2.0数据源和其他Hologres实例。本文为您介绍CREATE USER MAPPING的用法及限制条件。

背景信息

User Mapping定义了Hologres登录用户和阿里云账号的映射关系,允许Hologres当前用户(包括BASIC用户)通过User Mapping的方式跨账号访问外部服务,如MaxCompute、DLF、OSS以及Hologres跨库查询。详情请参见PostgreSQL CREATE USER MAPPING

使用限制

  • 授予普通用户权限需要具备Hologres实例的SuperUser权限或Foreign Server的Owner权限,以及拥有Foreign Server Usage权限的用户也可以为自己创建User Mapping。

  • MaxCompute数据源和DLF1.0不支持以RAMRole方式配置User Mapping。

语法说明

External Database配置方式

MaxCompute数据源

  • 语法

    CREATE USER MAPPING FOR "<user_name>"
    EXTERNAL DATABASE <ext_db_name>
    OPTIONS
    (
        access_id '<Access_id>',
        access_key '<Access_key>'
    );
  • 参数说明

    参数名称

    描述

    user_name

    待授权的账号,比如其他RAM用户(子账号)、Hologres内部账号(BASIC账号)、public(面向所有用户公开访问,请谨慎操作)。

    Access_id

    当前访问账号的AccessKey ID,您可以单击RAM控制台,获取AccessKey ID。

    Access_key

    当前访问账号的AccessKey Secret。

DLF数据源

  • 语法

    CREATE USER MAPPING FOR "<user_name>"
    EXTERNAL DATABASE <ext_db_name>
    OPTIONS
    (
        -- For DLF1.0
        [dlf_access_id 'LTxxxxxxxxxx',
        dlf_access_key 'y8xxxxxxxxxxxxx',
        oss_access_id 'LTxxxxxxxxxx',
        oss_access_key 'y8xxxxxxxxxxxxx'] 
    
        -- For DLF2.0
        [dlf_access_id 'LTxxxxxxxxxx',
        dlf_access_key 'y8xxxxxxxxxxxxx'] | 
        [rolearn 'RoleARN']
    );
    说明

    当使用RoleARN方式配置User Mapping时,需要在RAM侧配置权限策略hologram::GrantAssumeRoleHologres通过该策略判断当前用户是否具备创建对应RoleARN的User Mapping的权限。具备该权限的用户,可以在Hologres中为任意用户创建到对应RoleARN的User Mapping示例如下:

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "hologram:GrantAssumeRole",
          "Resource": "<Role_ARN>"
        }
      ]
    }
  • 参数说明

    参数名称

    描述

    user_name

    待授权的账号,比如其他RAM用户(子账号)、Hologres内部账号(BASIC账号)、public(面向所有用户公开访问,请谨慎操作)。

    ext_db_name

    使用CREATE EXTERNAL DATABASE在Hologres实例中创建的外部数据库,用来加载外部数据源的元数据到Hologres,详情请参见CREATE EXTERNAL DATABASE

    access_id

    当前访问账号的AccessKey ID,您可以单击RAM控制台,获取AccessKey ID。

    access_key

    当前访问账号的AccessKey Secret。

    dlf_access_id

    拥有读写DLF权限的阿里云账号或RAM账号的AccessKey ID。

    dlf_access_key

    拥有读写DLF权限的阿里云账号或RAM账号的AccessKey Secret。

    oss_access_id

    拥有读写OSS权限的阿里云账号或RAM账号的AccessKey ID。

    oss_access_key

    拥有读写OSS权限的阿里云账号或RAM账号的AccessKey Secret。

    rolearn

    角色ARN是角色的全局资源描述符,用来指定具体的角色,格式为acs:ram::<account-id>:role/<role-name>。其中,<role-name>部分会将角色的名称全部转换为小写。关于如何查看角色ARN,详情请参见查看RAM角色

查询外部数据库已配置的USER MAPPING

SELECT
    datname,
    usename,
    eumoptions
FROM
    pg_holo_external_user_mappings;

Foreign Server配置方式

MaxCompute数据源

  • 语法

    CREATE USER MAPPING FOR "<user_name>"
    SERVER odps_server  -- 固定server
    OPTIONS
    (  
       access_id '<access_id>', 
       access_key '<access_key>'
    );
  • 参数说明

    参数名称

    描述

    user_name

    待授权的账号,比如其他RAM用户(子账号)、Hologres内部账号(BASIC账号)、public(面向所有用户公开访问,请谨慎操作)。

    access_id

    当前访问账号的AccessKey ID,您可以单击RAM控制台,获取AccessKey ID。

    access_key

    当前访问账号的AccessKey Secret。

DLF数据源

  • 语法

    CREATE USER MAPPING FOR "<user_name>"
    SERVER <server_name>
    OPTIONS
    (
        -- For DLF1.0
        [dlf_access_id 'LTxxxxxxxxxx',
        dlf_access_key 'y8xxxxxxxxxxxxx',
        oss_access_id 'LTxxxxxxxxxx',
        oss_access_key 'y8xxxxxxxxxxxxx'] 
    
        -- For DLF2.0
        [dlf_access_id 'LTxxxxxxxxxx',
        dlf_access_key 'y8xxxxxxxxxxxxx'] | 
        [rolearn 'RoleARN']
    );
  • 参数说明

    参数名称

    描述

    user_name

    待授权的账号,比如其他RAM用户(子账号)、Hologres内部账号(BASIC账号)、public(面向所有用户公开访问,请谨慎操作)。

    server_name

    Foriegn Server的名称,上一步骤自定义设置的名称,MaxCompute数据源是固定的内置server: odps_server。详情请参见创建Foreign Server

    access_id

    当前访问账号的AccessKey ID,您可以单击RAM控制台,获取AccessKey ID。

    access_key

    当前访问账号的AccessKey Secret。

    dlf_access_id

    拥有读写DLF权限的阿里云账号或RAM账号的Accesskey ID。

    dlf_access_key

    拥有读写DLF权限的阿里云账号或RAM账号的Accesskey Secret。

    oss_access_id

    拥有读写OSS权限的阿里云账号或RAM账号的Accesskey ID。

    oss_access_key

    拥有读写OSS权限的阿里云账号或RAM账号的Accesskey Secret。

    rolearn

    角色ARN是角色的全局资源描述符,用来指定具体的角色,格式为acs:ram::<account-id>:role/<role-name>。其中,<role-name>部分会将角色的名称全部转换为小写。关于如何查看角色ARN,请参见查看RAM角色

Hologres数据源

  • 语法

    CREATE USER MAPPING FOR "<user_name>"
    SERVER <server_name>
    OPTIONS (
      access_id '<access_id>', 
      access_key '<access_key>'
    );
  • 参数说明

    参数名称

    描述

    user_name

    待授权的账号,比如其他RAM用户(子账号)、Hologres内部账号(BASIC账号)、public(面向所有用户公开访问,请谨慎操作)。

    server_name

    Hologres实现跨库查询所创建的Server。详情请参见跨库查询(Beta)

    access_id

    当前访问账号的AccessKey ID,您可以单击RAM控制台,获取AccessKey ID。

    access_key

    当前访问账号的AccessKey Secret。

查询内部数据库已配置的USER MAPPING

SELECT
    um.srvname AS "Server",
    um.usename AS "User name"
FROM
    pg_catalog.pg_user_mappings um
WHERE
    um.srvname != 'query_log_store_server'
ORDER BY 1, 2;

使用示例

EXTERNAL DATABASE(推荐)

  1. 以DLF2.0数据源为例,首先创建一个External Database来关联DLF上的Paimon Catalog。

    CREATE EXTERNAL DATABASE ext_db_dlf
    WITH 
      metastore_type 'dlf-paimon' 
      catalog_type 'paimon' 
      dlf_region 'cn-hangzhou' 
      dlf_endpoint 'dlfnext-share.cn-hangzhou.aliyuncs.com' 
      dlf_catalog 'clg-paimon-d241aee***********'; 
  2. 创建完成后,该外部Database仅实例Superuser和DB Owner可访问,其他账号无法访问,接下来通过在RAM控制台创建RAMRole和Hologres侧CREATE USER MAPPING来给一个RAM用户(子账号)授权。

    1. RAM侧新建角色并完成策略配置。

      1. 登录RAM控制台,单击角色>创建角色,可信实体类型选择阿里云服务,角色类型选择普通服务角色,输入角色名称,选择受信服务交互式分析,单击完成

      2. 进入权限策略页面,单击创建权限策略>脚本编辑分别创建用于Hologres和DLF做权限检查的策略策略内容如下。

        Hologres需要的权限检查策略。

        {
            "Version": "1",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": "hologram:GrantAssumeRole",
                    "Resource": "acs:ram::xxx:role/testramrole"
                }
            ]
        }

        DLF需要的权限检查策略。

        {
            "Version": "1",
            "Statement": [
                {
                    "Action": "dlf:CheckPermissions",
                    "Resource": "*",
                    "Effect": "Allow"
                }
            ]
        }
      3. 进入角色页面,单击新增授权,添加上述两个权限策略。

        role2222

    2. Hologres侧通过CREATE USER MAPPING将ext_db_dlf数据库的权限授予RAM用户(子账号)。

      CREATE USER MAPPING FOR "p4_203535926287167253"
      EXTERNAL DATABASE ext_db_dlf
      OPTIONS
      (
          rolearn 'acs:ram::xxx:role/testramrole'
      );
  3. 使用子账号登录Hologres控制台,使用SQL编辑器进行查询。

    SELECT * FROM ext_db_dlf.dlf_db.paimon_table;

Foreign Server

以MaxCompute数据源为例,给一个Hologres BASIC账号授予访问MC外部表的权限。

  1. 在Hologres中创建BASIC账号。

    CREATE USER basicuser;
  2. 给BASIC账号授予odps_server的访问权限。

    CREATE USER MAPPING
    FOR "basicuser"
    SERVER odps_server
    OPTIONS
    (
        access_id 'LTxxxxxxxxxx',
        access_key 'y8xxxxxxxxxxxxx'
    );