Google 云 运行 尝试调用 Auth0 OpenID 配置端点时服务连接超时
Google Cloud Run Service connection timeout when trying to call Auth0 OpenID configuration endpoint
我创建了一个连接到 Auth0 oauth2 端点的后端服务。在 localhost
上本地测试所有这些时,它在提供的配置下运行良好。但是,一旦我将后端服务部署到 Google 云 运行,它就无法工作,因为配置端点有连接超时。
这是错误日志:
Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://myproject.eu.auth0.com/.well-known/openid-configuration": Connection timed out (Connection timed out); nested exception is java.net.ConnectException: Connection timed out (Connection timed out)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:785)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:670)
at org.springframework.security.oauth2.jwt.JwtDecoderProviderConfigurationUtils.getConfiguration(JwtDecoderProviderConfigurationUtils.java:150)
... 77 common frames omitted
这是我的 Cloud 运行 服务配置:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: gcloud
args:
- 'alpha'
- 'run'
- 'deploy'
- 'foo-service'
- '--image=eu.gcr.io/$PROJECT_ID/foo-service:$BUILD_ID'
- '--concurrency=80'
- '--cpu=2'
- '--memory=512Mi'
- '--region=europe-west4'
- '--min-instances=1'
- '--max-instances=2'
- '--platform=managed'
- '--port=8080'
- '--timeout=3000'
- '--set-env-vars=SQL_CONNECTION=10.113.160.3, SQL_USER=root, SQL_PASSWORD=root, SQL_DATABASE=dev'
- '--set-env-vars=LOG_LEVEL=debug'
- '--ingress=internal'
- '--allow-unauthenticated'
- '--vpc-connector=cloud-run'
- '--vpc-egress=all-traffic'
我想这里的重要部分是 --vpc-egress=all-traffic
选项,所以我确信该服务能够与外部通信。
但是 Ingress 配置为 --ingress=internal
。这可能是个问题吗?
我想当我定义了一个出口并且通过它启动了一个请求时 - 它会再次通过该通道接收响应并且它不应该通过入口路由并因此被其策略阻止?
编辑 #1
删除 ingress=internal
选项似乎不起作用。我想这是因为如果定义了出口,它在默认情况下被禁用。
选项 --vpc-egress=all-traffic
表示来自您的云 运行 服务的 所有 流量通过您称为 cloud-run
的 VPC 连接器。如果您使用该选项,我认为您无法在 https://myproject.eu.auth0.com/.well-known/openid-configuration 到达您的 Auth0 端点。这就是连接 Cloud 运行 服务 => Auth0 超时的原因。
我想您需要 VPC 连接器来连接到您的云 SQL 实例的私有 IP。因此,只有 从您的云 运行 服务到您的云 SQL 实例的私有 IP 的流量应该通过 VPC 连接器。我认为您可以通过使用 --vpc-egress=private-ranges-only
来实现。
此外,通过设置 --ingress=internal
,您表示您的 Cloud 运行 服务 can only be called within your VPC network。这意味着 Auth0 将无法调用您的 Cloud 运行 服务。
我创建了一个连接到 Auth0 oauth2 端点的后端服务。在 localhost
上本地测试所有这些时,它在提供的配置下运行良好。但是,一旦我将后端服务部署到 Google 云 运行,它就无法工作,因为配置端点有连接超时。
这是错误日志:
Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://myproject.eu.auth0.com/.well-known/openid-configuration": Connection timed out (Connection timed out); nested exception is java.net.ConnectException: Connection timed out (Connection timed out)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:785)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:670)
at org.springframework.security.oauth2.jwt.JwtDecoderProviderConfigurationUtils.getConfiguration(JwtDecoderProviderConfigurationUtils.java:150)
... 77 common frames omitted
这是我的 Cloud 运行 服务配置:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: gcloud
args:
- 'alpha'
- 'run'
- 'deploy'
- 'foo-service'
- '--image=eu.gcr.io/$PROJECT_ID/foo-service:$BUILD_ID'
- '--concurrency=80'
- '--cpu=2'
- '--memory=512Mi'
- '--region=europe-west4'
- '--min-instances=1'
- '--max-instances=2'
- '--platform=managed'
- '--port=8080'
- '--timeout=3000'
- '--set-env-vars=SQL_CONNECTION=10.113.160.3, SQL_USER=root, SQL_PASSWORD=root, SQL_DATABASE=dev'
- '--set-env-vars=LOG_LEVEL=debug'
- '--ingress=internal'
- '--allow-unauthenticated'
- '--vpc-connector=cloud-run'
- '--vpc-egress=all-traffic'
我想这里的重要部分是 --vpc-egress=all-traffic
选项,所以我确信该服务能够与外部通信。
但是 Ingress 配置为 --ingress=internal
。这可能是个问题吗?
我想当我定义了一个出口并且通过它启动了一个请求时 - 它会再次通过该通道接收响应并且它不应该通过入口路由并因此被其策略阻止?
编辑 #1
删除 ingress=internal
选项似乎不起作用。我想这是因为如果定义了出口,它在默认情况下被禁用。
选项 --vpc-egress=all-traffic
表示来自您的云 运行 服务的 所有 流量通过您称为 cloud-run
的 VPC 连接器。如果您使用该选项,我认为您无法在 https://myproject.eu.auth0.com/.well-known/openid-configuration 到达您的 Auth0 端点。这就是连接 Cloud 运行 服务 => Auth0 超时的原因。
我想您需要 VPC 连接器来连接到您的云 SQL 实例的私有 IP。因此,只有 从您的云 运行 服务到您的云 SQL 实例的私有 IP 的流量应该通过 VPC 连接器。我认为您可以通过使用 --vpc-egress=private-ranges-only
来实现。
此外,通过设置 --ingress=internal
,您表示您的 Cloud 运行 服务 can only be called within your VPC network。这意味着 Auth0 将无法调用您的 Cloud 运行 服务。