Как изменить значение переменной среды из кода функции Google Cloud?

# #python #google-cloud-platform #google-cloud-functions #environment-variables

Вопрос:

Я пытаюсь понять, как правильно использовать переменные среды для облачных функций Google.

Я развернул функцию и хочу записать и прочитать ее переменную среды (например: XXX ).

 if not os.environ.get("XXX"):
    print("XXX_SET_DEFAULT")
    os.environ.setdefault("XXX","1")
else:
    print("XXX_SET")
    os.environ["XXX"] = "1"
print("XXX_GET", os.environ["XXX"])
 

После запуска функции значение, изначально заданное в списке переменных среды выполнения, не изменяется.

Хотя поведение немного отличается, потому что, когда я развертываю переменную с функцией с фиктивным значением, я вижу XXX_SET строку в журналах , но когда я сначала не развертываю переменную, для первого запуска я вижу XXX_SET_DEFAULT , затем для второго запуска есть XXX_SET .

Я установил переменные с помощью (и из пользовательского интерфейса тоже):

 gcloud functions deploy my_func 
    ...
    --set-env-vars XXX=xxx
 

Вопросы:

  • Можно ли как-то установить эту переменную из кода python?
  • В чем заключается эта разница в журналах ( XXX_SET_DEFAULT, XXX_SET по сравнению XXX_SET, XXX_SET )
  • Почему значение этой переменной не устанавливается из кода python?
    • это как-то связано с несколькими экземплярами функции (при необходимости)?
  • В чем разница между Runtime environment variables и Build environment variables ?
    • могу ли я Build environment variables каким-то образом развернуть переменные между ними?
  • Каковы рекомендации по использованию переменных среды с облачными функциями в Google?

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

1. Дочерний процесс (ваше приложение Python) не может изменять переменные среды в родительском процессе. Дочерний процесс может изменять переменные среды только для себя и своих дочерних процессов. Прочитайте документацию по облачным функциям о том, как устанавливать переменные среды. Если вам нужно загрузить переменные во время выполнения, используйте базу данных, Секретный менеджер, облачное хранилище и т. Д.

Ответ №1:

Вы не должны изменять переменные среды в GCFs. Они существуют для установки конфигураций.

Вот некоторые основы:

  • Функции выполняются в контейнерах (docker). Это гарантирует, что они всегда работают в четкой и согласованной среде.
  • Build environment variables предназначены для того, когда контейнер будет построен. Если вы не возитесь с тем, как вы строите, они вам не понадобятся.
  • Runtime environment variables предназначены для случаев, когда функция выполняется в контейнере. Это те, к которым вы можете получить доступ с помощью своего кода.

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

Теперь возможно, что GCF в фоновом режиме повторно использует некоторые контейнеры, и вы можете увидеть некоторое сохранение, но вы не можете на это положиться.

В заключение:

  • Переменные среды предназначены для обеспечения простого варианта конфигурации вашего кода, который можно изменить без необходимости изменять код.
  • В общем, лучше относиться к ним как к доступным только для чтения, даже если вы можете их изменить, эти изменения будут отброшены, когда контейнер, в котором выполняется ваш код, будет отброшен.
  • Если вы хотите сохранить данные между функциями, используйте базу данных.