Rustでsqlxを利用して、GCPのCloudSQLにPrivate IPで接続する場合はruntime-actix-rustlsではなくruntime-actix-native-tlsを利用する


Rust で actix-web + sqlx を使った Web API サーバーを、 Cloud Run にデプロイし、DB に Cloud SQL を利用しようとしたところ下記のエラーに相当悩みました。

 Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information.

CloudSQL のインスタンスにパブリック IP を持たせて接続すると上手く接続できるものの、Private IP のみだと上記エラーが表示され、ログには Tls(InvalidDNSNameError)が出る状況でした。DB のホストに IP を指定する場合に起きるようです。

※注意 上記のエラーは DB 接続エラーの色々な症状で出るため、同じエラー内容でも今回の方法では問題が解決しない可能性があります。

結論

Cargo.toml の sqlx の feature を確認する。利用しているのが runtime-actix-rustls なら、runtime-actix-native-tls を利用する。

sqlx = { version = "0.5.9", default-features = false, features = [ "runtime-actix-rustls", "macros", "postgres", "uuid", "chrono", "migrate", "offline"] }

参考:

CloudSQL にパブリック IP を設定しないときは、サーバーレス VPC アクセスを作成して、コネクタが必要。

公式ガイドの通りですが設定がどうにもわからなかったのでメモ。

./run.jpg

パブリック IP を公開している場合、CloudRun からは DB HOST に接続名(xxx:asia-northeast1:xxxxx のような名前)を設定して接続が可能です。その時、Cloud SQL 接続に Cloud SQL インスタンスを設定します。VPCk コネクタは必要ありません。

パブリック IP を公開せず、Private IP (10.xx.xxx.x のようにプライベート IP アドレスの項目で表示されているもの)で Cloud Run から接続するときは、DB のホスト指定に IP を指定します。こちらのケースでは Cloud SQL 接続の設定は不要ですが、別途サーバーレス VPC アクセスの作成と、設定が必要になります(上記画像のような形になる)。

簡単なのはパブリック IP を公開する形なので、お試しで遊んでいる場合はパブリック IP を公開する方がやりやすいかもしれません。一方、パブリック IP を公開するとその分料金が加算されます。プライベート IP 接続の場合は、サーバーレス VPC アクセスの費用が別途必要です。どちらの方が料金を抑えられるのかは使いながら検証中です。