Closed5

いろんなヘッドレスCMSを触ってみる

marromugimarromugi

いろんなヘッドレスCMSがあるので、それぞれどんな特徴があるのか調査📝

marromugimarromugi

Contentful

ドイツ発のヘッドレスCMS

ドキュメント

こちらから閲覧可能

価格

こちらから確認できます

Community(フリープラン)のひとつ上になると、急に $489 / month かかってしまうので、Community の範囲内で余裕を持ってデータ管理できた方が良さそう。
一方で Community でも基本的な機能にあまり制限が設けられていなさそうなので、個人ブログや簡単なお知らせ機能等であれば問題なく利用できそう。

データ転送

フリーで 750GB/月(超過不可)・Professionalで 750GB/月(課金で超過あり)・Enterpriseで 10TB(課金で超過あり) となっています(アセットの転送量のみ)

APIリクエスト

フリーで 2,000,000/月(超過不可)Community で 2,000,000/月 (課金で超過あり)、Premium で制限なしです

ユーザー

価格のところにありますが、フリープランでは5人までで、登録できるロールは管理者と編集者の2種類となっています。
Enterprise では25人で最大4つまでのロール、Premium では 3000人で制限なしのカスタムロールが設定できるようです

コンテンツ

Contentful では、一番上にGroupという括りがあります。
その下には、ContentModelというデータの定義があり、その定義に沿ってContentというデータが作成されるような仕組みになっています。

それらの概念とは別に、Mediaというデータが Contentful にはあります。
Media では、画像や動画などのファイルを保存することができます。
フリー版ではアップロードするファイルごとに50MBまでのサイズ制限がついているようで、動画とかだと厳しい場合があるかもしれません。

Media で保存したファイルは、Content から参照することができます。
それぞれのコンテンツやモデルは以下の画像のような関係の認識。
contentful-data-model

データフェッチ

APIキーは4種類あるぽい
APIキー周りの話は、こちらから確認できますが、このページの文面を見る限りデータ取得にはContent Delivery APIを使用すればよさそう
Javascript では SDK が提供されている
クライアントを作成して

const client = createClient({
    space: CONTENTFUL_SPACE_ID,
    accessToken: CONTENTFUL_ACCESS_TOKEN,
});
const entries = await client.getEntries<IBlogFields>({
    content_type: "blog",
    order: "-fields.release",
});
return entries.items.map((item) => item.fields);

その他

Webhooks

