Как вызвать Cloud Run из-за пределов Cloud Run / GCP? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть простая служба Spring Boot 'say-hi', которая принимает запрос GET в / say-hi и возвращает 'hello'. Он развернут в управляемом Cloud Run. Допустим, я не хочу открывать его для общего доступа c. Теперь я хотел сделать две вещи: 1. разрешить разработчику (я сам) получить доступ к 'say-hi' 2. разрешить другой службе Spring Boot за пределами Cloud Run сделать вызов 'say-hi'

Для моей цели 1:

Странно то, что команда curl не работает, но Insomnia работает нормально. В основном, я следовал do c, я добавил свою учетную запись google в роли / run.invoker, но команда curl сообщает, что сеть недоступна:
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 отдельно, чтобы сначала получить токен, а затем отправляю запрос GET от клиента Insomnia, он работает ... Мне интересно, почему ...

Для моей цели 2 я предполагаю, что правильный сеанс, чтобы посмотреть на это здесь . Означает ли это, что если я хочу получить доступ к «привет» извне Cloud Run Manged (как с моего собственного ноутбука, так и с других экземпляров GKE), мне нужно включить IAP для моего проекта? если да, как интегрировать облачный запуск с IAP?

1 Ответ

2 голосов
/ 05 мая 2020

После долгого дня поиска и чтения. Наконец-то получился рабочий вариант. Данный do c из аутентификации между сервисами , предоставленный 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 - это URL-адрес развернутой службы Cloud Run

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...