AWS CodeDeployを使う ( PHP + Laravel )
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もあわせた記事を書きます。