アイレット株式会社 DX開発事業部 IoT×クラウドセクション コアエンジニアリンググループの井上です!
Laravel × Google Cloudでの開発において、
セキュリティ要件から「DB(Cloud SQL)にグローバルIPを持たせず、VPC内に閉じ込める(プライベートIPのみにする)」という構成はよくあるかと思います。

しかし、そうなると困るのが 「ローカル環境や外部のCIツールからマイグレーション(php artisan migrate)が実行できない」 という問題です。
セキュリティのために踏み台サーバー(Bastion)を立てるのも、管理コストや運用負荷がかかります。

そこで今回は、前回の記事:Laravel on Cloud Run:gcloud run jobs executeで複数引数を扱う方法で紹介した「引数の渡し方」のテクニックを応用し、
Cloud Run Jobs を使って、VPC内部から安全かつスマートにマイグレーションを実行する方法をシェアいたします!

解決したい課題と構成

DBをプライベートネットワークに配置しているため、外部からは接続できない
そこで、DBと同じVPC(またはVPCコネクタ経由)に配置した Cloud Run Jobs でマイグレーションを実行し、インフラ内部で処理を完結させる

  • Cloud Run Jobs: VPC コネクタを経由して DB にアクセス
  • Cloud SQL: プライベート IP のみ有効(グローバル IP 無効)

Cloud Run ジョブの設定

  • 今回はlaravel側に専用のコマンドは作成せず、ジョブ追加のみで実現する
  • コンテナコマンドの例は本番稼働後に機能追加などでテーブル追加が必要になった際の場合
    • コンテナイメージのURL:画像はサンプル用のものだが実際はビルドしてpushしたものを設定
    • ジョブ名:test-migrate-job
    • コンテナコマンド
      • /usr/local/bin/php:固定
      • /var/www/artisan:固定
      • migrate:実行したいマイグレーションによって変更
      • --path=/database/migrations/0001_01_01_000000_create_xxxxx_table.php:実行したいマイグレーションによって変更
  • その他、接続タブ、セキュリティタブなどでの設定も必要だが本記事では割愛

    上記のようにコンテナコマンドを変更するだけで柔軟にマイグレーションを実行できるなんて!!
    なんて便利なんでしょう!Cloud Run最高ですね!!!

実行IDを控える

本番のリリースにおいてはリリース手順書を作成して実行すると思いますが、
後から確認できるようにどのマイグレーションをいつ実行したかがわかるように実行IDをリリース手順書にメモしておくと良さそうですね!
実行履歴のコンテナタブのコマンドと引数の部分にどのコマンドで実行されたジョブか表示されています!

終わりに

gcloud run jobs execute コマンドに引数を設定する方法をマスターしていれば、
Laravel 側に手を加えなくても、安全かつ柔軟なマイグレーション環境が構築できます。

「便利だから」とセキュリティを妥協するのではなく、クラウドの機能を使い倒して安全に運用する のがエンジニアの醍醐味ですね。
ぜひ皆さんのプロジェクトでも活用してみてください!