AWS EC2にLaravelアプリをデプロイする時に注意すべきポイント

AWS
AWS EC2にLaravelアプリをデプロイするのは結構大変だった件

Laravel フレームワークで作った LAMP スタックなアプリケーションを AWS の EC2 にデプロイしました。

ファイルをアップロードしてDBを設定すれば動くでしょと思っていましたが、結構大変な作業になってしまいました。

デプロイ方法について

丸ごとデプロイしています

htdocsディレクトリにプロジェクトフォルダをに丸ごと配置する方法をとっています。

vendorも

今回はvendorディレクトリも丸ごとプロジェクトディレクトリ配下にコピーしました。

本番環境ではどちらもhtdocs配下から外しましょう。

.htaccess を作成する

/opt/bitnami/apache2/htdocs/{プロジェクト}/.htaccess

を作成します。

▼中身

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</IfModule>

storage ディレクトリに書き込めるようにする

/opt/bitnami/apache2/htdocs/timecard/storage

というディレクトリ以下にはログ出力先の logs ディレクトリなど、Apache が書き込む場所があります。

storage ディレクトリの所有者、所有グループはともに bitnami だと思います。Bitnami では Apache は daemon ユーザー/グループで動作しますので、storage ディレクトリに書き込む権限がありません。そこで所有者グループを bitnami から daemon に変更して書き込めるようにします。

sudo chgrp -R daemon /opt/bitnami/apache2/htdocs/timecard/storage

【超重要】エラー画面のサーバー情報を伏せ字にする

これをやらないと、エラー画面に DBのパスワード など様々なサーバー情報が表示されてしまいます。ヤバすぎ。

▼修正ファイル

/opt/bitnami/apache2/htdocs/{プロジェクト}/config/app.php

▼最後あたりに debug_blacklist を追記します

return [

    ・・・

    'debug_blacklist' => [
        '_COOKIE' => array_keys($_COOKIE),
        '_SERVER' => array_keys($_SERVER),
        '_ENV' => array_keys($_ENV),        
    ],
];

▼これでエラーになっても大丈夫
エラー画面

開発中は便利ですが、こんな重要な情報を設定一つで隠せないのはどうなの?とは思います。

.ENV ファイルの修正

環境設定ファイルである .ENV は以下のように修正しました。

APP_ENV=production
APP_DEBUG=false
APP_URL={プロジェクトのURL}

DB_HOST=localhost
DB_PASSWORD={Bitnamiのアプリケーションパスワード}

MAIL_DRIVER=smtp
MAIL_HOST=smtp.office365.com
MAIL_PORT=587
MAIL_USERNAME={Office365の任意のアカウントのID}
MAIL_PASSWORD={Office365の任意のアカウントのパスワード}
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS={Office365の任意のアカウントのID}
MAIL_FROM_NAME="株式会社アーザス"

メール部分はOffice365のSMTPサーバを使用した場合の設定です。

今回は composer install していないので、APP_KEY は開発環境で生成された値のままです。

気になる方は

php artisan key:generate

で APP_KEY を生成しましょう。

SSL対応

ELB(+ACM) を利用してサイトのSSL化をしています。そんな時は

/opt/bitnami/apache2/htdocs/{プロジェクト}/app/Http/Middleware/TrustProxies.php

の一部を修正すれば、route() や asset() で出力されるパスがセキュアになります。

▼これだけ

protected $proxies = '**';

$url->forceScheme(‘https’); を使ったり、route() を url() にしたり、asset() のパラメータを変更して何とかセキュアにしようとしていましたが、こんな簡単なことでした。ずいぶん回り道をしました。

MySQL

MySQLのスキーマを設定したり、初期データの登録をします。

phpMyAdmin を使っても良いですし、せっかくLaravel を使っているので

php artisan migration

してもOKです。

もし動かなかったら

画面さえ表示されず5xx系エラー

Laravel フレームワーク自体が正常に動いていない可能性があるので、apacheのエラーログを見ましょう。

/opt/bitnami/apache2/logs/error_log

画面は表示されるが色々とおかしい

アプリケーションに問題があるので、Laravel のログを見ましょう。

/opt/bitnami/apache2/logs/error_log/laravel-{yyyy-mm-dd}.log

最後に

最初はPHPアプリケーションのデプロイですのでそこまで深く考えていませんでした。でも Laravel フレームワークと SSL と EC2(+ELB) が絡むと結構面倒ですね。