如何在云函数的较新运行时中获取旧的环境变量



对于云函数的较新运行时,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_REGIONFUNCTION_TRIGGER_TYPEFUNCTION_MEMORY_MBFUNCTION_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_TYPEHTTP_TRIGGERCLOUD_PUBSUB_TRIGGERCLOUD_STORAGE_TRIGGER
  • FUNCTION_SIGNATURE_TYPEhttpevent

您也可以使用Cloud Functions API来获取详细信息,但编写完全交叉兼容的代码有些复杂(如果您想尝试,请检查HttpsTriggerEventTrigger类型(。

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

相关内容

  • 没有找到相关文章