Projects/[Spring] Ticketing App Project

[AWS] (1부) EC2 서버 체크하기, ElastiCache 생성 및 연결하기

montmer27 2026. 3. 18. 22:22

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);
  }

 

레디슨이고 나발이고 나는 죽겟슨

끄아앙