なんでもノート

なんでも書くノートみたいなブログ

GitHub Pagesにはてなブログの最新記事を表示する

https://azujuuuuuun.github.ioにブログの最新記事を出した。

実装方法

  1. はてなブログの更新フィードを取得する
    • Atomフォーマットを取得する
  2. 1の更新フィードをJSONに変換する
    • XMLより扱いに慣れているのでJSONに変換した
  3. 2のJSONGoogle Cloud Storage(以下、GCS)にアップロードする
    • 無料枠があるのでGCSを選択した
  4. Next.jsのgetStaticPropsでGCSからJSONを取得する

当初の目的はブログを更新したらazujuuuuuun.github.ioを更新することだった。それを踏まえた実装方法になっている。今後、以下の日時の定期実行処理を別コンポーネントに実装する。

  1. GCSから更新フィードJSONを取得する
  2. はてなブログの更新フィードAtomを取得する
  3. 1と2のJSONAtomの最終更新日時が同じ場合は処理を終了する
  4. 異なる場合
    1. 2のAtomからJSONを生成し、GCSにアップロードする
    2. GitHub Actionsのrepository dispatchを利用してGitHub Pagesのデプロイ処理を走らせる

困ったこと

GCSのバケット

https://cloud.google.com/storage/docs/naming-buckets

バケット名は一般公開されます。 ユーザー ID、メールアドレス、プロジェクト名、プロジェクト番号、個人を特定可能な情報(PII)をバケット名に使用しないでください。バケットの存在を誰でも調べることができます。

この考慮事項に悩まされた。良い命名規則が未だにわからない。当たり障りのないバケット名をつけた。

Google Cloudはリソースに名前とIDを求められるのでその度に悩んでいる。

GCSの無料枠を超えないか

GCSの無料枠は2022/09/03現在以下の条件。

  • 5 GB 月の Regional Storage(米国リージョンのみ)
  • 5,000 回のクラス A オペレーション(1 か月あたり)
  • 50,000 回のクラス B オペレーション(1 か月あたり)
  • 1 GB の北米から全リージョン宛ての下りネットワーク(1 か月あたり、中国とオーストラリアを除く)

https://cloud.google.com/free/docs/free-cloud-features?hl=ja

クラスAオペレーションとクラスBオペレーションはhttps://cloud.google.com/storage/pricing?hl=jaの説明を参照。更新系やバケット内のオブジェクト一覧取得などのやや重い処理がクラスA、比較的軽めの参照系がクラスB。

ローカルで開発中にビルドの度にファイル取得が走るので無料枠を超えないか心配だった。とりあえず、開発中は環境変数でローカルのファイルを参照するようにした。ただ、開発中のソースコードと本番のソースコードが異なるので、GCS互換のオブジェクトストレージをローカルに立てられないか検討中。

GitHub ActionsからGCSへの認証方法

長くなりそうなので別の記事に書く。

感想

Google Cloudを初めて触るので読むドキュメントが多い。実装よりGoogle Cloudの設定、Google Cloudの設定よりリソースの命名に時間を使ってる気がする。