[Cloud | Deepdive| 트러블슈팅] 1차 프로젝트에서 겪은 험한 것 Deepdive
지금부터 1차프로젝트를 하면서 겪은 험한 것들에 대해 썰을 풀어드립니다.
사실 별 거 없음. 다들 처음 하면 겪는 것들이긴 한데
그래도 꼬
#1 VPC + ALB + EC2 연동 트러블 슈팅
# 플로우 희망편
(1) 클라이언트 브라우저 / 외부 사용자
|
| HTTP 요청 (port 80)
▼
(2) ALB (인터넷 공개, 퍼블릭 서브넷에 위치)
├─ 보안 그룹: 80, 443 열림 (0.0.0.0/0)
└─ 리스너: 80 → 타겟 그룹 포트 8080 으로 포워딩
|
▼
(3) 타겟 그룹
├─ 대상: EC2 인스턴스 (IP or 인스턴스 ID 기준)
└─ 포트: 8080
|
▼
(4) EC2 인스턴스
├─ 위치: 퍼블릭 or 프라이빗 서브넷
├─ 보안 그룹: ALB 보안 그룹에서 8080 포트 허용
└─ Spring Boot 서버가 8080에서 실행 중
|
▼
(5) Spring Boot 서버
└─ `/health`, `/actuator/health` 등 헬스체크 엔드포인트 제공
1차 프로젝트를 진행하면서 네트워크 구조 희망편은 위와 같았는데요
분명 희망을 현실로 구현했는데 통신이 계속 안되고 타임아웃이 되거나 연결이 안되는 거 있죠.
심지어 ALB 헬스 체크가 계속 비정상이 뜨는 거에요.
아 이건 문제가 있다. 내가 ALB 대상 그룹을 잘못 설정했던가. 내 잘못이다.
생각을 하고
이 무슨 일인가. 하여 하나하나 찾아보기 시작했습니다.
일단 ALB 생성 정보를 확인 해봤습니다.
- VPC : 목표 VPC와 일치.
- 리스너 규칙 : 80 / 443 접근 가능
- 대상 그룹 : public subnet에 있는 인스턴스 (올바름)
암만 봐도 잘 해써.. 난 실수한 게 없쒀.... 난... 난...ㅠㅠㅠㅠㅠ
혹시 상태검사 경로를 잘못 적었나..? 했는데
잘적었듬. 너무 잘 적었음.
분명 오늘 EC2 인스턴스 보안그룹도 깔끔하게 최소 권한 원칙 맞춰서 ALB에서 들어오는 인바운드만 허용되게 해 놨는데
왜 왜 왜 왜 왜 왜 왜 왜 안돌아가지..?
왜 인스턴스가 그러지...?
나 건든 적 없는데?
라는 굴레에 갇혀있다가
또 다른 자아의 내가 EC2 인스턴스 보안그룹을 건들였는가 하여 확인을 해 보니...
다른 팀원분께서 말 없이 보안그룹 규칙을 변경하셨었었섰섰었섰습니다....
그럴 수 있어~ 우린 모두 초보니까~ 해결했으니 되었어~
여럽훈?
타임아웃이 뜬다? 504가 뜬다?
일단 보안그룹을 확인하십쇼.
다음날에 디코에 공지 한번 깔꼼하게 때리고 나니
이후에는 보안그룹 이슈 생긴 적이 없습니다.
너무 힘든 것.
#2 CloudWatch - Ec2 모니터링 로그 추출 불가
CloudFront (프론트) - Route53 - S3
↳ ALB - EC2 (Spring Boot) - CloudWatch Agent
↳ 로그 수집 (out.log)
↳ 로그 전송 to CloudWatch 로그 그룹(route33-logs)
위와 같은 환경에서 스프링 서버 어플리케이션이 돌아가고있는 EC2 인스턴스에서 로그를 수집해서 cloudwatch로 보내려고 하는데
도통 수집이 안된다는 연락을 받아 같이 확인하러 갔단 말이죠.
설정 확인 최종 체크리스트
- [x] EC2 퍼블릭 IP + IGW 연결
- [x] EC2 Outbound 443 허용
- [x] 로그 그룹 이름 정확 (route33-logs)
- [x] 로그 스트림 이름 정확 (route33-ec2 or {instance_id})
- [x] 로그 파일 존재 + 읽기 권한 + 디렉터리 x권한
- [x] CloudWatch Agent 실행 중 (systemctl status)
- [x] curl <https://logs.ap-northeast-2.amazonaws.com> 성공
위와 같은 체크리스트를 기준으로 왜 로그 수집이 안되는지 파악을 하고자 했습니다.
결론만 말하자면
CloudWatch Agent가 로그를 업로드하려면:
로그 파일은 읽기(r) 가능해야 하고 해당 파일이 있는 디렉터리는 x 권한으로 들어갈 수 있어야 함
권한문제였습니다.
CloudWatch Agent는 아래와 같은 단계로 로그를 수집한다고 하는데요
- file_path로 설정한 경로(
"/home/route33/apps/out.log")에 접근 - 해당 디렉토리를 탐색해서 log 파일을 찾아 열기
- 이후 로그 파일을 읽고 변경 사항을 감지
이때 디렉터리 접근 권한이 없으면:
- 에이전트가 파일이 존재하는지조차 확인하지 못함
- 에러 로그는 뜨지 않고, 로그 업로드도 안 됨
이런 상황이 벌어지게 됩니다.
그래서 해결을 어떻게 하느냐 권한을 주면 되는겁니다
sudo chmod +x /home/route33
sudo chmod +x /home/route33/apps
Agent가 파일을 찾을 수 있게 디렉토리에 x권한을 부여해서 접근 가능 상태로 만들어주며
해결합니당
끗.