🎄

[Day.12] Laravel on Cloud Run created by Terraform Modules

2021/12/12に公開

以下の12日目のエントリです。

「GCP上でLaravelプロダクトを」という案件がありまして、先月下調べしました。
自身としては久々の GCP であり、いかに今風に作れるか、を目指して Cloud Run を選択してみました。そして、インフラの再構築も容易にやれるといいよね、と思って省エネ目指してできるだけ terraform-google-modules で構築を進めようとしています[4]。その途中経過のお話です。

Laravel on Cloud Run まで

時間の都合(...)で書くのを思いっきり手抜きしてしまうのですが、↓の「まだ検証段階」のところをクリックして展開すると経過がまとまってます。
https://esa-pages.io/p/sharing/6641/posts/1551/4a826ac3c24978e956ce.html#Laravel on Cloud Run はじめました

かいつまんで段階を列挙すると、

  • Vue.js のビルド
    • appBase/runディレクトリで以下手順により実現可能だと思います
      • make local
      • make up
      • docker-compose exec node make npmipack
  • Artifact Registry へ image を push
    • (ローカルで動作確認して) appBaseディレクトリで appBase/Makefile[5]
      • make build (docker build ...)
      • make tag (docker tag ...)
      • make push (docker push ...)
  • (初回だけ) push した image を 「Cloud Run にデプロイ」
    • 2回目以降は image を push したら自動でデプロイが走り、成功したら更新される感じ
  • プライベートIP での Cloud SQL (for PosqtgreSQL)Memorystore for Redis への接続は サーバーレス VPC アクセス コネクタ 経由になるので API を有効にして[6] Cloud Run の管理画面で設定

という流れでできたようです。

ソースコードはこちら(12/12 18:00 時点で↑の通りに期待動作するかは未確認。。)
https://github.com/sogaoh/laravel-cloud-run/

AWS Fargate と比較になる点

(個人の感想です)

  • 複数コンテナを突っ込めないので nginx -> laravel というよくある感じの構成にはできなさそうです。自分は php-fpm でビルトインサーバーを ENTRYPOINT から起動する、というやり方にしてます。apache 単体という手もあると思います。Heroku で Laravel 動かすのと似たような感じ、でした。
  • image の push 方法が AWS ECR とちょっと違う感じがあった記憶です。そんなに大差はないようには思います。

備考

約1週間で、料金実績が以下です。僕はこれを確認した直後に両方止めて destroy しました。だいぶスペック弱めたのに。

  • Cloud SQL for PostgreSQL : ¥1,500
  • Memorystore for Redis : ¥2,000

以後、DBは sqlite、Redisは file に変更。 Cloud Run は叩かれない限り無料(っぽい)ですが、これだと毎回DB作り直されますです。(それがソースコードリポジトリの「sqlite」ブランチ)

(Infrastructure) created by Terraform Modules

これから、という感じなのですが、以下を使っていく予定です。

Network
https://github.com/terraform-google-modules/terraform-google-network

Cloud NAT
https://github.com/terraform-google-modules/terraform-google-cloud-nat

GCLB
https://github.com/terraform-google-modules/terraform-google-lb

bastion host (これから精査。Cloud SQL や Redis を見に行くとか用にする想定。Cloud Run で ECS Exec みたいなことしたい・・・)
https://github.com/terraform-google-modules/terraform-google-bastion-host

container-vm (これから精査。↑のとどっちかを選択、もしくは GCE 用の module を自作するか。要は GCE を置かざるを得ない、と考えてます。。)
https://github.com/terraform-google-modules/terraform-google-container-vm

さいごに

明日13日目の予定は以下になっています。それぞれお楽しみに。

脚注
  1. 11日目は @katsugdgd さんの wikiによるとバージョン4(2013年5月)ではコードがゼロベースから書き直されたらしい。何があったんだろうね。 でした。 ↩︎

  2. 11日目は @sano3071 さんの Cloud Workflows から外部の JSON データを読み込んでセットする方法 でした。 ↩︎

  3. 11日目は @c6tower さんの 【Terraform】list, map, objectの結合を整理したい でした。 ↩︎

  4. 2021/12/12 時点で Cloud Run の module がまだないようなので、おそらくここは自作になりそう。探せばあるかな・・・ ↩︎

  5. GCP_PROJECT は設定が必要 ↩︎

  6. 1つ1つ API を有効にするのが面倒なので、GCPのAPIを全部有効化するワンライナー - Qiita (by shiozaki さん) の手法を使いたい・・・ ↩︎

Discussion