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 输出 - 创建一个外部配置文件的主要内容,如果未能解决你的问题,请参考以下文章