本文介紹如何配置 RAM 使用者、RAM 角色及相關策略,並示範提交讀寫 OSS 資料的 Spark 作業。
概覽
AnalyticDB Spark 提供同帳號快速授權功能。但在嚴格管控許可權的企業環境中,需要自訂策略以實現細粒度授權,防止預設許可權放大。
本文將展示“提交Spark作業的許可權”與“應用運行時的資源存取權限”分離的最佳實務。RAM 使用者(子帳號)負責提交作業,而 Spark 應用使用獨立的 RAM 角色訪問 OSS 等雲資源。
配置 RAM 身份與策略
使用 RAM 管理員登入RAM控制台。
建立RAM使用者。(樣本使用者名稱:
adb-spark-ramuser-test)信任主體:選擇雲原生資料倉儲 AnalyticDB MySQL 版。
樣本角色名稱:
adb-spark-ramrole-test。
建立自訂權限原則
需要建立兩個策略:一個用於管理 AnalyticDB 叢集,一個用於控制應用訪問外部資源。
策略 A:AnalyticDB 系統管理權限
此策略允許 RAM 使用者管理 AnalyticDB Spark 應用,並擁有 PassRole 許可權。
進入,點擊建立權限原則。
選擇指令碼編輯。
輸入以下內容(將 ${AliyunAccount} 替換為你的阿里雲主帳號 ID)。
策略命名樣本為
adb-spark-ramuser-test-adbpolicy。
說明ram:PassRole的Resource對應的值請根據實際值進行替換。可通過,單擊具體角色名稱
adb-spark-ramrole-test,在基本資料中複製ARN。請記錄該 ARN,後續步驟將使用此值。
{ "Version": "1", "Statement": [ { "Action": [ "adb:Get*", "adb:List*", "adb:Kill*", "adb:Cancel*", "adb:Submit*", "adb:Allocate*", "adb:Describe*", "adb:Lock*", "adb:Copy*", "adb:Query*", "adb:Show*", "adb:Test*", "adb:Export*", "adb:Execute*", "adb:*Project", "adb:*Directory", "adb:*ProcessDefinition", "adb:*ProcessDefinitions", "adb:*ProcessDefinitionAttribute", "adb:*ProcessInstance", "adb:*ProcessInstances", "adb:*ProcessInstanceAttribute", "adb:*ProcessInstanceTasks", "adb:*TaskDefinition", "adb:*TaskDefinitions", "adb:*TaskDefinitionCode", "adb:*TaskDefinitionAttribute", "adb:*TaskInstance", "adb:*TaskInstances", "adb:*Notebook", "adb:*Notebooks", "adb:*NotebookKernel", "adb:*NotebookAttribute", "adb:*NotebookConfiguration", "adb:*NotebookParagraph", "adb:*NotebookParagraphs", "adb:*JupyterInstance", "adb:*JupyterInstances", "adb:*JupyterSpecifications", "adb:*JupyterInstanceAttribute", "adb:*Schedule", "adb:BindAccount", "adb:UnbindAccount", "adb:Authentication", "adb:Check*", "adb:Load*", "adb:Stat*", "adb:*SparkTemplate*", "adb:Download*" ], "Resource": "*", "Effect": "Allow" }, { "Action": "ram:ListUserBasicInfos", "Effect": "Allow", "Resource": "*" }, { "Action": "ram:PassRole", "Resource": "acs:ram::${AliyunAccount}:role/adb-spark-ramrole-test", "Effect": "Allow" } ] }策略 B:資料存取權限
此策略控制 Spark 應用運行時對 OSS 的訪問。
配置允許訪問的 Bucket 和 IP 網段。
策略命名樣本為
adb-spark-ramuser-test-datapolicy。
下列參數替換成實際值:
${bucket}:需要訪問的Bucket。${AliyunAccount}:阿里雲主賬戶ID。${IPv4 CIDR Block}:IP網段。(如192.168.1.0/24)
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:*", "Resource": [ "acs:oss:oss-*:${AliyunAccount}:${bucket-1}", "acs:oss:oss-*:${AliyunAccount}:${bucket-2}", "acs:oss:oss-*:${AliyunAccount}:${bucket-1}/*", "acs:oss:oss-*:${AliyunAccount}:${bucket-2}/*" ], "Condition": { "IpAddress": { "acs:SourceIp": [ "${IPv4 CIDR Block1}", "${IPv4 CIDR Block2}" ] } } } ] }授權RAM使用者
進入,選擇
adb-spark-ramuser-test。點擊。
添加策略
adb-spark-ramuser-test-adbpolicy。
授權RAM角色
進入,選擇
adb-spark-ramrole-test。點擊。
添加策略
adb-spark-ramuser-test-datapolicy。
配置AnalyticDB MySQL帳號
使用管理員登入AnalyticDB MySQL控制台。
單擊集群清單,進入目的地組群。
單擊,賬戶類型選擇普通賬號。
建立完成後,單擊RAM綁定管理,綁定 RAM 使用者
adb-spark-ramuser-test。點擊,根據需求授予許可權(例如:全域建立、查詢、變更許可權)。
RAM使用者提交作業
完成以上所有步驟後,RAM 使用者adb-spark-ramuser-test已具備策略 A定義的叢集系統管理權限。接下來的操作示範如何使用該 RAM 使用者提交作業,並通過指定 RAM 角色(具備策略 B)來安全地讀寫 OSS 資料。
使用RAM使用者
adb-spark-ramuser-test登入AnalyticDB MySQL控制台。單擊集群清單,進入目的地組群,然後單擊。
在編輯器上方,選擇Spark引擎和對應的資源群組。
編寫並提交作業。
必須在SQL中配置
spark.adb.roleArn參數,即上面配置策略中記錄的ARN值。說明雖然當前登入的 RAM 使用者擁有提交作業的許可權,但該使用者無權直接讀取 OSS。Spark 引擎將扮演參數中指定的 RAM 角色(
adb-spark-ramrole-test),利用該角色的許可權去訪問 OSS 資料。-- 配置 Spark 應用運行時使用的 RAM 角色 ARN -- 該角色已在“自訂權限原則 B”中獲得了 OSS 讀寫權限 set spark.adb.roleArn=acs:ram::${AliyunAccount}:role/adb-spark-ramrole-test; -- 建立指向 OSS 路徑的資料庫 -- 確保 bucket-1 在策略允許的資源清單中 create database if not exists test_db_01 location 'oss://bucket-1/path/to/test_db_01/'; -- 建立表 create table if not exists test_db_01.test_tbl_01(id int, name string); -- 寫入資料 (Spark 引擎將使用指定的 Role 寫入 OSS) insert into test_db_01.test_tbl_01 values(1, 'a'); -- 查詢資料 (Spark 引擎將使用指定的 Role 讀取 OSS) select * from test_db_01.test_tbl_01;SET配置中如需指定日誌路徑,請配置
spark.app.log.rootPath。更多參數請參考 Spark 應用配置參數說明。驗證結果
單擊執行SQL。作業成功運行即證明細粒度授權配置生效:RAM使用者成功提交了作業,且 Spark 應用成功通過扮演角色訪問了 OSS。