Рубрики
Uncategorized

Переменные среды приложения Google Cloud App

Одним из моих недавних проектов привлекла приложение, которое должно было размещено на приложении Google Cloud App …. Теги с GCP, облаком, AppEngine, Devops.

Одним из моих недавних проектов включала приложение, которое должно было размещено на приложении Google Cloud App. Раньше я не использовал приложение, но мне удалось приложения на Heroku и OpenShift и было интересно посмотреть, что пришлось предложить Google Cloud Paa.

Это было довольно стандартное приложение Node.js с большинством конфигурации, выполненной с переменными среды. Вскоре стало ясно, что это может быть проблемой — приложение-двигатель не поддерживает настраиваемые переменные среды.

Умышленное или нет, App Engine имеет только один способ определить эти переменные — в App.yaml конфигурационный файл. Этот файл описывает настройки приложений (время выполнения, сопоставления URL и т. Д.), В том числе env_variables Раздел, который поручает приложению двигателя устанавливать переменные среды на развертывание.

Пример app.yaml. Содержание файла:

runtime: nodejs10

handlers:
- url: /api/.*
  script: auto
  secure: always

- url: /.*
  static_files: index.html
  upload: index.html
  secure: always
  http_headers:
    X-Frame-Options: deny
    X-DNS-Prefetch-Control: off
    X-XSS-Protection: 1; mode=block
    X-Permitted-Cross-Domain-Policies: none

env_variables:
    VAR1: 'VALUE1'
    VAR2: 'VALUE2'

Наш трубопровод развертывания уже был полностью автоматизирован, поэтому мне нужно было хранить App.yaml Файл где-нибудь предоставить его создать сервер, прежде чем нажать код в Google Cloud. В идеале это был бы репозиторий кода применения. Однако, имеющие переменные среды в App.yaml Файл вызвал проблему: нам также необходимо для совершения конфигурации приложений к репозитории, либо оставить весь файл без упущенного. Ни один из этих вариантов не подходил, поэтому я начал искать любые другие способы борьбы с этим ограничением приложений.

В качестве бокового примечания Heroku и OpenShift (по крайней мере, его предыдущее воплощение) имеют возможность установить переменные среды из интерфейса веб/командной строки, которые упрощают управление конфигурацией приложения.

Мой поиск принес мне некоторые разочаровывающие результаты:

  1. Храните конфигурацию приложений в Google Cloud DataStore и прочитайте от него на запуск приложения ( Link ).
  2. Шифрование значений конфигурации с облачными KMS и посвящена вместе с остальными App.yaml Конфигурация ( ссылка ).
  3. Используйте отдельные App.yaml Файлы для разных сред (и, и, наверное, совершайте их все в репозитории?) ( та же ссылка ).

Вариант № 1 Предполагается дополнительный компонент в нашей инфраструктуре и блокировке поставщика в базу данных Google Cloud DataStore, которая была далеко от идеальной.

Вариант № 2 Решил охраняемую часть проблемы, но означал бы жесткодирующие в зашифрованные значения, специфичные для окружающей среды к кодовой базе. Также потребуется обновить код с помощью каждой новой добавленной среды или любые изменения в существующие переменные среды. Не идеально.

Вариант № 3 Не решал проблему вообще — код все равно будет хранить информацию о своей среде и секретам приложений будет доступна прямо в репозитории кода …

Дополнительный шаг в трубопроводе развертывания

В конце концов, я придумал подход, который участвует компиляции App.yaml Файл из файла шаблона во время процесса сборки. В этот момент мы использовали Google Cloud Build в качестве сервера сборки для CI/CD, но быстро переехали в Gitlab Ci Так как облачная сборка не поддерживает переменные среды либо Отказ

Быть справедливым, я должен упомянуть, что поддерживает облачные сборки «Замена» , которые удаленно похожи на переменные среды. К сожалению, единственным способом пропустить замены на работу на сборку — через аргументы командной строки, что означает управление переменными среды где-то снаружи. И это возвращает нас к оригинальной проблеме …

Приложение уже использовало библиотеку EJS, поэтому я использовал его для компиляции шаблона:

# app.tpl.yaml
runtime: nodejs10
env_variables:
  SSO_CLIENT_ID: <% SSO_CLIENT_ID %>
  SSO_SECRET: <% SSO_SECRET %>

С помощью сценария:

// bin/config-compile.js
const fs = require('fs');
const ejs = require('ejs');

const template = fs.readFileSync('app.tpl.yaml').toString();
const content = ejs.render(template, process.env);

fs.writeFileSync('app.yaml', content);

и Gitlab Ci Stept аналогичен этому:

# .gitlab-ci.yml
config-compile:
  stage: build
  image: node:10
  script:
    - node bin/config-compile.js
  artifacts:
    paths:
      - app.yaml
    expire_in: 1 days
    when: always

Это позволило нам управлять конфигурацией приложения в переменных среды GitLab.

Подход может быть легко адаптирован к любой другой библиотеке шаблонов, языка программирования или сервера сборки, код выше просто примером.

Примечание о безопасности

Мне было интересно, что один из самых старых продуктов Google Cloud не поддерживает такую общую функциональность. Тем не менее, я принимаю, могут быть допустимые соображения безопасности для этого, например, E.g. Воздействие уязвимости зависимости, аналогичной обнаруживаемой в Rest-Client или опечатка, как В НПМ реестра Отказ Это особенно актуально, поскольку App Engine не предоставляет опции для ограничения/управления исходящими соединениями из среды.

Альтернативные решения не покрыты в этом посте

Оригинал: «https://dev.to/mungell/google-cloud-app-engine-environment-variables-5990»