【问题标题】:How to call Cloud Run from out side of Cloud Run/GCP?如何从 Cloud Run/GCP 外部调用 Cloud Run?
【发布时间】:2020-08-19 10:07:25
【问题描述】:

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

为了我的目标 1:

奇怪的是 curl 命令不起作用,但 Insomnia 工作正常。基本上,我关注了the doc,我将我的google 帐户添加到了roles/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 我假设正确的会话来查看它here。这是否意味着如果我想从受管理的 Cloud Run 外部(从我自己的笔记本电脑和其他 GKE 实例)访问“say-hi”,我需要为我的项目启用 IAP?如果是,如何将云运行与 IAP 集成?

【问题讨论】:

    标签: google-cloud-run google-iap


    【解决方案1】:

    经过一整天的搜索和阅读。最后得到一个工作版本。 Google Cloud Run 给出的service-to-service authentication 的给定文档确实误导了我对 IAP 的看法,the code here 留下了一些未澄清的地方。原来是调用Cloud Run服务,我根本不需要IAP。非常感谢this blog 我从中获取了解决方案。

      @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 服务网址

    【讨论】:

    • #createScoped 调用似乎是多余的。另外,为了比较,我使用 GOOGLE_APPLICATION_CREDENTIALS=service_account_creds.json 和 "(IdTokenProvider) GoogleCredentials.getApplicationDefault()" 而不是自己加载它们。然后这也会自动在 cloud run->cloud run 中运行。
    • @mernst 范围与我相信的凭证不同。如果缺少服务帐户凭据,则范围不会授予您任何权限。但是您获取服务帐户的方式绝对是首选。
    • 你的代码 sn-p 没有使用 createScoped 的结果,所以我怀疑它有什么效果。
    • 它节省了我很多时间。真的很有帮助。
    猜你喜欢
    • 2020-05-29
    • 2023-02-14
    • 2023-02-26
    • 2021-06-12
    • 2020-07-14
    • 2021-04-14
    • 2022-08-18
    • 2020-08-31
    • 2021-05-31
    相关资源
    最近更新 更多