AWS Codedeployを使用してLaravelのアプリをリリースします。
appspec.yml
codebuildでdeploy管理のためのファイルです。
Laravelで必要なこと
- composer install
- php artisan migrate
パッケージの更新、データベースのカラム更新もdeploy時に必要なためどこかに書きたいです。
Laravelの設定例
version: 0.0
os: linux
files:
- source: /
destination: /var/www/app
hooks:
BeforeInstall:
- location: scripts/stopApp.sh
runas: root
AfterInstall:
- location: scripts/preparation.sh
runas: root
ApplicationStart:
- location: scripts/startApp.sh
runas: root
permissions:
- object: /var/www/app/scripts
pattern: "**"
owner: ec2-user
group: nginx
mode: 774
type:
- file
#!/bin/bash
find /var/www/app -type f -exec chmod 664 {} \;
find /var/www/app -type d -exec chmod 774 {} \;
chown -R ec2-user:nginx /var/www/app
chmod -R 775 /var/www/app/storage
chmod -R 775 /var/www/app/bootstrap/cache
# db migrate
cd /var/www/app
php artisan migrate
# composer
# cd /var/www/app
# composer install
stopApp.sh, startApp.shにはなにも書いてないです。
migrationも書いてしまっていますが、DBとアプリが同じサーバーにあり、まだ複数台での冗長構成にしていないためこの書き方で機能しています。
サーバーが複数台の構成になった場合はmigrationは別の方法にしたほうがいいです。
困ったこと
ファイルのpermissionを手動で変更してもcodedeployを行うとパーミッションが変更されるためstorageの設定をpreparation.shに記述しました。
appspec.ymlにてパーミッションを変更しようとすると、制限が多く同じフォルダや指定したフォルダ配下の変更ができないです。
コマンドをrootで実行するを使うしかなかったですね。
composer installエラー
ec2のインスタンスをmicroで行っているため、composer installを実行するとメモリ不足でエラーが発生します。
解消するためにインスタンスをあげて解決する必要があります。
最初のinstallは大量にメモリを消費しますが、それ以降は追加パッケージがすくなければメモリエラーも発生せずinstallできました。
まとめ
CI/CDがかなり浸透した世の中でサンプルも多いと思っていましたが、codedeployってあまりないですね。実際にはフレームワークを使う場合が多くもっとサンプルがあると思ってました。
次はcodebuildを使用して、codepipelineもあわせた記事を書きます。