2020年あけましておめでとうございます!今年もカルテット開発部ブログをよろしくおねがいします!

この記事は Symfony Advent Calendar 2019 19日目の記事です。大幅に遅刻しましたが検証に時間がかかったためなのでご容赦ください m(_ _)m

now.shとは

now.sh とは、サーバーレスで様々な言語のウェブアプリケーションを動かすことができるPaaSです。

公式にサポートされているのはnode.js, Go, pythonですが、サードパーティのビルダーを利用することでPHPも使えます。
※ ただし、 PHPのビルトインウェブサーバー を使うことになるので、本番環境にはおすすめできないかもしれません。試す際は自己責任でお願いします。

Symfony4アプリをGitHub経由でnow.shにデプロイしてWEBアプリケーションとして動かす

ソースコード側の準備

src/Kernel.php に細工しておく

now.shの環境では /var/cache/var/log に書き込めないので、キャッシュ書き込み先とログ書き込み先をnow.shでも書き込める /tmp 等に変えておく必要があります。 どこをどのように変えるのかは https://github.com/juicyfx/now-php/blob/master/examples/framework-symfony-microservice/src/Kernel.php を参考にしてください。

.env じゃないファイルを使う

now.shではデプロイ時に .env という名前のファイルはすべて無視されます。
無視しない設定はありません、必ず削除されます(T_T)

かと言って Symfony4+で .env は必要な環境変数のテンプレートなので、内容が全然なくても .env を置かないでアプリケーションを動かすことはできません(厳密に言うと違うんですが…気になる人はお手元のSymfonyアプリケーションのconfig/bootstrap.phpを読んでみてください)。now.shのデプロイ時に .env を消されないためには、 .env.env じゃない名前に変えます。私は myenv にしました。
.env を変えたら config/bootstrap.php でSymfonyDotEnvによって .env を読み込んでいる箇所を探して、 myenv を読むように変更しておきましょう。

Symfony4のphpunit.xml.distはテスト時のbootstrapとして config/bootstrap.php を読み込んでくれるので、ローカルでの機能テスト等も問題なく動きます。
テスト用の環境変数は .env.test でなく myenv.test、 ローカル動作確認用の環境変数は .env.local でなく myenv.local に記載すればOKです。

デプロイ設定

秘密の環境変数の準備(ローカル)

アプリケーションにはDBのパスワードとか、SECRETとか。レポジトリにコミットしたくない環境変数がありますよね。
そういった秘密の環境変数はローカルPCにnow-cliをインストールしてnow-secretsに登録しておきます。

# xxxという変数名でyyyという値を登録
$ now secrets add xxx yyy

注意しておきたいのは、secret名はユーザー別であってプロジェクト別ではないという点です。複数のWEBアプリをnow.shにデプロイしてそれぞれ違う値を使いたい場合はそれぞれ a-password b-password のように、どのsecretがどのプロジェクト用のものかわかるようにしておくと良いでしょう。

.nowignoreの準備

now.shにデプロイするときに無視するファイル・ディレクトリを指定するファイルです。gitignoreと同じようなものと考えてください。
ローカルから /vendor を含めてデプロイしようとするとビルドが FetchError というエラーでほぼ確実に落ちるので、 .nowignore/vendor は除外しておきましょう。
/vendor なしでデプロイしてもサーバー側で勝手に composer install してくれるようです。

now.jsonの準備

now.json を準備します。 now.jsonはnow.shのためのデプロイ指定を記述するjsonファイルです。プロジェクトのルートディレクトリに置きます。

{
  "version": 2,
  "env": {
      "APP_ENV": "prod",
      "MY_ENV": "@my-env"
  },
  "builds": [
    { "src": "public/index.php", "use": "now-php"}
  ],
  "routes": [
    { "src": "/(.*)", "dest": "public/index.php" }
  ]
}

{ "src": "public/index.php", "use": "now-php"} で指定している now-php というのがPHP用のビルダーです。
公式でなくサードパーティ扱いですが、特にベンダープリフィクスは不要のようです。

now.sh側で composer install するときは require-dev は無視されるようなので、 APP_ENV はかならず prod にしましょう。
now secretsに登録した秘密の環境変数は @ をつけて参照できます。(MY_ENVの定義を見てください)

デプロイ

GitHubにpushするだけです。

安定性

正直自分専用の軽いAPIアプリしか動かしてないので、まだわかりません。
最初に書いたように、PHPのビルトインウェブサーバーを使うことになるので、安定性は保証できないと思っています。