Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bref でサービスを運用している話

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Bref でサービスを運用している話

@Verybest LT Night #1

Avatar for Sugar Sato

Sugar Sato

March 25, 2026
Tweet

More Decks by Sugar Sato

Other Decks in Technology

Transcript

  1. 目次 01 Bref とは 02 なぜ Bref を選んだか 03 アーキテクチャ

    04 構築と運用 05 コスト 06 メリット・デメリット 07 まとめ
  2. • PHP を AWS Lambda で動かすための OSS フレームワーク • Lambda

    Layer として PHP ランタイムを提供 • Laravel / Symfony をそのまま動かせる • serverless.yml で構成管理 • GitHub Stars: 4k+ Bref とは
  3. • php-84-fpm ◦ Web API(FPM ベース、HTTP リクエスト処理) • php-84-console ◦

    CLI(artisan コマンド実行) • php-84 ◦ Worker(SQS などのイベント処理) • 拡張レイヤーも提供(GD, Imagick 等) • Amazon Linux 2 / ECR イメージ対応 Bref が提供するランタイム
  4. • EC2 / ECS ◦ サーバー管理必要 ◦ 常時課金 ◦ 運用負荷高め

    • Bref (Lambda) ◦ サーバー管理不要 ◦ リクエスト単位課金 ◦ 運用負荷低め 従来の PHP ホスティング vs Bref
  5. • チーム ◦ エンジニア少人数 • 既存資産 ◦ PHP (Laravel) のコードベース

    • 課題 ◦ インフラ運用に割けるリソースがない • 要件 ◦ コストを抑えつつ本番運用したい 選定時の状況
  6. • インフラの選択肢 ◦ EC2: 運用負荷 高 / コスト 中〜高 /

    自由度 高 ◦ ECS Fargate: 運用負荷 中 / コスト 中 / 自由度 高 ◦ Lambda: 運用負荷 低 / コスト 低 / スケーリング自動 ◦ Lambda を選択 • Lambda 上の FW の選択肢 ◦ Laravel Vapor: 運用負荷 低 / 月$399〜 / Laravel公式 ◦ Bref: 運用負荷 低 / 無料(OSS) / 自由度 高 ◦ Bref を選択 選択肢の比較
  7. • OSS で無料 — Vapor は月額 $399〜 • serverless.yml で完結

    — インフラ定義がシンプル • Laravel がそのまま動く — コード変更最小限 • PHP ランタイムを選ぶだけ — 学習コスト低い • コミュニティが活発 — ドキュメント充実 Bref に決めた理由
  8. • 基本的にコード変更は最小限で移行できる ◦ Bref Laravel Bridge が自動統合 → サービスプロバイダ追加不要 •

    composer require bref/bref bref/laravel-bridge bref/extra-php-extensions • ストレージ ◦ デフォルトを S3 に変更(Lambda は読み取り専用) • キャッシュ・セッション ◦ database に変更(ファイル不可) • キュー ◦ SQS に変更 + Bref\LaravelBridge\Queue\QueueHandler • ログ ◦ stderr に出力(→ CloudWatch Logs) Bref 導入後の Laravel 側の対応
  9. • Web API ◦ php-84-fpm (ECR) ◦ タイムアウト 28秒 ◦

    HTTP リクエスト処理 • Console ◦ php-84-console ◦ タイムアウト 720秒 ◦ artisan コマンド • Queue Worker ◦ php-84 + GD ◦ タイムアウト 300秒 ◦ 画像圧縮・変換 Lambda 関数は 3 種類
  10. • Lambda × RDS の「コネクション爆発」問題 ◦ Lambda はリクエストごとにインスタンスが起動 • 同時接続数が一気に増える

    • RDS の max_connections を超えてしまう ◦ RDS Proxy でコネクションをプーリングして回避 なぜ RDS Proxy?
  11. • 2 つの User Pool で運用 ◦ Web User Pool

    ▪ クリニックユーザー向け(カスタム属性: clinic_id) ◦ Admin User Pool ▪ 管理者向け • Bearer トークンを Laravel ミドルウェアで検証 • clinic_id でデータのテナント分離 認証: AWS Cognito
  12. • ユーザーが写真アップロード → API (Lambda) → S3 に保存 • PhotoCompressionJob

    を SQS に投入 • Queue Worker (Lambda + GD) で処理 • 1MB 以上は JPEG 品質 25% に圧縮 • PNG/TIFF → JPEG 変換 • 圧縮済み画像を S3 に再保存 画像処理パイプライン
  13. • provider ◦ aws / region: ap-northeast-1 • runtime ◦

    provided.al2 (ECR Image) • VPC 内に配置(RDS アクセスのため) • api ◦ ECR イメージ / timeout 28s • console ◦ php-84-console / timeout 720s • jobs ◦ Queue Worker + GD Layer serverless.yml のポイント
  14. • FROM bref/php-84-fpm • COPY --from=bref/extra-gd-php-84 /opt /opt • COPY

    . /var/task • CMD ["public/index.php"] • たった 4 行で PHP 8.4 + GD の Lambda 環境が完成 Dockerfile
  15. • GitHub push/tag → GitHub Actions • composer install --no-dev

    • sls deploy --stage {env} • sls bref:cli --args="migrate --force" • Slack 通知 • staging ◦ ブランチ push で自動デプロイ • production ◦ タグで自動デプロイ デプロイフロー
  16. • dev / stg / prod を 1 つの serverless.yml

    で管理 • config.dev.yml ◦ APP_ENV: development • config.stg.yml ◦ APP_ENV: staging • config.prod.yml ◦ APP_ENV: production • 秘密情報: AWS SSM Parameter Store に格納 環境管理
  17. • GD拡張の追加 ◦ brefphp/extra-php-extensions を Layer で追加 • Bref独自のphp.iniが存在 ◦

    カスタムphp.iniが上書きされない • 自分のphp.iniを適用するには /opt/bref/etc/php/conf.d/ に配置 • ドキュメントが少なく手探りで解決 つらみ: PHP拡張とphp.ini
  18. • Serverless Framework v4 がリリース(2024/05/22) ◦ CIが翌日から壊れた... ◦ Bref が

    sls v4 に未対応だった ▪ v3 にダウングレード • serverless-lift(SQS構築に必要)も v3 依存 ◦ bref も lift も v4 未対応で、バージョン上げられない辛さ • frameworkVersion: '^3.28.1' でピン留めして運用中 つらみ: Serverless Framework v4 問題
  19. • Dockerfile の配置場所 ◦ ./docker/bref/Dockerfile に置くとデプロイは成功するが、 COPYしたリソースにアクセスできない ◦ ルートに配置で解決 •

    VPC 内 Lambda = NAT 必須 ◦ NAT Gatewayは高い... ◦ NAT Instance (t2.micro) でコスト削減 • タイムアウト設計 ◦ API Gateway 29秒 > Lambda 28秒にする ◦ 画像処理は Queue Worker に逃がす(最大 300秒) • コールドスタート ◦ ECR イメージは Layer より起動が遅い → 初回アクセスに注意 ハマりポイント
  20. 月額 $717(税込)の内訳 サービス 月額 備考 S3 $239.74 写真ストレージ Glue $104.56

    写真エクスポート CloudFront $97.47 CDN RDS $97.03 MySQL Multi-AZ Tax $65.19 消費税 VPC $58.13 NAT Instance CloudWatch $28.44 ログ EC2 $21.39 NAT Instance / 踏み台 API Gateway $1.97 HTTP API Lambda $0 計上なし
  21. • コスト ◦ コンピュート費用がほぼゼロ • スケーリング ◦ トラフィック増減に自動対応 • 運用負荷

    ◦ サーバー管理不要、パッチ適用不要 • デプロイ ◦ sls deploy で完了、ロールバックも簡単 ▪ 中身は CloudFormation なのでわかりやすい • Laravel がそのまま動く ◦ コード変更最小限で移行可能 メリット
  22. • コールドスタート ◦ 初回リクエストに数秒かかる • タイムアウト制約 ◦ API Gateway 29秒の壁

    • VPC 内 Lambda = NAT 必須 ◦ NAT Instance でコスト軽減しているが外部通信には必要 • ローカル再現 ◦ Lambda 環境の完全再現は難しい → Docker Compose で代替 • デバッグ ◦ CloudWatch Logs ベース デメリット