从Cloud Run连接到Memorystore

时间:2019-05-20 17:06:38

标签: google-cloud-run

我想在使用Cloud Memorystore作为缓存的Google Cloud Run上运行服务。

我在与Cloud Run相同的区域中创建了一个Memorystore实例,并使用示例代码进行连接:https://github.com/GoogleCloudPlatform/golang-samples/blob/master/memorystore/redis/main.go这不起作用。

接下来,我创建了一个无服务器的VPC访问Connectore,它没有帮助。我在没有GKE群集的情况下使用Cloud Run,所以无法更改任何配置。

是否有从Cloud Run连接到Memorystore的方法?

3 个答案:

答案 0 :(得分:3)

在等待serverless VPC connectors on Cloud Run时-谷歌昨天表示将在近期内发布公告-您可以通过GCE使用SSH隧道从Cloud Run连接到Memorystore。

基本方法如下。

首先,在GCE上创建转发器实例

gcloud compute instances create vpc-forwarder --machine-type=f1-micro --zone=us-central1-a

不要忘记在防火墙策略中打开端口22(默认情况下处于打开状态)。

然后通过您的Dockerfile安装gcloud CLI

这里是Rails应用程序的示例。 Dockerfile将脚本用作入口点。

# Use the official lightweight Ruby image.
# https://hub.docker.com/_/ruby
FROM ruby:2.5.5

# Install gcloud
RUN curl https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz > /tmp/google-cloud-sdk.tar.gz
RUN mkdir -p /usr/local/gcloud \
  && tar -C /usr/local/gcloud -xvf /tmp/google-cloud-sdk.tar.gz \
  && /usr/local/gcloud/google-cloud-sdk/install.sh
ENV PATH $PATH:/usr/local/gcloud/google-cloud-sdk/bin

# Generate SSH key to be used by the SSH tunnel (see entrypoint.sh)
RUN mkdir -p /home/.ssh && ssh-keygen -b 2048 -t rsa -f /home/.ssh/google_compute_engine -q -N ""

# Install bundler
RUN gem update --system
RUN gem install bundler

# Install production dependencies.
WORKDIR /usr/src/app
COPY Gemfile Gemfile.lock ./
ENV BUNDLE_FROZEN=true
RUN bundle install

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD ["bash", "entrypoint.sh"]

最后在您的entrypoint.sh脚本中打开到Redis的SSH隧道


# !/bin/bash

# Memorystore config
MEMORYSTORE_IP=10.0.0.5
MEMORYSTORE_REMOTE_PORT=6379
MEMORYSTORE_LOCAL_PORT=6379

# Forwarder config
FORWARDER_ID=vpc-forwarder
FORWARDER_ZONE=us-central1-a

# Start tunnel to Redis Memorystore in background
gcloud compute ssh \
  --zone=${FORWARDER_ZONE} \
  --ssh-flag="-N -L ${MEMORYSTORE_LOCAL_PORT}:${MEMORYSTORE_IP}:${MEMORYSTORE_REMOTE_PORT}" \
  ${FORWARDER_ID} &

# Run migrations and start Puma
bundle exec rake db:migrate && bundle exec puma -p 8080

通过上述解决方案,Memorystore将可用于localhost:6379上的应用程序。

尽管有一些注意事项

  1. 此方法要求您在Cloud Run服务上配置的服务帐户具有roles/compute.instanceAdmin角色,该角色非常强大。
  2. 将SSH密钥备份到映像中,以加快容器启动时间。那不是理想的。
  3. 如果转发器崩溃,则不会进行故障转移。

我在blog post中写了一个更长,更详尽的方法,该方法提高了整体安全性并增加了故障转移功能。该解决方案使用纯SSH而非gcloud CLI。

答案 1 :(得分:2)

Cloud Run有望在将来获得对无服务器VPC连接器的支持,这是使用Cloud Memorystore的先决条件。

您可以在GKE群集上创建Cloud Run,并在那里托管服务,直到Cloud Run上可以使用无服务器VPC访问支持为止。

另一种替代方法是,通过改编本《 App Engine操作指南》 https://cloud.google.com/appengine/docs/standard/python3/using-redislabs-redis,在Redis Labs上使用Redis实例。

答案 2 :(得分:1)

如果您的VPC中需要某些内容,还可以旋转Redis on Compute Engine

与Redis Cloud相比,它的成本更高(尤其是对于集群而言)-但如果必须将数据保留在VPC中,这是一个临时解决方案。