火山引擎服务实践:控制台与 Pulumi 两种方式
需求与整体说明
一个新项目要在火山引擎上开一整套基础服务:PostgreSQL、Redis、MongoDB、Elasticsearch、Kafka、对象存储、负载均衡和 Kubernetes 集群,外加访问控制(IP 白名单)、备份策略和一批团队账号。
同一件事有两种做法,本文都记录下来:
- 控制台手动创建 —— 打开网页照着向导点,参数有默认值和联动校验,适合第一次摸一个产品。
- Pulumi 代码化 —— 把资源写成 Python 代码,
pulumi up创建、pulumi destroy回收,适合要复制多套环境或者批量操作的场景。
两条路径的取舍放在文末对比。
方式一 控制台手动创建
白名单设置
各个服务都要设防火墙,只放通白名单。默认开通公网访问,需要单独申请公网 IP。
IP 白名单内容:
1 | # lan |
备份策略
各服务的备份按数据重要程度分档,能重建的一律不备份:
| 服务 | 保留时长 | 全量 | 增量 |
|---|---|---|---|
| PostgreSQL | 30 天 | 每周一三五七 | 每 2 小时 |
| MongoDB | 30 天 | 每天 | 无 |
| Elasticsearch | 不备份 | 无 | 无 |
| Milvus | 不备份 | 无 | 无 |
| 对象存储 | 不备份 | 无 | 无 |
PostgreSQL

创建完成后到「实例 - 账号管理」新增一个高权限账号。
Redis

MongoDB


只给第一个节点地址申请公网地址即可。
Elasticsearch

给 Kibana 开通公网访问即可,ES 本身走 http。
Kafka

不需要开通公网访问。记得打开自动创建 Topic 和 Group。
对象存储

在「权限管理 - 存储桶授权策略管理」里配置目录级别的匿名只读,下面是两套环境的策略。
cms 环境:
1 | { |
prod 环境:
1 | { |
向量检索服务 Milvus
向量检索这块用的是阿里云向量检索服务 Milvus,和火山上的其他服务混着用:

负载均衡

Kubernetes
先建集群,再建节点池,然后才能发布服务:







集群建好后还有一些附加配置要过一遍:




方式二 Pulumi 代码化
Pulumi 是一个开源的基础设施即代码(IaC)工具,用真正的编程语言而不是 DSL 来描述和管理云资源。相比上面一屏屏点,代码能进 Git、能 review、能重复执行。
安装方式见 https://www.pulumi.com/docs/iac/download-install/,火山引擎 provider 的资源清单见 https://www.pulumi.com/registry/packages/volcengine。
安装与初始化
新建项目目录,选 Python 模板,然后把 provider 和凭据配好。--secret 会把 key 加密后存进 stack 配置,不会明文落盘:
1 | mkdir volcengine && cd volcengine |
PostgreSQL 实例
创建实例
对应控制台里那一屏 PostgreSQL 表单,规格、可用区、存储、参数都在代码里写清楚:
1 | import pulumi |
执行创建:
1 | pulumi up |
查询已有实例
已经存在的实例可以用 get 导入进来查看,注意这里用的是 volcengine.rds.Instance 而不是创建时的 rds_postgresql:
1 | import pulumi |
同样执行:
1 | pulumi up |
返回的信息比控制台详情页还全,连接地址、节点分布、计费方式、参数一次性都在这里:
1 | - postgres_instance_id: { |
销毁实例
测试环境用完一条命令回收,这是控制台方式很难做到的:
1 | pulumi destroy |
IAM 用户与用户组
这是代码化收益最明显的场景。八个人分属产品、开发、运维三个团队,有人跨团队,有人只要控制台密码,有人只要访问密钥。手工点要开八次用户表单加十几次授权,写成循环则是一遍过:
1 | """火山引擎 IAM 用户和用户组管理模块 |
人员变动时改 USER_CONFIG 再 pulumi up,增删和授权变更都由 Pulumi 算差异,不用自己记上次点到哪一步。
两种方式对比与取舍
| 维度 | 控制台 | Pulumi |
|---|---|---|
| 上手成本 | 打开网页就能用,参数有向导和默认值 | 要装 CLI、建项目、配 provider 凭据 |
| 可复现性 | 靠截图和记忆,换个环境重建容易漏参数 | 代码进 Git,pulumi up 结果一致 |
| 变更记录 | 只能翻操作日志 | diff 即变更说明,可 review |
| 批量操作 | 用户、授权这类重复动作纯手工,易错 | 循环生成,八个用户和三组授权一遍过 |
| 回收测试资源 | 一个个找一个个删 | pulumi destroy 一次清干净 |
| 参数发现 | 表单会列出所有可选项和联动限制 | 得翻 provider 文档,字段名和控制台不完全对应 |
| 凭据管理 | 登录态即权限 | 需要长期 accessKey/secretKey,靠 --secret 加密存进 stack 配置 |
实际怎么分:
- 一次性、参数需要探索的,用控制台。 比如 VPC 和子网规划、备份策略、告警规则。这类东西建一次基本不动,而且控制台表单会明确告诉你哪些选项互斥、哪些可用区有货 —— Pulumi 里的
subnet_id、primary_zone_id这些值本来也得先从控制台确认。 - 要复制多套或者会反复调整的,用 Pulumi。 数据库实例、K8s 节点池这类 dev/staging/prod 各来一份的资源,代码化以后环境差异就是一个 stack 配置的区别。
- 批量且规则化的,一定用 Pulumi。 IAM 是最典型的例子,人员和权限矩阵写在代码里,谁在哪个组、有没有 access key 一目了然,比在控制台里逐个核对可靠得多。
- provider 没覆盖到的,退回控制台。 火山引擎 provider 的资源覆盖度和文档不如控制台完整,本文的 Pulumi 示例也只做到 RDS 和 IAM;查询已有实例甚至要从
rds_postgresql换成rds命名空间。遇到这类情况别硬扛,控制台点完再考虑要不要 import 进 Pulumi 管理。