对于云函数的较新运行时,Google不提供与旧运行时相同的环境变量子集。
基本上,较新的运行时不提供:
- ENTRY_POINT
- GCP项目
- GCLOUD_项目
- 函数触发器类型
- 函数名称
- 函数_MEMORY_MB
- 函数超时_SEC
- 函数_标识
- 函数_区域
如果不在代码中对其值进行硬编码,如何获取这些信息?
我不知道谷歌为什么删除这些变量,但其中一些变量可以使用其他方法获得。
在这里,我列出了一段代码,你可能想添加到你的函数中,以交叉兼容的方式获得一些数据(在旧的和新的运行时都可以工作(:
import os
import requests # requires: "requests"
import google.auth # requires: "google-auth"
def query_metadata(entry):
metadata_url = 'http://metadata.google.internal/computeMetadata/v1/'
response = requests.get(metadata_url + entry, headers={'Metadata-Flavor': 'Google'})
return response.content.decode("utf-8")
# ------ Older Runtime Method ------ ------ Newer Runtime Alternative Method ------
ENTRY_POINT = os.environ.get('ENTRY_POINT') OR os.environ.get('FUNCTION_TARGET')
GCP_PROJECT = os.environ.get('GCP_PROJECT') OR google.auth.default()[1]
GCLOUD_PROJECT = os.environ.get('GCP_PROJECT') OR google.auth.default()[1]
FUNCTION_NAME = os.environ.get('FUNCTION_NAME') OR os.environ.get('K_SERVICE')
FUNCTION_IDENTITY = os.environ.get('FUNCTION_IDENTITY') OR query_metadata('instance/service-accounts/default/email')
如果您不使用Python,您可能不喜欢使用google.auth.default()[1]
方法来检索项目名称。这里有第二种方法可以通过查询元数据服务器获取这些数据,我认为用其他语言复制它更容易:
import requests # requires: "requests"
def query_metadata(entry):
response = requests.get('http://metadata.google.internal/computeMetadata/v1/' + entry, headers={'Metadata-Flavor': 'Google'})
return response.content.decode("utf-8")
GCP_PROJECT = query_metadata('project/project-id')
我无法找到获取其他环境变量(FUNCTION_REGION
、FUNCTION_TRIGGER_TYPE
、FUNCTION_MEMORY_MB
或FUNCTION_TIMEOUT_SEC
(的方法。但我在下面讨论了每种选择。
FUNCTION_REGION环境变量
此变量无法在较新的运行时上获得。
我目前最好的解决方法是尝试从URL中提取信息,但它只适用于HTTP触发器使用时风险自负
# extract region from URL using regex, expecting
# https://<region>-<project-name>.cloudfunctions.net/<function-name>
import os
import re
import google.auth # requires: "google-auth"
GCP_PROJECT = os.environ.get('GCP_PROJECT') or google.auth.default()[1]
FUNCTION_REGION = re.match(r'https?://(.*)-{}..*'.format(GCP_PROJECT), request.url_root).group(1)
如果这不符合您的需求,您可能需要获得GCP项目的默认区域。它是有效的,但它与函数区域不同。
import requests # requires: "requests"
def query_metadata(entry):
response = requests.get('http://metadata.google.internal/computeMetadata/v1/' + entry, headers={'Metadata-Flavor': 'Google'})
return response.content.decode("utf-8")
project_default_region = query_metadata('project/attributes/google-compute-default-region')
更准确地说,您可以查询函数正在运行的区域。它也起作用,但这个与功能区域不同(大多数时候都没用(,但它可能适合某人的需求。
import requests # requires: "requests"
def query_metadata(entry):
response = requests.get('http://metadata.google.internal/computeMetadata/v1/' + entry, headers={'Metadata-Flavor': 'Google'})
return response.content.decode("utf-8")
function_zone = query_metadata('instance/zone')
# returns "projects/<project-id>/zones/us16"
很明显,您可以从云函数API中查询这些信息。但是云函数API需要Region作为参数(与我们想要检索的参数相同(,所以我认为这种方法是无用的。
作为最后手段,您可以使用云函数API(i(查询所有支持的位置;然后(ii(查询所有区域,列出它们的函数,直到找到为止。但是,有几个受支持的区域,GCP支持不同区域中同名的函数。因此,不能保证此方法只返回一个值。
FUNCTION_TRIGGER_TYPE环境变量
此变量无法在较新的运行时上获得。
谷歌建议你使用FUNCTION_SIGNATURE_TYPE
作为替代,但它们的域名不同。它们可能有相同的用途,但你应该注意这个区别:
- FUNCTION_TRIGGER_TYPE:
HTTP_TRIGGER
、CLOUD_PUBSUB_TRIGGER
、CLOUD_STORAGE_TRIGGER
- FUNCTION_SIGNATURE_TYPE:
http
或event
您也可以使用Cloud Functions API来获取详细信息,但编写完全交叉兼容的代码有些复杂(如果您想尝试,请检查HttpsTrigger
和EventTrigger
类型(。
FUNCTION _MEMORY_MB环境变量
此变量无法在较新的运行时上获得。
但是,如果您不介意对函数区域进行硬编码,您可以从云函数API查询这些信息。
import os
import google.auth # requires: "google-auth"
from google.cloud import functions_v1 # requires: "google-cloud-functions"
REGION = 'us-central1' # notice this variable is hardcoded, since there is no alternative to it
GCP_PROJECT = os.environ.get('GCP_PROJECT') or google.auth.default()[1]
FUNCTION_NAME = os.environ.get('FUNCTION_NAME') or os.environ.get('K_SERVICE')
functions_client = functions_v1.services.cloud_functions_service.CloudFunctionsServiceClient()
this_function = functions_client.get_function(name='projects/{}/locations/{}/functions/{}'.format(GCP_PROJECT, REGION, FUNCTION_NAME))
FUNCTION_MEMORY_MB = this_function.available_memory_mb
FUNCTION_TIMEOUT_SEC环境变量
此变量无法在较新的运行时上获得。
作为上一个变量,如果您不介意对函数区域进行硬编码,您可以从云函数API查询这些信息。
import os
import google.auth # requires: "google-auth"
from google.cloud import functions_v1 # requires: "google-cloud-functions"
REGION = 'us-central1' # notice this variable is hardcoded, since there is no alternative to it
GCP_PROJECT = os.environ.get('GCP_PROJECT') or google.auth.default()[1]
FUNCTION_NAME = os.environ.get('FUNCTION_NAME') or os.environ.get('K_SERVICE')
functions_client = functions_v1.services.cloud_functions_service.CloudFunctionsServiceClient()
this_function = functions_client.get_function(name='projects/{}/locations/{}/functions/{}'.format(GCP_PROJECT, REGION, FUNCTION_NAME))
FUNCTION_TIMEOUT_SEC = this_function.timeout