Webhooks を利用してコンテンツ等の更新時にデプロイしたりできそう
また、Webhooks で発火したイベントをもとにデータを S3 とかにバックアップしたりすることもできるぽい(https://dev.classmethod.jp/articles/contentful-s3-backup/)

豊富なプラグイン

Contentful は様々な SaaS と連携するプラグインが他のCMSと比較しても多いイメージがありました
何か既に運用している基盤サービスがあって、そこと連携してごにょごにょしたい人にとって有力な候補となるかもしれません

モデルの型ファイル出力

有志の方?のライブラリを用いて用いて、Contentful 上で定義されているモデルの型の出力が可能
Typescripts で開発している場合はかなり便利そう

export interface IBlogFields {
  /** Title */
  title: string;

  /** release */
  release?: string | undefined;

  /** author */
  author?: Entry<{ [fieldId: string]: unknown }> | undefined;

  /** slug */
  slug: string;

  /** content */
  content?: Document | undefined;

  /** thumbnail */
  thumbnail?: Asset | undefined;
}

/** ブログ用のモデル */

export interface IBlog extends Entry<IBlogFields> {
  sys: {
    id: string;
    type: string;
    createdAt: string;
    updatedAt: string;
    locale: string;
    contentType: {
      sys: {
        id: "blog";
        linkType: "ContentType";
        type: "Link";
      };
    };
  };
}
marromugimarromugi

Newt

Newt は日本発のCMS

ドキュメント

こちらから閲覧可能

価格

こちらから確認できます
なんとコンテンツ数・モデル数・メンバー数がフリープラン含め無制限...(2022年12月時点)
今後のプラン展開を経て変わる可能性はありますが、太っ腹すぎる...
予約投稿機能なんかも全プランでついています
フリープランではアップロードするファイルごとに50MBまでのサイズ制限があり、ここは Contentful と同様の仕様です
またフリープランでは、ロールは管理者権限のみしか割り当てられないので、ユーザー間で細かくロールを制御したい場合は Professional プランを契約する必要があります
Professional プランでも ¥2,980 とかなり安いので、後々の規模拡大や運用変更も考えやすいのかなと思いました

データ転送

フリーで100GB/月・Professionalで 300GB/月・Enterpriseで 1TB~ となっています(コンテンツの転送量も含まれる?)

APIリクエスト数

フリーで 2,000,000/月かつ超過不可・Professionalで 2,000,000/月かつ課金で超過可・Enterpriseで 無制限 となっています

ユーザー

価格のところにありますが、メンバー数は無制限です
ロールはフリープランでは管理者権限のみ。
Professional では3つのロールがデフォルトで与えられており、それ以降は1つ増えるごとに500円課金されるシステムのようです。
一番上の Enterprise はロール数無制限

コンテンツ

Newt でも一番大きなデータ管理の単位はスペースという概念
さらに Newt では、スペースの下にアプリという括りを持っており、その中にモデルというコンテンツの型を定義することができます
メディアはスペース単位で管理されているため、別々のアプリ間でも共有できるようです
newt-data-model

データフェッチ

データ取得に必要な API Key は、Newt CDN APINewt APIの2種類があるらしい
詳しくはこちらから確認できるが、CDN経由で取得するかであったり、下書きのものを取得するのかなどの違いがあるらしい
Javascript では SDK が提供されており、以下のように取得できる
データの型を出力する方法は少し調べたところ無料ではなさそうなので、自分で定義する必要ありかも

// クライアント作成
const client = createClient({
  spaceUid: NEWT_SPACE_UID,
  token: NEWT_CDN_API_TOKEN,
  apiType: 'cdn', // You can specify "cdn" or "api".
})

// コンテンツ取得
// appUid: アプリ の UID
// modelUid: アプリに所属するモデルの UID
const contents = await client.getContents<Article>({
    appUid: 'blog',
    modelUid: 'article',
})

const articles = contents.items
return res.json(articles)

その他

外部ストレージの設定

Newt では、データの保存場所に任意の外部ストレージを設定できるようです
外部ストレージを仕様すると Newt のデータ通信量を削減できるため、各プランの制限に余裕をもたすことができます

Webhook

Webhook でコンテンツ更新時にデプロイしたりできるらしい

Appのエクスポート/インポート

Newt では有料プランに限りアプリ単位でデータをインポート/エクスポートできるようです
データのバックアップを取ったりすることができそう
また、エクスポートするデータにはモデルの情報も含まれるため、スクリプトを組めばエクスポートしたデータから Typescript の型情報を生成するみたいなこともできそう
型情報の生成の面で言えば、Contentful は無料でできるので、そこの便利さでは Contentful が勝りそう

marromugimarromugi

microCMS

日本発のCMS

ドキュメント

こちらから確認可能

価格

こちらから確認可能
まずは利用頻度の高そうなフリープランについて
フリープランでは、3個までのAPIを作成することができます
またユーザーは3名まで作成することができ、それぞれの権限設定はできない(全員管理者権限のような形?)となっています
メディア1つの容量制限は40MBとなっており、Contentful や Newt と比べると 10MB 少ない容量となっています

有料プランに注目してみると、2段階認証の必須化やセキュリティチェックシートの回答などセキュリティに関するサービスを受けることができることが明示的にプランに組み込まれています
またSSOログインができるため、既に社内で管理しているアカウントと連携することで運用が楽になったりというメリットもありそうです

APIリクエスト

全プラン無制限!

データ転送量

フリーは 20GB/月(超過なし)、Teamは 200GB/月(課金超過あり)、BusinessとAdvance は 1TB/月(課金超過あり)となります

ユーザー

価格のところにもあるように、フリープランでは3名まで作成でき、ユーザーのロールは作成ができません
有料になると上限を従量課金制で上げることができます
¥1500 課金すること、1ユーザーを作成することができます
また、ロールの設定については Bussiness プラン以上で付与することができるようになります

コンテンツ

microCMS では、サービスという単位を一番大きな単位として管理しています
サービスの中では、APIというデータの型・エンドポイントを設定でき、そこに紐づく形でコンテンツという形でデータを保存できます
メディアという形で画像等を保存することができますが、メディアはサービス単位で保存されるため、同じサービスであれば API をまたいで利用することができます

データフェッチ

一番簡単な例は以下になります
エンドポイントや取得したデータの型は自分で定義する必要がありますが、
とてもシンプルで使いやすそうです

const { createClient } = require('microcms-js-sdk');

const client = createClient({ serviceDomain: 'service-domain', apiKey: 'api-key' });
// service-domain は XXXX.microcms.io の XXXX 部分
client
  .get({
    endpoint: 'hello',
  })
  .then((res) => console.log(res))
  .catch((err)> console.log(err));

この他に画像APIがデフォルトで使えるようです。
この機能を提供している imgix は Newt や Contentful でも連携が可能ですが、別途 imgix アカウント連携が必要となっています

その他

WebHook

コンテンツメディアの更新をWebHookを用いて検知することができるようです

APIスキーマのインポート・エクスポート

こちらにあるように、APIスキーマを JSON 形式でインポート・エクスポートできるようです
Contentful のように有志の方が作成されたライブラリがあるようで、JSONファイルから型定義ファイルへの変換ができるようです
今後リリース予定の v2 では、OpenAPI の定義ファイルをダウンロードできる機能のリリース予定もあるらしく、スキーマ駆動の開発がよりしやすくなりそう

marromugimarromugi

少しまとめる

Contentful Newt microCMS
APIリクエスト数 2,000,000 2,000,000 制限なし
データ転送量 750GB(アセットのみ) 100GB 20GB
ユーザー数 5人 無制限 3人
ロール 2ロール(管理者と編集者) 1ロール(管理者) 1ロール(管理者)
アセットの最大データ量 50MB 50MB 40MB
API数 48個 無制限 3個
コンテンツ数 2500件 無制限 10000件
SDK(JavaScript) あり あり あり
環境数 2つ 1つ 1つ
Locale 2つ 1つ - (可能ではある
Webhook あり あり あり
予約投稿・下書き あり あり あり
プレビュー あり あり あり

結局どれ使おう?

かなりざっくり見てきましたが、
コストをかけないことを念頭に置いて考えると以下のような感じでしょうか?

小さな機能で多くのデータを扱いたい!(ブログを1000件登録するとか?)
=> Newt (エンドポイントは少ないが、データの登録数は一番多そう)

インフラの管理を全てサービス側に任したい!(自分でストレージとか管理したくないとか?)
=> microCMS(画像生成含めサービス側でやってくれる)

既に運用しているSaasと連携したい!(データをクラウドで一元管理したいとか?)
=> Contentful(プラグインで多くのSaasとの連携が期待できそう)

このスクラップは2023/01/20にクローズされました