授权自定义角色写数据到MaxCompute(跨账号投递)

MaxCompute投递任务(新版)运行时,需要将从Logstore中读取的数据投递到MaxCompute的表中,您可以授权MaxCompute投递任务(新版)扮演自定义RAM角色完成该操作。本文介绍在MaxCompute和日志服务Project不同账号时,如何对自定义RAM角色进行授权。

背景信息

日志服务和MaxCompute属于不同的阿里云账号,例如日志服务属于阿里云账号AMaxCompute属于阿里云账号B。则需授予账号B下的RAM角色写入MaxCompute的权限。授权完成后,MaxCompute投递任务可以使用该RAM角色将Logstore中的数据写入到目标MaxCompute表中。

解决痛点:在跨账号投递时,由于权限问题,MaxCompute的表名和表字段映射不到该投递任务。

image

前提条件

  • 日志服务所属账号A创建ODPS SQL的临时查询节点。具体操作,请参见创建临时查询节点

  • 使用阿里云账号B创建一个和日志服务同地域的MaxCompute项目。具体操作,请参见创建MaxCompute项目

  • MaxCompute所属账号B将您的MaxCompute项目关联为DataWorksMaxCompute数据源,并且和日志服务Project同一地域。更多信息,请参见创建MaxCompute数据源

步骤一:创建自定义角色写数据MaxCompute(MaxCompute所属账号B)

  1. 使用阿里云主账号B登录RAM控制台

  2. 创建RAM角色,例如MaxComputeShipRole。具体操作,请参见创建可信实体为阿里云服务的RAM角色

    重要
    • 创建RAM角色时,必须选择信任主题类型云服务,且必须信任主题名称日志服务

    • 请检查角色的信任策略如下,Service内容至少包含"log.aliyuncs.com"

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "log.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }
  3. 修改RAM角色信任策略。具体操作,请参见修改RAM角色的信任策略

    将原有的信任策略替换为如下内容。

    Service配置项中添加{阿里云账号AID}@log.aliyuncs.comdataworks.aliyuncs.com。其中{阿里云账号AID},需根据实际情况替换,您可以在账号中心查看阿里云账号ID。

    说明

    该策略表示账号A有权限通过日志服务获取临时Token来操作账号B中的资源。

    {
        "Statement": [
            {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Principal": {
                    "Service": [
                        "log.aliyuncs.com",
                        "dataworks.aliyuncs.com",
                        "{阿里云账号AID}@log.aliyuncs.com"
                    ]
                }
            }
        ],
        "Version": "1"
    }
  4. 添加RAM角色为工作空间成员。

    1. 登录DataWorks控制台

    2. 在页面左上角,选择地域。

    3. 在左侧导航栏中,单击工作空间。在工作空间列表页面,单击目标工作空间对应的管理

    4. 工作空间页面的空间成员页签下,单击添加成员image

    5. 添加成员对话框中,选中当前登录账号和目标RAM角色,完成添加。

      此处需在批量设置角色中选中开发。更多信息,请参见授权给其他用户

    6. 授予RAM角色操作MaxCompute表的权限。

      1. 登录MaxCompute控制台,在左上角选择地域。

      2. 选择工作区 > 项目管理,在项目管理页面,单击目标项目操作列的管理image

      3. MaxCompute项目管理页面,单击角色权限image.png

        如果出现如下报错,您需要在阿里云主账号下将当前登录的RAM账号添加至目标MaxCompute项目,先在角色列表中单击admin对应的成员管理,然后在成员管理对话框中,选中当前登录RAM账号,根据页面提示完成添加。image.png

      4. 在角色列表中,单击role_project_admin角色对应的成员管理

      5. 成员管理对话框中,选中当前登录账号和目标RAM角色账号,如MaxComputeShipRole。完成添加。

      6. 在角色列表中,单击role_project_admin角色对应的编辑角色

      7. 编辑角色对话框的Table页签下,选择目标MaxCompute表,选中DescribeAlterUpdateimage.png

    重要

    上述授权只针对指定的MaxCompute表。如果您希望目标角色可以操作当前MaxCompute空间项目下所有的表,则您可以为当前登录账号和目标角色添加admin角色权限。即在角色列表中,单击admin角色对应的成员管理,然后在成员管理对话框中,选中当前登录账号和目标角色,完成添加。

