utsusemiという静的サイト生成用クローラを作った(作っていた)

github.com

昨年からサーバーレスな勉強会で何回か紹介していましたが、ちゃんとエントリを書いていなかったので書いておきます。

これは何?

1つのオリジナルサイトをクロールしてS3上に(S3の静的ウェブサイトホスティング機能で)静的サイトを構築してしまうServerlessなツールです。

さらに、構築したS3上の静的ページを任意のタイミングで更新できるようになります。

どんな時に使えるの?

以下の2つの要件を実現したいときに使えると思っています。

  1. コンテンツはCMSなど便利なWebアプリケーションで更新をし続けたい。
  2. 実際にアクセスされる公開側は(可用性、信頼性やセキュリティを理由に)S3の静的ウェブサイトホスティングで実現したい。

utsusemiのアーキテクチャ

f:id:k1LoW:20180124215620p:plain

utsusemiはAWS上で実現される、いわばサーバーレスアプリケーションです。

utsusemiをデプロイすると、オリジナルサイトをクロールするクローラ(AWS Lambda + Amazon SQS)と、クロールした結果の静的コンテンツを置くS3をAWS上に展開します。

クローラにはAPIAPI Gateway)を通じて命令を送ることができ、クロールした結果は「リンクなどが切れないように書き換えた上で(ここが泥臭い)」S3に設置されます。

CMSでコンテンツを更新したタイミングでutsusemiのAPIを叩くようにすれば、「CMSから更新可能なS3静的ウェブサイトホスティング」の出来上がりというわけです。

あとはS3側だけを公開するような形にしておけば、CMSの可用性を考える必要もないですし、S3ならセキュリティ的にも安心です。

URLの問題だけですのでDNSいじることができるのあれば、既に運用しているCMSにも適用できるかもしれないという良さもあります。

静的ウェブサイトホスティングのためにURLを書き換えるという仕組み

utsusemiはクロールしたコンテンツをただ保存することを目的にしているのではなく、クロールした結果を静的サイトとしてリンク切れなくホスティングすることを目的としているので、主にURLをガンガン書き換えています。

例えば、

  • aタグやlinkタグの href 属性
  • scriptタグやimgタグなどの src 属性
  • CSS内の url()
  • タグに直接書かれた style 属性内の url()
  • CSS内の @import

などを泥臭く、パス解決だけでなくクエリストリングやハッシュも良い感じに書き換えています。

というわけで

なかなか使いどころあると思っているのですがいかがでしょうか?

ちなみに

utsusemiという名前の命名は奥さんです(ヒント: FFXIユーザ)。