Одним из моих недавних проектов включала приложение, которое должно было размещено на приложении 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 (по крайней мере, его предыдущее воплощение) имеют возможность установить переменные среды из интерфейса веб/командной строки, которые упрощают управление конфигурацией приложения.
Мой поиск принес мне некоторые разочаровывающие результаты:
- Храните конфигурацию приложений в Google Cloud DataStore и прочитайте от него на запуск приложения ( Link ).
- Шифрование значений конфигурации с облачными KMS и посвящена вместе с остальными
App.yaml
Конфигурация ( ссылка ). - Используйте отдельные
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 не предоставляет опции для ограничения/управления исходящими соединениями из среды.
Альтернативные решения не покрыты в этом посте
- » Секреты в Google App Engine « Stuart Leitch
- » Как использовать переменные среды в App GCloud App Engine « Гунар Гесснер
Оригинал: «https://dev.to/mungell/google-cloud-app-engine-environment-variables-5990»