有没有办法从AppEngine Standard访问Google Cloud元数据服务以进行运行时配置?

时间:2016-12-06 21:38:37

标签: google-app-engine google-cloud-platform

我想从App Engine Standard应用程序访问Metadata Service。我尝试对http://metadata.google.internal/computeMetadata/v1/project/attributes进行urlfetch并返回DNS lookup failed

    logging.info(urlfetch.fetch('http://metadata.google.internal/computeMetadata/v1/project/attributes/').content)

这可能吗?我想在同一个项目中在App Engine Flex和Standard代码之间共享配置。

2 个答案:

答案 0 :(得分:8)

GCP slack channel上的一些友好人员向我指出RuntimeConfig API用于在Google Cloud中跨多种类型的服务共享配置。这解决了我正在寻找的共享配置的问题。

对于那些好奇的人,你必须:

  1. Enable the API in API Manager用于您的Google云端项目
  2. 运行一些gcloud命令:

    gcloud beta deployment-manager runtime-configs create foo-credentials
    gcloud beta deployment-manager runtime-configs variables set "bar-variable-name" "baz-value"  --config-name "foo-credentials"```
    
  3. 将python google-cloud-runtimeconfig库添加到您的项目中(我是通过pip完成的)

  4. 添加一些python代码以在运行时获取变量:

    config_client = runtimeconfig.Client()
    config = config_client.config('foo-credentials')
    bar = config.get_variable('bar-variable-name')```
    

答案 1 :(得分:2)

不,您无法从GAE标准实例访问(GCE特定的)元数据,因为它不是GCE VM /实例。来自Getting metadata(强调我的):

  

您可以通过发出请求来查询元数据服务器的内容   从虚拟机实例中的以下根URL 。   使用http://metadata.google.internal/computeMetadata/v1/网址   向元数据服务器发出请求。

您在metadata.google.internal看到的DNS失败可能表明它是一个特殊的主机DNS条目,仅在GCE网络或机器内可用。

但一般情况下,可以通过在需要它的每个服务/模块目录内对同一文件(理想情况下放在app目录中)进行符号链接来跨GAE服务/模块共享文件。请参阅此处的示例:Sharing entities between App Engine modules和此处:https://stackoverflow.com/a/34111170/4495081

只要flex服务/模块使用与标准文件相同的文件内容,这种技术也适用于它们,这意味着您可以通过共享{{{}来共享配置。例如,1}}文件。