运行角色(Runtime Role)是 EMR Serverless Spark 作业运行时访问云资源所使用的 IAM 身份。启用后,您无需在 SparkJar、PySpark 或 Spark Connect 等作业配置中明文提供 AK/SK。系统会根据您在作业中指定的运行角色,自动获取临时凭证并将其注入作业的运行环境。
说明
运行角色功能目前正在灰度试用中。
EMR Serverless 支持运行角色和显式配置 AK/SK两种认证方式。运行角色和显式配置 AK/SK 同时存在时,作业优先使用 AK/SK;如果 AK/SK 验证失败或无权限,作业会直接失败,不会降级使用运行角色。因此,迁移到运行角色时,请删除作业运行参数中不再需要的长期 AK/SK。用于 API 请求签名的 SDK/API 客户端认证配置(提交身份)仍需保留。
在任何不希望明文配置长期 AK/SK 的场景下,都推荐使用运行角色,运行角色尤其适用于以下环境:
场景 | 典型需求 | 权限配置要点 |
|---|---|---|
读写 TOS 数据 | 作业需要读取输入数据、写入计算结果或 Checkpoint。 | 在运行角色的权限策略中,为目标 Bucket 和 Prefix 授予 |
访问 LAS Catalog | SparkJar 或 PySpark 作业需要访问 Hive、Paimon、Iceberg 等格式的表。 | 为角色同时配置 LAS Catalog 的访问权限和底层数据存储(如 TOS)的访问权限。 |
运行长时作业 | Streaming 或长周期批处理作业的运行时间超过了单次 STS Token 的有效期。 | 运行角色机制支持临时凭证的自动刷新,可确保长时作业的稳定性,避免因凭证过期导致 |
跨账号访问资源 | 作业由 A 账号提交,但需要访问 B 账号的资源。 | 在 B 账号中创建运行角色,并在其信任策略中明确信任 A 账号的提交身份,同时配置对 B 账号下目标资源的访问权限。 |
在创建运行角色前,请确保满足以下条件:
管理权限:确保当前账号拥有创建 IAM 角色、创建或选择权限策略,以及编辑信任关系所需的权限。
提交身份:明确将由哪个用户或角色提交作业,并准备好其完整的 TRN。如果无法获取完整 TRN,请准备其所属主账号 ID 和准确的 IAM 用户名。同时,提交身份还需具备在目标 EMR Serverless 资源上执行作业操作的权限。
资源范围:明确作业运行所需的全部资源路径,包括代码与依赖、输入数据、结果输出和 checkpoint 等,以及对各路径所需的具体操作权限(如读取、写入、列举或删除)。
资源访问权限策略:如果已有适用的系统策略或自定义策略,可以直接记录其名称,然后创建角色。如果需要自定义策略,请先完成创建,以便后续在角色创建向导中进行选择。关于新建自定义策略的具体步骤,请参见新建自定义策略。注意权限选择与配置应遵循最小权限原则:即仅授予作业运行所必需的最小权限集。
下表列出了常见授权资源与授权重点:
资源类型 | 授权重点 | 校验方式 |
|---|---|---|
TOS |
| 提交一个读写 TOS 的 Spark 作业,验证授权路径可正常访问,而未授权路径访问失败。 |
LAS Catalog | 对 Catalog、Database、Table 的读写权限,以及对底层数据存储的访问权限。 | 依次执行建表、读表、写表、分区等操作,分别验证只读和读写策略是否生效。 |
EMR Serverless | 根据需要,在访问控制中授予 | 授权后,作业应能正常指定运行角色;若未授权,提交作业时会报告权限错误。 |
LAS | 如果作业需要访问 LAS Catalog 元数据,需要在访问控制中授予 | 授权后,作业应能正常访问 LAS Catalog 元数据;若未授权,相关操作会报告权限错误。 |
进入 IAM 角色管理页面,点击 新建角色。
在 新建角色 弹窗中, 选择 账号 和 当前账号,然后点击 下一步。
在 配置角色信息 页面,填写 角色名,例如 EMRServerlessExecuteRole。根据需要填写 显示名称、 描述 和 标签,点击 下一步。
在 添加权限 页面,搜索并勾选已准备好的权限策略,不确定权限时可先选择 跳过。然后完成角色创建。
打开刚创建角色的详情页面,切换到 信任关系 页签。
点击 编辑信任策略,在 Principal 字段中补充 IAM 列表,并填入实际提交作业的身份 TRN,然后点击 保存。
注意
信任策略必须同时包含 Service 和 IAM 身份。如果忽略对提交者 IAM 身份的校验,任何拥有权限的账号或角色都可能指定该运行角色,从而引发越权访问风险。
示例:
{ "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Principal": { "Service": ["emr_serverless"], "IAM": [ "trn:iam::<account-id>:root", "trn:iam::<account-id>:user/<sub-user-name>", "trn:iam::<account-id>:role/<submit-role-name>" ] } } ] }
在角色详情的 基本信息 中,核对 最大会话时间。建议将其设置为 12 小时。请注意,此时间是临时凭证有效期的上限,而非作业本身的最长运行时长。对于长时作业,请确保运行环境支持凭证自动刷新。如需修改,可使用该字段旁的编辑功能。
复制完整的 角色 TRN(例如 trn:iam::<ROLE_ACCOUNT_ID>:role/EMRServerlessExecuteRole),后续提交作业时将会用到。
创建并配置角色后,即可在提交作业时指定该角色。指定角色支持以下两种途径:
详细的作业提交步骤,请参见 SparkJar 作业 和 PySpark 作业。
调用 API 提交作业时,您需要在请求体(Request Body)中包含运行角色的完整 TRN。具体的参数字段名和位置取决于您调用的 API 版本和作业类型。
示例:在 conf 参数中指定运行角色
以下示例展示了如何在提交 Spark 作业时,通过 conf 配置块内的 serverless.spark.runtime.role 参数来指定运行角色。
{ "name": "test_use_role", "jar": "tos:///jobs/demo.py", "mainArgs": [ "arg0", "arg1" ], "conf": { "serverless.spark.runtime.role": "trn:iam::${accountId}:role/EMRServerlessExecuteRole", "tqs.spark.jar.resource": "tos:///jobs/demo.py", "tqs.spark.jar.class": "", "tqs.spark.jar.class.args": "[\"arg0\",\"arg1\"]", "tqs.query.engine.type": "SparkJar" }, "queue": {}, "sync": false }
详细的作业提交步骤,请参见 SparkJar 作业 和 PySpark 作业。
先区分失败发生在提交阶段还是运行阶段。提交阶段的 NoPermission 多数来自服务身份或提交身份不在运行角色信任策略中;运行阶段访问 TOS、LAS 时失败,则优先检查运行角色的资源权限。
先按日志确认失败资源和实际鉴权身份。典型错误包括未授权 Bucket、Prefix 范围过窄、跨租户 Bucket Policy 未放行、Executor 侧仍使用旧 AK/SK 配置。
检查作业运行参数中是否仍显式填写 AK/SK。两者同时存在时旧密钥优先。为保障存量用户兼容性,服务端保留原 AK/SK 提交链路;存量作业迁移时应先灰度验证权限策略、错误信息和审计链路。