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

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

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

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

デプロイ方法について

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

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

サーバー側でcomposerは使っていません

開発環境のvendorディレクトリを丸ごとプロジェクトディレクトリ配下にコピーしました。

.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対応

ALB + ACM でサイトのSSL化をしています。そんな時はこのファイル

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

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

▼これだけ

//protected $proxies;
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、ALB が絡むと結構面倒ですね。