【问题标题】:How to pass Pulumi's Output<T> to the container definition of a task within ecs?如何将 Pulumi 的 Output<T> 传递给 ecs 中任务的容器定义?
【发布时间】: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.ecrRepositoriesclientTemplate 返回值的类型是什么?
  • @MikhailShilkov clientTemplate 返回一个对象数组,其中包含 TaskDefinition 资源属性的输入,如下所述:pulumi.com/registry/packages/aws/api-docs/ecs/taskdefinitionthis.ecrRepositories 是一组从多个 ECR 存储库返回的预定义值。即:this.ecrRepositories.clientUrl = this.client.repository.repositoryUrl.apply((url) => url);` 这使得 clientUrl(在 this.ecrRepositories 中)成为Output&lt;string&gt;(需要为 'image' 属性是一个TaskDefinition 资源属性)。

标签: json typescript pulumi ecs-taskdefinition


【解决方案1】:

假设clientTemplate 正常工作并且错误发生在您共享的 sn-p 中,您应该能够解决它

containerDefinitions: pulumi.all(
    clientTemplate(
        this.defaultRegion,
        this.domainName,
        this.taskEnvVars?.filter((object: { ENVIRONMENT: string }) => object.ENVIRONMENT === environment),
        this.ecrRepositories
  )).apply(JSON.stringify),

【讨论】:

  • 谢谢!所以这个解决方案等待所有多个输出可用,然后将它们提供给提供的回调,非常聪明。作品!
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2021-03-07
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多