AWS EC2(Linux環境)で JSON Schema 2020-12 を利用した開発環境

Views: 2

ChatGPTの回答に従って作業を進めました。Linux2の環境では問題が発生したためLinux 2023を用意して作業しました。また、検証スクリプト修正も必要でした。

1. AWS EC2 Linux2での環境設定

1.1. ChatGPT回答

AWS EC2(Linux環境)で JSON Schema 2020-12 を利用した開発環境を構築する手順を以下に示します。用途に応じて Node.js + ajv や Python + jsonschema などが選べます。ここでは主に Node.js を使う構成(ajv ライブラリ)を中心に説明し、Python についても補足します。

1.1.1. EC2 インスタンスの準備(既存インスタンスがあればスキップ可)

Amazon Linux 2 での例

# EC2 に SSH 接続
ssh -i "your-key.pem" ec2-user@your-ec2-public-ip

1.1.2. Node.js + ajv による JSON Schema 2020-12 開発

Node.js のインストール
# 1. NodeSource のリポジトリ設定スクリプトを実行(v18用)
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -

# 2. Node.js をインストール
sudo yum install -y nodejs

確認:

node -v    # v18.x.x
npm -v     # npm v9 など

よくあるトラブルと対処

問題

解決策

curl コマンドが無い

sudo yum install -y curl で導入

sudo: yum: command not found

Amazon Linux 2023 / Ubuntu の場合は dnf または apt に変更

Node.js が古いまま

一度 sudo yum remove nodejs してから再インストール

node は入ったが npm が無い

通常は同梱だが、sudo yum install npm でも可

プロジェクト初期化
mkdir jsonschema-dev && cd jsonschema-dev
npm init -y
ajv ライブラリのインストール
npm install ajv ajv-formats

ajv は JSON Schema 2020-12 に対応済みです(v8以降)

JSON Schema 2020-12 に対応したサンプルコード
// validate.js
const Ajv = require("ajv").default;
const addFormats = require("ajv-formats");

const ajv = new Ajv({ strict: false }); // 必要に応じて strict を調整
addFormats(ajv);

const schema = {
  $schema: "https://json-schema.org/draft/2020-12/schema",
  type: "object",
  properties: {
    name: { type: "string" },
    age: { type: "integer", minimum: 0 }
  },
  required: ["name"]
};

const data = {
  name: "Alice",
  age: 25
};

const validate = ajv.compile(schema);
const valid = validate(data);

if (valid) {
  console.log("Valid!");
} else {
  console.error("Validation errors:", validate.errors);
}

実行:

node validate.js

1.1.3. Python (jsonschema ライブラリ, 補足)

Python で 2020-12 を使いたい場合は jsonschema v4 以上が必要です。

sudo yum install -y python3-pip
pip3 install jsonschema

ただし Python の jsonschema は 2020-12の完全対応 には制限がある場合があります。jsonschema-specifications パッケージとの併用が必要です。

1.1.4. 補足:開発ツール(VSCode等)

EC2 上で直接開発するのが不便な場合は、以下の方法が便利です:
VSCode + Remote SSH 拡張:ローカルの VSCode から EC2 に SSH 接続して編集
GitHub との連携:ローカルで開発して GitHub に push → EC2 で pull

1.1.5. よくある注意点

項目

内容

$schema

“https://json-schema.org/draft/2020-12/schema” を明示することで、対応バージョンを指定可能

$dynamicRef

一部ツールでは未対応。AJV は使用可能だが、IDE や LSP によって制限あり

strictMode

AJV で厳格チェックを避けたい場合は { strict: false } を設定

UTF-8

JSON ファイルを UTF-8 で保存(BOMなし)するよう注意

Node.js の環境が整えば、あとは npm init → npm install ajv の流れで JSON Schema 2020-12 開発が可能です。環境が Amazon Linux 2023 など新しいものの場合は dnf を使う必要があるため、その場合はお知らせください。

1.2. 実行結果(失敗)

