ContentfulのデータをAWS S3に自動で保存する(バックアップ)

2020.12.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

管理画面だけを提供してくれるヘッドレスCMSのContentfulでは、AWSや、Dropboxなどのストレージサービス、CloudinaryなどのSaaSと連携するプラグインを数多く揃えていることが特徴です。

今回はAWS S3とContentfulを連携して、記事データが更新されるたびにS3に記事のjsonデータがバックアップされる仕組みを作ります。

前提

  1. Contentfulのアカウントを持っている(無料で使い始めることができます)
  2. AWSのアカウントを持っている
  3. AWSのs3への書き込み権限を持っているアクセスキーとシークレットキーを準備済み(下記記事参照)

参考記事: AWS アクセスキーを作成するには、どうすればよいですか?

S3のバケット作成

まずはS3でバケットを作成します。

S3 Screenshot

設定はデフォルトでいいのですが、一点、バケットのバージョニングを有効にしてください。

s3 screenshot

同一記事はS3上で同じファイル名で更新されるため、バージョニングを有効にすることでContentfulの記事データの更新履歴をS3からも追うことができます。

Contentful側でS3の連携

Contentful上でS3のプラグインを有効化します。

ステップ1: 下記のページからInstall nowをクリック
https://www.contentful.com/marketplace/webhook/aws-s3/

Contentful s3 plugin

ステップ2: S3アクセス情報を設定
S3へのWebhookを作成する画面に進むので、バケットとアクセス情報を記述します。

  • リージョン名
  • バケット名
  • アクセスキーID
  • シークレットキー
Contentful s3 plugin

ステップ3: Webhook条件の設定
デフォルトだと、下記の条件になっています。

  • 全ての投稿にいずれかの変更(作成/更新/削除/アーカイブ)が発生した際
  • Space内の全ての投稿が対象
  • Asset(画像など)やContent modelは対象外
Contentful webhook

これだと個人的には範囲が広すぎると感じるので、例えば下記の設定変更をしてみました。

  • Auto saveをトリガーにしない(記事の一文字変えるだけでもS3へのデータの保存処理が発生してしまうことを防ぐ)
  • 特定のContent modelのみを対象にする(「Filters」から「Content Type ID (sys.contentType.sys.id)」が特定の値と等しい時だけトリガー)
  • AssetのCRUD発生時にトリガー(写真データも保存したい場合)を追加

これで準備ができました。

記事がバックアップされるかチェック

試しにContentful上で記事を適当に更新してみて、S3を見てみます。

s3

記事のjsonデータがs3上に生成されました!

これ以後同じ記事が更新された際も同じ名前でファイルが更新されていきます。

バックアップシステムの初期費用もかからないですし、必要に応じてS3のライフサイクルポリシーを調整することで運用費用も最低限に抑えることができます。

さいごに

Contentfulではセキュリティなどにあまり気を配る必要がないとはいえ、不慮の事故などはありうるので、S3など外部に記事データを保存しておくと安心です。

ちなみにS3プラグインはContentfulのエンタープライズプラン限定で利用できます。

もしContentfulやAWSとの連携に興味のある方はぜひ弊社までお問い合わせください。