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::GrantAssumeRole,Hologres通过该策略判断当前用户是否具备创建对应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(推荐)
- 以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***********';
- 创建完成后,该外部Database仅实例Superuser和DB Owner可访问,其他账号无法访问,接下来通过在RAM控制台创建RAMRole和Hologres侧CREATE USER MAPPING来给一个RAM用户(子账号)授权。 - RAM侧新建角色并完成策略配置。 - 登录RAM控制台,单击角色>创建角色,可信实体类型选择阿里云服务,角色类型选择普通服务角色,输入角色名称,选择受信服务为交互式分析,单击完成。 
- 进入权限策略页面,单击创建权限策略>脚本编辑,分别创建用于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" } ] }
- 进入角色页面,单击新增授权,添加上述两个权限策略。  
 
- 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' );
 
- 使用子账号登录Hologres控制台,使用SQL编辑器进行查询。 - SELECT * FROM ext_db_dlf.dlf_db.paimon_table;
Foreign Server
以MaxCompute数据源为例,给一个Hologres BASIC账号授予访问MC外部表的权限。
- 在Hologres中创建BASIC账号。 - CREATE USER basicuser;
- 给BASIC账号授予 - odps_server的访问权限。- CREATE USER MAPPING FOR "basicuser" SERVER odps_server OPTIONS ( access_id 'LTxxxxxxxxxx', access_key 'y8xxxxxxxxxxxxx' );