AWS CI/CD CodeDeployの実行時間の改善

Posted date at 2023-12-11

AWS

環境の概要

AWS CodePipeline, CodeCommit. CodeBuild, CodeDeployを利用してLaravel, VueのモノリスアプリケーションをEC2にデプロイする。

今回はCodeDeployにフォーカスして改善する。

BlockTrafficが5分以上かかる問題

https://developer.so-tech.co.jp/entry/2022/11/04/112144

こちらの記事で解決。

EC2のターゲットグループのヘルスチェックの設定が原因でした。

Timeout, Interval を最小値に変更し、ALB の Connection drainingの値を300秒から30秒に変更することでBlockTrafficが5分以上かかる問題は30秒程度に収めることができました。

Install, AfterInstallにそれぞれ3分程度かかってしまう問題

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コマンドでコピーしていたのが原因と推定。

vendornode_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でvendornode_modulesを削除するシェルを使用するように更新する。

←ホームに戻る