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

    View full-size slide

  2. #hug_tokyo

    自己紹介

    2

    View full-size slide

  3. #hug_tokyo

    自己紹介

    3
    - 受託開発

    - LINEミニアプリ

    - Webアプリ

    - インフラ構築支援

    - 主要技術

    - React, Vue.js

    - Node.js, NestJS

    - TypeScript

    - AWS

    - AWS CDK

    - Hasura

    - 2022年7月〜

    株式会社グランドリーム
    代表取締役 山下 徳光
    兼 エンジニア

    View full-size slide

  4. #hug_tokyo

    自己紹介 - LINE API Expert

    4
    LINEを活用したアプリ開発のエキスパート

    2023年1月17日 認定 (7名)


    View full-size slide

  5. #hug_tokyo

    自己紹介 - Twitter

    5
    @nori3tsu


    View full-size slide

  6. #hug_tokyo

    目次

    6

    View full-size slide

  7. #hug_tokyo

    目次

    7
    ● HasuraのEdition

    ● Hasuraのインフラ構成

    ● Production Checklist

    ● 実運用の課題


    View full-size slide

  8. #hug_tokyo

    HasuraのEdition

    8

    View full-size slide

  9. #hug_tokyo

    HasuraのEdition

    9
    ● Hasura Cloud

    ● Hasura Enterprise Edition (EE)

    ● Hasura Community Edition (CE)

    ○ ☆本発表の対象はCE


    View full-size slide

  10. #hug_tokyo

    Hasuraのインフラ構成

    10

    View full-size slide

  11. #hug_tokyo

    Hasuraのインフラ構成

    11
    Hasura採用前

    ※Hasuraの構成説明用の簡易構成です。

    View full-size slide

  12. #hug_tokyo

    Hasuraのインフラ構成

    12
    ※Hasuraの構成説明用の簡易構成です。

    Hasura採用後


    ● HAProxy

    ○ リバースプロキシで配置

    ○ アクセス制御

    ○ ルーティング

    ● Hasura

    ○ PostgreSQLにCRUD

    ● NestJS

    ○ Hasura Remote Schemas

    ○ 業務ロジックを通してCRUD


    View full-size slide

  13. #hug_tokyo

    Production Checklist

    13

    View full-size slide

  14. #hug_tokyo

    Production Checklist

    14
    https://hasura.io/docs/latest/deployment/production-checklist/


    Hasura公式の本番環境チェックリスト


    View full-size slide

  15. #hug_tokyo

    Production Checklist

    15
    ● Admin Secretの設定

    ● パーミッションの確認

    ● 有効APIの選択

    ● Hasura Consoleの無効化

    ● 開発モードの無効化

    ● Allow Listの有効化

    ● CORSの設定

    ● HTTPSの有効化


    View full-size slide

  16. #hug_tokyo

    実運用の課題

    16

    View full-size slide

  17. #hug_tokyo

    実運用の課題

    17
    ● IPアドレス制限

    ● 複数Hasuraインスタンスの起動

    ● メタデータの同期

    ● Remote Schemasの再接続

    ● Webhook APIの接続

    ● CI/CDのネットワーク構成


    View full-size slide

  18. #hug_tokyo

    IPアドレス制限

    18

    View full-size slide

  19. #hug_tokyo

    IPアドレス制限

    19
    ● 前提・課題

    ○ Admin SecretはDBパスワードとほぼ同義

    ■ 漏洩した場合のリスクは甚大 

    ● 全テーブルのスキーマ操作・CRUD 

    ● Hasura Console

    ○ Production Checklistの推奨設定は「長い文字列の設定」

    ■ 総当たり攻撃からは原則防御可能

    ■ 漏洩は防げない

    ● 単純漏洩

    ● 過去のサービス運用担当者から漏洩 


    View full-size slide

  20. #hug_tokyo

    IPアドレス制限

    20
    ● 対応方法

    ○ HAProxyで内部ネットワーク以外からのAdmin Secretアク
    セス(x-hasura-admin-secret)をブロックする。


    View full-size slide

  21. #hug_tokyo

    IPアドレス制限

    21

    View full-size slide

  22. #hug_tokyo

    複数Hasuraインスタンスの起動

    22

    View full-size slide

  23. #hug_tokyo

    複数Hasuraインスタンスの起動

    23
    ● 前提・課題

    ○ サービス毎にHasuraを分離したい

    ■ toC向けアプリ・管理画面など

    ○ サービス毎にHasuraのメタデータが異なる

    ● 対応内容

    ○ 各サービスのHasuraの環境変数に
    HASURA_GRAPHQL_METADATA_DATABASE_URL を設定


    View full-size slide

  24. #hug_tokyo

    複数Hasuraインスタンスの起動

    24

    View full-size slide

  25. #hug_tokyo

    メタデータの同期

    25

    View full-size slide

  26. #hug_tokyo

    メタデータの同期

    26
    ● 前提・課題

    ○ ローカル環境でHasura Consoleを利用してメタデータを設定

    ■ 設定したメタデータはDBに保存される

    ○ メタデータを本番環境に読み込む必要がある

    ○ メタデータ系コマンド

    ■ メタデータエクスポート: haura metadata export

    ■ メタデータインポート: hasura metadata apply

    ■ メタデータリロード: hasura metadata reload

    View full-size slide

  27. #hug_tokyo

    メタデータの同期

    27
    メタデータ同期フロー

    ※(6)-(7)の詳細は次項で解説 


    View full-size slide

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


    View full-size slide

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


    View full-size slide

  30. #hug_tokyo

    Remote Schemasの再接続

    30

    View full-size slide

  31. #hug_tokyo

    Remote Schemasの再接続

    31

    View full-size slide

  32. #hug_tokyo

    Remote Schemasの再接続

    ● 前提・課題

    ○ ECS内のタスクに複数サービス(HAProxy, Hasura, NestJS)
    同居する構成。

    ○ 各サービスの起動時間は一定ではないが、原則、NestJS
    よりHasuraが先に起動するため、Hasura起動時にRemote
    Schemasの読み込みに失敗する。

    ○ Remote Schemasは読み込み失敗時の定期リロードの仕組
    みがないため、手動リロードが必要。

    32

    View full-size slide

  33. #hug_tokyo

    Remote Schemasの再接続

    ● 対応内容

    ○ NestJSの起動処理が完了次第、Hasuraのmetadata APIを
    実行してRemote Schemasの再接続を試みる。

    33

    View full-size slide

  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,
    },
    },
    );

    View full-size slide

  35. #hug_tokyo

    Webhook APIの接続

    35

    View full-size slide

  36. #hug_tokyo

    Webhook APIの接続

    ● 前提・課題

    ○ Hasura採用前に、NestJSでGraphQL・Webhook APIを受信
    していた。

    ○ Hasura+Remote Schemas構成にしたことで、ロードバラン
    サー経由のアクセスでWebhook APIにリクエストできなく
    なった。

    36

    View full-size slide

  37. #hug_tokyo

    Webhook APIの接続


    ● 対応内容

    ○ Webhook APIのリクエストのみ、HAProxyでNestJSに直接
    ルーティング

    37

    View full-size slide

  38. #hug_tokyo

    Webhook APIの接続


    38

    View full-size slide

  39. #hug_tokyo

    CI/CDのネットワーク構成

    39

    View full-size slide

  40. #hug_tokyo

    CI/CDのネットワーク構成

    ● 前提・課題

    ○ CI/CDでHasuraのメタデータ操作が必要。

    ○ Admin Secretの外部アクセスを禁止したため、公開API経由でメ
    タデータ操作ができない。

    ○ ECSタスクのプライベートIPは起動毎に動的に変化するため、
    Hauraの接続先も動的に変化する。

    ● 対応方法

    ○ AWS CloudMapでECSタスクのプライベートIPに向けて通信でき
    るようにする。

    40

    View full-size slide

  41. #hug_tokyo

    CI/CDのネットワーク構成

    41

    View full-size slide

  42. #hug_tokyo

    ● Production Checklistは必読

    ● Admin Secretの外部公開は制御すべき

    ● セキュアにHasuraを利用して快適な開発ライフ
    を!

    さいごに

    42

    View full-size slide

  43. #hug_tokyo

    ご清聴ありがとうございました。

    43
    フルスタックエンジニアを目指したい

    開発が好き・技術が好き

    ずっと開発していたい

    そんなエンジニア仲間を募集中!

    View full-size slide