$ sudo yum install -y nodejs
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
326 packages excluded due to repository priority protections
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ nodejs.x86_64 2:18.20.8-1nodesource を インストール
--> 依存性の処理をしています: glibc >= 2.28 のパッケージ: 2:nodejs-18.20.8-1nodesource.x86_64
--> 依存性の処理をしています: libm.so.6(GLIBC_2.27)(64bit) のパッケージ: 2:nodejs-18.20.8-1nodesource.x86_64
--> 依存性の処理をしています: libc.so.6(GLIBC_2.28)(64bit) のパッケージ: 2:nodejs-18.20.8-1nodesource.x86_64
--> 依存性解決を終了しました。
エラー: パッケージ: 2:nodejs-18.20.8-1nodesource.x86_64 (nodesource-nodejs)
             要求: libm.so.6(GLIBC_2.27)(64bit)
エラー: パッケージ: 2:nodejs-18.20.8-1nodesource.x86_64 (nodesource-nodejs)
             要求: glibc >= 2.28
            インストール: glibc-2.26-64.amzn2.0.4.x86_64 (@amzn2-core)
                glibc = 2.26-64.amzn2.0.4
            利用可能: glibc-2.25-10.amzn2.0.1.x86_64 (amzn2-core)
                glibc = 2.25-10.amzn2.0.1
            利用可能: glibc-2.26-27.amzn2.0.4.x86_64 (amzn2-core)
                glibc = 2.26-27.amzn2.0.4

            ... 略 ...

エラー: パッケージ: 2:nodejs-18.20.8-1nodesource.x86_64 (nodesource-nodejs)
             要求: libc.so.6(GLIBC_2.28)(64bit)
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest

ChatGPT

このエラーは、現在の Amazon Linux 2 環境における glibc のバージョンが 2.26 であり、Node.js 18.x が要求する glibc 2.28 に満たないため、nodesource リポジトリからの Node.js 18 のインストールができない、ということを意味しています。

🔧 解決策
以下のどちらかの方法を選択してください。

✅ 方法①: Node.js 16 をインストールする(推奨・安定)
Node.js 16 は glibc 2.26 でも動作します
JSON Schema 2020-12 を扱うには ajv@8.x を使えば Node.js 16 でも問題ありません。

✅ 方法②: Node.js 18 をビルドする(非推奨・上級者向け)
Node.js をソースからビルドして glibc の制約を回避することも可能ですが、以下の理由からおすすめしません:
どうしても Node.js 18 を使いたい場合は、Amazon Linux 2023 や Ubuntu 20.04/22.04 ベースの EC2 インスタンスへの切り替えを検討した方がよいです。

✅ 方法③: NVM(Node Version Manager)を使う
NVM を使えば glibc 制限を回避して複数バージョンを切り替えて使えます。

✅ 推奨方針まとめ

選択肢

対応内容

推奨度

Node.js 16 + ajv@8.x

glibc 2.26 でOK。JSON Schema 2020-12 に対応

⭐️⭐️⭐️⭐️⭐️

Node.js 18(ビルド)

非推奨。glibc更新は危険

⭐️

NVM + Node.js 16/18

柔軟で安全(glibc制限も一部回避可)

⭐️⭐️⭐️⭐️

2. Amazon Linux 2023での環境設定

ChatGPT

✅ なぜ Node.js 18 が入らないか?

理由

内容

Node.js 18

glibc 2.28+ を必要とする

Amazon Linux 2

標準 glibc 2.26、更新不可(セキュリティ互換のため)

NodeSource

最新 Node.js に必要な glibc が提供されないため yum で失敗

🟡 代替案(将来的に Node.js 18/20 が必要な場合)

方法

説明

NVM(Node Version Manager)

glibc の制限を一部回避でき、Node.js 18 や 20 も導入可能

Amazon Linux 2023 または Ubuntu 22.04 EC2 に切り替え

glibc 2.28 以上搭載済みのため Node.js 18+ が直接インストール可能

ご希望あれば:
NVM を使って Node.js 18 を Amazon Linux 2 に導入する手順
Amazon Linux 2023 への移行と初期セットアップ手順
もご案内できます。どちらに進めるかお知らせください。

— Node.js 18を使用したいので、Linux 2023を新規に用意して環境設定することにした。–

Amazon Linux 2023(AL2023)は glibc 2.34 を搭載しており、Node.js v18 や v20 など最新のバージョンを問題なくインストールできます。以下に Amazon Linux 2023 での Node.js 環境構築(JSON Schema 2020-12 開発)手順 を示します。

