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