MaxCompute投递任务(新版)运行时,需要将从Logstore中读取的数据投递到MaxCompute的表中,您可以授权MaxCompute投递任务(新版)扮演自定义RAM角色完成该操作。本文介绍在MaxCompute和日志服务Project不同账号时,如何对自定义RAM角色进行授权。
背景信息
日志服务和MaxCompute属于不同的阿里云账号,例如日志服务属于阿里云账号A,MaxCompute属于阿里云账号B。则需授予账号B下的RAM角色写入MaxCompute的权限。授权完成后,MaxCompute投递任务可以使用该RAM角色将Logstore中的数据写入到目标MaxCompute表中。
解决痛点:在跨账号投递时,由于权限问题,MaxCompute的表名和表字段映射不到该投递任务。
前提条件
日志服务所属账号A创建ODPS SQL的临时查询节点。具体操作,请参见创建临时查询节点。
使用阿里云账号B创建一个和日志服务同地域的MaxCompute项目。具体操作,请参见创建MaxCompute项目。
MaxCompute所属账号B将您的MaxCompute项目关联为DataWorks的MaxCompute数据源,并且和日志服务Project同一地域。更多信息,请参见创建MaxCompute数据源。
步骤一:创建自定义角色写数据到MaxCompute(MaxCompute所属账号B)
使用阿里云主账号B登录RAM控制台。
创建RAM角色,例如
MaxComputeShipRole
。具体操作,请参见创建可信实体为阿里云服务的RAM角色。重要创建RAM角色时,必须选择信任主题类型为云服务,且必须信任主题名称为日志服务。
请检查角色的信任策略如下,
Service
内容至少包含"log.aliyuncs.com"
。{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "log.aliyuncs.com" ] } } ], "Version": "1" }
修改RAM角色信任策略。具体操作,请参见修改RAM角色的信任策略。
将原有的信任策略替换为如下内容。
在
Service
配置项中添加{阿里云账号A的ID}@log.aliyuncs.com
和dataworks.aliyuncs.com
。其中{阿里云账号A的ID}
,需根据实际情况替换,您可以在账号中心查看阿里云账号ID。说明该策略表示账号A有权限通过日志服务获取临时Token来操作账号B中的资源。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "log.aliyuncs.com", "dataworks.aliyuncs.com", "{阿里云账号A的ID}@log.aliyuncs.com" ] } } ], "Version": "1" }
添加RAM角色为工作空间成员。
登录DataWorks控制台。
在页面左上角,选择地域。
在左侧导航栏中,单击工作空间。在工作空间列表页面,单击目标工作空间对应的管理。
在工作空间页面的空间成员页签下,单击添加成员。
在添加成员对话框中,选中当前登录账号和目标RAM角色,完成添加。
此处需在批量设置角色中选中开发。更多信息,请参见授权给其他用户。
授予RAM角色操作MaxCompute表的权限。
登录MaxCompute控制台,在左上角选择地域。
选择
,在项目管理页面,单击目标项目操作列的管理。在MaxCompute项目管理页面,单击角色权限。
如果出现如下报错,您需要在阿里云主账号下将当前登录的RAM账号添加至目标MaxCompute项目,先在角色列表中单击admin对应的成员管理,然后在成员管理对话框中,选中当前登录RAM账号,根据页面提示完成添加。
在角色列表中,单击role_project_admin角色对应的成员管理。
在成员管理对话框中,选中当前登录账号和目标RAM角色账号,如
MaxComputeShipRole
。完成添加。在角色列表中,单击role_project_admin角色对应的编辑角色。
在编辑角色对话框的Table页签下,选择目标MaxCompute表,选中Describe、Alter和Update。
重要上述授权只针对指定的MaxCompute表。如果您希望目标角色可以操作当前MaxCompute空间项目下所有的表,则您可以为当前登录账号和目标角色添加admin角色权限。即在角色列表中,单击admin角色对应的成员管理,然后在成员管理对话框中,选中当前登录账号和目标角色,完成添加。
步骤二:创建MaxCompute投递表(MaxCompute所属账号B)
步骤三:对日志服务所属账号A授权(MaxCompute所属账号B)
使用步骤二创建的临时查询节点执行以下命令,对日志服务所属阿里云账户A进行授权。
use {MaxCompute项目名称};
add USER ALIYUN${阿里云主账户A ID};
grant super_administrator to ALIYUN${阿里云账户A ID};
命令说明
命令名称 | 说明 |
| 使用MaxCompute所属账号B创建的MaxCompute项目名称。 |
| 在MaxCompute项目中添加用户。您可以通过 |
| 使用GRANT授权super_administrator给用户授权。 |
常见问题
在授权过程中,可能发生如下报错。
在操作过程中出现
FAILED: mismatched input
错误,表示当前的RAM用户没有执行ADD USER
等语句的权限。更多信息,请参见出现FAILED: mismatched input错误时,如何解决。在操作过程中出现
FAILED: ODPS-0130013:Authorization exception - Authorization Failed [4003], You have NO privilege to do the PROJECT SECURITY OPERATION for {acs:odps:*:projects/xxxxxx/authorization/users}. Context ID:1111-11111-1111-1111-11111.
错误,表示当前的操作用户无MaxCompute账户操作或者授权权限。更多信息,请参见出现操作用户无权限错误时,如何解决。
查看日志服务所属主账号是否授权成功(日志服务所属账号A)
使用阿里云主账户A登录A账号创建的临时查询节点,执行以下SQL,查看阿里云主账号A授权是否成功。
执行完成后,通过以下命令确认授权是否成功。
use {MaxCompute项目名称};
show grants;
命令说明
命令名称 | 说明 |
| 使用MaxCompute所属账号B创建的MaxCompute项目名称。 |
| 查看super_administrator角色是否给账户A授权成功。 结果显示如图所示,表示授权成功。 |
常见问题
执行use {MaxCompute项目名称}
时可能会报错,解决方案请参见Access Denied - Authorization Failed。
步骤四:授权RAM用户管理MaxCompute投递任务(日志服务所属账号A)
使用阿里云主账户A创建一个RAM用户,此RAM用户用于创建MaxCompute投递任务。具体操作,请参见创建RAM用户。
在RAM控制台创建一个自定义权限策略,具体操作,请参见通过脚本编辑模式创建自定义权限策略。
其中在脚本编辑页签,请使用以下脚本替换配置框中的原有内容。
重要请根据实际情况替换脚本中的
Project名称
和Logstore名称
。如果您要使用RAM用户配置MaxCompute投递任务告警,还需授予RAM用户告警操作权限。具体操作,请参见授权RAM用户操作告警。
{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "log:GetLogStore", "log:GetIndex", "log:GetLogStoreHistogram", "log:GetLogStoreLogs" ], "Resource": [ "acs:log:*:*:project/Project名称/logstore/Logstore名称", "acs:log:*:*:project/Project名称/logstore/internal-diagnostic_log" ] }, { "Effect": "Allow", "Action": [ "log:CreateJob", "log:UpdateJob", "log:DeleteJob", "log:ListJobs", "log:GetJob" ], "Resource": "acs:log:*:*:project/Project名称/job/*" }, { "Effect": "Allow", "Action": [ "log:ListLogStores", "log:ListDashboard", "log:ListSavedSearch" ], "Resource": "acs:log:*:*:project/Project名称/*" }, { "Effect": "Allow", "Action": [ "ram:PassRole", "ram:GetRole", "ram:ListRoles" ], "Resource": "*" } ] }
授予RAM用户自定义权限策略。具体操作,请参见为RAM用户授权。
步骤五:授权RAM角色读取Logstore数据(日志服务所属账号A)
使用阿里云账号(主账号)或RAM用户登录阿里云控制台。
单击云资源访问授权完成授权。
说明如果阿里云主账号没有默认角色
AliyunLogDefaultRole
,RAM用户只有第一次单击后会生成该角色。日志服务扮演
AliyunLogDefaultRole
角色来访问您在其他云产品中的资源。默认角色
AliyunLogDefaultRole
的权限策略请参见AliyunLogDefaultRole。
步骤六:对RAM用户进行DataWorks表授权(日志服务所属账号A)
使用阿里云主账户A登录该账号创建的临时查询节点,授予步骤四的RAM用户操作DataWorks表的权限。
SQL中的{MaxCompute项目名称}
、{阿里云主账号A ID}
和{RAM用户名称}
请根据实际情况填写。
use {MaxCompute项目名称};
add USER RAM${阿里云主账号A ID}:{RAM用户名称};
grant admin to RAM${阿里云主账号A ID}:{RAM用户名称};
show grants FOR RAM${阿里云主账号A ID}:{RAM用户名称};
命令说明
命令名称 | 说明 |
| 使用MaxCompute所属账号B创建的MaxCompute项目名称。 |
| 在MaxCompute项目中添加用户。您可以通过 |
| |
| 查看Admin角色是否授权成功。 结果显示如图所示,表示授权成功。 |
步骤七:创建MaxCompute投递
使用步骤四创建的RAM用户创建MaxCompute投递任务(新版),其中读日志服务授权使用默认角色,写 MaxCompute授权使用自定义角色。
跨账号投递无需点击自动授权的授权,此处涉及跨账号,日志投递自动映射。
写 MaxCompute授权的自定义角色为步骤一创建默认角色的ARN。
常见问题
Access Denied - Authorization Failed
报错信息
FAILED: ODPS-0420095: Access Denied - Authorization Failed [4002,4009], You have NO privilege 'odps:Read' on {acs:odps:*:projects/welcrm_spaces}. CheckPermission failed, User doesn't exist in the project. Context ID:xxxx. --->Tips: Pricipal:RAM$xxx:xxx;
原因
由于MaxCompute所属账户B开通DataWorks使用的是RAM用户,这里即便使用阿里云主账号B登录DataWorks,实际上用户使用的也是RAM子账号权限。
解决方案
使用MaxCompute所属账户B登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的 ,在下拉框中选择对应工作空间后单击进入管理中心。
进入工作空间管理中心页面后,单击左侧导航栏的数据源,进入数据源页面。
单击目标数据源右侧的编辑。
修改目标数据源的默认访问身份为阿里云主账号。