我正在尝试生成一个身份验证令牌来调用已部署的Cloud Run服务,以下是我的代码调用元数据服务器的情况:
async function auth(receivingServiceURL:string) {
const metadataTokenURL = 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=';
const options ={
headers: {
'Metadata-Flavor': 'Google',
},
}
const response = await fetch(metadataTokenURL + receivingServiceURL, options);
return response;
}
我的错误如下:
> at ClientRequest.<anonymous> (/Users/dennisy/dev/view/functions/node_modules/node-fetch/lib/index.js:1455:11)
> at ClientRequest.emit (events.js:210:5)
> at Socket.socketErrorListener (_http_client.js:406:9)
> at Socket.emit (events.js:210:5)
> at emitErrorNT (internal/streams/destroy.js:92:8)
> at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
> at processTicksAndRejections (internal/process/task_queues.js:80:21) {
> message: 'request to http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://universal-sentence-encoder-lite-xnqffnl2ba-ew.a.run.app failed, reason: getaddrinfo ENOTFOUND metadata',
> type: 'system',
> errno: 'ENOTFOUND',
> code: 'ENOTFOUND'
> }
我是从firebase函数中调用它的。
编辑:经过一些初步的帮助之后,现在的问题是,当部署到云中时,它可以很好地工作,但是在Firebase函数仿真器中不是本地的。
尝试访问Google Metadata服务器上的任何API / URL都会返回相同的结果:
FetchError: request to http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://universal-sentence-encoder-lite-xnqffnl2ba-ew.a.run.app failed, reason: getaddrinfo ENOTFOUND metadata.google.internal
似乎没有找到资源reason: getaddrinfo ENOTFOUND metadata.google.internal
,但事实并非如此,因为部署后它可以正常工作。
我正在使用我的主服务帐户密钥,该密钥具有整个项目的所有者权限。
答案 0 :(得分:1)
您的URI格式错误:
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE
不要忘记为AUDIENCE
指定一个值,它将是Cloud Run服务端点。
云功能还需要一项具有访问元数据服务器权限的服务。
默认情况下,Cloud Functions使用以下服务帐户:
PROJECT_ID@appspot.gserviceaccount.com
此服务帐户默认情况下具有Editor
角色。这会授予大量权限。默认服务帐户也可以更改为其他服务帐户。访问元数据服务器的最低要求是权限compute.instances.get
。