SpotEditor 프로젝트 ‐ 백엔드 인프라 아키텍처 구축과 그 과정에서 겪었던 트러블 슈팅 정리 - dnwls16071/Backend_Study_TIL GitHub Wiki
- 구축하고자하는 인프라는 위와 같은 Container 기반의 확장성 있는 인프라로 CodeDeploy & S3를 사용한 무중단 배포를 원했다.
- 실행 메커니즘은 아래와 같다.
1. main, dev 브랜치에 트리거를 걸어두고 개발자가 Git Push를 한다.
2. Github Actions에서 이벤트를 감지해 Docker Image를 생성하고 생성된 이미지를 AWS Elastic Container Registry에 전달한다.
3. CodeDeploy 관련 파일을 S3에 업로드한다.
4. AWS CodeDeploy에게 배포를 진행하라고 명령한다.
5. EC2한테 S3로부터 다운받은 CodeDeploy 관련 파일을 다운 받은 뒤에 배포를 진행하도록 명령한다.
6. EC2가 S3로부터 CodeDeploy 관련 파일을 다운받는다.
7. EC2가 AWS Elastic Container Registry로부터 이미지를 다운 받아 배포를 진행한다.
❗추가로 고려해야 되는 부분들(2025.02.05)
- EC2 최소 사양 고려
- 작성 시점 현재 EC2 컨테이너 상황
* Spring Container 1
* Redis Commander Container 1
* Redis Master Container 1
* Redis Slave Container 2
* MySQL Container 1
ElasticSearch, RabbitMQ, Spring Container 제외 Nginx, Certbot HTTPS 적용 및 리버스 프록시, 로드 밸런싱 제외
❗트러블 슈팅1 - Error saving credentials: error storing credentials - err: exit status 1, out: not implemented
- AWS ECR의 푸시 명령 중 인증 토큰을 검색하고 레지스트리에 대해 Docker 클라이언트를 인증하는 부분이 필요한데 해당 명령어를 AWS CLI로 처리하는 과정에서 발생한 오류였다.
/home/ubuntu/.docker/config.json
에 다음과 같은 인증 파일을 작성해주었다.
{
"credsStore": "ecr-login"
}
Setting environment variables from repository settings
$ export AWS_SECRET_ACCESS_KEY=[secure]
$ export AWS_ACCESS_KEY_ID=[secure]
$ export AWS_DEFAULT_REGION=[secure]
- 위와 같이 작성을 해주고 인증을 거쳤으나 제목과 같은 오류가 발생해서 비슷한 사례의 트러블 슈팅이 있었는지 구글링 하던 도중 다음 이슈를 발견했다.
- error storing credentials - err: exit status 1, out: not implemented
{
"credsStore": ""
}
- 똑같은 방법들이었고 그래서 위와 같이 처리를 해주고 AWS CLI 푸시 명령을 거쳤는데 정상적으로 Login Success 문구가 보이면서 인증이 정상적으로 수행된 것을 볼 수 있었다.
- 그래서 관련 방법을 amazon-ecr-credential-helper 공식 리포지토리 이슈에도 남겨놓았다.
❗트러블 슈팅2 - ubuntu@ip-172-31-39-63:~$ aws ecr get-logiaws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 891612578477.dkr.ecr.ap-northeast-2.amazonaws.com An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::891612578477:assumed-role/CodeDeploy-EC2-Role/i-0fc59931f2ebd42a3 is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action
- 위의 오류
❗트러블 슈팅1 - Error saving credentials: error storing credentials - err: exit status 1, out: not implemented
를 해결하면서 같이 해결되었다. 이 부분도 인증이 제대로 이루어지지 않으면 발생할 수 있다.
❗트러블 슈팅3 - The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.
- CodeDeploy 애플리케이션에서 배포 과정 발생했던 오류다.
- CodeDeploy 배포 관련 로그를 볼 수 있다는 부분을 알게 되었고 아래에서 참고했다.
- CodeDeploy EC2/온프레미스 배포에 관한 로그 데이터 보기
- 직접 오류를 보았는데 git clone한 리포지토리의 네임과 소문자 / 대문자 철자 하나의 오타로 위와 같은 오류가 발생했다는 것을 알게 되었다.
appspec.yaml
파일 오타를 수정하고 다시 배포를 돌리니 정상적으로 해결이 되었다.
❗트러블 슈팅4 - ScriptTimedOut
- CodeDeploy 배포 과정에서 발생했던 오류다.
- 현재 프로젝트에는 Spring Container, Redis Container, Redis Commander Container, MySQL Container가 올라가는데 이렇게 컨테이너가 올라가는 과정에서 타임아웃(기존 60초)이 발생해 오류가 발생한 것으로 보여진다.
- 타임아웃을 180초로 늘려주고 CodeDeploy Agent를 재시작했더니 해당 부분 오류는 정상적으로 해결이 되었다.