どうも、たかふみです。
現在携わっているシステムの開発が終わり、「さぁそろそろステージング環境の準備をしようかなぁ」と思い、テーブルを作成するコマンド php aritisan migrate
を実行しようとしたそのとき。
Operation not permitted
「migrateができない!」
今日の記事は、AWSのEC2を使って用意したステージング環境でmigrateができない問題を解決します!
解決策
自分が所有ユーザーになる&所有グループに書き込み権限を与える
やったこと
1. まずエラーメッセージを読む。
UnexpectedValueException : The stream or file "/var/www/mcfhfs/storage/logs/laravel-2019-11-20.log" could not be opened: failed to open stream: Permission denied
at /var/www/mcfhfs/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:111
107| restore_error_handler();
108| if (!is_resource($this->stream)) {
109| $this->stream = null;
110|
> 111| throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url));
112| }
113| }
114|
115| if ($this->useLocking) {
Exception trace:
1 Monolog\Handler\StreamHandler::write()
/var/www/mcfhfs/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php:120
2 Monolog\Handler\RotatingFileHandler::write()
/var/www/mcfhfs/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php:42
Please use the argument -v to see more details.
エラーメッセージを見てみると「ログファイルへの書き込み権限がありません。」となっていました。どうやらログファイルへの書き込み権限が無いようです。
2. ログファイルの権限を確認&変更
ls -la
で権限を確認すると、rw- - r -- - r --
となっていました。
この場合「所有ユーザ(読/書) - 所有グループ(読) - その他のユーザ(読)」であり、
僕は所有ユーザーではなく、所有グループに属するので読み取り権限しかありません。
「そしたら、所有グループの権限に書き込み権限(w)を追加すれば良いのでは?」
ということでchmod 664 laravel-2019-11-20.log
を実行。
結果、 Operation not permitted
が表示されました。
調べてみると、ファイルの権限はファイル所有者でないと変更できないようです。
(参考:https://marunouchi-tech.i-studio.co.jp/3341)
3. ファイルを作り直す
「そしたら、自分がファイルの所有ユーザーになればいいのでは?」
該当のログファイルを一旦削除して再度作成。
ファイル所有者が自分になっていることを確認した後、再度migrateを実行。
php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
「成功!」
4. webサーバーからも書き込みができるように権限を変更
これで解決だと思い、ブラウザからステージング環境に接続してページを表示しようとしたところ、再び「ログファイルに書き込み権限がありません」との表示がされました。
どうやらwebサーバーからの書き込み権限を与える必要があるようです。
chmod 664 laravel-2019-11-20.log
ls -la
-rw-rw-r--
これで所有ユーザー、所有グループに書き込み権限を付与できたので再度サイトへアクセス。無事に表示されていました!
■まとめ
・権限はファイル所有者でないと変更できない。
・webサーバーからの書き込み権限付与を忘れずに!
・「Operation not permitted」「Permission denied」のときには権限を確認!
今まで権限でエラーが起きたことがなかったので、これを機に知ることができて良かったです。これでPermission deniedが出ても安心ですね。それでは!