无法从 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 请求。
在尝试从 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 请求。