HasuraをCloud RunとCloud SQL(PostgreSQL)で起動するアーキテクチャと設定例
こんにちは、クラウドエースの錦木です。
Hasura公式にはGoogle Kubernetes Engineを利用してGoogle CloudでHasuraを実行するサンプルが記載されていますが、Cloud Runについては記載がありません。
この記事では、HasuraをCloud Runで実行するためのアーキテクチャとその設定例を紹介します。
Hasuraそのものの説明やそれぞれのGoogle Cloudプロダクトの説明ついてはこの記事では扱いません。
アーキテクチャ
重要な登場人物は Cloud Run
, Cloud SQL(PostgreSQL)
に加え、Serverless VPC Access
です。
Serverless VPC Accessは、Cloud FunctionsやCloud Runのようなサーバーレスなアプリケーションを、任意のVPCネットワークのリソースに内部IPアドレスで到達できる機能です。
Cloud SQLは任意のVPCネットワークから内部IPアドレスで接続できるように構成できるので、Serverless VPC AccessでVPC ネットワークと繋がったCloud Runはそのネットワークを介してCloud SQLとも繋がっている、とイメージしていただくとわかりやすいです。
注意点として、Cloud RunにはCloud SQLと接続するためのProxyを利用するオプションがあり、これを利用するのであればServerless VPC Accessを利用する必要はありません。
しかし、Cloud SQLに外部IPアドレスで接続しなければならない点や、VPCネットワークのリソースに内部IPアドレスで到達できず他のプロダクトと連携しづらい点を考慮し、ここではServerless VPC Accessを利用した例を紹介します。
Hasuraの起動
Cloud SQLの起動やServerless VPC Accessの設定は省略し、それらが存在する前提でCloud RunでHasuraを起動する時の環境変数とその値の与え方に焦点を当てます。
前提として、Firebase Authenticationで得られるIDトークン(jwt)を Authorization
ヘッダーで送信して認可を行うケースを想定しています。セッションCookieを用いる方法についてはまた別の記事で投稿する予定です。
コンテナの用意
まずはHasuraのコンテナをArtifact Registryにpushします。以下のコマンドはCloud Shellで動作を確認しています。
(Optional) ローカル端末からCloud Shellに接続
gcloud cloud-shell ssh --authorize-session
Artifact Registryにrepositoryを作成
gcloud artifacts repositories create <REPOSITORY_NAME> \
--repository-format=docker \
--location=asia-northeast1 \
--project=<YOUR_PROJECT_ID>
コンテナイメージをpull
docker pull hasura/graphql-engine:v2.11.1
Artifact Registry向けにコンテナイメージにタグを付与する
docker tag hasura/graphql-engine:v2.11.1 \
asia-northeast1-docker.pkg.dev/<YOUR_PROJECT_ID>/<REPOSITORY_NAME>/graphql-engine:v2.11.1
gcloudでArtifact Registryに認証する
gcloud auth configure-docker \
asia-northeast1-docker.pkg.dev
コンテナイメージをpushする
docker push asia-northeast1-docker.pkg.dev/<YOUR_PROJECT_ID>/<REPOSITORY_NAME>/graphql-engine:v2.11.1
Hasura起動時に重要な環境変数
key | value | description | Secret Manager推奨 |
---|---|---|---|
HASURA_GRAPHQL_DATABASE_URL | postgres://<user>:<password>@<CloudSQLの内部IPアドレス>:5432/<DBの名前> | Cloud SQLに接続する情報 | ✅ |
HASURA_GRAPHQL_ADMIN_SECRET | 任意の文字列 | Hasuraの様々な場面で利用する管理者パスワード | ✅ |
HASURA_GRAPHQL_ENABLE_CONSOLE | true | Hasuraのブラウザコンソールを有効にするかどうか | |
HASURA_GRAPHQL_JWT_SECRET | https://hasura.io/jwt-config で生成できるJWT Config | idトークンの検証に使う |
上の2つについては機密情報なので、Cloud Runを起動する際にSecret Managerから値を注入することをオススメします。
Cloud Runの設定
続いてはCloud Runにおける起動時の設定例を記載します。
特に記載の無い場合はデフォルトの値を利用します。
key | value |
---|---|
Container image URL | さきほどpushしたimageを選択 |
Service name | 任意の名前 |
Region | 任意ですが、Cloud SQLインスタンスのregionと同じが良いです |
key | value |
---|---|
CPU allocation and pricing | CPU is only allocated... |
Minimum number of instances | 0 |
Maximum number of instances | 1 |
ここでは検証用途を想定して、ゼロスケール可能にし最大でも1台としています。
key | value |
---|---|
Ingress | Allow all traffic |
Authentication | Allow unauthenticated invocations |
簡便のため、全てのリクエストを許可します。
key | value |
---|---|
Execution environment | Second generation |
Environment variables | 先程記載したもの |
Secrets | 環境変数のうちSecret Managerに保存したもの |
key | value |
---|---|
VPC > Network | Serverless VPC Networkで作成した Connector |
これで、Cloud SQLが起動していればHasuraが起動できます。
Cloud Runに https://<任意の名前>-<ランダム文字列>.a.run.app
のようなURLが示されているはずなので、ここにアクセスすると次のように admin-secret
の入力を要求されます。
ここにHASURA_GRAPHQL_ADMIN_SECRET
で設定した値を入力すると、Hasuraのコンソールにアクセスできます。
GraphQLリクエストを送る際にFirebase AuthenticationのIDトークンを用意するのが面倒であれば、 リクエストヘッダーX-Hasura-Admin-Secret
にHASURA_GRAPHQL_ADMIN_SECRET
で設定した値を入れておけば全てのクエリが実行可能なことを知っておくと良いでしょう。
以上です。
次回はFirebase AuthenticationのセッションCookieをHasuraで利用する方法を紹介します。
Discussion