我正在使用 GCP 存储上传文件并返回其签名/公共 URL。
将文件上传到 gcp 存储后尝试 SignUrl 时出现以下错误。
Caused by: java.io.IOException: Unexpected Error code 403 trying to get service accounts from Compute Engine metadata: This metadata endpoint is concealed for ?recursive calls
at com.google.auth.oauth2.ComputeEngineCredentials.getDefaultServiceAccount(ComputeEngineCredentials.java:383)
at com.google.auth.oauth2.ComputeEngineCredentials.getAccount(ComputeEngineCredentials.java:336)
... 18 common frames omitted
特别是当服务帐户调用转到 GCP 元数据时。
com.google.auth.oauth2.ComputeEngineCredentials#getDefaultServiceAccount
HttpResponse response = getMetadataResponse(getServiceAccountsUrl());
我的GCP java库版本是1.80.0。
无法在任何地方找到此错误。
如果需要更多详细信息,请告诉我。
编辑1:
这是实际代码的最小版本,是正在发生的事情的要点。
int ttlInMinutes = 5;
String objectName = "object-name";
String bucket = "some-bucket";
Storage storage = StorageOptions.getDefaultInstance().getService();
BlobInfo blobinfo = BlobInfo.newBuilder(BlobId.of(bucket, objectName)).build();
URL url = storage.signUrl(blobinfo, ttlInMinutes, TimeUnit.MINUTES, withV4Signature());
此时,我收到了上述错误。
我们将 GCE 与 k8s 结合使用,我们在 GCE 服务器上部署 pod,服务帐户与部署 pod 的服务器链接,而不是直接与 pod 本身链接。
问题是在用于部署 pod 的 k8s yaml 文件中,我们没有设置
hostNetwork
。将 hostNetwork
设置为 true
后,元数据请求成功返回结果。
在此设置之前,我猜 pod 将在它自己的网络中运行,而不是使用服务器的网络。更多信息:Kubernetes 中的 hostNetwork 是什么?