Лучший способ использовать выходные данные pulumi в коде моего приложения

#amazon-web-services #azure #terraform #infrastructure-as-code #pulumi

#amazon-web-services #azure #terraform #инфраструктура как код #pulumi

Вопрос:

Мне было интересно, как лучше всего использовать результат развертывания Pulumi в коде моего приложения. Чтобы привести конкретный пример, предположим, что мой стек Pulumi генерирует следующий URL-адрес для конечной точки шлюза API

     [Output]
    public Output<string> APIEndpoint { get; set; }
  

Этот URL-адрес должен использоваться кодом JavaScript, хранящимся в корзине S3. JavaScript объединяется webpack во время сборки, а затем сохраняется в корзине S3 также с помощью Pulumi во время развертывания.

Каков наилучший способ передать этот URL-адрес в интерфейсный код пакета JavaScript?

Комментарии:

1. Установить переменную среды для webpack?

2. Но пакет webpack является частью сборки, и URL-адрес не известен до завершения развертывания. Кроме того, в зависимости от среды URL-адрес может отличаться в разных средах. Теперь, учитывая это, мне кажется, что Pulumi нужно сгенерировать что-то на Javascript в корзине S3, которая содержит URL-адрес, на который может ссылаться пакет, созданный webpack. Мне было интересно, является ли это лучшей практикой, которой придерживается большинство людей?

Ответ №1:

После некоторых исследований я решил использовать это решение.

URL-адрес времени развертывания вводится в объект window, как показано ниже

 window['runtime-config'] = {
    apiUrl: 'http://localhost:8080/api'
}
  

И он используется интерфейсом приложения

     var value = document.getElementById("my_input").value;
    const url = window["runtime-config"].apiUrl;
  

И runtime-config.js файл перезаписывается во время развертывания перед копированием в корзину S3

     Func<string, Output<string>?> overwriteFiles = fileName => fileName == "runtime-config.js"? url.Apply(x=>$@"window['runtime-config'] = {{apiUrl: '${x}'}}") : null;  
    var objects = bucket.BucketName.Apply(bucketName => LoadFilesToS3(@"./public", bucketName, overwriteFiles));