【Vercel】PHP8.3でLaravelアプリを動かしたい

PHP8.3でLaravelを動かそうと思い、Vercelを選定しました。

今回はその手順をお届けします。

:::note info
もちろんAPIルートも対応してます。
:::

## 経緯
もともと、Drupalアプリを ec2 に乗せていました。
無料利用枠が終了して想像よりコストがかかって大慌て...。

aws無料利用枠のありがたさをしみじみと感じました。
1年間もあったのにコストかからない方法を覚えることはできませんでした...。

コストを抑えて、Symfonyベースで動かせるアプリケーションをデプロイしたい、というのが今回作業に至った経緯です。

### なぜ Vercel？
個人的に気に入ってる機能はこちら。
- 自動デプロイ: GitHub連携し、コードをプッシュするだけで自動的にビルドとデプロイが実行可能。
- ホスティング: ドメイン管理、環境変数のGUI設定、アナリティクスが使いやすい。
- サーバーレス機能: サーバーレス関数をサポート。バックエンドの機能を簡単に追加可能。

Vercelの記事以前書いてます。よければ。

https://qiita.com/umekikazuya/items/684b0414e3a2b9865fa7


### VercelでPHP動くの？
動かせる、ってAIが教えてくれたので今回いろいろ調査してみました。
海外のエンジニアでちょこちょこやってる人がいるみたい。

いろんな方のGithubリポジトリを見て、設定を精査しましたので今回ご紹介させていただきます。

とりあえずコード見せろよ。という方は[こちら](https://github.com/umekikazuya/Laravel-Vercel-Template)

## 設定方法
今回、Vercelのリポジトリセットアップについての紹介は省かせていただきます。
正直なところ、あまり説明しなくても誰でも簡単使えるよう洗練されたサービスです。
（僕もはじめて使ったときそんな手順調べてない。）

それでも調べないと不安だよ。って方はこちら。

https://vercel.com/docs/getting-started-with-vercel

### #001. Laravelインストール
```bash
composer create-project laravel/laravel
```
### #002. Vercel接続設定
```bash
composer require revolution/laravel-vercel-installer --dev
php artisan vercel:install
```

### #003. PHPランタイム設定
vercel.jsonを修正。
```json:vercel.json
{
    "version": 2,
    "framework": null,
    "functions": {
        "api/index.php": {
            "runtime": "vercel-php@0.7.3"
        }
    },
    "routes": [
        {
            "src": "/(.*)",
            "dest": "/api/index.php"
        }
    ],
    "env": {
        "APP_NAME": "Laravel Vercel",
        "APP_DEBUG": "false",
        "APP_URL": "https://xxxx.vercel.app",
        "APP_CONFIG_CACHE": "/tmp/config.php",
        "APP_EVENTS_CACHE": "/tmp/events.php",
        "APP_PACKAGES_CACHE": "/tmp/packages.php",
        "APP_ROUTES_CACHE": "/tmp/routes.php",
        "APP_SERVICES_CACHE": "/tmp/services.php",
        "CACHE_DRIVER": "array",
        "CACHE_STORE": "array",
        "LOG_CHANNEL": "stderr",
        "SESSION_DRIVER": "cookie",
        "VIEW_COMPILED_PATH": "/tmp"
    }
}

```
※ `vercel-php`のバージョンは、利用したいPHPバージョンに依存します。
今回はバージョンだとPHP8.3に対応させています。

### #005. `/dist` ディレクトリを作成
デプロイ時の出力ファイル置き場ですかね。ビルドファイル置き場ですかね。
ここの理解浅くて申し訳ありません。分かる方コメントください。

ルート直下に`dist/.gitkeep`を作成します。

### #006. `artisan`コマンドでAPI設定
```bash
php artisan install:api
```
以下、2点変更差分が入ればOK.
- `routes/api.php`が作成される
- `bootstrap/app.php`に`api`ルートが設定される

### #007. APIの Prefix 設定
`bootstrap/app.php`に一行追加します。
```diff:bootstrap/app.php
return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
+         apiPrefix: 'data',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();
```

今回は、Prefix に `data`を利用します。
URLイメージ: `/data/user`, `/data/product/{id}`, `/data/log`

## Vercelで設定
こちらの設定は要点のみ。

1. Githubでソースコードを管理している方はリポジトリインポートをしてください。
2. 環境変数の設定を行います。
   APP_KEY の設定は必須です。

ビルドが完了したらアクセスして確認するのみ。

## 参考
文中でもしれっと紹介しましたがリポジトリ用意してます。
よければ参考にしてください。

https://github.com/umekikazuya/Laravel-Vercel-Template

他にもPoCする際に私が参考にしたリポジトリ / 記事を記載しておきます。

https://github.com/jacksonjk94/laravel-deploy-vercel

https://github.com/theaungmyatmoe/laravel-on-vercel

https://github.com/moghwan/laracel-app

https://blog.moghwan.io/articles/laravel-on-the-edge-with-vercel

## まとめ
今回は、VercelでLaravelアプリを動かす方法について紹介しました。
想像以上に簡単ですのでぜひ。