AWS LambdaでMediumの記事を投稿する
Medium自体はコードブロックの編集に対応していない。背後にある理由は定かではないが(おそらくエンジニアが主要なターゲット層ではないのだろう)、コードをハイライト表示したい場合、画像を直接貼り付けるか、Gistに貼り付けてから記事に埋め込む(embed)かという方法をとることになる。
コードを画像として貼ればシンタックスハイライトの効果は得られるものの、エンジニアにとってはかなり不便だ。コピペで実際にコードをテストすることができないし、記事を編集する際にも手動で画像を修正しなければならず、非常に面倒だからだ。
しかし、Gistを貼り付けるのにもいくつか問題がある。
- モバイル版では正常に表示されず、埋め込みコンテンツではなくリンクがそのまま表示されてしまう
- 自分でコードをGistに貼り付けるのが面倒。(VS CodeやSublimeなどの拡張機能を使ってGistにアップロードするのも悪くない方法だが)
Medium上でできる限りハイライトされたコードブロックを見るために、最終的にAWS Lambdaを使ってこの問題を解決することにした。
AWS Lambda
Lambdaについてまだよく知らない読者は、すでにネット上に多くのリソースがあるのでここでは割愛する。Lambdaは、実際にサーバーを立ち上げることなく(もちろん裏側にはサーバーが存在するが)、AWSに実行したい関数を実行してもらう仕組みだ。この方法を使えば、関数を書くたびにマシンへデプロイしたり保守したりする必要はなく、ただ実行するだけで済む。
Github Issue
Lambdaのエンドポイントに連携するために、GitHubのWebhookを使ってトリガーすることにした。GitHubではIssueを使ってMarkdownが書け、画像アップロード(GitHubがホストしてくれる)やプレビュー、コードブロックなども使えて非常に便利だからだ。記事を公開したいときは、IssueをクローズすることでWebhookをトリガーし、Lambda経由でコードブロックをGistにアップロードさせ、最後にMedium APIを呼び出して記事を作成する。
Medium API
MediumのAPIはシンプルだが、便利で扱いやすい。まずは個人ページの Settings > Integration tokens でトークンを生成し、そのトークンを使って記事作成APIを呼び出せばよい。
Gist API
Gist APIも同様だ。自分のGistが散らからないように、記事用のコードを保存するための別アカウントを新たに作成することをおすすめする。Settings > Developer settings > Personal access tokens > Generate token でトークンを作成し、その際にgist権限にチェックを入れるのを忘れないようにしよう。
Lambdaとの連携
事前準備が整ったら、Lambdaとの連携を始められる。
まず作成したLambdaのエンドポイントをGitHubのWebhookに設定し、MarkdownをHTMLに変換できる適当なパッケージ(僕の場合は marked を使用)を見つけて組み合わせれば完成だ!
簡単な実装はここにある。少し手間ではあるが、実際はかなり便利だ。Mediumはいつになったらコードブロックに対応してくれるのだろうかQQ。
関連記事
- 測定が目標になるとき:窓税からPull Request数まで かつて僕は小さなツールを自作し、四半期で自分がどれだけPRに貢献したか、レビューコメントをどれだけ残したか、チケットをどれだけ消化したかを集計して、上司にアウトプットを証明しようとしたことがある。上司は淡々と、評価はアウトプットだけで見るものではないと言った。数年後、僕はようやく理解した――測定が目標になるとき、それはもはや良い測定ではなくなるのだ。英国の窓税、ハノイのネズミ駆除の報奨金から、現代のPR数による開発者評価に至るまで、そのメカニズムはまったく同じだ。
- Cloudflare Images を画像ストレージ・変換ソリューションとして使う ウェブページに画像を1枚置くのはフロントエンドにとって最も簡単なことだが、リサイズや各種フォーマットの生成、さらにはトラフィックの負荷に耐えることまで完璧にやろうとすると、実際には一つの包括的なソリューションが必要になる。僕はその後、すべて Cloudflare Images に任せるようになり、オリジナル画像1枚だけを渡すようにしている。
- もう AWS Access Key を使うのはやめよう Access Key は AWS において見落とされがちなセキュリティリスクだ。OIDC と IAM Role を組み合わせることで、GitHub Actions にシークレットを一切保持させることなく、安全に AWS リソースを操作できるようにする。
- データベース主キー:AUTO_INCREMENT、UUID、そしてUUIDv7 バックエンド開発で度々直面する主キーの決定。auto incrementを使うべきか、それともUUIDか?衝突への懸念は?UUIDv7とcreated_at + インデックスの性能差はどれほどか?実際に2,000万件のデータで検証したベンチマークと設計上の意思決定を解説する。