✅ 前提:Amazon Linux 2023 の特徴
パッケージ管理は dnf(yumではない)
glibc 2.34 なので、Node.js 18 以降にも対応
EPEL や extra リポジトリはデフォルトで無効なことがあるので注意

✅ Node.js 18 または 20 のインストール手順(Amazon Linux 2023)

# 1. Node.js 20(LTS)をインストール
sudo dnf install -y nodejs

💡 Amazon Linux 2023 では、AppStream 経由で Node.js 18/20 が提供されています。

✅ 動作確認

node -v    # → v18.x.x または v20.x.x
npm -v     # → v9 または v10

✅ ajv による JSON Schema 2020-12 開発準備

mkdir jsonschema-dev && cd jsonschema-dev
npm init -y
npm install ajv ajv-formats

✅ サンプルスクリプト:validate.js

const Ajv = require("ajv").default;
const addFormats = require("ajv-formats");

const ajv = new Ajv({ strict: false });
addFormats(ajv);

const schema = {
  $schema: "https://json-schema.org/draft/2020-12/schema",
  type: "object",
  properties: {
    name: { type: "string" },
    age: { type: "integer", minimum: 0 }
  },
  required: ["name"]
};

const data = {
  name: "Alice",
  age: 25
};

const validate = ajv.compile(schema);
const valid = validate(data);

if (valid) {
  console.log("Valid!");
} else {
  console.error("Validation errors:", validate.errors);
}

✅ まとめ

ステップ

コマンド(AL2023)

Node.js インストール

sudo dnf install -y nodejs

バージョン確認

node -v / npm -v

JSON Schema 開発準備

npm install ajv ajv-formats

2.1. ajv環境設定後にvalidate.js実行(失敗)

$ node validate.js
/home/ec2-user/jsonschema-dev/node_modules/ajv/dist/core.js:148
                throw new Error(no schema with key or ref "${schemaKeyRef}");
                ^

Error: no schema with key or ref "https://json-schema.org/draft/2020-12/schema"
    at Ajv.validate (/home/ec2-user/jsonschema-dev/node_modules/ajv/dist/core.js:148:23)
    at Ajv.validateSchema (/home/ec2-user/jsonschema-dev/node_modules/ajv/dist/core.js:261:28)
    at Ajv._addSchema (/home/ec2-user/jsonschema-dev/node_modules/ajv/dist/core.js:461:18)
    at Ajv.compile (/home/ec2-user/jsonschema-dev/node_modules/ajv/dist/core.js:159:26)
    at Object.<anonymous> (/home/ec2-user/jsonschema-dev/validate.js:22:22)
    at Module._compile (node:internal/modules/cjs/loader:1364:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1422:10)
    at Module.load (node:internal/modules/cjs/loader:1203:32)
    at Module._load (node:internal/modules/cjs/loader:1019:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:128:12)

Node.js v18.20.8

ChatGPT:

このエラー:

Error: no schema with key or ref "https://json-schema.org/draft/2020-12/schema"

は、ajv が $schema に指定された “https://json-schema.org/draft/2020-12/schema” の メタスキーマ(自己定義) を内部に読み込んでいないために起こります。

✅ 解決方法:メタスキーマを明示的にロードする
ajv v8 では draft-2020-12 を自動では読み込まないため、自分でロードする必要があります。

以下のように ajv/dist/2020 からインポートし、addMetaSchema() を使って追加してください。

✅ 修正済み validate.js(完全対応)

const Ajv2020 = require("ajv/dist/2020").default;
const addFormats = require("ajv-formats");
const metaSchema = require("ajv/dist/refs/json-schema-2020-12.json");

const ajv = new Ajv2020({ strict: false });
addFormats(ajv);
ajv.addMetaSchema(metaSchema); // ★ メタスキーマを登録

const schema = {
  $schema: "https://json-schema.org/draft/2020-12/schema",
  type: "object",
  properties: {
    name: { type: "string" },
    age: { type: "integer", minimum: 0 }
  },
  required: ["name"]
};

const data = {
  name: "Alice",
  age: 25
};

const validate = ajv.compile(schema);
const valid = validate(data);

if (valid) {
  console.log("Valid!");
} else {
  console.error("Validation errors:", validate.errors);
}

ChatGPT:

