Help us understand the problem. What is going on with this article?

Serverless VPC AccessでGAE(Standard)からCloud Memorystore使ってみた

いまきたさんぎょう

GAE(Standard)で
Cloud Memorystoreに
アクセス出来るよ

注意

Serverless VPC Accessはbetaです。
いつの間にか変わっていても私のせいじゃないです。

Serverless VPC Accessとは

GAE(かCloud Functions)から、VPC内のリソースに、プライベートIPアドレスでアクセス出来るようになります
詳しくは公式ドキュメントを読んでください。

で、具体的に何できんの?

  • CloudSQL
  • Cloud Memorystore
  • GCEサーバー

などのVPC中にあるリソースを、外部に公開することなく、GAE(やCloud Functions)からアクセスすることが出来るようになります。

また、GAEの2nd Generation(Python3.7)では、1st Generation(Python2.7)で使えたMemcacheが使えなくなっていますが、その代替としても
言及されています

Cloud Memorystoreで使ってみる

GAE(Python3.7+Standard)から、Serverless VPC AccessでCloud Memorystoreを使ってみました。

VPCの準備

gcloudなりConsoleなりでVPCを作ってください。
後述の理由で、Serverless VPC Access試すだけならSubnetは作らない方が楽です。

Serverless VPC Accessの準備

Serverless VPC Accessで「IP 範囲は、VPC ネットワーク内の既存の IP アドレス予約と重複してはいけません」らしいので、IPアドレスの範囲はいい感じに設定してください。

ちなみに、IPアドレスの範囲が被っていると、GCE Subnetに下のようなエラーが出ます。

"Invalid value for field 'resource.ipCidrRange': '10.147.0.0/28'. Extended subnetworks in auto subnet mode networks cannot overlap with 10.128.0.0/9."

Cloud Memorystoreの準備

作ったVPC内にCloud Memorystoreを作ります

Connection propertiesに
* IPアドレス
* ポート
が表示されるので、メモっておきます。

GAEの準備

GAE Standardでも、GAE Flexibleからのアクセスと同様に、利用出来ます。

# -*- coding: utf-8 -*-

from flask import Flask, request
import os
import redis

app = Flask(__name__)


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

@app.route('/hoge', methods=['GET'])
def hoge_request():
    value = redis_client.incr('counter', 1)
    return str(value), 200

app.yaml

runtime: python37
service: default
entrypoint: gunicorn handlers:app --workers=1

env_variables:
  REDISHOST: CloudMemorystoreのIPアドレス
  REDISPORT: CloudMemorystoreのポート

vpc_access_connector:
  name: "projects/projectのID/locations/asia-northeast1/connectors/コネクタの名前"

handlers:
- url: /hoge
  script: auto

requirements.txt

flask
gunicorn
redis

デプロイ
公式ドキュメントにもあるようにbetaを付ける必要があります(※)。

gcloud beta app deploy app.yaml

※betaつけないと、デプロイには成功しますが、デプロイ後のMemorystoreへのアクセス時に失敗します

結果

Redisにカウントが保存され、アクセスするたびにインクリメントされます。

> curl "https://エンドポイント.appspot.com/hoge"
8
> curl "https://エンドポイント.appspot.com/hoge"                                                                                                                                        
9

その他

  • GAEとServerless VPC Accessは同じリージョンである必要があります
    • リリースノートには無いですが、いつの間にかasia-northeast1で使えるようになっています
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away