You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pulumi创建Dynamic Listener Rules时TypeScript类型错误排查

问题定位:Pulumi创建Listener Rule时的TypeScript编译错误

咱们直接拆解问题根源和解决办法:

编译错误的核心原因

  1. 初始类型不匹配
    你一开始把configuration.conditions初始化成了空对象{},但Pulumi的ListenerRuleArgs要求conditions必须是数组类型(或Pulumi Output包装的数组),空对象完全不符合这个类型定义——TypeScript编译阶段只认变量声明时的初始类型,哪怕你后续会把它改成数组,编译时依然会触发类型不兼容的报错。

  2. 循环逻辑的隐藏bug
    你内部循环里每次都直接覆盖configuration.conditions为新数组,这意味着如果某条规则有多个条件(比如同时包含pathPattern和hostHeader),最后只会保留最后一个条件,前面的都会被冲掉,这是逻辑层面的问题,得一起修正。

修复后的代码示例

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";

const config = new pulumi.Config()
const listener_rules_data = JSON.parse(config.require("listener_rules_data"))

// 假设你已提前定义project_name和httpsListener
let rulePriority = 0;

// 改用for...of遍历规则数组,更直观安全
for (const ruleData of listener_rules_data) {
    // 初始化时就把conditions设为空数组,直接匹配Pulumi要求的类型
    const ruleConfig: aws.lb.ListenerRuleArgs = {
        listenerArn: httpsListener.arn,
        priority: rulePriority,
        // 注意:forward类型的action必须指定targetGroupArn,原代码漏了,部署时会失败
        actions: [{ 
            type: "forward",
            targetGroupArn: yourTargetGroup.arn // 替换成你的目标组ARN
        }],
        conditions: [],
    };

    // 遍历当前规则的所有条件类型(比如pathPattern)
    for (const [conditionType, values] of Object.entries(ruleData)) {
        // 把每个条件push到数组,而非覆盖整个数组
        ruleConfig.conditions.push({
            [conditionType]: { values: values as string[] }
        });
    }

    new aws.lb.ListenerRule(`${project_name}-https-rule-${rulePriority++}`, ruleConfig);
}

额外注意点

  • 原代码里的actions只写了type: "forward",但Pulumi要求forward类型的动作必须指定targetGroupArn,不然部署时会报错,示例里已补上,记得替换成你实际的目标组ARN。
  • 用Object.entries遍历对象键值对,比for...in更安全,不会意外遍历到对象原型链上的属性。
  • 把变量名i改成rulePriority,可读性更好,避免歧义。

内容的提问来源于stack exchange,提问作者Roman Newaza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:37:42