SageMaker Auto Scaling 遇到 AWS CDK 必须编排的部署约束
AWS 发布了一种用于处理 SageMaker 自动扩缩容场景的变通方案,解决端点在扩缩容注册仍然存在时无法更新的问题。该方案使用 AWS CDK——一个以代码定义云基础设施的框架——来协调原本需要人工干预的变更。其意义在于弥合这样一个缺口:声明所需的基础设施,并不总能表达实现它所必需的操作顺序。
10 月 23 日的文章介绍了一种可复用构造,即打包的基础设施组件:它会暂时移除扩缩容注册,并在端点更新后将其恢复。AWS CloudFormation——根据模板配置资源的服务——仍负责部署。自定义资源,即运行应用特定配置逻辑的扩展,则负责处理更新前后的状态转换。
对于平台工程师而言,核心矛盾在于声明式配置与运维时序之间。模板可以正确描述端点及其扩缩容设置,但两者之间的关系仍可能阻断更新。AWS 的示例将这种关系纳入部署工作流,但团队仍需评估恢复能力、容量和责任归属。
SageMaker 自动扩缩容暴露了配置与执行之间的缺口
这项变更是一种已发布的编排模式,而非取消 SageMaker 底层的更新限制。
AWS 顾问 Lauren Eterno 在一项端点更新构造中介绍了该方法。它以围绕端点变更执行的自定义配置步骤,替代原生扩缩容资源。AWS 表示,这使端点配置和扩缩容参数可以在单次部署中完成变更。
这一差异很重要,因为“扩缩容会阻止端点更新”这一笼统说法需要限定。SageMaker 的端点更新规则明确指出,当模型仍处于注册状态时,更改实例类型会导致更新失败。规则也允许更改已配置扩缩容变体的模型。变体是端点内用于提供模型服务的一项配置。
这一例外避免了对公告作出过度宽泛的解读。团队不应认为每次模型发布都必须撤销扩缩容注册。关键问题在于哪些资源属性发生变化,以及这些变化是否触及文档中所述的限制。部署策略应遵循这一差异。
设想一个假设场景:某推荐服务将其模型迁移到不同的实例类型。模型本身或许保持不变,但基础设施更新跨越了受扩缩容注册保护的边界。若工程师只审查新的端点配置,就可能忽略这一前置条件。
因此,该示例解决的是一个生命周期问题,即创建、更新和移除资源所需的有序状态转换。它并未引入另一种扩缩容算法。它的价值在于协调既有操作,使部署流程能够理解这些操作的前置条件。
这是评估这则消息的一个有用边界。新的构造应依据其能否让基础设施变更可重复、可恢复来判断。关于提升推理质量、加快模型执行或改善扩缩容效率的说法,则需要独立证据支持。
该文章也为维护私有变通方案的团队提供了具体的审查对象。他们可以将自己的脚本与 AWS 编写的参考实现进行比较,而不必仅凭错误信息推断。这并不意味着该参考实现会自动适用于所有生产环境。
直接压力落在那些假定有效模板就能保证有效更新路径的团队身上。该示例说明,更新路径本身也值得审查。目标状态和状态转换行为应成为同一场工程讨论的一部分。
平台团队要承担人工干预带来的后果
如果预期的扩缩容行为尚未恢复,即使端点变更成功也并不完整。
最突出的运维担忧,是基础设施配置与实际运行行为之间的距离。端点可以响应请求,却可能没有其所有者预期的扩缩容安排。若发布审查只关注应用响应,就无法证明基础设施仍已准备好应对需求变化。
AWS 描述了人工取消注册的场景:这类操作要么使扩缩容缺失,要么导致后续资源更新失败。这些示例揭示了不同问题。明显的部署失败需要立即关注,而缺少扩缩容则可能逃过以应用是否仍有响应为中心的审查。
无论哪种情况,值班工程师都要承担后果。必须有人判断哪些变更已经完成、哪些资源仍然存在,以及下一次部署会尝试执行什么操作。没有共享记录时,恢复过程只能依赖于重建那些在正常发布流程之外执行的操作。
对于平台团队而言,这既是责任归属问题,也是工具问题。应用开发人员可能负责模型行为,而基础设施工程师负责部署控制。横跨两者的工作流需要一项明确的完成定义,任何一方都无法单独满足。
这一定义应包括服务配置和预期的容量控制。它还应区分注册与策略附加。可扩缩目标,即容量可以变动的已注册资源,及其扩缩策略,是最终状态中彼此相关但相互独立的部分。
实际影响是需要采用更广泛的发布验收检查。团队应验证端点使用预期配置,并确认其容量控制与获批变更一致。应用健康状况仍然必要,但它回答的是另一个问题。
当硬件变更伴随修订后的扩缩容设置时,这一点尤其重要。此时发布同时改变了请求的执行方式和之后容量的响应方式。孤立地审查任一变更,都会让两者之间的互动未经检验。
可复用组件可以集中承担这项责任。平台团队无需要求每个应用团队记住一套操作顺序,而是可以维护统一实现。其收益取决于是否将该组件视为持续维护的基础设施,并明确责任归属和恢复流程文档。
文档既要保留决策,也要保留命令。工程师调查后续事故时,需要知道为何存在临时取消注册,以及哪些假设使其合理。可搜索的工程知识库可以将这些决策与部署证据一并保存。
商业层面的影响在于发布可预测性。经常需要专家干预的基础设施变更,会给每次受影响的部署带来协调成本。将操作顺序纳入代码,有望减少这些工作,前提是故障仍能被实际操作该流程的人理解。
这一限定区分了有用的自动化与隐藏的复杂性。目标应是能够清晰说明自身状态的部署。仅仅把人工命令移入函数,并不能达成这一结果。
该构造将顺序和就绪状态明确化
该机制将有序依赖链与确认每项前置条件确已可用的检查结合起来。
示例实现遵循既定顺序:取消注册扩缩容、更新端点、注册目标,以及附加策略。注册阶段会等待端点达到 InService,即其已就绪的运行状态。策略阶段则等待已注册目标变为可查询状态。
这些检查处理的是不同边界。端点必须准备就绪才能注册,而注册必须变得可见,策略才能附加。将这些条件分开处理,比假定已接受的请求意味着所有依赖操作都能继续执行,更容易审查该工作流。
Application Auto Scaling,即 AWS 用于调整受支持资源容量的服务,记录了这一可见性缺口。其注册 API 警告存在最终一致性,这意味着成功的变更可能需要一段时间才会出现在后续请求中。因此,就绪状态检查是对已记录行为的回应。
该示例使用异步完成机制,即将启动操作与检查其是否完成分开的模式。CDK 提供程序框架会反复调用完成处理程序,直到成功或达到超时。这样避免将整个等待过程绑定到单次函数调用中。
参考实现将检查间隔设为 30 秒。它允许目标注册最多耗时一小时,策略附加最多耗时 15 分钟。这些数值描述的是实现的等待上限;它们既不是承诺的部署时长,也不能证明典型生产环境中的性能。
配置触发器同样重要。ConfigHash 属性是一个代表相关配置的值;当端点或扩缩容设置变化时,它也会变化。这为 CloudFormation 提供了一个已变更的自定义资源属性以供处理,从而让编排重新纳入更新流程。
这正是该模式超越依赖排序的地方。仅有排序规则并不能让未发生变化的自定义资源再次运行。工作流既需要一个执行理由,也需要在执行开始后具备强制执行的顺序。
更广泛的 CDK 行为体现在其自定义资源框架中。CloudFormation 向提供程序发送生命周期事件,框架支持对耗时操作进行完成检查。它也会在处理程序出错或等待期到期时报告失败。
对于审查人员而言,这些是彼此独立的责任。配置触发器决定何时需要执行工作。依赖关系决定何时可以开始执行。完成检查决定何时可以继续后续工作。恢复逻辑随后必须处理在这些边界之间进度停止时会发生什么。
与按顺序提交请求并假定立即就绪的部署脚本相比,最终设计更为明确。然而,明确性不应与正确性的证明混为一谈。该参考实现提供了一种可检查的机制,团队可以根据自身的运维要求对其进行评估。
托管推理仍将部署协调责任留给运营方
更广泛的比较关注的是平台如何暴露生命周期责任,而非哪家供应商提供自动扩缩容。
Google Cloud 也记录了已部署预测模型的可配置扩缩容功能。其推理自动扩缩容设置包括最小和最大副本数,其中副本是正在运行、用于提供模型服务的副本。该文档还在受支持的配置中区分了部署成功与容量完全就绪。
这种比较提供了背景,但并不能据此建立供应商排名。相似的设置并不意味着更新限制、故障处理或部署语义完全相同。AWS 示例也无法作为依据,证明其他平台能够避免所有类似的协调问题。
对企业采购方而言,有价值的比较不应止于是否具备扩缩容能力。他们还应了解硬件变更如何与容量控制交互、就绪状态如何报告,以及发生故障后由谁恢复配置。这些问题将产品能力与实际运维所需工作联系起来。
同样的区别也适用于 AWS 环境。通过 CDK 定义基础设施为开发者提供了编程接口,但生成的部署仍遵循 CloudFormation 的行为。用于描述资源的语言,并不会消除服务层面的前置条件。
这正是该示例值得在其具体实现之外获得关注的原因。它将一项运维依赖关系显式呈现在基础设施代码中。这让审查人员能够检查原本可能分散在发行说明、脚本和个人经验中的流程。
更新可用性与扩缩容可用性之间同样存在边界。SageMaker 的端点更新 API 描述了将流量迁移至新资源组、同时淘汰旧资源组的过程。这一服务切换本身并不能证明预期的扩缩容策略已经恢复。
因此,团队可以为请求服务和容量管理分别定义验收条件。应用应在变更期间保持健康,而部署完成时则应具备预期的扩缩容控制。两项条件都不应替代另一项。
这种划分也能改善事故分析。如果请求失败,工程师可以调查服务切换过程;如果容量不再随需求变化,则可以检查扩缩容状态。能够区分这些结果的部署记录,会为响应人员提供更清晰的排查起点。
对于正在标准化推理基础设施的组织,关键选择在于是否将这类协调工作纳入通用组件。另一种做法是让每个团队自行负责理解同一生命周期边界。共享组件能带来一致性,但也会集中维护责任。
这一权衡需要明确的责任人。必须有人审核组件变更、维护与现有部署的兼容性,并判断其假设何时不再适用。只有维护模式同样可复用时,可复用性才会创造组织价值。
注销使恢复成为设计的一部分
恢复目标是必要条件,但生产验收必须覆盖注销会移除的一切内容。
deregistration API 指出,移除可扩缩容目标会删除其关联的扩缩容策略和计划操作。计划操作是为特定时间配置的容量变更。这意味着注销是一项具有破坏性的生命周期操作,即使其意图只是临时处理。
这种行为立即对现有端点提出了兼容性问题。如果组织使用计划操作或额外策略,审查人员应明确这些配置将如何恢复。存在目标跟踪策略——即将容量调整至选定指标值的策略——并不能回答这个问题。
示例中记录的流程侧重于注册目标并附加其配置的策略。团队不应推断,端点上原先附加的每一种扩缩容安排都会被发现并重建。更广泛的恢复要求需要明确检查和验证。
扩缩容缺口同样值得关注。移除注册并不意味着端点已被删除,但其原有的自动容量控制已经缺失。运营人员应评估,在此期间服务资源组需要承受多少需求。
这是一项与工作负载相关的评估。稳定的内部服务与面向不可预测需求的公共应用,具有不同的验收条件。该参考资料并未提供测量证据,以证明任一场景可接受的中断窗口。
硬件变更后,容量设置需要单独审查。保留原有策略配置,并不能证明它仍适用于不同的实例类型。在将恢复视为运维成功之前,团队应在具有代表性的需求下评估最终行为。
故障测试应遵循各个转换边界。审查人员应检查端点更新失败、注册失败和策略附加失败。每种故障都会留下关于实际状态以及恢复所需操作的不同问题。
回滚,即在失败后尝试恢复至先前配置的过程,需要获得与前向部署同等的关注。自定义资源通过其处理程序参与这一生命周期。它的存在并不保证每一次部分完成的操作都能干净地逆转。
CDK 文档明确指出,即使底层操作在技术上已经成功,资源操作仍可能失败。这一区别在解读日志时至关重要。报告的错误应触发对实际资源状态的检查,而不是让任何人直接假设操作从未发生。
资源标识也是另一个审查重点。CloudFormation 使用提供方的物理资源标识符来区分更新与替换。修改示例的团队应在更改标识符格式或清理逻辑之前理解这一行为。
这些顾虑并不否定该方法。它们界定了负责任采用该方法所需的证据。编排组件应让故障状态可见、保留足够的恢复上下文,并避免在预期结果尚未出现前报告完成。
现有发布内容是一篇技术演练,而非独立的可靠性研究。它并未证明生产环境采用情况、事故数量的可测量下降,或普遍适用的恢复保证。其最重要的贡献在于提供了一项明确设计,供运营人员测试,而无需自行重构。
后续证据应来自更新、恢复和原生支持
最有价值的信号是可观察的工程结果,而非关于自动化的泛泛主张。
第一个信号是可重复的配置更新,以及后续已恢复的扩缩容能力。在接下来的数月中,采用者应寻找涵盖硬件变更和扩缩容设置变更的证据。成功的重复实践将强化这样一种判断:该组件能够持续捕捉预期的依赖关系。
证据应说明最终状态,而不只是某条部署命令已经完成。审查人员需要确认端点运行的是预期配置,并且预期的目标和策略确实存在。即使服务仍保持健康,恢复缺失也会削弱这一模式的实际价值。
下一个信号是在注入故障时记录下来的行为。有说服力的评估应明确工作流停止的位置、哪些内容仍处于活动状态,以及恢复如何进行。清晰的恢复证据比另一次成功的初始部署更能增强信心。
相反,若故障需要未记录的控制台干预才能恢复,则说明运维工作尚未完成。这不会抹去自动化编排的价值,但会改变采用决策。团队需要在其发布流程中考虑这部分剩余工作。
最后一个信号是原生生命周期支持的进展。应关注 SageMaker、CloudFormation 和 CDK 文档中影响端点更新及扩缩容注册的变化。若原生支持处理该前置流程,将减少对由应用维护的编排机制的需求。
在这类支持出现之前,该参考资料为平台工程决策提供了具体基础。它将 SageMaker 自动扩缩容纳入端点部署生命周期,而不是把恢复视为另一项由运维人员执行的任务。其采用依据在于:这一显式工作流能否在实际运行它的环境中表现得可预测。
对于考虑采用该构造的团队,应先从更新历史和扩缩容配置均已明确的端点开始。审查生成的基础设施,识别注销会移除的每一项配置,并为恢复指定责任人。然后,在扩大采用范围前,执行一次具有代表性的更新和一次受控故障测试。将所得证据与组件的运行文档一并保存,使未来发布能够继承其中的推理过程,而不仅仅是代码。发布审查需要回答的问题很具体:端点变更后,团队能否确认服务、扩缩容和恢复行为均符合其要求?请以这一标准评估 SageMaker 自动扩缩容编排,并要求部署证据对此作出回答。



