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