書く人と公開する人を分けて誤公開を防ぐ Contentful のワークフローを組んでみた
はじめに
複数人で CMS を運用し始めると、公開の扱いが不安になってきます。公開ボタンは誰でも押せてしまうので、レビューの終わっていない記事がうっかり本番へ出てしまわないかというものです。かといって公開できる人をむやみに絞ると、今度は執筆や修正の作業が滞ります。
Contentful のワークフロー機能を使用し、記事の執筆から公開までをステップに分け、最後のステップでだけ公開を許可すれば、レビューを飛ばした公開の経路がなくなり、誤公開を構造的に防げます。本記事では、この承認フローを組み、定義の作成からステップの遷移、公開までが一通り動くことを確認します。
今回組む承認フローの全体像は次の通りです。
書く人が記事を書き、レビューを経て、公開する人が承認してから公開します。
Contentful のワークフローとは
Contentful のワークフロー とは、記事の執筆から公開までのプロセスを複数のステップに分け、ステップごとに誰が何をできるかを決めておく機能です。エントリはこのステップを順に進み、最後のステップへ到達したらワークフローを完了します。
対象読者
- 複数人でヘッドレス CMS を運用し始め、誰でも公開できる状態に不安を感じている編集チームのリードの方
- Contentful のロールは設定したものの、ワークフロー機能はまだ使っていない運用担当者の方
- 承認フローを CMS 上でどう組むのか、具体例で知りたい方
参考
課題: ロールだけでは公開の順序を強制できない
Contentful では、記事やアセットを編集・公開できるかどうかをロールで決めます。書く人には公開できないロールを、公開する人には公開できるロールを割り当てれば、誰が公開できるかは制限できます。
しかし、ロールだけでは公開までの順序までは強制できません。公開できる人が、レビューを経ずにいきなり公開することを止める仕組みがないためです。 誰が公開できるかという権限の話と、どの順序で公開まで進めるかという流れの話は別物です。この流れの部分を CMS 上に組むのがワークフローの役割です。
設計: ステップと 2 種類の権限で承認フローを組む
ステップと遷移
ワークフローは、執筆中、レビュー中、承認済みといったステップの並びとして定義します。1 つのワークフローには最大 20 のステップを持てます。
ステップの進め方には 2 つのモードがあります。既定のモードでは、権限さえあれば任意のステップへ移動できます。もう 1 つのモードを有効にすると、1 ステップずつ順番にしか進めなくなります。承認の順序を厳密に守らせたい場合は、後者を選びます。
2 種類の権限
ステップには 2 種類の権限を設定できます。1 つは、そのステップへ進める人を決める権限です。既定では誰も進められない状態で、全員、または指定したユーザーやチームに許可します。もう 1 つは、そのステップにいる間の編集や公開を許可・禁止するルールです。例えば、承認済みステップでだけ公開を許可する、といった設定ができます。
ここで押さえておきたいのは、権限の対象がユーザーとチーム (もしくは全員) である点です。ロールを直接指定するわけではありません。記事やアセットを編集・公開できるかどうかの土台はロールが決め、ワークフローはそこにステップ単位の制御を重ねます。
ロール権限との関係
ワークフローの権限は、space レベルのロール権限を補完するものです。上書きするものではありません。とくに、ロール側で明示的に禁止されている操作は、ワークフロー側で許可しても実行できません。禁止が許可に優先します。
ロール権限とワークフロー権限のどちらかが禁止していれば、その操作はできません。両方が許可している場合にだけ操作できます。
したがって、ロール設計とワークフロー設計はセットで考える必要があります。今回の題材でいえば、書く人には公開権限を持たないロールを、公開する人には公開できるロールを割り当てたうえで、ワークフローで承認のステップを挟むという組み合わせになります。
構築と実行: ワークフローを組んで動かす
ここからは、実際にワークフローを組んで動かします。
GUI でのワークフローの作成方法
AI & Automations > Workflows から作成します。

Add Step でステップを追加し、ルールを追加します。たとえば、Ready to publish ステップを追加し、Add a rule で「Takumi Koshii」だけが publish できるルールを追加する場合のスクリーンショットがこちらです。

対象としたいコンテンツタイプは画面右から選択します。

ワークフロー定義を作成する
記事を表すコンテンツタイプ blogArticle を用意し、これに適用するワークフロー定義を作成しました。(なお、今回の検証では CMA = Content Management API で作成しました。) ステップは執筆中、レビュー中、承認済みの 3 段階とし、承認済みのステップにだけ公開を許可する権限を付けます。
const wfDef = await client.workflowDefinition.create(
{ spaceId, environmentId },
{
name: 'Blog Review',
description: '記事の執筆から公開までのレビューワークフロー',
appliesTo: [
{ type: 'Link', linkType: 'Entry', validations: [{ linkContentType: ['blogArticle'] }] },
],
flowType: 'no_restriction',
steps: [
{ name: 'Draft', description: '執筆中' },
{ name: 'Review', description: 'レビュー中' },
{
name: 'Ready to publish',
description: '承認済み',
permissions: [
{
type: 'entity_permission',
configuration: {
// 公開を許可する相手。ユーザーまたはチームのリンクを指定する
actors: [{ sys: { type: 'Link', linkType: 'User', id: 'APPROVER_USER_ID' } }],
action: 'publish',
effect: 'allow',
},
},
],
},
],
},
)
ワークフローが作成されているのを GUI で確認しました。

承認済みステップに付けた権限は、次の構造で保存されます。action は編集・公開・削除のいずれか、effect は許可・禁止、actors は公開を許可する相手です。特定のユーザーやチームのリンクを配列で指定するほか、全員を表す all も指定できます。
{
"type": "entity_permission",
"configuration": {
"effect": "allow",
"action": "publish",
"actors": [{ "sys": { "type": "Link", "linkType": "User", "id": "APPROVER_USER_ID" } }]
}
}
エントリを作り、ワークフローを進める
blogArticle のエントリを 1 件作り、編集画面を開きます。画面右のワークフロー欄で Start workflow を押します。

ワークフローが先頭の Draft から始まります。

試しに Ready to publish へ進めます。Ready to publish をクリックして移動します。

完了して公開する
Ready to publish まで進めたら、Publish ボタンでエントリを公開します。

まとめ
Contentful のワークフロー機能を使うと、記事の執筆から公開までをステップに分け、承認を挟んでから公開する流れを CMS 上に組めます。書く人と公開する人を分け、最後のステップでだけ公開を許可することで、誤公開を構造的に防げます。複数人での CMS 運用を設計する際に、本記事が参考になれば幸いです。


