我想从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代码之间共享配置。
答案 0 :(得分:8)
GCP slack channel上的一些友好人员向我指出RuntimeConfig API用于在Google Cloud中跨多种类型的服务共享配置。这解决了我正在寻找的共享配置的问题。
对于那些好奇的人,你必须:
运行一些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"```
将python google-cloud-runtimeconfig
库添加到您的项目中(我是通过pip
完成的)
添加一些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}}文件。