执行角色

EMR Serverless Spark工作空间中的任务在调用其他阿里云服务(如OSS、DLF)时,将通过执行角色进行权限验证。在创建工作空间时,您既可以使用默认执行角色,也可以使用自定义的角色。

使用场景

在任务执行过程中,执行角色会根据具体场景调用不同的资源或服务,并以指定的身份进行鉴权和操作审计。以下是主要使用场景:

  • 调用OSS文件

    在任务执行时,执行角色负责访问和操作存储在阿里云对象存储服务(OSS)中的文件。

  • 读写DLF元数据

    如果开启了数据湖元数据服务(DLF)权限控制,执行角色将根据不同的任务类型扮演不同的身份:

    • 数据开发:扮演提交任务的阿里云账号或RAM用户(子账号)身份。

    • Livy Gateway:扮演Token创建者的身份。

  • 读写MaxCompute数据

    在读写MaxCompute数据时,执行角色将扮演提交任务的阿里云账号或RAM用户(子账号)身份进行鉴权及操作审计。

注意事项

工作空间创建后,执行角色不可更改。

使用默认执行角色

在创建工作空间时,如果您未对执行角色配置项进行修改,系统将自动使用默认执行角色AliyunEMRSparkJobRunDefaultRole

默认执行角色说明如下:

  • 角色名称:AliyunEMRSparkJobRunDefaultRole

  • 关联策略:该角色包含系统权限策略AliyunEMRSparkJobRunDefaultRolePolicy,授予了OSS(对象存储服务)、DLF(数据湖元数据服务)和MaxCompute服务的访问权限。

  • 维护方式:该策略由阿里云创建和维护,会根据服务需求变化自动更新。

重要

请谨慎编辑和删除默认执行角色AliyunEMRSparkJobRunDefaultRole,否则会造成工作空间资源创建失败或者任务执行失败。

使用自定义执行角色

如果您希望自主控制执行角色的权限点,可以在创建工作空间时修改执行角色。通过以下步骤配置自定义执行角色,以实现免密访问同一账号下的其他资源(例如,OSSDLF)。

说明

以下权限策略仅用于为您展示如何为自定义角色配置权限。当选择使用自定义执行角色,请注意其权限策略是静态的,不会随阿里云服务的需求变化而自动更新。为了确保任务能够正常运行,建议定期检查并更新权限策略。具体可以参考默认执行角色AliyunEMRSparkJobRunDefaultRole的权限策略(AliyunEMRSparkJobRunDefaultRolePolicy),以了解当前所需的最新的权限列表。

