AWS
AWS CodePipeline, CodeCommit. CodeBuild, CodeDeployを利用してLaravel, VueのモノリスアプリケーションをEC2にデプロイする。
今回はCodeDeployにフォーカスして改善する。
https://developer.so-tech.co.jp/entry/2022/11/04/112144
こちらの記事で解決。
EC2のターゲットグループのヘルスチェックの設定が原因でした。
Timeout, Interval を最小値に変更し、ALB
の Connection draining
の値を300秒から30秒に変更することでBlockTrafficが5分以上かかる問題は30秒程度に収めることができました。
CodeDeployのappspec.ymlの設定で、afterinstallに対し以下のようなシェルを実行するように指示していた。
after_install.sh
#!/bin/bash deploy_path="/opt/xxxxxx/laravel" # currentディレクトリを作成 # cp -R /tmp/laravel/* /opt/cheerpay/laravel/current/ # .envとstorageをシンボリックリンクで再接続 ln -nfs ${deploy_path}/shared/.env ${deploy_path}/current/.env ln -nfs ${deploy_path}/shared/storage ${deploy_path}/current/storage # アプリケーションのキャッシュをクリア cd ${deploy_path}/current || exit 99 php artisan cache:clear php artisan config:clear php artisan route:clear # Composerのオートローダを最適化 composer dump-autoload --optimize # データベースマイグレーション php artisan migrate --force # NginxとPHP-FPMの再起動(必要に応じて) systemctl restart php-fpm.service systemctl restart nginx.service
appspec.yml
version: 0.0 os: linux files: - source: / destination: /tmp/laravel exclude: - storage/ permissions: - object: /tmp/laravel pattern: '**' hooks: AfterInstall: - location: bin/after_install.sh
CodeBuildでnode_modules
, vendor
, Vueのビルド成果物を生成していて、installでコピーする際とafter_installで実行するシェルの中でcpコマンドでコピーしていたのが原因と推定。
vendor
もnode_modules
も容量が大きめのためcpコマンドにも時間がかかると考えた。
appspec.ymlで上書きを行うように更新して実行するとinstallでエラーが発生。
The deployment failed because a specified file already exists at this location: /opt/xxxxx/laravel/current/node_modules/date-fns/_lib/getUTCISOWeekYear/index.js
すでにファイルが存在するためにエラーが発生している。
before_installでvendor
もnode_modules
を削除するシェルを使用するように更新する。