CloudRun(Prisma)からプライベートIPのCloudSQL(MySQL)へ接続する
接続方法
-
VPCコネクタの設定: Cloud RunからプライベートIPのCloud SQLインスタンスへ接続するには、まずVPCコネクタを設定する必要があります。VPCコネクタは、Cloud RunサービスとVPCネットワーク間の接続を提供します。
こちらの公式ドキュメントに従って、VPCコネクタを作成します。 -
schema.prisma
ファイルの設定datasource db { provider = "mysql" url = env("DATABASE_URL") } generator client { provider = "prisma-client-js" }
-
DATABASE_URL
の設定CloudRunデプロイ時に
DATABASE_URL
を設定します。gcloud run deploy [SERVICE_NAME] \ --image [IMAGE_NAME] \ --set-env-vars DATABASE_URL=mysql://[USER]:[PASSWORD]@[PRIVATE_IP]:3306/[DATABASE_NAME] \ --vpc-connector projects/[PROJECT_ID]/locations/[REGION]/connectors/[VPC_CONNECTOR_NAME] \ --allow-unauthenticated
SSL接続を行う場合
SSL接続を行う場合は、別途証明書を用意する必要があります。
gcloud run deploy [SERVICE_NAME] \
--image [IMAGE_NAME] \
--set-env-vars DATABASE_URL=mysql://[USER]:[PASSWORD]@[PRIVATE_IP]:3306/[DATABASE_NAME]?sslidentity=[CLIENT_CERT_PATH]&sslpassword=[PASSWORD]&sslcert=[SERVER_CERT_PATH] \
--vpc-connector projects/[PROJECT_ID]/locations/[REGION]/connectors/[VPC_CONNECTOR_NAME] \
--allow-unauthenticated
MySQL database connector (Reference)
-
SSL接続を行う場合の指定可能なパラメータは以下
-
sslcert=<PATH>
- PATH: サーバー証明書へのパス
- データベース・サーバがクライアント証明書に署名するために使用するルート証明書
- 証明書がシステムの信頼できる証明書ストアに存在しない場合は、これを提供する必要がある
- Google Cloudの場合: server-ca.pem
- 証明書のパスは ./prisma フォルダからの相対パスで解決される
-
sslidentity=<PATH>
-
PATH: PKCS12証明書データベースへのパス
-
クライアント証明書とクライアント鍵からPKCS12証明書データベースが作成される
- クライアント鍵とクライアント証明書を使って生成されるPKCS12形式のSSL IDファイル
-
この二つのファイルを一つにまとめて、パスワードで保護する
-
クライアントキーとクライアント証明書を使ってこのファイルを作るには、次のコマンドを使う
openssl pkcs12 -export -out client-identity.p12 -inkey client-key.pem -in client-cert.pem
-
-
-
sslpassword=<PASSWORD>
- PKCS12ファイルを保護するために使用されたパスワード
- 前のステップで挙げたopensslコマンドは、PKCS12ファイルを作成する際にパスワードを尋ねてくるので、同じパスワードをここで入力する必要がある
-
sslaccept=(strict|accept_invalid_certs)
- strict
- accept_invalid_certs (default)
例)
mysql://USER:PASSWORD@HOST:PORT/DATABASE?sslidentity=client-identity.p12&sslpassword=mypassword&sslcert=rootca.cert
バッドノウハウ
下記のエラーが発生する場合
Error: P1011: Error opening a TLS connection: error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:../crypto/evp/evp_fetch.c:373:Global default library context, Algorithm (RC2-40-CBC : 0), Properties ()
inner_evp_generic_fetch
curl - OpenSSL error error:0308010C:digital envelope routines::unsupported
↑もしかするとopensslのバージョンが古い?かもしれないので、opensslのバージョンを確認してみます。
-
opensslのバージョン確認
$ openssl version LibreSSL 3.3.6
-
早速バージョンアップしてみる
$ brew update $ brew upgrade openssl $ openssl version LibreSSL 3.3.6
変わらない。。
Openssl 3.x and Legacy Providers – Practical Networking .net
↑を見るとCloudRun or prisma 上は古いopensslのproviderを見にいってるのに、作られた際に新しいアルゴリズムを使っているのでエラーが出るっぽい?
結果
OpenSSL 3.0.9 30 May 2023 (Library: OpenSSL 3.0.9 30 May 2023)
のバージョンのopesslでなら成功しました
Discussion