У меня есть сценарий и производственный проект на App Engine, с 6 сервисами на каждом.
На данный момент мы развертываем с компьютера разработчиков, используя
gcloud app deploy app.staging.yaml --project staging-project
или gcloud app deploy app.production.yaml --project production-project
Работает, но вызывает проблемы с переменными среды, особенно с секретами.
Наши приложения получают ключи Api, учетные данные базы данных и другие данные из переменных среды, что позволяет нам запускать одно и то же приложение локально, в контейнере Docker или в App Engine, не зная, где оно развернуто.
Если я буду использовать документацию для развертывания, наши файлы app.yaml будут выглядеть так:
app.production.yaml
runtime: nodejs
env: flex
manual_scaling:
instances: 1
env_variables:
DATABASE_PASSWORD: "topsecret"
MY_API_KEY: "ultrasecret"
Я думаю, что все легко понимают, почему плохая идея хранить это в репозитории Git.
На данный момент у нас есть этот теневой файл, который каждый разработчик должен заполнить перед развертыванием
app.production.yaml.shadow
runtime: nodejs
env: flex
manual_scaling:
instances: 1
env_variables:
DATABASE_PASSWORD: "set me"
MY_API_KEY: "set me"
Но по мере роста команды и того, что мы хотим, чтобы все могли развертываться на стадии подготовки, становится все труднее иметь правильные настройки для каждого разработчика и каждой услуги.
Я обнаружил 3 обходных пути и причину их неиспользования:
- Использование Google KMS - позволяет нам помещать зашифрованные секреты непосредственно в проект, но для их расшифровки требуется, чтобы мы добавили пользовательский код в наши приложения. Это создает другую среду управления между местным, промежуточным и производственным. Это увеличивает риск ошибок из-за сложности.
- Хранить секреты в Google Datastore - Я попробовал, я создал помощник, который ищет env vars в proccess.ENV, затем в кеше и в конечном итоге в Datastore. Но, как и в KMS, это значительно увеличивает сложность.
- Хранить секреты в файле JSON и помещать в Google Cloud Storage : опять же, требуется загрузить переменные env через помощника, который проверяет env vars, затем загружает файл и т. Д. ...
В конечном счете, мы изучаем возможность использования сервера развертывания , который будет запускаться разработчиками или Continuous Integration и обрабатывать все инъекции секретов при развертывании в App Engine. Но такие инструменты, как Ansible , Salt, Puppet, Chef имеют только плагины для Compute Engine и не поддерживают App Engine.
+-------------------------+ +-------------------+ +---------------------+
| | | +---> |
| Developer workspace | | Ansible | | App Engine STAGING |
| +----> (or other) | | |
+-------------------------+ | | +---------------------+
| |
+-------------------------+ | | +---------------------+
| +----> Injects secrets | | |
| Continous Integration | | | App Engine PROD. |
| | | +---> |
+-------------------------+ +-------------------+ +---------------------+
Это подводит меня к 3 вопросам:
- Считаете ли вы хорошей идеей использование сервера развертывания с App Engine?
- Как я могу убедиться, что производственные и промежуточные секреты поддерживают синхронизацию, чтобы развертывания от разработчиков всегда были правильными?
- Есть ли способ использовать классические переменные среды для секретов в App Engine?