Views: 2
AWS EC2(Linux環境)で JSON Schema 2020-12 を利用した開発環境
2025-06-07
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 を指定 |
|
✅ 推奨される明示的な定義 |
❌ 不要(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 サンプルからスキーマを自動生成したい場合 |
必要な項目があれば、お気軽にどうぞ。お疲れさまでした!
コメントを残す