倍数输出适用 | 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 可以计算出顺序(尽管拥有它们并没有坏处)
我正在尝试获取两个输出(负载平衡器)的值并将它们注入容器定义资源 (aws.ecs.TaskDefinition
)。
负载均衡器和任务定义都在同一个堆栈中创建,依赖性使用 depends_on
标志进行管理。
我按照 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 可以计算出顺序(尽管拥有它们并没有坏处)