将已有的云基础设施导入 Pulumi 项目

2025-06-30#Pulumi#IaC

Pulumi 是一个用户实现“基础设施即代码” 的工具。遗留项目中的基础设置,可能是手动创建或者使用其他工具创建,那么如何使用 Pulumi 管理这些已有资源呢?Pulumi 提供“导入”功能,将这些资源导入到 Pulumi 项目中,实现基础设施即代码。

导入资源 🔗

Pulumi 提供了两种方式导入现有资源:单次导入和批量导入。

导入单个资源 🔗

参考官方文档《pulumi import》,使用 pulumi import 命令,并传入资源的类型、名称和 ID,即可导入。

批量导入 🔗

导入单个资源的情况比较少见,通常需要导入多个资源。那么如果通过调用多次 pulumi import 导入单个资源的话,就会比较慢。幸运的是,pulumi import还支持批量导入(见文档《Bulk Import Operations》):首先将需要导入的资源写入文件(比如 ./my-resources.json),然后使用如下命令导入:

pulumi import --file ./my-resources.json

那么,如何定义这个文件呢?它的结构类似如下:

{
  "resources": [
    {
      "type": "...",
      "name": "...",
      "id": "..."
    }
  ],
  "nameTable": {
    "variableName": "resource urn"
  }
}

其中,resources 里的每个资源,可能还会有 parent 字段等。

更新和执行代码 🔗

pulumi import 命令执行后,还需要修改代码。幸运的是,这条命令在运行成功后,会贴心地打印出已导入资源对应的代码,可作为参考。

同时,导入的资源被标记成了 protected,需要执行 pulumi up 才可以解除保护。此后,这些导入的资源就被真正被 Pulumi 管理了。

实操经验 🔗

在导入资源时,可能会出现认为错误。比如,未能正确设置资源ID。为此,可以将状态文件回滚到导入之前,然后重新导入。注意,状态文件是快照文件,而不是增量文件(checkpoint)。