Как вы указали, в App Engine нет встроенного способа задания переменных среды, кроме файла app.yaml
. Я не эксперт в Spring Boot, но если вы не можете установить / переопределить некоторые хуки для инициализации env var из Java-кода до application.properties
оценки, вам нужно будет установить их во время сборки.
Вариант 1. Использование Cloud Build
Я знаю, что вы на самом деле не хотите использовать Cloud Build, но это будет что-то вроде этого.
Во-первых, следуя инструкциям здесь (после создания KeyRing и CryptoKey в KMS и предоставления доступа к учетной записи службы Cloud Build) с вашего терминала зашифруйте переменную среды, используя KMS, и верните ее представление base64:
echo -n $DB_PASSWORD | gcloud kms encrypt \
--plaintext-file=- \ # - reads from stdin
--ciphertext-file=- \ # - writes to stdout
--location=global \
--keyring=[KEYRING-NAME] \
--key=[KEY-NAME] | base64
Далее, скажем, у вас есть файл app.yaml
, подобный этому:
runtime: java11
instance_class: F1
env_variables:
USER: db_user
PASSWORD: db_passwd
создайте файл cloudbuild.yaml
, чтобы определить шаги сборки :
steps:
# replace env vars in app.yaml by their values from KMS
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args: ['-c', 'sed -i "s/TEST/$$PASSWORD/g" src/main/appengine/app.yaml']
secretEnv: ['PASSWORD']
- name: 'gcr.io/cloud-builders/mvn'
args: ['clean']
- name: 'gcr.io/cloud-builders/mvn'
args: ['package']
- name: 'gcr.io/cloud-builders/mvn'
args: ['appengine:deploy']
timeout: '1600s'
secrets:
- kmsKeyName: projects/<PROJECT-ID>/locations/global/keyRings/<KEYRING_NAME>/cryptoKeys/<KEY_NAME>
secretEnv:
PASSWORD: <base64-encoded encrypted password>
timeout: '1600s'
Затем можно развернуть приложение, выполнив следующую команду:
gcloud builds submit .
Преимущество этого метода заключается в том, что ваш локальный файл app.yaml
содержит только значения заполнителей и может быть безопасно зафиксирован. Или вы можете даже настроить эту сборку так, чтобы она автоматически запускалась при каждой фиксации в удаленном репозитории.
Опция 2: локально с помощью сценария bash
Вместо запуска mvn appengine:deploy
чтобы развернуть ваше приложение, вы можете создать скрипт bash, который заменит значения в app.yaml
, развернуть приложение и сразу удалить значения .. Что-то вроде:
#!/bin/bash
sed -i "s/db_passwd/$PASSWORD/g" src/main/appengine/app.yaml'
mvn appengine:deploy
sed -i "s/$PASSWORD/db_passwd/g" src/main/appengine/app.yaml'
и выполнить этот bashсценарий вместо запуска команды maven.