步骤二:创建MaxCompute投递表(MaxCompute所属账号B)

  1. 使用阿里云账号B创建ODPS SQL临时查询节点。具体操作,请参见创建临时查询节点

  2. 在节点编辑页面,创建分区表,用于存储日志服务数据。具体说明,请参见表操作

    CREATE TABLE IF NOT EXISTS server_logs (
        request_method STRING,
        `status` string
    )
    PARTITIONED BY (
        ds STRING 
    )
    LIFECYCLE 30;

步骤三:对日志服务所属账号A授权(MaxCompute所属账号B)

使用步骤二创建的临时查询节点执行以下命令,对日志服务所属阿里云账户A进行授权。

use {MaxCompute项目名称};
add USER ALIYUN${阿里云主账户A ID};
grant super_administrator to ALIYUN${阿里云账户A ID};

命令说明

命令名称

说明

use {MaxCompute项目名称}

使用MaxCompute所属账号B创建的MaxCompute项目名称。

add USER ALIYUN${阿里云主账户A ID}

MaxCompute项目中添加用户。您可以通过list users;命令查看对应的用户。

grant super_administrator to ALIYUN${阿里云账户A ID};

使用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;

命令说明

命令名称

说明

use {MaxCompute项目名称}

使用MaxCompute所属账号B创建的MaxCompute项目名称。

show grants;

查看super_administrator角色是否给账户A授权成功。

结果显示如图所示,表示授权成功。

image

常见问题

执行use {MaxCompute项目名称}时可能会报错,解决方案请参见Access Denied - Authorization Failed

步骤四:授权RAM用户管理MaxCompute投递任务(日志服务所属账号A)

  1. 使用阿里云主账户A创建一个RAM用户,此RAM用户用于创建MaxCompute投递任务。具体操作,请参见创建RAM用户

  2. 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": "*"
            }
        ]
    }
  3. 授予RAM用户自定义权限策略。具体操作,请参见RAM用户授权

步骤五:授权RAM角色读取Logstore数据(日志服务所属账号A

  1. 使用阿里云账号(主账号)或RAM用户登录阿里云控制台

  2. 单击云资源访问授权完成授权。

    说明
    • 如果阿里云主账号没有默认角色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用户名称};

命令说明

命令名称

说明

use {MaxCompute项目名称}

使用MaxCompute所属账号B创建的MaxCompute项目名称。

add USER ALIYUN${阿里云主账户A ID}

MaxCompute项目中添加用户。您可以通过list users;命令查看对应的用户。

grant super_administrator to ALIYUN${阿里云账户A ID}

使用GRANT授权AdminRAM用户授权。

show grants FOR RAM${阿里云主账号A ID}:{RAM用户名称}

查看Admin角色是否授权成功。

结果显示如图所示,表示授权成功。

image

步骤七:创建MaxCompute投递

使用步骤四创建的RAM用户创建MaxCompute投递任务(新版),其中读日志服务授权使用默认角色写 MaxCompute授权使用自定义角色

说明
  • 跨账号投递无需点击自动授权授权,此处涉及跨账号,日志投递自动映射。

  • 写 MaxCompute授权自定义角色步骤一创建默认角色的ARN。

image

常见问题

  • 日志投递MaxCompute后,如何检查数据完整性

  • MaxCompute投递任务(新版)常见报错与问题

  • 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子账号权限。

    • 解决方案

      1. 使用MaxCompute所属账户B登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的更多 > 管理中心,在下拉框中选择对应工作空间后单击进入管理中心

      2. 进入工作空间管理中心页面后,单击左侧导航栏的数据源,进入数据源页面。

      3. 单击目标数据源右侧的编辑

      4. 修改目标数据源的默认访问身份阿里云主账号

        image