Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hasuraの本番運用に向けて

 Hasuraの本番運用に向けて

2023/1/19 の Hasura User Group Tokyo Meetup #2 で話した内容です。
---
Hasura に限らず、本番環境にミドルウェアを適用する際には検討すべきことが多くあります。今回は、弊社が Hasura を本番環境に適用する上で検討したことや工夫したことについて話します。

Norimitsu Yamashita

January 20, 2023
Tweet

More Decks by Norimitsu Yamashita

Other Decks in Technology

Transcript

  1. #hug_tokyo
 自己紹介
 3 - 受託開発
 - LINEミニアプリ
 - Webアプリ
 -

    インフラ構築支援
 - 主要技術
 - React, Vue.js
 - Node.js, NestJS
 - TypeScript
 - AWS
 - AWS CDK
 - Hasura
 - 2022年7月〜
 株式会社グランドリーム 代表取締役 山下 徳光 兼 エンジニア
  2. #hug_tokyo
 HasuraのEdition
 9 • Hasura Cloud
 • Hasura Enterprise Edition

    (EE)
 • Hasura Community Edition (CE)
 ◦ ☆本発表の対象はCE

  3. #hug_tokyo
 Hasuraのインフラ構成
 12 ※Hasuraの構成説明用の簡易構成です。 
 Hasura採用後
 
 • HAProxy
 ◦

    リバースプロキシで配置
 ◦ アクセス制御
 ◦ ルーティング
 • Hasura
 ◦ PostgreSQLにCRUD
 • NestJS
 ◦ Hasura Remote Schemas
 ◦ 業務ロジックを通してCRUD

  4. #hug_tokyo
 Production Checklist
 15 • Admin Secretの設定
 • パーミッションの確認
 •

    有効APIの選択
 • Hasura Consoleの無効化
 • 開発モードの無効化
 • Allow Listの有効化
 • CORSの設定
 • HTTPSの有効化

  5. #hug_tokyo
 実運用の課題
 17 • IPアドレス制限
 • 複数Hasuraインスタンスの起動
 • メタデータの同期
 •

    Remote Schemasの再接続
 • Webhook APIの接続
 • CI/CDのネットワーク構成

  6. #hug_tokyo
 IPアドレス制限
 19 • 前提・課題
 ◦ Admin SecretはDBパスワードとほぼ同義
 ▪ 漏洩した場合のリスクは甚大

    
 • 全テーブルのスキーマ操作・CRUD 
 • Hasura Console
 ◦ Production Checklistの推奨設定は「長い文字列の設定」
 ▪ 総当たり攻撃からは原則防御可能 
 ▪ 漏洩は防げない
 • 単純漏洩
 • 過去のサービス運用担当者から漏洩 

  7. #hug_tokyo
 複数Hasuraインスタンスの起動
 23 • 前提・課題
 ◦ サービス毎にHasuraを分離したい
 ▪ toC向けアプリ・管理画面など
 ◦

    サービス毎にHasuraのメタデータが異なる
 • 対応内容
 ◦ 各サービスのHasuraの環境変数に HASURA_GRAPHQL_METADATA_DATABASE_URL を設定

  8. #hug_tokyo
 メタデータの同期
 26 • 前提・課題
 ◦ ローカル環境でHasura Consoleを利用してメタデータを設定
 ▪ 設定したメタデータはDBに保存される

    
 ◦ メタデータを本番環境に読み込む必要がある
 ◦ メタデータ系コマンド
 ▪ メタデータエクスポート: haura metadata export 
 ▪ メタデータインポート: hasura metadata apply 
 ▪ メタデータリロード: hasura metadata reload 

  9. #hug_tokyo
 メタデータの同期
 28 データベースの設定apps/${SERVICE_NAME}/config/hasura/metadata/databases/databases.yaml
 - name: app kind: postgres configuration:

    connection_info: database_url: # 環境変数を指定 from_env: HASURA_GRAPHQL_APP_DATABASE_URL tables: "!include app/tables/tables.yaml" • 環境毎に接続先が異なるので環境変数で管理

  10. #hug_tokyo
 メタデータの同期
 29 Remote Schemasの設定apps/${SERVICE_NAME}/config/hasura/metadata/remote_schemas.yaml
 - name: admin-api definition: #

    環境変数を設定 url_from_env: HASURA_GRAPHQL_REMOTE_SCHEMA_URL timeout_seconds: 60 forward_client_headers: true comment: "" • 環境毎に接続先が異なるので環境変数で管理

  11. #hug_tokyo
 Remote Schemasの再接続
 • 前提・課題
 ◦ ECS内のタスクに複数サービス(HAProxy, Hasura, NestJS) 同居する構成。


    ◦ 各サービスの起動時間は一定ではないが、原則、NestJS よりHasuraが先に起動するため、Hasura起動時にRemote Schemasの読み込みに失敗する。
 ◦ Remote Schemasは読み込み失敗時の定期リロードの仕組 みがないため、手動リロードが必要。
 32
  12. #hug_tokyo
 Remote Schemasの再接続
 34 await axios.post( process.env.HASURA_URL, JSON.stringify({ type: 'reload_remote_schema',

    args: { name: 'service-api', }, }), { headers: { 'x-hasura-admin-secret': process.env.HASURA_GRAPHQL_ADMIN_SECRET, }, }, );
  13. #hug_tokyo
 Webhook APIの接続
 • 前提・課題
 ◦ Hasura採用前に、NestJSでGraphQL・Webhook APIを受信 していた。
 ◦

    Hasura+Remote Schemas構成にしたことで、ロードバラン サー経由のアクセスでWebhook APIにリクエストできなく なった。
 36
  14. #hug_tokyo
 CI/CDのネットワーク構成
 • 前提・課題
 ◦ CI/CDでHasuraのメタデータ操作が必要。
 ◦ Admin Secretの外部アクセスを禁止したため、公開API経由でメ タデータ操作ができない。


    ◦ ECSタスクのプライベートIPは起動毎に動的に変化するため、 Hauraの接続先も動的に変化する。
 • 対応方法
 ◦ AWS CloudMapでECSタスクのプライベートIPに向けて通信でき るようにする。
 40