1 of 21

大コンテナ時代を生きのこるための

JSON Schema + α

id:aereal

2 of 21

aereal

  • id:aereal
  • @aereal
  • 株式会社はてな
  • はてなブログ
  • TypeScript
  • Perl
  • Go
  • Scala

3 of 21

世は大コンテナ時代……

4 of 21

The Twelve-Factor App

5 of 21

The Twelve-Factor App

  • Herokuの経験に基いたコンテナアプリケーションのベストプラクティス
  • コンテナ化されているかによらず、運用しやすいアプリを作る上で�大事なことがまとまっている、良い資料
  • 時代にそぐわない点もちらほらあるが、基準点として有用だと思う
  • Codebase, Dependencies, Config, Backing services, etc.

6 of 21

Config

7 of 21

コンフィギュレーション今昔

  • 設定ファイル
    • ini
    • YAML
    • JSON
    • etc.
  • コマンドライン引数
    • plackup --port $PORT --host $HOST
  • 環境変数

8 of 21

コンフィギュレーション今昔

  • 設定ファイル
    • ini
    • YAML
    • JSON
    • etc.
  • コマンドライン引数
    • plackup --port $PORT --host $HOST
  • 環境変数

9 of 21

😇

PORT=... HOST=... \

FOO_API_KEY=... BAR_API_KEY=... \

FOO_DEBUG=1 BAR_DEBUG=0 \

docker run ...

10 of 21

環境変数はあまりに貧弱

  • 一般的に設定はアプリに比例して肥大化しがち
  • 環境変数はグローバル変数なので増えるとカオス
  • 表現力に乏しいのでinteroperabilityが皆無に
    • 真偽値を0/1にする派、yes/noにする派、defined or not派
    • 複数値 (リスト) のデリミタ

11 of 21

JSON Schema

12 of 21

JSON Schema

  • Web APIの仕様 (スキーマ) 表現などで昨今有名なアレ
    • 貴重なWeb API以外の事例 (他にtsconfig.jsonのスキーマしか知らない)
  • JSONの形式についてJSONで書ける
  • 例: このキーは必須で、値はnumberであるべき
  • いろんな言語でvalidatorの実装がある→interoperabilityが高い
    • PerlだとValiemonやJSON::Validator

13 of 21

JSON?

  • JSON Schemaはシリアライズ形式にJSONを選んでいるだけ
  • 環境変数: 名前と値からなる辞書として表現 (されることもある)
    • 例: Perl, Ruby
  • JSONにシリアライズできるなら神様だってvalidateしてみせるっ……!

14 of 21

15 of 21

{� "definitions": {},� "$schema": "http://json-schema.org/draft-07/schema#",� "type": "object",� "title": "configuration",� "properties": {"LISTEN_ADDR": {� "type": "string"� },� "DSN": {� "type": "string",� "minLength": 1� }� }�}

16 of 21

type config struct {� Addr string `json:"LISTEN_ADDR"`�}��func run() error {� // LISTEN_ADDR=localhost:8000�� loader, err := loader.New(gojsonschema.NewReferenceLoader("file://./config-schema.json"))� if err != nil {� return err� }� cfg := config{}� if err := loader.Load(&cfg); err != nil {� return err� }� // cfg.Addr // => "localhost:8000"�� return nil�}

17 of 21

JSON Schemaを使う優位性

  • JSON Schemaなのでinteroperabilityが高い
    • polyglotな組織・サービスに向いている
    • いわゆるincludeみたいな仕組みも仕様にあるので、PORTでlisten portを渡そう、みたいなスキーマを配れる
  • 検証のセマンティクスを明示できる
    • ぜんぶstringなのでbooleanとして1/0なのかyes/noなのかがはっきりする
  • JSON Schemaのエコシステムに乗れる
    • たとえば設定のドキュメント生成などは既存のツールが使える

18 of 21

今後

  • Perl版を作りたい or 興味ある人はどうでしょうか!!
  • CLIを同梱しようかとおもっている
    • envschema PORT=... HOST=... plackup …
    • スキーマがおかしい時はコマンドを実行しない、みたいな挙動をする

19 of 21

PR: aereal/go-http-replay

  • Go版VCR
    • github.com/vcr/vcr
  • テスト時に実際にHTTPリクエストし、レスポンスを記録する
  • 2回目以降は記録したレスポンスを再利用
  • テストデータの自動生成と、HTTPリクエストのスタブ化

20 of 21

PR「npmという次世代CPANパッケージマネージャー」という話を明日LTします

21 of 21