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
 Hasuraの
 本番運用に向けて
 株式会社グランドリーム
 代表取締役 山下 徳光
 Hasura User Group

    Tokyo Meetup #2
  2. #hug_tokyo
 自己紹介
 2

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

    インフラ構築支援
 - 主要技術
 - React, Vue.js
 - Node.js, NestJS
 - TypeScript
 - AWS
 - AWS CDK
 - Hasura
 - 2022年7月〜
 株式会社グランドリーム 代表取締役 山下 徳光 兼 エンジニア
  4. #hug_tokyo
 自己紹介 - LINE API Expert
 4 LINEを活用したアプリ開発のエキスパート
 2023年1月17日 認定

    (7名)

  5. #hug_tokyo
 自己紹介 - Twitter
 5 @nori3tsu


  6. #hug_tokyo
 目次
 6

  7. #hug_tokyo
 目次
 7 • HasuraのEdition
 • Hasuraのインフラ構成
 • Production Checklist


    • 実運用の課題

  8. #hug_tokyo
 HasuraのEdition
 8

  9. #hug_tokyo
 HasuraのEdition
 9 • Hasura Cloud
 • Hasura Enterprise Edition

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

  10. #hug_tokyo
 Hasuraのインフラ構成
 10

  11. #hug_tokyo
 Hasuraのインフラ構成
 11 Hasura採用前
 ※Hasuraの構成説明用の簡易構成です。 


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

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

  13. #hug_tokyo
 Production Checklist
 13

  14. #hug_tokyo
 Production Checklist
 14 https://hasura.io/docs/latest/deployment/production-checklist/
 
 Hasura公式の本番環境チェックリスト


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

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

  16. #hug_tokyo
 実運用の課題
 16

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

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

  18. #hug_tokyo
 IPアドレス制限
 18

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

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

  20. #hug_tokyo
 IPアドレス制限
 20 • 対応方法
 ◦ HAProxyで内部ネットワーク以外からのAdmin Secretアク セス(x-hasura-admin-secret)をブロックする。


  21. #hug_tokyo
 IPアドレス制限
 21

  22. #hug_tokyo
 複数Hasuraインスタンスの起動
 22

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

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

  24. #hug_tokyo
 複数Hasuraインスタンスの起動
 24

  25. #hug_tokyo
 メタデータの同期
 25

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

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

  27. #hug_tokyo
 メタデータの同期
 27 メタデータ同期フロー
 ※(6)-(7)の詳細は次項で解説 


  28. #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" • 環境毎に接続先が異なるので環境変数で管理

  29. #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: "" • 環境毎に接続先が異なるので環境変数で管理

  30. #hug_tokyo
 Remote Schemasの再接続
 30

  31. #hug_tokyo
 Remote Schemasの再接続
 31

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


    ◦ 各サービスの起動時間は一定ではないが、原則、NestJS よりHasuraが先に起動するため、Hasura起動時にRemote Schemasの読み込みに失敗する。
 ◦ Remote Schemasは読み込み失敗時の定期リロードの仕組 みがないため、手動リロードが必要。
 32
  33. #hug_tokyo
 Remote Schemasの再接続
 • 対応内容
 ◦ NestJSの起動処理が完了次第、Hasuraのmetadata APIを 実行してRemote Schemasの再接続を試みる。


    33
  34. #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, }, }, );
  35. #hug_tokyo
 Webhook APIの接続
 35

  36. #hug_tokyo
 Webhook APIの接続
 • 前提・課題
 ◦ Hasura採用前に、NestJSでGraphQL・Webhook APIを受信 していた。
 ◦

    Hasura+Remote Schemas構成にしたことで、ロードバラン サー経由のアクセスでWebhook APIにリクエストできなく なった。
 36
  37. #hug_tokyo
 Webhook APIの接続
 
 • 対応内容
 ◦ Webhook APIのリクエストのみ、HAProxyでNestJSに直接 ルーティング


    37
  38. #hug_tokyo
 Webhook APIの接続
 
 38

  39. #hug_tokyo
 CI/CDのネットワーク構成
 39

  40. #hug_tokyo
 CI/CDのネットワーク構成
 • 前提・課題
 ◦ CI/CDでHasuraのメタデータ操作が必要。
 ◦ Admin Secretの外部アクセスを禁止したため、公開API経由でメ タデータ操作ができない。


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

  42. #hug_tokyo
 • Production Checklistは必読
 • Admin Secretの外部公開は制御すべき
 • セキュアにHasuraを利用して快適な開発ライフ を!


    さいごに
 42
  43. #hug_tokyo
 ご清聴ありがとうございました。
 43 フルスタックエンジニアを目指したい 
 開発が好き・技術が好き 
 ずっと開発していたい 
 そんなエンジニア仲間を募集中!