0

我有一个简单的 Spring Boot 服务 'say-hi' 在 /say-hi 下接受 GET 请求并返回 'hello'。它部署在托管 Cloud Run 中。假设我不想向公众开放它。现在我想做两件事:1. 允许开发人员(我自己)访问“say-hi” 2. 允许 Cloud Run 之外的另一个 Spring Boot 服务能够调用“say-hi”

对于我的目标 1:

奇怪的是 curl 命令不起作用,但 Insomnia 工作正常。基本上,我遵循了文档,将我的 google 帐户添加到角色/run.invoker,但 curl 命令显示 Network is unrechable:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" http://say-hi-0-1-0-q6g2cgbzna-ew.a.run.app:8080/say-hi -v 错误:

*   Trying 216.239.36.53...
*   Trying 2001:4860:4802:36::35...
* Immediate connect fail for 2001:4860:4802:36::35: Network is unreachable
*   Trying 2001:4860:4802:36::35...
* Immediate connect fail for 2001:4860:4802:36::35: Network is unreachable
*   Trying 2001:4860:4802:36::35...
* Immediate connect fail for 2001:4860:4802:36::35: Network is unreachable

但是,如果我gcloud auth print-identity-token单独运行以先获取令牌,然后从 Insomnia 客户端发送 GET 请求,它可以工作......我想知道为什么......

对于我的目标 2 ,我假设正确的会话在这里查看它。这是否意味着如果我想从受管理的 Cloud Run 外部(从我自己的笔记本电脑和其他 GKE 实例)访问“say-hi”,我需要为我的项目启用 IAP?如果是,如何将云运行与 IAP 集成?

4

1 回答 1

3

经过一整天的搜索和阅读。最后得到一个工作版本。Google Cloud Run 给出的服务到服务身份验证文档确实误导了我对 IAP 的看法,这里的代码还有一些地方没有说明。原来是调用Cloud Run服务,我根本不需要IAP。非常感谢这个博客,我从中获得了解决方案。

  @PostMapping(value="/call-say-hi")
  public ResponseEntity<String> callSayHi() throws URISyntaxException, IOException {

    ServiceAccountCredentials serviceAccountCredentials =
        ServiceAccountCredentials.fromStream(new FileInputStream(SERVICE_ACCOUNT_JSON_KEY_PATH));
    serviceAccountCredentials.createScoped(IAM_SCOPE);
    IdTokenCredentials idTokenCredentials = IdTokenCredentials.newBuilder()
                                            .setIdTokenProvider(serviceAccountCredentials)
                                            .setTargetAudience(TARGET_AUDIENCE)
                                            .build();
    GenericUrl genericUrl = new GenericUrl(TARGET_AUDIENCE+"/say-hi");
    HttpCredentialsAdapter adapter = new HttpCredentialsAdapter(idTokenCredentials);
    HttpRequest request = httpTransport.createRequestFactory(adapter).buildGetRequest(genericUrl);
    request.setThrowExceptionOnExecuteError(false);
    HttpResponse response = request.execute();
    String r = response.parseAsString();
    System.out.println(r);
    return ResponseEntity.status(HttpStatus.OK).body(r);
  }

其中 TARGET_AUDIENCE 是部署的 Cloud Run 服务 URL

于 2020-05-05T03:01:35.283 回答