サーバレス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はセッションにmemcached
やredis
を使う機能が標準で備わっているのでそれを利用しましょう。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 SQL
やRedis
関係のサービス。サーバレスVPCコネクタ
もかかります。
ちなみに、サーバレスVPCコネクタ
はMicro Instance with burstable CPU
として請求が上がるのでこちらも注意が必要です。(最初分からなくてGCPのサポートに問い合わせてしまいました。。。料金に記載はきっちりとあります)
階層 | CPU | メモリ | リクエスト | ネットワーキング |
---|---|---|---|---|
無料 | 最初の 180,000 vCPU 秒は無料 | 最初の 360,000 GiB 秒は無料 | 200 万リクエストまで無料 | 北米内の下り(外向き)は、1 GiB まで無料 |
まとめ
インフラに対する意識をほとんどすることなく、ここまでスケーラブルかつ低料金でサービスを開始できるCloud Run
は本当に素晴らしい製品だと思います。
デプロイまでの手順も非常にシンプルなので、学習コストも低いことが特徴的ですね。(Developer Experience高い)
ここまでお付き合いいただきまして、ありがとうございました!