无法从 Google 云 运行 发出完全托管的出站请求

Can't make outbound request from Google Cloud Run fully managed

在尝试从 Google 云 运行 完全托管向外部 API 发出出站请求时,http 调用不知何故卡住了,或者我们正在 运行ning过了一会儿进入下面的SSLHandshakeException Remote host terminated the handshake。该图像在本地执行时运行良好,因此我假设它来自沙盒云 运行 环境。

我的docker配置:

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 引导应用程序,我们在启动时获得此跟踪:
Container Sandbox: Unsupported syscall setsockopt(0x9,0x6,0x6,0x3e7a3d678e2c,0x4,0xa)

有什么我遗漏的吗?

这确实是 Cloud 运行 沙盒的限制。 gVisor 项目(Cloud 运行 使用)only partially supports setsockopt.

深入 Google Cloud Run documentation 之后,计算必须限定在请求范围内。我的进程在 startup/deployment 阶段执行后台 activity,超出了请求的范围。似乎在这种特定情况下,出口流量不可用。

为了修复它,我们公开了一个 API 端点来触发该过程。这样就可以了。

附带说明一下,该问题与日志跟踪 Unsupported syscall setsockopt 无关,因为该进程仅执行 POST 请求。