Skip to content

refactor(infra/smalruby-api): rename Lambdas + import existing domain for prod cutover#575

Merged
takaokouji merged 2 commits into
developfrom
refactor/smalruby-api-prod-cutover
Apr 29, 2026
Merged

refactor(infra/smalruby-api): rename Lambdas + import existing domain for prod cutover#575
takaokouji merged 2 commits into
developfrom
refactor/smalruby-api-prod-cutover

Conversation

@takaokouji
Copy link
Copy Markdown

Summary

prod カットオーバー (旧 SAM スタック smalruby-infra-prod → CDK スタック SmalrubyApiStack) に対応するためのコード変更。カットオーバー自体は本 PR を出す前にすでに実施済み (2026-04-29)。本 PR は実施したコード変更を develop に反映する。

カットオーバーで変更した点

1. Lambda 関数名の smalruby-api- プレフィックス統一

旧 SAM スタックの Lambda 関数名と衝突していたため、CDK 側はすべて smalruby-api- プレフィックスで統一:

旧 (CDK 初期実装) 新 (本 PR)
smalruby-cors-proxy smalruby-api-cors-proxy
smalruby-mesh-zone-get smalruby-api-mesh-zone
smalruby-scratch-api-projects smalruby-api-scratch-projects
smalruby-scratch-api-translate smalruby-api-scratch-translate

stg では -stg サフィックス、prod ではサフィックスなし。

2. カスタムドメインの import 機能

ダウンタイム最小化のため、CDK スタックが既存の API Gateway カスタムドメイン (api.smalruby.app) を 作成せずに参照 できる仕組みを追加。apigatewayv2.DomainName.fromDomainNameAttributes() を使用。

.env.prod に以下を設定 (gitignored、.env.example に記載):

IMPORT_EXISTING_CUSTOM_DOMAIN=true
IMPORTED_REGIONAL_DOMAIN_NAME=d-8g2cqu3hqg.execute-api.ap-northeast-1.amazonaws.com
IMPORTED_REGIONAL_HOSTED_ZONE_ID=Z1YSHQZHG15GKL

これで:

  • 既存 ACM 証明書 (2020 発行の b813732a-...) を再利用 (再発行不要)
  • 既存 Route53 A レコードを再利用 (DNS 切り替え不要)
  • ダウンタイムは「base path mapping を SAM から CDK へ swap する数分」のみ

3. integration test の Origin 修正

CORS preflight test の Origin を http://localhost:8601https://smalruby.app に変更。prod では .env.prod で意図的に localhost を CORS 許可リストから除外しているため。smalruby.app は両環境で常に許可。

カットオーバー実施記録 (2026-04-29 完了)

  1. ✅ stg リネーム再デプロイ
  2. ✅ stg 動作確認 (18 integration tests pass)
  3. .env.prod 作成 (MESH_ZONE_SECRET_KEY を旧 SAM 値で設定 → mesh ドメイン継続性 OK)
  4. ✅ SAM のドメインマッピング解除 (aws apigateway delete-base-path-mapping)
  5. cdk deploy --context stage=prod で新スタックを api.smalruby.app に紐付け
  6. ✅ prod 動作確認 (全 4 endpoint + CORS + 18 integration tests against prod pass)
  7. ✅ 旧 SAM スタック削除 (aws cloudformation delete-stack --stack-name smalruby-infra-prod)

ダウンタイム実測: 約 5 分

副次的な変更

  • .claude/rules/infra/smalruby-api.md を更新 (新しい Lambda 名、import 機能、カットオーバー記録を反映)
  • .env.exampleIMPORT_EXISTING_CUSTOM_DOMAIN の説明を追加

Verification

後続作業 (本 PR スコープ外)

  • smalruby/smalruby-infra リポジトリの該当ディレクトリ (lambda/cors-for-smalruby/, lambda/smalruby-cors-proxy/, lambda/smalruby-mesh-zone-get/, lambda/smalruby-scratch-api-proxy-*/) を deprecate

Test plan

  • CI で infra/smalruby-api の unit tests / cdk synth / npm audit が green
  • CI で全 scratch-gui / scratch-vm テストが green
  • develop 取り込み後、smalruby.app の通常動作を本ブランチビルドで確認

Related

Refs #573

… for prod cutover

prod カットオーバー (api.smalruby.app を旧 SAM スタックから CDK へ) に対応する
変更。ダウンタイムを最小化するため、既存の API Gateway カスタムドメインを
新規作成せずに import する。

Lambda 関数名変更:
- smalruby-cors-proxy → smalruby-api-cors-proxy
- smalruby-mesh-zone-get → smalruby-api-mesh-zone
- smalruby-scratch-api-projects → smalruby-api-scratch-projects
- smalruby-scratch-api-translate → smalruby-api-scratch-translate

旧 SAM スタックが使っていた `smalruby-cors-proxy` 等と衝突していたため、
すべて `smalruby-api-` プレフィックスで統一。stg は既存の関数を CFN が
delete + create で置き換える (stg のみ短時間ダウンする)。

カスタムドメイン import:
- `IMPORT_EXISTING_CUSTOM_DOMAIN=true` のとき、apigatewayv2.DomainName.
  fromDomainNameAttributes() で既存ドメインを参照
- ACM 証明書、Route53 レコードは作成せず再利用
- prod 用の .env.prod でこのフラグと既存の regional domain attributes を設定

Integration test の Origin を localhost:8601 → smalruby.app に変更:
- prod CORS は localhost を許可しない (.env.prod で意図的に除外)
- smalruby.app は両環境で常に許可されるため、両方で pass する

prod 検証 (2026-04-29):
- 全 4 endpoint 200/404/CORS 正常動作
- mesh-domain は旧 SAM secret_key 引き継ぎでドメイン継続性 OK
- integration test 18 件すべて pass
- ダウンタイム実測: 約 5 分 (CDK deploy + HTTP API mapping 反映)

旧 SAM スタック smalruby-infra-prod は CloudFormation から削除済み。
smalruby/smalruby-infra リポジトリの該当ディレクトリ deprecate は後続作業。

Refs: #573
prod カットオーバー (2026-04-29) で得た学びを今後のために記録:

.claude/rules/infra/smalruby-api.md:
- Lambda 関数名衝突 → smalruby-api- プレフィックスで回避
- カスタムドメイン import (fromDomainNameAttributes) でダウンタイム削減
- base path mapping は domain と切り離されている
- integration test Origin は両環境で許可される値を使う
- mesh-zone-get の secret key は引き継ぎ必須 (互換性破壊リスク)
- import 時は manageRoute53Record で ARecord 作成をスキップ
- CFN Delete 後は polling で消滅確認
- 検証は curl + Playwright で end-to-end

.claude/rules/infra/development.md:
- 汎用「旧スタック → CDK 移行チェックリスト」を追加
- 関数名衝突回避、import パターン、secret 引き継ぎ、カットオーバー手順
@takaokouji takaokouji merged commit 9efc9ac into develop Apr 29, 2026
10 checks passed
@takaokouji takaokouji deleted the refactor/smalruby-api-prod-cutover branch April 29, 2026 08:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant