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' );