1. EC2 서버 기동 확인
목표: EC2에 접속한 상태에서 8080 포트 서버가 떴는지 확인
시도한 방법
- curl http://localhost:8080 -> Connection refused 에러 발생
- ps aux | grep java -> Java 프로세스 없음 확인(grep 자신만 출력)
curl http://localhost:8080/actuator/health # Spring Boot Actuator로 헬스체크하기
curl -o /dev/null -s -w "%{http_code}\n" http://localhost:8080 # 상태코드만
ss -tlnp | grep 8080 # 포트 리스닝 확인
2. Docker 컨테이너 문제 해결
2-1. 권한 문제
- docker ps -a 실행 시 permission denied 에러
- 원인: ssm-user가 docker 그룹에 미포함
- 해결: sudo docker ps -a로 실행
2-2. exec format error (아키텍처 불일치)
- 컨테이너 상태: Restarting (255) 반복
- sudo docker logs ci-demo(내 컨테이너명) 확인 결과:
exec /usr/bin/java: exec format error
- 원인: 빌드된 이미지 아키텍처(arm64)와 EC2 아키텍처(amd64)가 불일치
- 해결: Github Actions 워크플로우에 플랫폼 명시

2-3. 재배포 확인
- 이미지 태그 변경 확인: (`5076b67f` → `f1439c89`)
- Exit code `255` → `1`로 변경 → 아키텍처 문제 해결, Java 실행은 되나 앱 기동 실패
sudo docker insepct [컨테이너명] --format='{{.Config.Image}}' //컨테이너의 이미지 태그 확인 방법
3. AWS Parameter Store 연동 문제
3-1. 에러 발생
로그:
Config data resource '[ParameterStoreConfigDataResource] via location
'aws-parameterstore:/ticketing-app/prod/' does not exist
3-2. 원인 진단
아래 코드 실행 결과,
aws ssm get-parameters-by-path \
--path /ticketing-app/prod/ \
--region ap-northeast-2
아래 결과 확인:
AccessDeniedException: not authorized to perform: ssm:GetParametersByPath
파악한 원인: `ticketing-app-ec2-role`에 SSM 권한 없음
3-3. 해결
- IAM 콘솔 → `ticketing-app-ec2-role` → `AmazonSSMReadOnlyAccess` 정책 추가
- 이후 `aws ssm get-parameters-by-path` 정상 응답 확인
- 컨테이너 재시작 후 포트 바인딩 정상 확인 (`0.0.0.0:8080->8080/tcp`)
4. ElastiCache (Redis) 구성 및 생성
4-1. Redis 연결 실패 에러
ec2에서 다음 명령어를 통해 로그를 확인
sudo docker logs [컨테이너명] --tail 50 // 마지막 50줄만 확인
sudo docker logs [컨테이너명] -f // 도커 컨테이너 실행 중 실시간으로 로그 확인
결과
Unable to connect to redis/<unresolved>:6379 java.net.UnknownHostException: redis
원인: application-prod.yml의 Redis host가 redis(Docker Compose 서비스명)로 설정되어 있어 EC2 환경에서 DNS 해석 불가
4-2. ElastiCache 생성 과정 및 설정값
| 단계 | 선택 항목 | 이유 |
| 엔진 | Redis OSS | spring-data-redis 호환성 |
| 배포 옵션 | 노드 기반 캐시 | 프리티어 사용 가능, VPC 직접 설정 |
| 생성 방법 | 클러스터 캐시 | 모든 옵션 직접 설정 가능 |
| 클러스터 모드 | 비활성화 | 단순 구성, 설정 복잡도 낮음 |
| 노드 유형 | cache.t3.micro | 프리티어, 비용 최소화 |
| 복제본 개수 | 0 | 개발 단계, 비용 절감 |
| TLS | 비활성화 | 활성화 시 rediss:// 필요로 설정 복잡해짐 |
| 자동 백업 | 비활성화 | 복제본 0개라 불필요 |
4-3. 서브넷 에러 해결
- 생성 시 Customer account VPC should have a minimum of 3 default subnets 에러
- 해결: ElastiCache → Subnet groups에서 ticketing-redis-subnet 직접 생성 후 지정
4-4. 엔드포인트 Parameter Store 등록
- ElastiCache 생성 완료 후 기본 엔드포인트 확인
- Parameter Store에 등록
5. Redisson 연결 문제 해결
5-1. 에러 발생
로그
java.net.MalformedURLException: Invalid host:
[ticketing-redis.xjgiaw.ng.0001.apn2.cache.amazonaws.com:6379]
5-2. 원인 분석
- redisson-spring-boot-starter 자동 설정이 spring.data.redis.host와 port를 읽어 redis://[host:port] 형식(IPv6 대괄호)으로 잘못 조합
- RedisConfig.java 자체 코드에는 문제 없음
5-3. 해결
- RedisConfig.java에 RedissonClient 빈을 명시적으로 등록하여 자동 설정 대체
RedisConfig.java에 아래 코드 추가
@Value("${spring.data.redis.host}")
private String redisHost;
@Value("${spring.data.redis.port}")
private int redisPort;
@Bean(destroyMethod = "shutdown")
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://" + redisHost + ":" + redisPort);
return Redisson.create(config);
}
레디슨이고 나발이고 나는 죽겟슨

'Projects > [Spring] Ticketing App Project' 카테고리의 다른 글
| [프로젝트 회고] Ticketing-Project (0) | 2026.03.25 |
|---|---|
| [AWS] (2부) EC2 배포 성공기 (0) | 2026.03.19 |
| [Test] 분명 사용되지 않아서 지웠는데, 왜 테스트가 실패할까? (0) | 2026.03.16 |
| [Test] Mock과 MockBean은 뭐가 다른 걸까? (0) | 2026.03.16 |
| [Github] Runner 서버에 Docker를 설치해야 할까? (0) | 2026.03.16 |