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のビルトインウェブサーバーを使うことになるので、安定性は保証できないと思っています。