Heroku 到 Azure 容器应用 迁移概述

如果要从 Heroku 迁移到 Azure 容器应用,本指南通过将你已知道的 Heroku 概念映射到其Azure等效项来帮助规划迁移。 使用本文评估迁移范围,确定所需的Azure服务,并在开始之前避免常见陷阱。

有关分步迁移过程,请参阅 将应用从 Heroku 迁移到 Azure 容器应用

概念映射

下表将核心 Heroku 平台功能映射到其Azure 容器应用等效项。

Heroku 概念 Azure 容器应用 等效 注释
应用(Web dyno) 容器应用 运行应用程序代码的单个可部署单元。
Dyno 类型 + 手动缩放 基于 KEDA 的自动缩放 基于规则的自动缩放,包括缩放到零。 替换手动动态计数管理。
Buildpacks(Slug 编译) 容器镜像或 云本机生成包 使用az containerapp up --source 来体验类似于构建包的功能,或使用自定义的 Dockerfile。
配置变量 环境变量 + Azure 密钥保管库 非敏感值使用环境变量。 机密可以使用密钥保管库引用或容器应用的机密。
加载项 (Postgres、Redis 等) Azure托管服务 有关完整映射信息,请参阅 服务等效项
heroku CLI(命令行界面) az containerappCLI(命令行界面) 使用 containerapp 扩展的Azure CLI提供等效的管理命令。
Heroku Pipelines/Review Apps GitHub ActionsAzure Pipelines 您配置和管理的 CI/CD 流水线。
一次性 dynos(heroku run 容器应用作业 无需长时间运行的应用即可按需执行或计划执行。
Procfile (进程类型) 针对不同进程类型的独立容器应用 在同一环境中将 Web 和工作进程部署为独立的容器应用。
自定义域名 + ACM Custom domain + 免费托管证书 托管证书是免费的,并自动续订。

服务等效项

从 Heroku 迁移时,请将 Heroku 加载项替换为Azure托管服务。 下表将常见的加载项映射到其Azure等效项。

Heroku 加载项 Azure 等效项 迁移复杂性
Heroku Postgres Azure Database for PostgreSQL - 灵活服务器 中:需要数据导出和还原。
Heroku Redis Azure Cache for Redis 低:通常不需要数据迁移(仅缓存使用)。
Heroku 调度器 容器应用作业 (计划任务类型) 低 - 将 cron 表达式重新创建为作业计划。
Papertrail / Logentries Azure Monitor + Log Analytics 低级别 - 日志记录已内置到容器应用中。
New Relic Azure 应用程序 Insights 中 - 需要 SDK 或自动检测更改。
SendGrid 通过 Azure 市场 的 SendGridAzure 通信服务 低 - SendGrid 继续使用 Azure,您只需更新连接详细信息即可。
CloudAMQP (RabbitMQ) Azure 服务总线 高 - 不同的消息传送 API;需要更改代码。
Heroku Kafka Azure 事件中心 (与 Kafka 兼容的终结点) 低 - Event Hubs 服务直接支持 Kafka 协议。
Bucketeer / S3 加载项 Azure Blob 存储 中等——需要对文件进行 SDK 或 API 更改。
Memcachier Azure Cache for Redis 低 - Redis 支持 memcache 兼容的协议。
Heroku Connect (Salesforce) Azure 逻辑应用 或Power Automate 高 — 不同的集成方法;需要重新设计工作流。

对于 Heroku 应用程序中的每个附加组件,请遵循以下常规模式:

  1. 预配Azure等效服务。
  2. 迁移任何持久性数据(数据库,storage)。
  3. 更新容器应用环境变量中的连接字符串和凭据。
  4. 在删除 Heroku 加载项之前验证集成。

缩放比较

Heroku 使用固定动态模型,可在其中设置特定的实例计数。 Azure 容器应用使用由 KEDA 提供支持的基于规则的自动缩放,从而根据需求调整副本。

能力 Heroku Azure 容器应用
缩放机制 手动动态计数 基于规则的自动缩放(HTTP、CPU、队列长度、cron、自定义)
缩放到零 不可用 支持 - 空闲时无需成本
最小实例数 至少需要 1 个 dyno 可配置:0 个或多个副本
最大实例数 依赖于计划 每个容器应用最多 300 个副本
缩放触发器 无 - 仅手动 HTTP 并发、TCP 连接、CPU、内存、Azure 队列、自定义 KEDA 缩放程序

关键缩放概念

  • min-replicas: 0 启用缩放至零功能,当没有流量时,可以消除空闲应用的成本。
  • max-replicas 限制用于控制成本的实例数。 保守开始,并根据监视数据进行调整。
  • HTTP 并发扩展是 Web 应用程序最简单的起点。 当每个实例的并发请求超出阈值时,它会添加副本。
  • 基于队列的缩放 非常适合工作进程。 将工作进程部署为可以根据队列深度自动扩展的单独容器应用。

小窍门

对于必须始终准备就绪的生产应用,请设置为 min-replicas1。 对于开发和测试环境,使用 min-replicas: 0 节省成本。

成本比较

Scenario Heroku (标准-1X) Azure 容器应用 (消耗)
空闲应用 (24/7) ~ 每个 dyno 每月 $25 $0 (缩放为零)
低流量应用 ~ 每个 dyno 每月 $25 ~ $1-5/月
高流量应用(10 个实例) ~ $250/月 因实际 CPU 和内存使用而异
每月无偿补助 None 180,000 个 vCPU 秒 + 200 万个请求

有关详细定价,请参阅 Azure 容器应用 定价

工作者和后台作业

如果 Heroku 应用使用工作进程 dynos(在Procfile中定义),请将每个工作进程类型部署为同一环境中的单独容器应用。 使用基于队列的缩放,而不是固定实例计数。

Heroku 模式 Azure 容器应用模式
web 进程类型 具有 HTTP 入口和基于 HTTP 的缩放的容器应用
worker 进程类型 基于队列的缩放的容器应用(无入口)
定时任务(Heroku 调度器) 使用 cron 时间表的容器应用作业
一次性任务 (heroku run 使用手动触发器的容器应用作业

常见陷阱

在迁移之前和期间查看这些常见问题,以避免延迟。

陷阱 症状 决议
PORT 环境变量 应用不响应请求。 容器应用程序设置一个 PORT 变量,并期望您的应用程序监听它。 如果端口是硬编码的,请在创建容器应用时将 --target-port 设置为匹配。 大多数 Heroku 应用已从环境中读取 PORT ,无需更改即可工作。
临时文件系统 在运行时写入的文件在重启后消失。 与 Heroku 一样,容器应用使用临时文件系统。 对于永久性文件,装载 Azure 文件共享
缩放配置错误 在负载下的意外成本或性能不佳。 从 Web 应用的 HTTP 并发缩放开始,并使用 Azure Monitor 进行监视。 在了解应用的资源消耗之前,请避免设置 max-replicas 过高。
环境一致性 开发、测试和生产之间的配置偏差。 使用基础结构即代码(BicepTerraform),以保持环境一致性。 此方法取代了Heroku Pipelines提供的一致性。
第三方服务 不必要的 SaaS 加载项迁移工作。 许多 Heroku 加载项是独立的 SaaS 产品(SendGrid、MongoDB Atlas、Elasticsearch)。 这些服务通常继续从容器应用工作 - 仅更新连接 URL。 只有 Heroku 托管服务(Heroku Postgres、Heroku Redis、Heroku Kafka)需要迁移到Azure等效项。
云构建可用性 az containerapp up --source 失败或者出现 ManagedEnvironmentNotFound 生成器错误。 Cloud Build 在并非所有区域或语言框架中都可用。 回退到基于 ACR 的方法:创建 Dockerfile,使用 az acr build 构建并 部署镜像。 有关这两种方法,请参阅 从 Heroku 迁移应用
机密和环境变量的排序 引用机密的环境变量解析为空。 在环境变量中引用之前,请先设置机密az containerapp secret set 另请注意,单独设置机密不会重启应用 , 你需要 az containerapp update 创建新的修订。
Azure服务预配时间 迁移所需的时间比预期长。 Azure 托管服务的预配时间比 Heroku 加载项更长。 Azure Cache for Redis可能需要 10-20 分钟;Azure Database for PostgreSQL可能需要 5-10 分钟。 部署应用时并行预配这些服务。

后续步骤