google-app-engine - App Engine 中的 Google Cloud Memorystore (Redis) ETIMEDOUT
问题描述
我正在编写一个 NodeJS 应用程序并尝试连接到 GCP Redis MemoryStore,但我收到了ETIMEDOUT 10.47.29.131:6379
错误消息。10.47.29.131
对应REDISHOST
于。我正在尝试通过其内部私有 IP 访问服务器。
虽然该应用在安装了本地 Redis 的情况下可以在本地工作,但在部署到 GCP AppEngine 时却不能。
我的 GCP 设置
- 在位置 europe-west3-a 运行的 Redis 实例
- 在 europe-west3 的“Serverless VPC access”下创建了一个连接器
- Redis 和 VPC 连接器位于同一网络“默认”上。
- 在欧洲西部运行的 App Engine
应用程序.yml
runtime: nodejs
env: flex
automatic_scaling:
// or this but without env: flex (standard)
vpc_access_connector:
name: "projects/project-ID/locations/europe-west/connectors/connector-name"
beta_settings:
cloud_sql_instances: project-ID:europe-west3:name
env_variables:
REDISHOST: '10.47.29.131'
REDISPORT: '6379'
// removed this when trying without env: flex (standard)
network:
name: default
session_affinity: true
我按照这些说明设置了所有内容:https ://cloud.google.com/memorystore/docs/redis/connect-redis-instance-standard
深入挖掘,我发现:https ://cloud.google.com/vpc/docs/configure-serverless-vpc-access他们提到了一些关于权限和的内容serverless-vpc-access-images
,并在尝试遵循说明时:https ://cloud.google .com/compute/docs/images/restricting-image-access#trusted_images我找不到“定义受信任的图像项目”。任何地方
我在这里想念什么?
解决方案
好吧,事实证明,问题在于我为 Redis 实例选择的区域。
从文档:
重要提示:为了连接到 Redis 实例的 Memorystore,连接的客户端必须位于与实例相同的区域内。
区域是您可以在其中运行资源的特定地理位置。每个区域被细分为几个区域。
例如,美国中部的 us-central1 区域有区域 us-central1-a、us-central1-b、us-central1-c 和 us-central1-f。
尽管文档清楚地表明,AppEngine 和 Memorystore 必须位于同一区域,但我对实际区域的假设是错误的。
当我创建 AppEngine 时,我在 中创建它europe-west
,这与europe-west1
. 另一方面,当我创建 redis 实例时,我使用europe-west3
, 假设west3
与 相同的区域west
,但事实并非如此。
由于 AppEngines 区域无法更改,因此我在其中创建了另一个 redis-instance europe-west1
,现在一切正常。
因此,redis 区域必须与 AppEngine 区域完全相同。region1
与 相同region
,但region2
或region3
不同region
。
推荐阅读
- reactjs - 无法解析“历史/createBrowserHistory”
- javascript - 如何在不使用父组件的 setState 的情况下将子状态传递给父状态
- php - PHP:strtotime() 没有添加正确的天数
- java - 递归返回 ArrayIndexOutOfBound 异常
- asp.net-core - 如何使用 LoginId 调用 IdentityServer4 SignOut
- python - 如何在 Python 中将 PID 写入文件?
- node.js - 如何从 vuejs3 中的 fs.readFile 获取数据
- linux - 在开源 QT 中安装 MQTT 模块
- javascript - 添加更多由 php 生成的选择字段
- node.js - 使用 exec 获取函数的输出,使用 execSync 获取另一个函数的输出到文件和标准输出