这里有一个非常简单的云函数:
lib.py
import os
TOKEN = os.environ['TOKEN']
some_func(token=TOKEN):
return token
main.py-当函数被调用并且main((是入口点时运行。
import os
from lib import some_func
# This is a simplification of KMS secret injection
def inject_secrets():
os.environ['TOKEN'] = 'SOMETOKEN'
inject_secrets()
def main():
...
在部署时,这会导致错误:ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code. Error message: 'TOKEN'
发生故障是因为从lib
导入some_func
时调用了TOKEN = os.environ['TOKEN']
。
一种解决方案是在导入发生时移动:
import os
def inject_secrets():
os.environ['TOKEN'] = 'SOMETOKEN'
inject_secrets()
# Import moved after secret injection
from lib import some_func
这将部署并工作,但不遵循PEP8,因为所有导入都应位于文件的顶部。
这个问题有什么更好的解决方案?
您可以在gcloud functions deploy
命令中使用环境变量,例如:
gcloud functions deploy FUNCTION_NAME --set-env-vars TOKEN=SOMETOKEN FLAGS...