Pulumi 输出 - 创建一个外部配置文件

Posted

技术标签:

【中文标题】Pulumi 输出 - 创建一个外部配置文件【英文标题】:Pulumi Outputs - create an external config file 【发布时间】:2021-10-10 08:18:08 【问题描述】:

我在 GCP 中使用 Cloudrun,想总结一下使用 API Gateway 创建的 API。这需要创建一个 Swagger/OpenAPI v2 文档,其中包含 Google 为 Cloudrun 服务生成的 URL。

如何将这些从 Pulumi 输出中获取到 swagger 文件中以作为 API 配置上传?

我最初希望使用 Moustache。但现在我正在尝试使用原始 JSON,但仍然没有成功。我试过apply()interpolate 但总是[object Object] 从来没有部署服务的url。

"x-google-backend": 
  "address": 
    "[object Object]":null
  ,
  "path_translation":"APPEND_PATH_TO_ADDRESS"

我错过了什么?

是否有可能直接使用 mustache 进行此操作,而无需使用反序列化的 Swagger?

要重新创建的代码:

一个基本的 Swagger 文件my-spec.yaml

swagger: '2.0'

info:
  title: Demo for URL Replacement
  version: 0.0.1

schemes:
  - https

paths:
  /users:
      post:
        summary: Registers a new user to the service
        operationId: createUser
        x-google-backend:
          address: apiUsersUrl # Output URL from CloudRun, in moustache format
          path_translation: APPEND_PATH_TO_ADDRESS
        responses:
          201:
            description: Success
        security:
        - api_key: []

securityDefinitions:
  api_key:
    type: apiKey
    name: x-api-key
    in: header

我的文件用于编写新的 API 配置。

import * as pulumi from '@pulumi/pulumi';
import * as yaml from 'js-yaml';
import * as fs from 'fs';
import  Spec  from '../types/Swagger';

export function buildApiSpecJS(usersUrl: pulumi.Output<string>) 
  const specFile = fs.readFileSync(`$__dirname/my-spec.yaml`, 'utf8');
  const specTemplate= yaml.load(specFile) as Spec;

  usersUrl.apply((url) => 
    let pathName: keyof typeof specTemplate.paths;
    // eslint-disable-next-line guard-for-in
    for (pathName in specTemplate.paths) 
      const path = specTemplate.paths[pathName];
      let operation: keyof typeof path;
      for (operation in path) 
        if (path[operation] !== '$ref') 
          const address: string = path[operation]['x-google-backend']?.address;
          if (address === 'apiUsersUrl') 
            path[operation]['x-google-backend'].address = pulumi.interpolate`$url`;
          
        
      
    

    fs.writeFileSync(`$__dirname/testfile.json`, JSON.stringify(specTemplate));
  );

类型中的Spec 是从DefinitelyTyped Definition 复制和修改的

// Changes:
//  - Operation is edited to add the Google Backend

export interface GoogleBackend 
  address: string;
  jwt_audience?: string;
  disable_auth?: boolean;
  path_translation?: string; // [ APPEND_PATH_TO_ADDRESS | CONSTANT_ADDRESS ]
  deadline?: string;
  protocol?: string; // [ http/1.1 | h2 ]
;

//
///// .... Copied Types ....
//

// ----------------------------- Operation -----------------------------------
export interface Operation 
  responses:  [responseName: string]: Response | Reference ;
  summary?: string | undefined;
  description?: string | undefined;
  externalDocs?: ExternalDocs | undefined;
  operationId?: string | undefined;
  produces?: string[] | undefined;
  consumes?: string[] | undefined;
  parameters?: Array<Parameter | Reference> | undefined;
  schemes?: string[] | undefined;
  deprecated?: boolean | undefined;
  security?: Array< [securityDefinitionName: string]: string[] > | undefined;
  tags?: string[] | undefined;
  'x-google-backend': GoogleBackend | undefined;  // Added


//
///// Copied Types continue....
//

【问题讨论】:

【参考方案1】:

我选择的解决方案是 DomainMapping 和 DNS。 我使用 DomainMapping 在每个环境中为 Cloud Run 服务创建一个可预测的名称。例如api-users.dev.example.com.

然后,由于我提前知道该名称,我可以将它用于 API 规范中的 Mustache 替换。

【讨论】:

以上是关于Pulumi 输出 - 创建一个外部配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Pulumi 如何在 Windows 环境中设置

Pulumi kubernetes ConfigGroup 需要字符串,我只有输出

jar配置文件怎么打包到外面eclipse

是否可以使用 Pulumi 创建 Azure 服务主体?

006 引入外部配置文件

spring boot项目application.properties多环境配置文件jar包外部配置文件