跳转至

From SSH to REST: A Security-Driven Modernization of Slack's EMR Data Pipelines

Ch12.003 From SSH to REST: A Security-Driven Modernization of Slack's EMR Data Pipelines

📊 Level ⭐ | 8.8KB | entities/from-ssh-to-rest-a-security-driven-modernization-of-slacks-e.md

深度分析

问题本质:SSH 作为临时方案的长期技术债

Slack 数据平台建于 2017 年,彼时 Airflow 通过 SSHOperator 直接连接 EMR 主节点执行命令是 最直接 的路径。这种模式在规模小、团队少时完全合理,但随着 700+ 生产作业分散到 8 个独立数据区域,SSH 从便利工具演变成基础设施现代化的 阻塞点。 核心矛盾在于:SSH 是一种 状态ful、点对点的连接协议,而现代云原生数据平台需要的是 无状态、可观测、可审计的作业提交机制。当作业运行在 K8s Pod 上时,Pod 重启 → SSH 连接断开 → 作业变成僵尸 或状态不可知,这是架构层面的根本性缺陷,不是 bug。

技术选型的关键洞察:为什么不自己造轮子

团队拒绝了三个提案:自建 wrapper service、Ansible/Salt 远程执行框架、自定义 YARN job type。共同问题是 引入新的自定义安全层 和 额外维护负担。 最终选择 YARN Distributed Shell 是因为它满足所有非功能性需求:开源协议、已有认证授权机制、标准 YARN REST API、无需自研。这里有个反直觉的教训:越是基础设施级别的迁移,越应该优先使用广泛验证过的开源组件,而非自研。自研的每一行代码都是未来的维护成本和安全审计对象。

Quarry 的架构价值:解耦 Airflow 与 EMR 基础设施细节

Quarry 原设计目标是跨计算引擎的统一作业提交网关(EMR/YARN、Trino、Snowflake),SSH 去化只是它的副产品价值。这个架构决策极具启发性: Before 架构:Airflow ↔ SSHConnection ↔ EMR Master Node → Execute(紧耦合) After 架构:Airflow ↔ Quarry REST API ↔ YARN ResourceManager → EMR Container(分层解耦) 解耦带来三个实质好处: 1. Airflow 不需要感知底层集群的连接细节,集群替换对 DAG 无影响 2. 作业生命周期由 Quarry 在 服务端 管理,K8s Pod 重启不影响作业执行 3. 统一观测入口——所有作业提交通过同一个 API,审计和 metrics 自然收敛

迁移策略:增量分阶段的本质是风险管理

五阶段方法论(PoC → 安全审查 → OKR 驱动执行 → 批量迁移 → 收尾)不是流程表演,而是每一阶段都有明确的风险递减目标:

  • Phase 1 PoC 验证技术可行性(减少技术风险)
  • Phase 2 安全审查确保合规(减少合规风险)
  • Phase 3 OKR 绑定使项目持续获得资源(减少组织优先级风险)
  • Phase 4/5 批量执行依赖前三阶段的验证基础(减少运维风险)

三个技术挑战的深层根因

vmem check 问题:SSH 执行时命令绕过了 YARN 资源管理器,相当于直接在人身上装防火墙而忽略了门口的检查站。迁移到 REST/YARN 后资源限制被正确执行,原本被掩盖的资源超用问题才暴露。这说明 SSH 模式下许多"正常"运行的作业其实一直处于资源违规状态,只是被 SSH 的穿透性掩盖了。 EKM 网络连通性问题:原始集群的网络路由配置能访问 KMS 端点,但这个依赖从未被显式记录——SSH 的便利性让拓扑依赖变成了隐式契约。迁移揭示了配置管理中一个常见问题:可工作的不等于正确的多 region 复杂度:8 个 region 不是 8x 的工作量,而是引入了 8 种独特的故障模式和配置差异。区域间的网络隔离策略、AWS 账户边界、数据主权要求各不相同。这意味着任何基础设施变更在规划阶段就必须将 region 差异纳入架构设计。

实践启示

安全迁移的工程方法论

  1. 建立监测先于迁移:在开始任何迁移前,先通过 Airflow DB 查询识别所有 SSH-based DAG,建立进度仪表板。进度可见性是保持项目动力的关键,也是避免迁移后期出现"被遗忘角落"的有效手段。
  2. 测试多个环境而非跳过:Dev → CommDev → GovDev → Prod 的递增测试路径不是为了拖延时间,而是为了在不同网络边界和账户配置下暴露问题。EKM 连接问题只在跨账户边界测试时才会出现。
  3. 渐进式废弃 operator:按 operator 类型逐个废弃(CrunchExecOperator → S3SyncOperator → ...),每个废弃周期都是一个独立的小型 PoC + 验证循环。虽然比批量迁移慢,但大幅降低了生产故障风险。

YARN Distributed Shell 的应用场景

对于任意 shell 命令(aws s3 sync、hadoop distcp、自定义 Python 脚本)到 YARN 容器中的作业提交,YARN Distributed Shell 提供了开箱即用的解决方案,无需自研。其核心流程:

1. 将命令脚本上传 S3
2. POST 到 YARN REST API,指定 script location + timestamp
3. YARN 分配容器、下载脚本、执行
4. 容器生命周期由 YARN 管理(资源限制、隔离、重试、日志)
这对 Hadoop 生态内任意非 JVM 工作负载的容器化有普遍参考价值。

SSH 去化的收益矩阵

维度 SSH 模式问题 REST/Quarry 解决
安全攻击面 直接访问计算集群 服务间 token 认证
作业状态 连接断开→状态未知 服务端追踪,可查询
资源竞争 主节点资源争用 分布式 YARN 容器
审计 多系统关联日志 REST API 结构化日志
基础设施演进 阻塞 Spark on K8s 解耦,无阻碍

迁移完成后的战略价值

REST 架构不只解决当前问题,更解锁了未来三条关键路径:

  • Spark on Kubernetes:无 SSH 依赖,迁移路径清晰
  • Whitecastle 完成:主账号 EMR 集群迁移到子账号,网络隔离合规
  • 平台可演进性:Airflow 与 EMR 基础设施细节解耦,集群替换对 DAG 无感

    来源:原文存档

相关实体