Не удается сделать исходящий запрос из Google Cloud Run полностью управляемым

При попытке выполнить полностью управляемый исходящий запрос к внешнему API из Google Cloud Run вызов http каким-то образом зависает или через некоторое время мы сталкиваемся со следующим SSLHandshakeException Remote host terminated the handshake. Образ хорошо работает при локальном запуске, поэтому я предполагаю, что он исходит из изолированной среды запуска облака.

Моя конфигурация докера:

FROM maven:3.6.3-jdk-11 as builder

WORKDIR /app
COPY pom.xml .
COPY src ./src

# Build a release artifact.
RUN mvn package -DskipTests

FROM openjdk:11-jdk

COPY --from=builder /app/target/poc-*.jar /poc.jar

# Run the service on container startup.
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/poc.jar"]

Фрагмент кода застревает:

private HttpEntity<String> prepareSecuredRestCallToAJStage() {
    CredentialsDTO credentials = new CredentialsDTO(USERNAME, PASSWORD);
    // Getting stuck here
    TokenDTO response = restTemplate.postForObject(LOGIN_CHECK_URL, credentials, TokenDTO.class);
    // We never get the response
    String token = BEARER_TOKEN_PREFIX + Objects.requireNonNull(response).getToken();
}

Для информации, это приложение Spring Boot, и мы получаем эту трассировку при запуске:
Container Sandbox: Unsupported syscall setsockopt(0x9,0x6,0x6,0x3e7a3d678e2c,0x4,0xa)

Что-то мне не хватает?


person Gwendal Le Cren    schedule 12.03.2020    source источник


Ответы (2)


Это действительно ограничение песочницы Cloud Run. Проект gVisor (который использует Cloud Run) только частично поддерживает setsockopt .

person Dustin Ingram    schedule 12.03.2020
comment
Привет Дастин. Похоже, проблема не связана с трассировкой журнала Unsupported syscall setsockopt, поскольку процесс выполняет только запрос POST. В любом случае спасибо за вашу помощь! - person Gwendal Le Cren; 13.03.2020

После изучения документации Google Cloud Run, вычисление должно относиться к запросу. Мой процесс выполнял фоновую активность на этапе запуска / развертывания, вне рамок запроса. Кажется, что в этом конкретном случае исходящий трафик недоступен.

Чтобы исправить это, мы открываем конечную точку API, запускающую процесс. Вот так это работает.

Кстати, проблема не связана с трассировкой журнала Unsupported syscall setsockopt, поскольку процесс выполняет только запрос POST.

person Gwendal Le Cren    schedule 13.03.2020