
AWS CodeDeploy로 배포하던 중 아래 에러가 발생했다.
The deployment failed because a specified file already exists at this location
배포 설정 문제인가 싶어서 확인해봤는데, 원인은 생각보다 단순했다.
배포하려는 경로에 같은 파일이 이미 존재하고 있었다.
원인
CodeDeploy는 appspec.yml에 지정한 파일을 서버의 배포 경로로 복사한다.
그런데 해당 경로에 이미 같은 파일이 있고, 그 파일이 CodeDeploy에서 관리하던 파일이 아니라면 충돌이 발생할 수 있다.
내 경우에는 이전에 직접 git clone 해둔 디렉터리가 그대로 남아 있었다.
배포 경로는 아래와 같았다.
/home/ubuntu/im-sprint-practice-deploy/
이 경로에 기존 파일들이 남아 있는 상태에서 CodeDeploy가 다시 같은 파일을 복사하려다 보니 배포가 실패했다.
해결
서버에 접속해서 기존 디렉터리를 삭제했다.
rm -rf /home/ubuntu/im-sprint-practice-deploy/
그다음 CodeDeploy를 다시 실행했고 정상적으로 배포됐다.
결국 기존 파일과 새로 배포하려는 파일이 충돌한 것이 원인이었다.
매번 직접 삭제하기는 번거롭다
한 번은 직접 삭제해서 해결할 수 있지만, 배포할 때마다 서버에 접속해서 디렉터리를 지우는 건 번거롭다.
그래서 이후에는 CodeDeploy의 BeforeInstall 단계에서 기존 배포 디렉터리를 정리하도록 처리했다.
appspec.yml에 아래처럼 추가했다.
hooks:
BeforeInstall:
- location: scripts/beforeInstall.bash
timeout: 60
runas: ubuntu
그리고 scripts/beforeInstall.bash 파일을 만든다.
#!/bin/bash
DEPLOY_DIR="/home/ubuntu/im-sprint-practice-deploy"
if [ -d "$DEPLOY_DIR" ]; then
rm -rf "$DEPLOY_DIR"
fi
mkdir -p "$DEPLOY_DIR"
이렇게 하면 배포 전에 기존 디렉터리를 먼저 삭제하고 새로 생성하게 된다.
예전 배포 파일이 남아 있어서 같은 에러가 반복되는 경우에는 이런 식으로 정리할 수 있다.
rm -rf 사용 시 주의할 점
배포 디렉터리를 통째로 지우는 방식은 간단하지만 운영 서버에서는 주의해야 한다.
예를 들어 배포 경로 안에 아래처럼 유지해야 하는 파일이 있다면 같이 삭제될 수 있다.
.env
uploads/
storage/
logs/
특히 업로드 파일이나 로그처럼 배포와 관계없이 계속 유지되어야 하는 데이터가 있다면 애플리케이션 배포 경로와 분리해두는 게 좋다.
내 경우에는 배포 디렉터리를 삭제해도 문제가 없는 구조여서 이 방식으로 해결했다.
file_exists_behavior로 처리하는 방법
CodeDeploy에서는 기존 파일이 있을 때 어떻게 처리할지도 지정할 수 있다.
기존 파일을 새 파일로 덮어쓰고 싶다면 appspec.yml에 다음과 같이 설정할 수 있다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/im-sprint-practice-deploy
file_exists_behavior: OVERWRITE
file_exists_behavior는 다음 세 가지 값을 사용할 수 있다.
- DISALLOW: 기존 파일이 있으면 배포 실패
- OVERWRITE: 기존 파일을 새 배포 파일로 덮어쓰기
- RETAIN: 기존 파일을 그대로 유지
별도로 지정하지 않으면 기본값은 DISALLOW다.
따라서 단순히 기존 파일을 새 파일로 교체하는 것이 목적이라면
file_exists_behavior: OVERWRITE
를 사용하는 방법도 있다.
다만 이전 배포에서 생성된 파일까지 전부 정리해야 한다면 BeforeInstall에서 직접 배포 디렉터리를 정리하는 방식이 더 편할 수 있다.
정리
아래 에러가 발생한다면,
The deployment failed because a specified file already exists at this location
우선 배포 대상 경로에 기존 파일이 남아 있는지 확인해보면 된다.
내 경우에는 예전에 git clone 해둔 디렉터리가 원인이었고,
rm -rf /home/ubuntu/im-sprint-practice-deploy/
로 기존 디렉터리를 삭제한 뒤 다시 배포해서 해결했다.
이후에는 BeforeInstall에서 기존 배포 디렉터리를 정리하도록 처리했다.
기존 파일을 단순히 덮어쓰는 구조라면 file_exists_behavior: OVERWRITE를 사용하는 방법도 있다.
참고
- AWS CodeDeploy 공식 문서 - Deployment troubleshooting
- AWS CodeDeploy 공식 문서 - AppSpec files
- AWS CodeDeploy 공식 문서 - Rollback and redeploy
최초작성: 2021년 8월 17일
'Troubleshooting' 카테고리의 다른 글
| npm install 설치 npm ERR! code ERESOLVE 해결 (0) | 2026.09.29 |
|---|---|
| [Node.js/Express] ERR_HTTP_HEADERS_SENT 에러 원인과 해결 방법 (0) | 2026.09.29 |