【发布时间】:2022-11-11 17:23:23
【问题描述】:
任务定义中的 containerDefinition 需要作为单个有效 JSON 文档提供。我正在创建一个应该处理动态数据的通用 ECS 服务。这是代码:
genericClientService(environment: string, targetGroupArn: Output<string>) {
return new aws.ecs.Service(`${this.domainName}-client-service-${environment}`, {
cluster: this.clientCluster.id,
taskDefinition: new aws.ecs.TaskDefinition(`${this.domainName}-client-${environment}`, {
family: `${this.domainName}-client-${environment}`,
containerDefinitions: JSON.stringify(
clientTemplate(
this.defaultRegion,
this.domainName,
this.taskEnvVars?.filter((object: { ENVIRONMENT: string }) => object.ENVIRONMENT === environment),
this.ecrRepositories
)
),
cpu: "256",
executionRoleArn: taskDefinitionRole.arn,
memory: "512",
networkMode: "awsvpc",
requiresCompatibilities: ["FARGATE"],
}).arn,
desiredCount: 1,
...
需要来自已构建资源的信息this.ecr 存储库它表示所需的 ECR 存储库列表。这里的问题是,假设您要检索存储库 URL 并应用必要的“apply()”方法,它将返回一个 Output<string>。这通常会很好,但因为容器定义必须是有效的 JSON 文档,Pulumi 无法处理,因为 Output<T> 上的 JSON 不受支持;
不支持在 [Output<T>] 上调用 [toJSON]。要将输出的值作为 JSON 值或 JSON 字符串,请考虑: 1: o.apply(v => v.toJSON()) 2: o.apply(v => JSON.stringify(v)) 见@ 987654321@了解更多详情。这个函数可能会抛出@pulumi/pulumi 的未来版本。 块引用
由于动态传递的变量被包装在 toJSON 函数回调中,上述建议的考虑都不起作用。因此,如何传递资源信息并不重要,因为它始终是一个 Output<T>。
有没有办法处理这个问题?
【问题讨论】:
-
this.ecrRepositories和clientTemplate返回值的类型是什么? -
@MikhailShilkov
clientTemplate返回一个对象数组,其中包含 TaskDefinition 资源属性的输入,如下所述:pulumi.com/registry/packages/aws/api-docs/ecs/taskdefinition。this.ecrRepositories是一组从多个 ECR 存储库返回的预定义值。即:this.ecrRepositories.clientUrl = this.client.repository.repositoryUrl.apply((url) => url);` 这使得 clientUrl(在 this.ecrRepositories 中)成为Output<string>(需要为 'image' 属性是一个TaskDefinition 资源属性)。
标签: json typescript pulumi ecs-taskdefinition