Slide 1

Slide 1 text

#hug_tokyo
 Hasuraの
 本番運用に向けて
 株式会社グランドリーム
 代表取締役 山下 徳光
 Hasura User Group Tokyo Meetup #2

Slide 2

Slide 2 text

#hug_tokyo
 自己紹介
 2

Slide 3

Slide 3 text

#hug_tokyo
 自己紹介
 3 - 受託開発
 - LINEミニアプリ
 - Webアプリ
 - インフラ構築支援
 - 主要技術
 - React, Vue.js
 - Node.js, NestJS
 - TypeScript
 - AWS
 - AWS CDK
 - Hasura
 - 2022年7月〜
 株式会社グランドリーム 代表取締役 山下 徳光 兼 エンジニア

Slide 4

Slide 4 text

#hug_tokyo
 自己紹介 - LINE API Expert
 4 LINEを活用したアプリ開発のエキスパート
 2023年1月17日 認定 (7名)


Slide 5

Slide 5 text

#hug_tokyo
 自己紹介 - Twitter
 5 @nori3tsu


Slide 6

Slide 6 text

#hug_tokyo
 目次
 6

Slide 7

Slide 7 text

#hug_tokyo
 目次
 7 ● HasuraのEdition
 ● Hasuraのインフラ構成
 ● Production Checklist
 ● 実運用の課題


Slide 8

Slide 8 text

#hug_tokyo
 HasuraのEdition
 8

Slide 9

Slide 9 text

#hug_tokyo
 HasuraのEdition
 9 ● Hasura Cloud
 ● Hasura Enterprise Edition (EE)
 ● Hasura Community Edition (CE)
 ○ ☆本発表の対象はCE


Slide 10

Slide 10 text

#hug_tokyo
 Hasuraのインフラ構成
 10

Slide 11

Slide 11 text

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


Slide 12

Slide 12 text

#hug_tokyo
 Hasuraのインフラ構成
 12 ※Hasuraの構成説明用の簡易構成です。 
 Hasura採用後
 
 ● HAProxy
 ○ リバースプロキシで配置
 ○ アクセス制御
 ○ ルーティング
 ● Hasura
 ○ PostgreSQLにCRUD
 ● NestJS
 ○ Hasura Remote Schemas
 ○ 業務ロジックを通してCRUD


Slide 13

Slide 13 text

#hug_tokyo
 Production Checklist
 13

Slide 14

Slide 14 text

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


Slide 15

Slide 15 text

#hug_tokyo
 Production Checklist
 15 ● Admin Secretの設定
 ● パーミッションの確認
 ● 有効APIの選択
 ● Hasura Consoleの無効化
 ● 開発モードの無効化
 ● Allow Listの有効化
 ● CORSの設定
 ● HTTPSの有効化


Slide 16

Slide 16 text

#hug_tokyo
 実運用の課題
 16

Slide 17

Slide 17 text

#hug_tokyo
 実運用の課題
 17 ● IPアドレス制限
 ● 複数Hasuraインスタンスの起動
 ● メタデータの同期
 ● Remote Schemasの再接続
 ● Webhook APIの接続
 ● CI/CDのネットワーク構成


Slide 18

Slide 18 text

#hug_tokyo
 IPアドレス制限
 18

Slide 19

Slide 19 text

#hug_tokyo
 IPアドレス制限
 19 ● 前提・課題
 ○ Admin SecretはDBパスワードとほぼ同義
 ■ 漏洩した場合のリスクは甚大 
 ● 全テーブルのスキーマ操作・CRUD 
 ● Hasura Console
 ○ Production Checklistの推奨設定は「長い文字列の設定」
 ■ 総当たり攻撃からは原則防御可能 
 ■ 漏洩は防げない
 ● 単純漏洩
 ● 過去のサービス運用担当者から漏洩 


Slide 20

Slide 20 text

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


Slide 21

Slide 21 text

#hug_tokyo
 IPアドレス制限
 21

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

#hug_tokyo
 複数Hasuraインスタンスの起動
 23 ● 前提・課題
 ○ サービス毎にHasuraを分離したい
 ■ toC向けアプリ・管理画面など
 ○ サービス毎にHasuraのメタデータが異なる
 ● 対応内容
 ○ 各サービスのHasuraの環境変数に HASURA_GRAPHQL_METADATA_DATABASE_URL を設定


Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

#hug_tokyo
 メタデータの同期
 25

Slide 26

Slide 26 text

#hug_tokyo
 メタデータの同期
 26 ● 前提・課題
 ○ ローカル環境でHasura Consoleを利用してメタデータを設定
 ■ 設定したメタデータはDBに保存される 
 ○ メタデータを本番環境に読み込む必要がある
 ○ メタデータ系コマンド
 ■ メタデータエクスポート: haura metadata export 
 ■ メタデータインポート: hasura metadata apply 
 ■ メタデータリロード: hasura metadata reload 


Slide 27

Slide 27 text

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


Slide 28

Slide 28 text

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


Slide 29

Slide 29 text

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


Slide 30

Slide 30 text

#hug_tokyo
 Remote Schemasの再接続
 30

Slide 31

Slide 31 text

#hug_tokyo
 Remote Schemasの再接続
 31

Slide 32

Slide 32 text

#hug_tokyo
 Remote Schemasの再接続
 ● 前提・課題
 ○ ECS内のタスクに複数サービス(HAProxy, Hasura, NestJS) 同居する構成。
 ○ 各サービスの起動時間は一定ではないが、原則、NestJS よりHasuraが先に起動するため、Hasura起動時にRemote Schemasの読み込みに失敗する。
 ○ Remote Schemasは読み込み失敗時の定期リロードの仕組 みがないため、手動リロードが必要。
 32

Slide 33

Slide 33 text

#hug_tokyo
 Remote Schemasの再接続
 ● 対応内容
 ○ NestJSの起動処理が完了次第、Hasuraのmetadata APIを 実行してRemote Schemasの再接続を試みる。
 33

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

#hug_tokyo
 Webhook APIの接続
 35

Slide 36

Slide 36 text

#hug_tokyo
 Webhook APIの接続
 ● 前提・課題
 ○ Hasura採用前に、NestJSでGraphQL・Webhook APIを受信 していた。
 ○ Hasura+Remote Schemas構成にしたことで、ロードバラン サー経由のアクセスでWebhook APIにリクエストできなく なった。
 36

Slide 37

Slide 37 text

#hug_tokyo
 Webhook APIの接続
 
 ● 対応内容
 ○ Webhook APIのリクエストのみ、HAProxyでNestJSに直接 ルーティング
 37

Slide 38

Slide 38 text

#hug_tokyo
 Webhook APIの接続
 
 38

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

#hug_tokyo
 CI/CDのネットワーク構成
 ● 前提・課題
 ○ CI/CDでHasuraのメタデータ操作が必要。
 ○ Admin Secretの外部アクセスを禁止したため、公開API経由でメ タデータ操作ができない。
 ○ ECSタスクのプライベートIPは起動毎に動的に変化するため、 Hauraの接続先も動的に変化する。
 ● 対応方法
 ○ AWS CloudMapでECSタスクのプライベートIPに向けて通信でき るようにする。
 40

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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