GCP内のネットワークについて覚書
CloudRunのサービスからCloudSQLへのアクセス方法
CloudRunへデプロイしたアプリケーションからCloudSQLインスタンスのDBへ接続するための方法。
出来る限りGCPのローカルネットワークを使用し、費用の掛からない方法順で記載。
-
直接VPCに接続する
Runサービスの編集で「ネットワークキング」>「アウトバウンド トラフィック用の VPC に接続する」>「VPC に直接トラフィックを送信する」
コンテナ上のアプリケーションでDBインスタンスのローカルIPを指定。
個人的一番設定が楽。
CloudSQLへのアクセスは指定したVPCのサブネットのIPが自動的に振られる。リビジョン変えると変わる。 -
SQLプロキシを設定する。
Runサービスの編集で「コンテナ」>「Cloud SQL 接続」
コンテナ上のアプリケーションの接続はunix_socketでDB接続名を指定する。
Runの実行ユーザに「CloudSQLクライアント」のIAMロールが必要。
CloudSQLへのアクセスはプロキシされたローカルIP固定。 -
サーバレスVPCコネクタを使用する
VPCネットワークの「サーバレスVPCアクセス」でコネクタを作成する
Runサービスの編集で「ネットワークキング」>「アウトバウンド トラフィック用の VPC に接続する」>「サーバーレス VPC アクセス コネクタを使用」
コンテナ上のアプリケーションでローカルIPを指定。
CloudSQLへのアクセスはコネクタに指定したサブネット内のIPが自動的に振られる。コネクタ内のインスタンスが2つの場合、IPも2つ使用される。コネクタがスケールイン/アウトすると変わる。 -
グローバルIPをCloudSQLに付与して接続する
設定はCloudSQL側でする必要があり、インスタンスは数分接続できなくなる。Run側はCloudNATに接続するための設定「VPC下り(外向き)」を設定する必要あり。
CloudRunとNATについて
コンテナ上のアプリケーションでDBインスタンスのグローバルIPを指定。
外部ネットワーク経由のアクセスになるのでCloudNAT+静的IP+トラフィック費用がかかるかも。
CloudSQLへのアクセスはNATのグローバルIP固定。
備考:
12はローカルネットワーク経由なので費用が安く、途中に色々なサービスを挟まない分パフォーマンスが上がる。他のサーバレスサービスとの接続は追加で設定が必要。
3はコネクタの最小インスタンス数が2、かつ24時間フルで起動するためどうしてもランニングコストがやばい。けど他のサーバレスサービスと接続する場合は必要そう。
4はグローバルを経由するのでその分料金がかかるが、VPCなどの設定をせずともアクセスが可能になるはず(未検証)
Regional Load BalancerでSSLに自己証明を持ちいる
Googleマネージドの証明書はグローバルロードバランサーでしか使用できない。テスト等でロードバランサを立てた場合に自己証明書を用いる場合のメモ
自己証明書の作成
適当なLinux環境で作成する
# 設定ファイルの作成(myapp.localは作成するドメイン名)
$ cat <<EOF > openssl.cnf
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = myapp.local
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = myapp.local
EOF
# 作成
$ openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout myapp.local.key -out myapp.local.crt -config openssl.cnf
LBのフロントエンドの構成セクション
- HTTPの設定をする
- HTTPSの設定をする
証明書をクリックし、「新しい証明書を作成」を選択。
証明書に「myapp.local.crt」の内容を入力し、秘密鍵に「myapp.local.key」を入力する。
自己証明である警告が出るがOK。 - SSLポリシーは「GCPのデフォルト」
後はローカルのhostsを書き換えて確認。
設定ファイルで指定したドメイン名でなくても問題はない。