AWS CodeDeploy 파일 존재 배포 실패 에러 발생시
Introduction
The deployment failed because a specified file already exists at this location
AWS CodeDeploy 로 배포 시 codedeploy-agent
서버에 동일한 파일이 존재할 경우 위와 같은 에러가 발생합니다.
라라벨 프로젝트를 자동 배포를 하기위해 TravisCI 를 이용해 CodeDeploy 로 배포를 진행 하려고 했는데 위와 같은 충돌에 해결법을 찾았습니다.
참고로 CodeDeploy는 파일 덮어쓰기(overwrite
)가 불가능 하다는것을 아래 래퍼런스 링크에서 확인 가능합니다. (AWS CodeDeploy GUI 수동 배포시 덮어쓰기 옵션 선택이 가능합니다.)
Solution
배포 시 release 디렉터리에 배포 후 appspec hook 을 통해 스크립트를 실행 시킵니다.
출처: AWS CodeDeploy appspec lifecycle
afterInstall.bash
를 실행 하게 되면 모든 파일을 제거하므로 반영에서 제외할 파일들은 따로 release-files
라는 디렉터리를 생성하여 넣어두고 copy
하는 형식을 추가했습니다.
# appspec.yml
version: 0.0
os: linux
files:
- source: ./
destination: /var/www/release/
permissions:
- object: /var/www/laravel-central-api/
owner: www-data
group: www-data
hooks:
BeforeInstall:
- location: scripts/beforeInstall.bash
AfterInstall:
- location: scripts/afterInstall.bash
# beforeInstall.bash
#!/usr/bin/env bash
if [ -d /var/www/release ]; then
sudo rm -rf /var/www/release
fi
sudo mkdir -vp /var/www/release
# afterInstall.bash
#!/usr/bin/env bash
sudo rsync --delete-before --verbose --archive /var/www/release/ /var/www/laravel-central-api/ > /var/log/deploy.log
cd /var/www/laravel-central-api
sudo composer install
sudo cp /var/www/release-files/.env /var/www/laravel-central-api
sudo cp /var/www/release-files/Controller.php /var/www/laravel-central-api/app/Http/Controllers
sudo php artisan key:generate
sudo php artisan config:cache
sudo chmod -R 775 storage bootstrap/cache storage/framework storage/logs
sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
sudo pkill -9 -ef bot.php
nohup php bot.php > /dev/null 2> /dev/null < /dev/null &
if [ -d /var/www/release ]; then
sudo rm -rf /var/www/release
fi