模式验证已加入 Pulumi ESC(使用 fn::validate)

发布: (2026年2月12日 GMT+8 22:00)
3 分钟阅读

Source: Pulumi Blog

工作原理

fn::validate 函数接受一个 JSON Schema 和一个值。如果该值符合模式,则保持不变直接通过;如果不符合,ESC 会抛出验证错误。

values:
  port:
    fn::validate:
      schema: { type: number, minimum: 1, maximum: 65535 }
      value: 8080

这会验证 port 是否是 1 到 65535 之间的数字。求值结果就是 8080

验证带必填字段的对象

对于复杂配置,你可以强制结构和必填字段:

values:
  database:
    fn::validate:
      schema:
        type: object
        properties:
          host: { type: string }
          port: { type: number }
          name: { type: string }
        required: [host, port, name]
      value:
        host: "db.example.com"
        port: 5432
        name: "myapp"

如果缺少任何必填字段或字段类型错误,环境将无法保存。

在多个环境中复用模式

一次定义模式后即可在多个环境中引用。使用environments 内置属性 可以将模式从环境输出中抽离。

模式环境 (my-project/schemas)

values:
  database-schema:
    type: object
    properties:
      host: { type: string }
      port: { type: number }
    required: [host, port]

使用该模式的环境

values:
  database:
    fn::validate:
      schema: ${environments.my-project.schemas.database-schema}
      value:
        host: "prod-db.example.com"
        port: 5432

这种模式确保团队和项目之间的验证规则保持一致。

验证失败时会发生什么

当值不符合其模式时,ESC 会返回清晰的错误信息:

values:
  port:
    fn::validate:
      schema: { type: string }
      value: 8080

这会抛出:expected string, got number。在修复值或更新模式之前,环境无法保存。

何时使用模式验证

在以下场景启用 fn::validate

  • 需要特定类型的值(数字、字符串、数组)
  • 必须包含特定字段的对象
  • 必须落在有效范围内的数字
  • 在多个环境之间共享的配置
  • 任何希望提前捕获错误以防止下游问题的值

入门指南

fn::validate 函数已在所有 Pulumi ESC 环境中可用。可以将模式验证添加到已有环境,也可以在创建新环境时使用。

更多信息,请参阅 fn::validate 文档

0 浏览
Back to Blog

相关文章

阅读更多 »

我的第一次成功的 CICD 部署

我刚开始我的 DevOps 学习之旅,已经掌握了 JavaScript、Git、GitHub Actions,稍微了解 Docker、构建工具和测试。我已经…