倍数输出适用 | Output 类型的对象不是 JSON 可序列化的

Multiples Output Applies | Object of type Output is not JSON serializable

我正在尝试获取两个输出(负载平衡器)的值并将它们注入容器定义资源 (aws.ecs.TaskDefinition)。 负载均衡器和任务定义都在同一个堆栈中创建,依赖性使用 depends_on 标志进行管理。

我按照 中描述的解释进行了重现,但在我的具体情况下,我需要将两个变量传递给 class [=] 的属性 container_definitions 16=].

所以我尝试了:

首先定义它自己的负载均衡器:
load_balancer_1 = aws.lb.LoadBalancer("LoadBalancer1",
// stuff here
    )  
load_balancer_2 = aws.lb.LoadBalancer("LoadBalancer2",
    // stuff here
        )  
然后用正确的值创建辅助 json 方法对象,以便稍后我可以插入它们:
 def get_lb1_dnsName(lb1_dnsname):
        return json.dumps(
            {
                "name": "var1",
                "value": lb1_dnsname
            }         
        )
    
    def get_lb2_dnsName(lb2_dnsname):
        return json.dumps(
            {
                "name": "var2",
                "value": lb2_dnsname
            }         
        )
然后将辅助 json 对象插入到定义任务定义的主要 json 对象:
 container_task_definition = aws.ecs.TaskDefinition("TaskDefinition",    
        // stuff here
        container_definitions=json.dumps([
                {   "name":"foo",
                    "essential":True,
                    "image":"image-url:latest",
                    "logConfiguration": {
                        "logDriver": "awslogs",      
                        "options": {
                            "awslogs-group": "/ecs/foo",
                            "awslogs-region": "us-east-1",
                            "awslogs-create-group": "true",
                            "awslogs-stream-prefix": "ecs"
                        }
                    },
                    "environment": [
                        load_balancer_1.dns_name.apply(get_lb1_dnsName),
                        load_balancer_2.dns_name.apply(get_lb2_dnsName)
                     
                    ]
                }
            ]
        ),
        opts=pulumi.ResourceOptions(depends_on=[load_balancer_1, load_balancer_2])
    )

尽管我一直收到错误消息:

TypeError: Object of type Output is not JSON serializable

所以我想知道如何将负载平衡器 dns_name 正确设置为任务定义的环境变量。例如:

 "environment": [
                        "env1": dns_of_load_balancer_1
                        "env2": dns_of_load_balancer_2                      
                ]

创建单独的函数没问题,但如果您要处理多个输出,则需要使用 all

这是个人喜好,但我更喜欢用 apply 包裹整个字符串,最后看起来有点像这样:

task_definition = aws.ecs.TaskDefinition(
    "app-task",
    family="fargate-task-definition",
    cpu="256",
    memory="512",
    network_mode="awsvpc",
    requires_compatibilities=["FARGATE"],
    execution_role_arn=role.arn,
    container_definitions=pulumi.Output.all(lb_one=alb.dns_name, lb_two=alb2.dns_name).apply(
        lambda args: json.dumps(
            [
                {
                    "name": "my-app",
                    "image": "nginx",
                    "portMappings": [
                        {"containerPort": 80, "hostPort": 80, "protocol": "tcp"}
                    ],
                    "environment": [
                        {"name": "LOADBALANCER_ONE", "value": args["lb_one"]},
                        {"name": "LOADBALANCER_TWO", "value": args["lb_two"]},
                    ],
                }
            ]
        ),
    ),
)

除此之外,您实际上不需要在资源选项中显式 depends_on。通过将原始资源的输出用作任务定义的输入(通过 apply/all),Pulumi 可以计算出顺序(尽管拥有它们并没有坏处)