操作流程

  1. 新建权限策略。

    1. 进入新建自定义权限策略页面。

      1. 使用RAM管理员登录RAM控制台

      2. 在左侧导航栏,选择权限管理 > 权限策略

      3. 权限策略页面,单击创建权限策略

        image

    2. 创建权限策略页面,单击脚本编辑页签。

    3. 输入权限策略内容,然后单击确定

      {
        "Version": "1",
        "Statement": [
          {
            "Action": [
              "oss:ListBuckets",
              "oss:PutObject",
              "oss:ListObjectsV2",
              "oss:ListObjects",
              "oss:GetObject",
              "oss:CopyObject",
              "oss:DeleteObject",
              "oss:DeleteObjects",
              "oss:RestoreObject",
              "oss:CompleteMultipartUpload",
              "oss:ListMultipartUploads",
              "oss:AbortMultipartUpload",
              "oss:UploadPartCopy",
              "oss:UploadPart",
              "oss:GetBucketInfo",
              "oss:PostDataLakeStorageFileOperation",
              "oss:PostDataLakeStorageAdminOperation",
              "oss:GetBucketVersions",
              "oss:ListObjectVersions",
              "oss:DeleteObjectVersion"
            ],
            "Resource": [
              "acs:oss:*:*:serverless-spark-test-resources/*",
              "acs:oss:*:*:serverless-spark-test-resources"
            ],
            "Effect": "Allow"
          },
          {
            "Action": [
              "dlf:AlterDatabase",
              "dlf:AlterTable",
              "dlf:ListCatalogs",
              "dlf:ListDatabases",
              "dlf:ListFunctions",
              "dlf:ListFunctionNames",
              "dlf:ListTables",
              "dlf:ListTableNames",
              "dlf:ListIcebergNamespaceDetails",
              "dlf:ListIcebergTableDetails",
              "dlf:ListIcebergSnapshots",
              "dlf:CreateDatabase",
              "dlf:Get*",
              "dlf:DeleteDatabase",
              "dlf:DropDatabase",
              "dlf:DropTable",
              "dlf:CreateTable",
              "dlf:CommitTable",
              "dlf:UpdateTable",
              "dlf:DeleteTable",
              "dlf:ListPartitions",
              "dlf:ListPartitionNames",
              "dlf:CreatePartition",
              "dlf:BatchCreatePartitions",
              "dlf:UpdateTableColumnStatistics",
              "dlf:DeleteTableColumnStatistics",
              "dlf:UpdatePartitionColumnStatistics",
              "dlf:DeletePartitionColumnStatistics",
              "dlf:UpdateDatabase",
              "dlf:BatchCreateTables",
              "dlf:BatchDeleteTables",
              "dlf:BatchUpdateTables",
              "dlf:BatchGetTables",
              "dlf:BatchUpdatePartitions",
              "dlf:BatchDeletePartitions",
              "dlf:BatchGetPartitions",
              "dlf:DeletePartition",
              "dlf:CreateFunction",
              "dlf:DeleteFunction",
              "dlf:UpdateFunction",
              "dlf:ListPartitionsByFilter",
              "dlf:DeltaGetPermissions",
              "dlf:UpdateCatalogSettings",
              "dlf:CreateLock",
              "dlf:UnLock",
              "dlf:AbortLock",
              "dlf:RefreshLock",
              "dlf:ListTableVersions",
              "dlf:CheckPermissions",
              "dlf:RenameTable",
              "dlf:RollbackTable"
            ],
            "Resource": "*",
            "Effect": "Allow"
          },
          {
            "Action": [
              "dlf-dss:CreateDatabase",
              "dlf-dss:CreateFunction",
              "dlf-dss:CreateTable",
              "dlf-dss:DropDatabase",
              "dlf-dss:DropFunction",
              "dlf-dss:DropTable",
              "dlf-dss:DescribeCatalog",
              "dlf-dss:DescribeDatabase",
              "dlf-dss:DescribeFunction",
              "dlf-dss:DescribeTable",
              "dlf-dss:AlterDatabase",
              "dlf-dss:AlterFunction",
              "dlf-dss:AlterTable",
              "dlf-dss:ListCatalogs",
              "dlf-dss:ListDatabases",
              "dlf-dss:ListTables",
              "dlf-dss:ListFunctions",
              "dlf-dss:CheckPermissions"
            ],
            "Resource": "*",
            "Effect": "Allow"
          },
          {
            "Effect": "Allow",
            "Action": "dlf-auth:ActOnBehalfOfAnotherUser",
            "Resource": "*"
          }
        ]
      }
    4. 输入权限策略名称(例如,test-serverless-spark)和备注,然后单击确定

      策略中涉及的元素如下所示:

      • Action:是指对具体资源的操作。本示例是OSSDLF的读取及查询目录的权限。

      • Resource:是指被授权的具体对象。本示例是访问DLF所有对象及其中的内容,以及访问OSS Bucket(serverless-spark-test-resources)下的所有内容,其中serverless-spark-test-resources需要根据实际情况替换为指定OSS Bucket的名称。

      更多权限策略的基本元素,请参见权限策略基本元素

  2. 创建RAM角色。

    1. 在左侧导航栏,选择身份管理 > 角色

    2. 角色页面,单击创建角色

    3. 创建RAM角色。

      1. 创建角色面板,配置以下信息,单击确定

        参数

        描述

        信任主体类型

        选择云服务

        信任主体名称

        spark.emr-serverless.aliyuncs.com

      2. 输入角色名称(例如,test-serverless-spark-jobrun),单击确定

  3. RAM角色授权。

    1. 角色页面,单击刚创建的角色操作列的新增授权

    2. 新增授权面板,权限策略选择自定义策略,添加前一步骤中新建的权限策略。

    3. 单击确认新增授权

    4. 单击关闭

  4. 创建工作空间并访问外部资源。

    1. 登录E-MapReduce控制台

    2. 在左侧导航栏,选择EMR Serverless > Spark

    3. 单击创建工作空间,参考以下参数配置,更多参数详情请参见创建工作空间

      • 工作空间基础路径:选择前面创建的RAM角色有读写权限的OSS路径。

      • 执行角色:选择前面创建的RAM角色名称(例如test-serverless-spark-jobrun)。

    4. 工作空间创建成功后,参考JAR开发快速入门进行批任务以验证权限是否生效。

      • 文件上传到已授权的OSS Bucket下时,任务可正常运行。

      • 文件上传到未授权的OSS Bucket下时,任务运行会报错,提示没有该OSS路径的访问权限。

其他权限策略参考

访问MaxCompute数据

为执行角色添加以下权限策略。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "odps:ActOnBehalfOfAnotherUser",
      "Resource": [
        "acs:odps:*:*:users/default/aliyun/*",
        "acs:odps:*:*:users/default/ramuser/*",
        "acs:odps:*:*:users/default/ramrole/*"
      ]
    }
  ]
}

访问开启了KMSOSS

为执行角色添加以下权限策略。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:List*",
        "kms:DescribeKey",
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": "*"
    }
  ]
}

相关文档