🔑

CloudRun(Prisma)からプライベートIPのCloudSQL(MySQL)へ接続する

2024/01/28に公開

接続方法

  1. VPCコネクタの設定: Cloud RunからプライベートIPのCloud SQLインスタンスへ接続するには、まずVPCコネクタを設定する必要があります。VPCコネクタは、Cloud RunサービスとVPCネットワーク間の接続を提供します。
    こちらの公式ドキュメントに従って、VPCコネクタを作成します。

  2. schema.prisma ファイルの設定

    datasource db {
      provider = "mysql"
      url      = env("DATABASE_URL")
    }
    
    generator client {
      provider = "prisma-client-js"
    }
    
  3. 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

PHP OpenSSL によるシェルコマンドベースの暗号化

https://github.com/openssl/openssl/issues/20513

digital envelope routines:inner_evp_generic_fetch:unsupported:crypto\evp\evp_fetch.c:373:global default library context, algorithm (rc2-40-cbc : 0), properties () 🔎 You.com Search

↑もしかすると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