【问题标题】:How to connect to Redis instance (memorystore) from Google's Standard App Engine (Python 3.7)如何从 Google 的标准 App Engine (Python 3.7) 连接到 Redis 实例 (memorystore)
【发布时间】:2020-01-15 03:15:37
【问题描述】:

我一直在尝试从 App Engine 实例连接到 Redis 实例,但没有任何运气。连接超时。

我已经在 app.yaml 中设置了主机和端口:

env_variables:
  REDIS_HOST: '10.0.0.3'
  REDIS_PORT: '6379'

并尝试按照示例中的说明进行连接:

redis_host = os.environ.get('REDIS_HOST', 'localhost')
redis_port = int(os.environ.get('REDIS_PORT', 6379))
redis_client = redis.StrictRedis(host=redis_host, port=redis_port)

但它不起作用,一些文档似乎需要 en vpc 访问连接器,但这些仅在 us-cental1 中可用,并且我在 asia-northeast1 中运行了 App Engine 实例和 Memorystore (Redis)。

有没有人幸运地让它工作?一般来说,谷歌很擅长记录他们的东西,但这对我来说似乎缺乏,没有关于如何让它工作的明确文档。

【问题讨论】:

    标签: google-app-engine redis google-cloud-platform google-cloud-memorystore


    【解决方案1】:

    从 App Engine 标准环境应用程序和 App Engine Flex 应用程序 2020 连接到 Redis 实例

    1.下载并安装Cloud SDK。

    2.如果您已经安装了 Cloud SDK,请运行以下命令对其进行更新:

    gcloud components update
    

    3.新建项目:

    gcloud projects create [YOUR_PROJECT_ID] --set-as-default
    

    4.验证项目是否已创建:

    gcloud projects describe [YOUR_PROJECT_ID]     
    

    5.设置刚刚创建的项目:

    gcloud config set core/project PROJECT_ID
    

    6.使用您的项目初始化您的 App Engine 应用并选择其区域:

    gcloud app create --project=[YOUR_PROJECT_ID]
    

    7. 出现提示时,选择您希望 App Engine 应用程序所在的区域。记住该区域,我们将在同一区域中创建 Redis 实例和 VPC 连接器。我的 App Engine 应用程序在 europe-west2

    8.确保为您的项目启用计费。结算帐户需要与您的项目相关联,才能将应用部署到 App Engine。

    9.安装以下先决条件:

    a.Download and install Git

    b.运行以下命令以安装包含适用于 Python 3.7 的 App Engine 扩展的 gcloud 组件:

    gcloud components install app-engine-python
    

    c.Prepare your environment for Python development

    10.为 Redis 实例创建 Memorystore。输入以下命令在“europe-west2”区域创建一个 2 GiB 基本层 Redis 实例

    gcloud redis instances create myinstance --size=2 --region=europe-west2 /
    --redis-version=redis_4_0
    

    11.创建实例后,输入describe命令获取实例的IP地址和端口。您将使用主机和端口值连接到实例。同时找到您的Redis实例的授权网络

    gcloud redis instances describe myinstance --region=europe-west2
    

    12.配置无服务器 VPC 访问。确保在与您的应用和 Redis 实例相同的区域中创建连接器,并确保连接器连接到 Redis 实例的授权 VPC 网络。记住连接器的名称。

    13.确保为您的项目启用无服务器 VPC 访问 API:

    gcloud services enable vpcaccess.googleapis.com
    

    14.使用命令创建连接器:

    gcloud compute networks vpc-access connectors create connector --network default --region europe-west2 --range 10.10.0.0/28
    

    15.使用前请确认您的连接器处于READY状态,输出应包含行状态:READY

    16.克隆python的存储库。

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    cd python-docs-samples/memorystore/redis
    

    17.准备应用程序以进行部署App Engine Standard。更新应用程序的配置以指定您的无服务器 VPC 访问连接器以及您的 Redis 实例的 IP 地址和端口:

     cd gae_standard_deployment/
     cat app.yaml
    
    
    runtime: python37
    entrypoint: gunicorn -b :$PORT main:app
    
    # Update with Redis instance details
    env_variables:
      REDISHOST: '<REDIS_IP>'
      REDISPORT: '6379'
    
    # Update with Serverless VPC Access connector details
    vpc_access_connector:
      name: 'projects/<PROJECT_ID>/locations/<REGION>/connectors/<CONNECTOR_NAME>'
    
    

    18.将应用部署到 App Engine 标准环境

    cd ..
    cp gae_standard_deployment/app.yaml .
    

    19.运行部署命令

    gcloud beta app deploy
    

    20.部署完成后,通过以下 URL 访问您的应用,将 [PROJECT_ID] 替换为您的 Google Cloud 项目 ID。

    Visitor number: 4
    

    成功!

    21.为部署准备应用程序App Engine Flex。更新应用程序的配置以指定您的 Redis 实例的 IP 地址和端口:

    cd gae_flex_deployment/
    cat app.yaml
    

    cp gae_flex_deployment/app.yaml .

    
    runtime: python
    env: flex
    entrypoint: gunicorn -b :$PORT main:app
    
    runtime_config:
      python_version: 3
    
    # Update with Redis instance IP and port
    env_variables:
      REDISHOST: '<REDIS_IP>'
      REDISPORT: '6379'
    
    # Update with Redis instance network name
    network:
      name: default
    
    

    22.将应用部署到 App Engine 标准环境

    cd ..
    cp gae_flex_deployment/app.yaml .
    

    23.运行部署命令

    gcloud beta app deploy
    

    24.部署完成后,通过以下 URL 访问您的应用,将 [PROJECT_ID] 替换为您的 Google Cloud 项目 ID。

    Visitor number: 4
    

    成功!

    【讨论】:

    • 好答案。一个问题,如何确定IP范围为10.10.0.0/28?而不是 Google Cloud 仪表板建议的 10.8.0.0/28?
    【解决方案2】:

    您可以在其他区域使用 VPC 连接器,但只能使用 gcloud 命令行。在 GUI 上,只有 us-central1 可用。

    【讨论】:

    • 非常感谢!我能够在正确的区域创建 VPC 连接器,但仍然无法将我的 AppEngine 实例连接到 redis。连接器报告为就绪,并且在 app.yaml 中正确设置,但连接仍然超时。
    • 终于成功了!必须通过“gcloud beta deploy”作为其他区域的 VPC 连接器进行部署是一个 beta 功能。
    【解决方案3】:

    目前(2019 年 9 月),您确实只能在 us-central1 区域创建 VPC 连接器。考虑到它目前是beta 功能。可用性将逐步添加到其他区域,同时向一般可用性迈进。

    如果没有 VCP 连接器,您将无法连接到 MemoryStore,原因是 App Engine Standard 应用在 Google 拥有的网络中运行,而不是在您的某个网络中运行。 VPC 连接器本质上是在您项目中选择的网络中运行的 Compute Engine 实例,并设置为通过内部 IP 代理对 MemoryStore 的请求。

    【讨论】:

    • 哦,好的,所以无法完成。太糟糕了,memcache 曾经是 python 2.7 版本的应用引擎的一个不错的选择,但现在不再是一个选择。感谢您的评论!
    • 虽然内存存储运行在同一个 google 拥有的网络上,不是吗?那么为什么它不能连接到它呢?
    猜你喜欢
    • 2020-06-24
    • 2020-03-31
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2016-07-23
    • 2022-11-22
    相关资源
    最近更新 更多