補足:なぜエラーになったのか?
ajv は $schema で参照された URL に対応する メタスキーマを内部登録 していないと、compile() 時に失敗します。
v7以降は draft-2020-12 対応が強化されましたが、メタスキーマの手動読み込みが必要 です。

2.2. Cannot find module ‘ajv/dist/refs/json-schema-2020-12.json’

$ node validate.js
node:internal/modules/cjs/loader:1143
  throw err;
  ^

Error: Cannot find module 'ajv/dist/refs/json-schema-2020-12.json'
Require stack:
- /home/ec2-user/jsonschema-dev/validate.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1140:15)
    at Module._load (node:internal/modules/cjs/loader:981:27)
    at Module.require (node:internal/modules/cjs/loader:1231:19)
    at require (node:internal/modules/helpers:177:18)
    at Object.<anonymous> (/home/ec2-user/jsonschema-dev/validate.js:3:20)
    at Module._compile (node:internal/modules/cjs/loader:1364:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1422:10)
    at Module.load (node:internal/modules/cjs/loader:1203:32)
    at Module._load (node:internal/modules/cjs/loader:1019:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:128:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/home/ec2-user/jsonschema-dev/validate.js' ]
}

Node.js v18.20.8
$

ChatGPT:

ありがとうございます。このエラーは:

Cannot find module 'ajv/dist/refs/json-schema-2020-12.json'

つまり、ajv v8 では json-schema-2020-12.json が ajv パッケージ内に 含まれていない ため、require() で直接読み込めないことが原因です。

✅ 修正済みの対策(メタスキーマを require しない)
AJV v8 では、Ajv2020 クラスを使うだけで draft-2020-12 メタスキーマが自動で扱われる ようになっています。よって、addMetaSchema() は不要です。

🔧 修正版 validate.js(この版でOKでした)

const Ajv2020 = require("ajv/dist/2020").default;
const addFormats = require("ajv-formats");

const ajv = new Ajv2020({ strict: false }); // draft-2020-12対応
addFormats(ajv); // ISO 8601, email などのformat対応

const schema = {
  $schema: "https://json-schema.org/draft/2020-12/schema",
  type: "object",
  properties: {
    name: { type: "string" },
    age: { type: "integer", minimum: 0 }
  },
  required: ["name"]
};

const data = {
  name: "Alice",
  age: 25
};

const validate = ajv.compile(schema);
const valid = validate(data);

if (valid) {
  console.log("Valid!");
} else {
  console.error("Validation errors:", validate.errors);
}

✅ 必要なパッケージ
念のため以下で最新版をインストール・更新してください:

npm install ajv@latest ajv-formats@latest

🔎 解説

処理

解説

ajv/dist/2020

Ajv2020 は draft-2020-12 用のビルド済みバージョンです

$schema 指定

自動で適切なメタスキーマが使われる(require は不要)

ajv-formats

ISO 8601 date-time や email 等の format に必要

✅ まとめ

課題

解決策

json-schema-2020-12.json が見つからない

読み込まず、Ajv2020 を使うだけでOK

$schema に “https://json-schema.org/draft/2020-12/schema” を指定したい

Ajv2020 を使えば処理される

2.3. ajv最新版インストール

$ npm install ajv@latest ajv-formats@latest

up to date, audited 7 packages in 1s

2 packages are looking for funding
  run npm fund for details

found 0 vulnerabilities

ChatGPT:

正常に ajv と ajv-formats がインストールされました 🎉
これで draft 2020-12 に準拠した JSON Schema の検証 が Node.js で行える状態になっています。

✅ 次に行うこと
修正済みの validate.js を以下のように保存し、実行してください:

🔧 validate.js の内容(再掲)

2.4. ‘ajv/dist/refs/json-schema-2020-12.json’の確認

$ ls ajv/dist/refs/json-schema-2020-12.json
ls: cannot access 'ajv/dist/refs/json-schema-2020-12.json': No such file or directory

ChatGPT:

はい、その挙動は正しいです。
ajv@8 以降では ajv/dist/refs/json-schema-2020-12.json というファイルはパッケージに含まれていません。

✅ 理由

以前の ajv v6/7 時代にはメタスキーマがファイルとして同梱されていましたが、v8 以降では build 時に直接バンドルされる構造に変わったため、dist/refs/json-schema-2020-12.json は存在しません。

