數據湖(Data Lake)是時下大數據行業熱門的概念:https://en.wikipedia.org/wiki/Data_lake。基於數據湖作分析,能夠不用作任何ETL、數據搬遷等前置過程,實現跨各類異構數據源進行大數據關聯分析,從而極大的節省成本和提高用戶體驗。html
阿里雲數據湖分析產品Data Lake Analytics(簡稱DLA):https://www.aliyun.com/product/datalakeanalytics
產品文檔:https://help.aliyun.com/product/70174.htmlmysql
下圖是DLA的簡易架構(__MPP計算引擎+存儲計算分離+彈性高可用+異構數據集源等)__:sql
目前DLA是以MySQL協議方式對外提供服務,用戶須要經過JDBC鏈接,連到DLA服務。DLA內部的帳號和密碼是獨立自建的(與RAM不一樣),對應的帳號和密碼信息,在用戶開通DLA服務時以站內信、郵件、短信等方式通知您。數據庫
可能您會疑惑,爲何DLA不是以RAM或AK帳號作認證和受權,而須要自建帳號。在這裏,作一些簡單的介紹:後端
目前DLA帳號體系與RAM帳號體系的關係:安全
找到服務:架構
購買:測試
開通完成,點擊進入控制檯:大數據
爲不一樣的Region初始化服務:ui
初始化完成,獲得一個Root帳號:
從新回到主頁:https://openanalytics.console.aliyun.com/overview,設置服務訪問點:
配置服務訪問點
鏈接DLA服務,並進入服務
##鏈接DLA服務,帳號和密碼都在您的收件箱內,服務訪問點則在服務頁面 [root]# mysql -u<您的dla用戶名> -p<您的dla密碼> -h<您的dla服務訪問點> -P10000 ## 進入DLA服務,開始測試之旅 mysql> show databases; Empty set (0.09 sec)
到此,咱們已經完成了服務開經過程,並認證和鏈接成功。
鏈接DLA服務,並進入服務,也能正常工做了:
DLA中有兩層權限驗證機制,確保您的數據被安全訪問:
DLA是根據用戶操做對象的範圍「從大到小」驗證的,從Global級(全局權限),到Schema級,再到Table級,最後到Column級(目前不支持)一層層驗證權限。任何一層有權限校驗成功,到最後一層也沒權限時校驗失敗:
基本上參考了MySQL的Grant/Revoke/Show Grants語法來實現:
##grant相關 GRANT {SELECT | SHOW | ALTER | DROP | CREATE | INSERT | UPDATE | DELETE | GRANT OPTION | ALL | ALL PRIVILEGES | USAGE } ON {* | *.* | xxDb.* | xxDb.yyTable | yyTable } TO { oa_1234546 | 'oa_123456' | 'oa_123456'@'1.2.3.4'} [with grant option] ##revoke相關 REVOKE {SELECT | SHOW | ALTER | DROP | CREATE | INSERT | UPDATE | DELETE |GRANT OPTION | ALL | ALL PRIVILEGES | USAGE} ON {* | *.* | xxDb.* | xxDb.yyTable | yyTable } FROM { oa_1234546 | 'oa_123456' | 'oa_123456'@'1.2.3.4'} ##show grants相關 SHOW GRANTS [for [ current_user | current_user() | oa_123456 | 'oa_123456' | 'oa_123456'@'localhost'] ]
由於DLA中的子帳號與RAM中的子帳號並非一一對應,於是RAM中資源的權限和DLA中庫表的權限也不是天然映射的,而是須要在DLA中以特殊定義的方式來作資源的映射和權限的隔離。
目前DLA中受權單位是Schema級別的,也就意味着若是Root帳號給某個User帳號受權了一個庫的權限,那這個User帳號可以訪問這個庫下全部的表,也就意味着可以訪問該庫映射到RAM上全部的資源,這些訪問並不受RAM的子帳號權限控制。
好比,咱們看一個典型的建庫語句(假設用戶已經能夠在DLA中建立相關的庫):
CREATE DATABASE db_name with dbproperties ( CATALOG = 'ots', LOCATION = 'https://test-hangzhou.ots.aliyuncs.com', INSTANCE = 'test' )
若是Root帳號給某個User帳後執行Grant操做後,該User帳號就能夠訪問這個庫:
grant all on db_name.* to xxx_s1519122757;
上述過程都假設雲帳號的系統角色受權已經完成,下一節咱們介紹首先如何完成系統角色受權,從而容許DLA訪問你在其餘雲產品中的數據。
系統角色受權是指:用戶給DLA受權,容許DLA訪問用戶相關雲服務裏的數據,從而實現DLA關聯分析用戶數據的目標,或者經過DLA實現ETL,將數據迴流到用戶的庫。具體過程能夠參考:https://help.aliyun.com/document_detail/53478.html
DLA支持跨帳號,容許A用戶在DLA上,鏈接B用戶的OSS上的數據進行分析計算,不過這須要作一些操做,後續文檔會以圖形化的方式來介紹和引導用戶:
咱們來到OTS的首頁,https://ots.console.aliyun.com/index,建立但願DLA作分析的庫和表:
庫建完後,去建表
插入一行數據
關於訪問控制和角色受權等信息,請參考:https://help.aliyun.com/product/28625.html
回到DLA主頁:https://openanalytics.console.aliyun.com/overview
點擊贊成受權:
受權完成以後的狀態:
查看角色受權已經成功:
咱們從新回到DLA Root帳號(oa_xxx),經過JDBC協議鏈接到DLA(帳號信息、DLA訪問點、JDBC鏈接方式,請參考前面文檔)
╰─○ mysql -u<您的DLA Root帳號> -p<您的DLA Root帳號的密碼> -h<您的DLA-jdbc訪問點> -P10000 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 194631 Server version: 5.6.40-log Source distribution Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
開始建立庫,去關聯TableStore中的實例:
mysql> select user(); +----------------+ | user() | +----------------+ | oa_xxxxxxxxxxx | +----------------+ 1 row in set (0.08 sec) mysql> show databases; Empty set (0.02 sec) mysql> create database ots_account_test with dbproperties( catalog = 'ots', location = 'https://account-test.cn-shanghai.ots-internal.aliyuncs.com', instance = 'account-test' ) comment 'test account and privileges'; Query OK, 0 rows affected (0.10 sec) mysql> show databases; +------------------+ | Database | +------------------+ | ots_account_test | +------------------+ 1 row in set (0.01 sec) mysql> show create database ots_account_test; +------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Database | Create Database | +------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ots_account_test | CREATE DATABASE `ots_account_test` WITH DBPROPERTIES ( catalog = 'ots', location = 'https://account-test.cn-shanghai.ots-internal.aliyuncs.com', instance = 'account-test' ) COMMENT 'test account and privileges' | +------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.03 sec)
開始建立表,去關聯TableStore中的表,並查詢數據(結果與OTS中的結果一致):
mysql> use ots_account_test; Database changed mysql> show tables; Empty set (0.03 sec) mysql> create external table account_test ( -> pk1 int not null primary key, -> name varchar(20) -> ); Query OK, 0 rows affected (0.15 sec) mysql> show create table account_test; +--------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +--------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ | account_test | CREATE EXTERNAL TABLE `account_test` ( `pk1` int NOT NULL COMMENT '', `name` varchar(20) NULL COMMENT '', PRIMARY KEY (`pk1`) ) COMMENT '' | +--------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.04 sec) mysql> select * from account_test; +------+--------------+ | pk1 | name | +------+--------------+ | 123 | account-test | +------+--------------+ 1 row in set (1.61 sec)
至此,咱們已經成功完成了數據關聯並實現數據查詢的過程!!
上訴都是Root帳號在操做,從前面的分析可知,Root帳號是能夠操做對應雲帳號全部的雲資源的,可是DLA的User帳號卻不行,必須經過Root帳號給User帳號Grant權限,DLA才能容許某個User帳號訪問對應的庫和表:
切換到User帳號/子帳號鏈接頁面,此時看不到任何庫表:
mysql> select user(); +------------------------+ | user() | +------------------------+ | test_sxxxxxxxxxxxxxxxx | +------------------------+ 1 row in set (0.14 sec) mysql> show databases; Empty set (0.02 sec) mysql> show grants ; +------------------------------------------------+ | Grants for test_sxxxxxxxxxxxxxxxx | +------------------------------------------------+ | GRANT USAGE ON *.* TO 'test_sxxxxxxxxxxxxxxxx' | +------------------------------------------------+ 1 row in set (0.03 sec)
切換Root帳號鏈接頁面,咱們給前面的帳號受權:
mysql> select user(); +------------------------+ | user() | +------------------------+ | oa_xxxxxxxxxxx | +------------------------+ 1 row in set (0.14 sec) mysql> show grants for test_sxxxxxxxxxxxxxxxx; +---------------------------------------------------------------+ | Grants for test_sxxxxxxxxxxxxxxxx | +---------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test_sxxxxxxxxxxxxxxxx' | +---------------------------------------------------------------+ 1 rows in set (0.02 sec) mysql> grant all on ots_account_test.* to test_sxxxxxxxxxxxxxxxx; Query OK, 0 rows affected (0.05 sec) mysql> show grants for test_sxxxxxxxxxxxxxxxx; +---------------------------------------------------------------+ | Grants for test_sxxxxxxxxxxxxxxxx | +---------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test_sxxxxxxxxxxxxxxxx' | | GRANT ALL ON `ots_account_test`.* TO 'test_sxxxxxxxxxxxxxxxx' | +---------------------------------------------------------------+ 2 rows in set (0.03 sec)
切換User帳號鏈接頁面,從新查詢看看,已經有權限了,而且能夠讀取數據:
mysql> select user(); +------------------------+ | user() | +------------------------+ | test_sxxxxxxxxxxxxxxxx | +------------------------+ 1 row in set (0.14 sec) mysql> show grants ; +---------------------------------------------------------------+ | Grants for test_sxxxxxxxxxxxxxxxx | +---------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test_sxxxxxxxxxxxxxxxx' | | GRANT ALL ON `ots_account_test`.* TO 'test_sxxxxxxxxxxxxxxxx' | +---------------------------------------------------------------+ 2 rows in set (0.02 sec) mysql> show databases; +------------------+ | Database | +------------------+ | ots_account_test | +------------------+ 1 row in set (0.02 sec) mysql> select * from ots_account_test.account_test; +------+--------------+ | pk1 | name | +------+--------------+ | 123 | account-test | +------+--------------+ 1 row in set (0.43 sec)
至此,子帳號受權訪問就能夠了!
通常狀況,用戶大部分使用DLA的場景是,雲帳號A使用DLA訪問雲帳號A在其餘雲產品中的數據,從前面的分析能夠知道,只要用戶在DLA的console上選擇具體的數據源(好比TableStore)給DLA作系統角色受權以後,就能夠打通數據源,建立庫表和查詢數據了。
可是,還有一種場景是:雲帳號A使用DLA來訪問雲帳號B在其餘雲產品(如下以TableStore)中的數據,這須要專門的角色受權才能正常運行:
假設上述測試帳號對應的雲帳號爲A,下面就以TableStore和另外一個雲帳號B(DLA另外一個真實的測試雲帳號)做爲案例,演示B帳號給A帳號針對TableStore中某個instance作跨帳號受權,而且A在DLA中完成查詢的過程。
首先,須要到B帳號內,在"訪問控制(https://ram.console.aliyun.com)"中建立一個跨帳號受權的角色:
選擇一個「服務角色」,選擇一個合適的模板,快速建立:
從新回到角色管理頁面,找到這個角色作修改(修改爲支持DLA的模板):
跨帳號的角色建立和修改完成,開始作「角色受權策略」的配置,這裏咱們以TableStore爲例,其餘數據源相似:
跨帳號角色定義,以及角色受權都操做完成,咱們開始進入DLA的實際測試,首先查看雲帳號B的TableStore中的instance和table的狀況:
從新使用雲帳號A的DLA Root帳號,經過MySQL-cli鏈接到DLA,而後鏈接和訪問雲帳號B的數據:
mysql> select user(); +----------------+ | user() | +----------------+ | oa_xxxxxxxxxxx | +----------------+ 1 row in set (0.06 sec) mysql> show databases; +------------------+ | Database | +------------------+ | ots_account_test | +------------------+ 1 row in set (0.24 sec) mysql> create database ots_cross_account_test with dbproperties( catalog = 'ots', location = 'https://test-sh.cn-shanghai.ots-internal.aliyuncs.com', --雲帳號B的TableStore instance instance = 'test-sh', cross_account_accessing_arn= 'acs:ram::1013xxxxxx:role/test-cross-account-accessing-role' --雲帳號B爲雲帳號A@雲服務DLA的跨帳號角色受權時的Arn信息 ); Query OK, 0 rows affected (0.14 sec) mysql> show databases ; +------------------------+ | Database | +------------------------+ | ots_account_test | | ots_cross_account_test | +------------------------+ 2 rows in set (0.18 sec) mysql> show create database ots_cross_account_test; +------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Database | Create Database | +------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ots_cross_account_test | CREATE DATABASE `ots_cross_account_test` WITH DBPROPERTIES ( catalog = 'ots', location = 'https://test-sh.cn-shanghai.ots-internal.aliyuncs.com', instance = 'test-sh', cross_account_accessing_arn = 'acs:ram::1013xxxxxx:role/test-cross-account-accessing-role' ) COMMENT '' | +------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.19 sec) mysql> use ots_cross_account_test; Database changed mysql> show tables; Empty set (0.19 sec) mysql> create external table test_table1 ( id1 int not null primary key, col1 int ); Query OK, 0 rows affected (0.31 sec) mysql> show tables; +-------------+ | Table_Name | +-------------+ | test_table1 | +-------------+ 1 row in set (0.20 sec) mysql> show create table test_table1; +-------------+--------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------------+--------------------------------------------------------------------------------------------------------------------------------------+ | test_table1 | CREATE EXTERNAL TABLE `test_table1` ( `id1` int NOT NULL COMMENT '', `col1` int NULL COMMENT '', PRIMARY KEY (`id1`) ) COMMENT '' | +-------------+--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.20 sec) mysql> select * from test_table1; +--------+------+ | id1 | col1 | +--------+------+ | 0 | -111 | | 111111 | 111 | +--------+------+ 2 rows in set (1.29 sec)
順便提醒一下,普通的建庫流程中是不須要cross_account_accessing_arn
參數的,意味着默認是雲帳號本身給本身開通了DLA訪問雲服務的權限,而有了cross_account_accessing_arn
參數,就表示跨帳號服務的開啓,這個DLA中的庫以及庫下面的表,都有了跨帳號訪問的權限!!
到這裏,咱們跨帳號訪問的全過程就完成啦!!若是你但願鏈接OSS等雲服務,你也能夠按照上述流程操做一遍!!
本文爲雲棲社區原創內容,未經容許不得轉載。