Heroku 到 Azure Container Apps 迁移概述

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

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

概念映射

下表将核心 Heroku 平台功能映射到其Azure Container Apps等效项。

Heroku 概念 Azure Container Apps 等效产品 注释
应用(Web dyno) 容器应用 运行应用程序代码的单个可部署单元。
Dyno 类型 + 手动缩放 基于 KEDA 的自动缩放 基于规则的自动缩放,包括缩放到零。 替换手动动态计数管理。
Buildpacks(Slug 编译) 容器镜像或 云本机生成包 使用az containerapp up --source 来体验类似于构建包的功能,或使用自定义的 Dockerfile。
配置变量 Environment variables + Azure Key Vault 非敏感值使用环境变量。 机密使用Key Vault引用或容器应用机密。
加载项 (Postgres、Redis 等) Azure托管服务 有关完整映射信息,请参阅 服务等效项
heroku CLI(命令行界面) az containerapp CLI 使用 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 Application Insights 中 - 需要 SDK 或自动检测更改。
SendGrid 通过 Azure Marketplace 使用 SendGrid 或 Azure Communication Services 低 - SendGrid 会继续在 Azure 上运行,只需更新连接信息。
CloudAMQP (RabbitMQ) Azure Service Bus 高 - 不同的消息传送 API;需要更改代码。
Heroku Kafka Azure Event Hubs (与 Kafka 兼容的终结点) 低 - Event Hubs 服务直接支持 Kafka 协议。
Bucketeer / S3 加载项 Azure Blob Storage 中等——需要对文件进行 SDK 或 API 更改。
Memcachier Azure Cache for Redis 低 - Redis 支持 memcache 兼容的协议。
Heroku Connect (Salesforce) Azure Logic Apps 或 Power Automate 高 — 不同的集成方法;需要重新设计工作流。

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

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

缩放比较

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

能力 Heroku Azure Container Apps
缩放机制 手动动态计数 基于规则的自动缩放(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 Container Apps (消耗)
空闲应用 (24/7) ~ 每个 dyno 每月 $25 $0 (缩放为零)
低流量应用 ~ 每个 dyno 每月 $25 ~ $1-5/月
高流量应用(10 个实例) ~ $250/月 因实际 CPU 和内存使用而异
每月无偿补助 None 180,000 个 vCPU 秒 + 200 万个请求

有关详细定价,请参阅 Azure Container Apps 定价

工作者和后台作业

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

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

常见陷阱

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

陷阱 症状 决议
PORT 环境变量 应用不响应请求。 容器应用程序设置一个 PORT 变量,并期望您的应用程序监听它。 如果端口是硬编码的,请在创建容器应用时将 --target-port 设置为匹配。 大多数 Heroku 应用已从环境中读取 PORT ,无需更改即可工作。
临时文件系统 在运行时写入的文件在重启后消失。 与 Heroku 一样,容器应用使用临时文件系统。 对于永久性文件,装载Azure Files共享
缩放配置错误 在负载下的意外成本或性能不佳。 首先,使用 Azure Monitor 对web apps进行 HTTP 并发缩放和监视。 在了解应用的资源消耗之前,请避免设置 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 分钟。 部署应用时并行预配这些服务。

后续步骤