✅ 正しい対応方法

ajv@8 で JSON Schema 2020-12 を使うには:

対応方法

解説

require(‘ajv/dist/2020’).default を使用

これだけで 2020-12 が使える(メタスキーマ不要)

$schema: “https://json-schema.org/draft/2020-12/schema”

この記述があると Ajv2020 が正しく認識

すでに以下のようなコードで問題なく使える状態です:

const Ajv2020 = require("ajv/dist/2020").default;
const ajv = new Ajv2020();

この方法では json-schema-2020-12.json を明示的にロードする必要は一切ありません。

🔍 補足:メタスキーマが必要な場合の代替方法(参考)
もしどうしても “https://json-schema.org/draft/2020-12/schema” をローカルに保持したい場合は:

curl -O https://json-schema.org/draft/2020-12/schema

そして:

const schema2020 = require("./schema.json");
ajv.addMetaSchema(schema2020);

ですが、Ajv2020 を使えば自動的にバンドル済みスキーマが有効になるため不要です。

ご安心ください:ajv/dist/refs/json-schema-2020-12.json が無いのは仕様です。
あなたの現在の構成は 正しく、最新の推奨構成 です。

あなた:

validate.jsのエラー対策は?

ChatGPT

現在の validate.js が次のようなエラーを出している場合:

Error: Cannot find module 'ajv/dist/refs/json-schema-2020-12.json'

これは 不要なファイルを読み込もうとしているのが原因です。ajv@8 以降では json-schema-2020-12.json を 自分で読み込む必要はありません。以下のようにコードを 修正すればエラーは解消されます。

// ✅ 必要なモジュールを読み込み
const Ajv2020 = require("ajv/dist/2020").default;
const addFormats = require("ajv-formats");

// ✅ AJV インスタンス作成(draft 2020-12 に対応)
const ajv = new Ajv2020({ strict: false });
addFormats(ajv);

// ✅ スキーマ($schema を明示的に指定)
const schema = {
  $schema: "https://json-schema.org/draft/2020-12/schema",
  type: "object",
  properties: {
    name: { type: "string" },
    age: { type: "integer", minimum: 0 }
  },
  required: ["name"]
};

// ✅ 検証対象データ
const data = {
  name: "Alice",
  age: 25
};

// ✅ バリデーション実行
const validate = ajv.compile(schema);
const valid = validate(data);

if (valid) {
  console.log("Valid!");
} else {
  console.error("Validation errors:", validate.errors);
}

❌ 修正すべき点
NG(やってはいけない)

const metaSchema = require("ajv/dist/refs/json-schema-2020-12.json");
ajv.addMetaSchema(metaSchema);

これは ajv@8 以降には存在しないパス を参照しており、エラーになります。

✅ まとめ

状態

対応

“ajv/dist/refs/json-schema-2020-12.json” を require している

❌ 削除すべき

ajv/dist/2020 を使っている

✅ 正しい

$schema に https://json-schema.org/draft/2020-12/schema を指定

✅ 推奨される明示的な定義
addMetaSchema() の呼び出し

❌ 不要(Ajv2020 なら自動)

この修正版で問題が解決するはずです。

確認

$ node validate.js
Valid!

🎉 完璧です!validate.js が “Valid!” と表示されたことで、以下すべてが正常に機能していることが確認できました:

✅ 確認された事項

項目

状態

Node.js v18 が Amazon Linux 2023 上に正常インストールされている

ajv@8 + ajv-formats が最新でインストールされている

draft-2020-12 スキーマが正しく認識されている

$schema の参照エラーが解消されている

JSON の構造と値がスキーマ通りであるため Valid と判定されている

🔜 次のステップ(必要に応じて)
もし以下のような応用もご希望でしたら、ご案内できます:

要素

内容例

$ref

外部/内部定義への参照の書き方

$defs

複数構造を再利用するための定義方法

format

email, date-time, uuid などの検証例

oneOf / anyOf

条件分岐付きの検証

バッチ検証

複数データをループして検証する方法

Web API に組み込む

Express を使って REST API でスキーマバリデーションする構成

スキーマ自動生成

TypeScript や JSON サンプルからスキーマを自動生成したい場合

必要な項目があれば、お気軽にどうぞ。お疲れさまでした!


投稿日

カテゴリー:

, ,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です