🐧

HasuraをCloud RunとCloud SQL(PostgreSQL)で起動するアーキテクチャと設定例

2022/09/07に公開

こんにちは、クラウドエースの錦木です。
Hasura公式にはGoogle Kubernetes Engineを利用してGoogle CloudでHasuraを実行するサンプルが記載されていますが、Cloud Runについては記載がありません。
この記事では、HasuraをCloud Runで実行するためのアーキテクチャとその設定例を紹介します。
Hasuraそのものの説明やそれぞれのGoogle Cloudプロダクトの説明ついてはこの記事では扱いません。

アーキテクチャ

重要な登場人物は Cloud Run, Cloud SQL(PostgreSQL) に加え、Serverless VPC Accessです。

alt

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における起動時の設定例を記載します。
特に記載の無い場合はデフォルトの値を利用します。

alt

key value
Container image URL さきほどpushしたimageを選択
Service name 任意の名前
Region 任意ですが、Cloud SQLインスタンスのregionと同じが良いです

alt

key value
CPU allocation and pricing CPU is only allocated...
Minimum number of instances 0
Maximum number of instances 1

ここでは検証用途を想定して、ゼロスケール可能にし最大でも1台としています。

alt

key value
Ingress Allow all traffic
Authentication Allow unauthenticated invocations

簡便のため、全てのリクエストを許可します。

alt

key value
Execution environment Second generation
Environment variables 先程記載したもの
Secrets 環境変数のうちSecret Managerに保存したもの

alt

key value
VPC > Network Serverless VPC Networkで作成した Connector

これで、Cloud SQLが起動していればHasuraが起動できます。
Cloud Runに https://<任意の名前>-<ランダム文字列>.a.run.app のようなURLが示されているはずなので、ここにアクセスすると次のように admin-secretの入力を要求されます。

alt

ここにHASURA_GRAPHQL_ADMIN_SECRETで設定した値を入力すると、Hasuraのコンソールにアクセスできます。

GraphQLリクエストを送る際にFirebase AuthenticationのIDトークンを用意するのが面倒であれば、 リクエストヘッダーX-Hasura-Admin-SecretHASURA_GRAPHQL_ADMIN_SECRETで設定した値を入れておけば全てのクエリが実行可能なことを知っておくと良いでしょう。

以上です。

次回はFirebase AuthenticationのセッションCookieをHasuraで利用する方法を紹介します。

Discussion