Cloud Run上でLaravel×React(Mix使用)のサイトを爆速で動かす - 必要な設定と料金関連


サーバレスVPCで関連サービスと繋ぐ

Laravelをサーバレスで動かすに当たって、最低限使う、かつ、少し考慮が必要と思われるのは

  • データベース(MySQL)
  • セッション
  • ログ

あたりだと思います。ここについては設定方法が公式にありますのでここではその情報だけまとめておきます。

データベース(MySQL)

当然、データベースの情報はどこからでも直接アクセスさせるとマズいですよね。なので、IP制限をするケースなどもあるかと思います。
ただ、Cloud SQLにはローカルIPを付与してCloud RunからそのIPへ向けてアクセスすることも可能です。
設定方法については、

Cloud Run(フルマネージド)から Cloud SQL に接続する

を参考にすると良いと思います。
ここで重要担ってくるのが、サーバーレス VPC アクセスの構成です。このサービスは下記のような構成を実現します。(画像は公式ページから引用)

非常にわかりやすい図解ですね。中心にある「サーバレスVPCアクセスコネクタ」を使うことで、Cloud SQLをはじめとするGCPのリソースをグローバルに晒すことなくセキュアに使えます。

セッションはMemory Store(Redis)を使う

サーバレスでログインなどのセッションを使う場合は必須のサービスですね。これをやらないと、コンテナが変わるたびにセッションも無効になるので、ログイン状態が度々無効になってしまいます。。。

こちらもCloud Run(フルマネージド)サービスから Redis インスタンスへの接続として公式に情報があります。

Laravelはセッションにmemcachedredis を使う機能が標準で備わっているのでそれを利用しましょう。configを変更するだけなので非常に簡単に対応できます。

HTTP Session(英語)
HTTPセッション(日本語)

ログは標準出力にする

コンテナ×サーバレスなので、当然の事ながらコンテナ内にlaravel.logなどを作ったとしても意味はありません。ログを追えるようにするためには、ログの出力方法をファイルから標準出力に変更する必要があります。弊社の場合には下記のような設定をして、ワーニング以上のログを標準出力するようにしています。

'custom' => [
    'driver' => 'monolog',
    'handler' => StreamHandler::class,
    'with' => [
        'stream' => 'php://stdout',
    ],
    'level' => 'warning',
],

こうする事でログビューからエラーやログを探すことが簡単になります。

Cloud Runでみた時

Logs Viewerでみた時

上記の構成を実現する上で最低限、必要になると思われる料金

※あくまで現時点で弊社が考える目安です。

サービス名 用途 月額
Cloud Run フロントとバックエンド 従量課金
Memorystore laravelのセッション保持 5,162
Cloud SQL For MySQL MySQL 1,357
Severless VPC Access Connector Cloud RUNとMySQLの接続 1,480
Container Registory デプロイに利用(Cloud Storageに対して課金) 10

Cloud Runは無料枠が大きいのも魅力的ですね。(2020/9/7時点 公式サイトより引用)
どちらかということ、固定費用が必要なのはMy SQLRedis関係のサービス。サーバレスVPCコネクタもかかります。
ちなみに、サーバレスVPCコネクタMicro Instance with burstable CPUとして請求が上がるのでこちらも注意が必要です。(最初分からなくてGCPのサポートに問い合わせてしまいました。。。料金に記載はきっちりとあります)

階層 CPU メモリ リクエスト ネットワーキング
無料 最初の 180,000 vCPU 秒は無料 最初の 360,000 GiB 秒は無料 200 万リクエストまで無料 北米内の下り(外向き)は、1 GiB まで無料

まとめ

インフラに対する意識をほとんどすることなく、ここまでスケーラブルかつ低料金でサービスを開始できるCloud Runは本当に素晴らしい製品だと思います。
デプロイまでの手順も非常にシンプルなので、学習コストも低いことが特徴的ですね。(Developer Experience高い)

ここまでお付き合いいただきまして、ありがとうございました!