【发布时间】:2020-07-14 20:53:47
【问题描述】:
我想从外部应用调用 Cloud Run。外部应用程序是用 Kotlin (java) 编写的,并在 JDK 11 JVM 上运行。它使用服务帐户进行身份验证
ServiceAccountCredentials.fromStream(serviceAccount).createScoped("https://www.googleapis.com/auth/cloud-platform")
服务帐户所在的位置是一个有效的 JSON 文件。我已经测试了在谷歌云控制台中为服务帐户调用云运行的权限。
我还没有找到官方 API,所以我使用 google 的 GoogleNetHttpTransport 来运行 HTTP 发布请求。 为了调用云运行,我尝试使用 HttpCredentialsAdapter
transport.createRequestFactory(HttpCredentialsAdapter(googleCredentials))
.buildPostRequest(GenericUrl(url), JsonHttpContent(JacksonFactory(), data))
我已尝试直接使用访问令牌
val headers = HttpHeaders()
googleCredentials.refreshIfExpired()
headers.authorization = "Bearer " + googleCredentials.accessToken.tokenValue
postRequest.headers = headers
我已经尝试使用 jet 服务帐户并使用 jwt 请求元数据
val headers = HttpHeaders()
jwtCredentials = ServiceAccountJwtAccessCredentials.fromStream(serviceAccount)
jwtCredentials.getRequestMetadata(URI(url)).forEach {
headers.set(it.key, it.value)
}
postRequest.headers = headers
在所有这些情况下,它都会返回此错误
[20:35:00 WARN]: Exception in thread "TestThread" com.google.api.client.http.HttpResponseException: 401 Unauthorized
[20:35:00 WARN]: at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1113)
[20:35:00 WARN]: at ***.CloudRun$invoke$3.invokeSuspend(CloudRun.kt:34)
[20:35:00 WARN]: at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[20:35:00 WARN]: at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[20:35:00 WARN]: at java.base/java.lang.Thread.run(Thread.java:834)
提前感谢您的支持
【问题讨论】:
-
“调用云运行”是什么意思? Cloud Run 是一个用于托管 REST / HTTP 应用程序的平台/环境。您创建一个监听 $PORT 并响应 HTTP 请求的应用程序。您的意思是调用托管在容器中的自定义 REST 应用程序吗?如果是,该应用程序的性质是什么?
-
我想向另一个在云运行容器中运行的 REST 应用程序发布请求。 cloud run用于各种任务,用node js编写。
标签: java google-cloud-run