Google cloud functions 如何在较新的云函数运行时获取旧的环境变量?

Google cloud functions 如何在较新的云函数运行时获取旧的环境变量?,google-cloud-functions,Google Cloud Functions,对于较新的云函数运行时,Google不提供与较旧运行时相同的子集 基本上,较新的运行时不提供: 入口点 GCP_项目 GCU项目 函数\触发器\类型 函数名 功能存储器 函数超时时间秒 函数单位 功能区 如何获取这些信息而不在代码中硬编码它们的值?我不知道谷歌为什么删除这些变量,但其中一些变量可以使用其他方法获得 在这里,我列出了一段代码,您可能希望添加到函数中,以便以交叉兼容的方式获取一些数据(将在较旧和较新的运行时中工作): 导入操作系统 导入请求#需要:“请求” 导入google.au

对于较新的云函数运行时,Google不提供与较旧运行时相同的子集

基本上,较新的运行时不提供:

  • 入口点
  • GCP_项目
  • GCU项目
  • 函数\触发器\类型
  • 函数名
  • 功能存储器
  • 函数超时时间秒
  • 函数单位
  • 功能区

如何获取这些信息而不在代码中硬编码它们的值?

我不知道谷歌为什么删除这些变量,但其中一些变量可以使用其他方法获得

在这里,我列出了一段代码,您可能希望添加到函数中,以便以交叉兼容的方式获取一些数据(将在较旧和较新的运行时中工作):

导入操作系统
导入请求#需要:“请求”
导入google.auth#需要:“google auth”
def查询_元数据(条目):
元数据http://metadata.google.internal/computeMetadata/v1/'
response=requests.get(metadata_url+条目,头={'metadata-Flavor':'Google'})
返回响应.内容.解码(“utf-8”)
#----较旧的运行时方法-----较新的运行时替代方法------
ENTRY\u POINT=os.environ.get('ENTRY\u POINT')或os.environ.get('FUNCTION\u TARGET'))
GCP_PROJECT=os.environ.get('GCP_PROJECT')或google.auth.default()[1]
GCLOUD\u PROJECT=os.environ.get('GCP\u PROJECT')或google.auth.default()[1]
FUNCTION\u NAME=os.environ.get('FUNCTION\u NAME')或os.environ.get('K\u SERVICE'))
FUNCTION_IDENTITY=os.environ.get('FUNCTION_IDENTITY')或query_元数据('instance/service accounts/default/email'))
如果您没有使用Python,您可能不喜欢使用
google.auth.default()[1]
方法来检索项目名称。这里有第二种方法可以通过查询获取此数据,我认为用其他语言复制此数据更容易:

导入请求#需要:“请求”
def查询_元数据(条目):
response=requests.get('http://metadata.google.internal/computeMetadata/v1/“+条目,标题={'Metadata-FLANCE':'Google'})
返回响应.内容.解码(“utf-8”)
GCP_项目=查询_元数据(“项目/项目id”)
我无法找到获取其他环境变量的方法(
FUNCTION\u REGION
FUNCTION\u TRIGGER\u TYPE
FUNCTION\u MEMORY\u MB
FUNCTION\u TIMEOUT\u SEC
)。但我会在下面讨论每一种选择

区域环境变量函数 无法在较新的运行时上获取此变量

我目前最好的解决方法是尝试从URL提取信息,但它只适用于HTTP触发器使用风险自负。

#使用正则表达式从URL提取区域,需要
# https://-.cloudfunctions.net/
导入操作系统
进口稀土
导入google.auth#需要:“google auth”
GCP_PROJECT=os.environ.get('GCP_PROJECT')或google.auth.default()[1]
FUNCTION\u REGION=re.match(r'https?:\/\/(.*)-{}\..*'格式(GCP\u项目),request.url\u root)。组(1)
如果这不符合您的需要,您可能希望获得GCP项目默认区域。它可以工作,但它与功能区不同

导入请求#需要:“请求”
def查询_元数据(条目):
response=requests.get('http://metadata.google.internal/computeMetadata/v1/“+条目,标题={'Metadata-FLANCE':'Google'})
返回响应.内容.解码(“utf-8”)
项目\默认\区域=查询\元数据('项目/属性/google计算默认区域')
更准确地说,您可以查询函数正在运行的区域。它也可以工作,但是这个与功能区域不同(大多数情况下都是无用的),但是它可能适合某些人的需要

导入请求#需要:“请求”
def查询_元数据(条目):
response=requests.get('http://metadata.google.internal/computeMetadata/v1/“+条目,标题={'Metadata-FLANCE':'Google'})
返回响应.内容.解码(“utf-8”)
函数\区域=查询\元数据('实例/区域')
#返回“projects//zones/us16”
显然,您可以从中查询此信息。但是CloudFunctionsAPI需要区域作为参数(与我们想要检索的参数相同),所以我认为这种方法是无用的

作为最后手段,您可以使用云函数API来(i);然后(ii)直到你找到它。但是,有几个受支持的区域,GCP支持不同区域中具有相同名称的功能。所以不能保证这个方法只返回一个值

函数\触发器\类型环境变量 无法在较新的运行时上获取此变量

谷歌建议您使用
函数\签名\类型
作为替代,但它们的域不同。它们可能用于相同的目的,但您应该意识到这一差异:

  • 功能触发类型
    HTTP\u触发器
    CLOUD\u PUBSUB\u触发器
    CLOUD\u存储触发
  • 功能\u签名\u类型
    http
    事件
您也可以使用来获取详细信息,但编写完全交叉兼容的代码(如果您想尝试的话)有些复杂

函数\内存\ MB环境变量 无法在较新的运行时上获取此变量

但如果您不介意硬编码功能区域,您可以从中查询此信息

导入操作系统
导入google.auth#需要:“google auth”
来自google.cloud导入功能_v1#要求:“谷歌云功能”
REGION='us-central1'#请注意,这个变量是硬编码的,因为没有替代品
GCP_PROJECT=os.environ.get('GCP_PROJECT')或google.auth.default()[1]
FUNCTION\u NAME=os.environ.get('FUNCTION\u NAM