Cloud Infra Architecture (AWS)/AWS Build

[AWS] ElastiCache for Redis 생성 (로그인 Session 보관용) - Tomcat

seongduck 2024. 6. 10. 10:26

이중화된 서버에서 Session 관리는 필수이다.

로그인 정보 세션관리를 하지 않으면 ELB에서 부하분산시, 로그인이 풀리게 된다.

당연한 결과로, 서버간 로그인정보를 공유하지 않기 때문이다.

따라서 이중화된 서버에서 로그인 정보를 담기위해 Session 관리를 진행해보자.

로그인 세션을 유지하기 위한 세션클러스터링하는 방법은 3가지가 있다.


 해결방법

  1. AWS ElastiCache for Redis를 이용하는 방법
  2. ELB에서 Sticky Session 활성화하는 방법
  3. WAS Session Clustering 진행하는 방법

1) AWS ElastiCache for Redis를 이용하는 방법

 

Redis에서 사용할 SG 생성

1) "보안그룹" 생성
2) 6379 Port로 WAS 서버 오픈 #Redis는 6379포트로 통신

 

Redis 용 ElastiCache 생성

1) "ElastiCache" 검색
2) "지금 시작" - "Redis"
3) "자체 캐시 설계" - "클러스터 캐시" - "활성화 됨"

4) 클러스터 모드
4-1) 활성화됨

5) 위치
5-1) AWS 클라우드 - 다중 AZ 사용

6) 클러스터 설정
6-1) 파라미터 그룹 선택 #디폴트
6-2) 노드 유형 #가장 저렴한 cache.t4g.micro
6-3) 샤드 수 1 #로그인 정보용이므로 크게 나눌필요 없음
6-4) 샤드당 복제본 수 1 #다중가용영역 #a, #c를 사용할 것이므로 1로 선택

7) 서브넷 설정

8) 보안

#여기서 전송 중 암호화 유무에 따라 추후 접속할때 방식이 달라짐
8-1) 전송 중 암호화 비활성화 #전송 중 암호화를 하지 않을 경우 
8-2) 전송 중 암호화 선택 #암호화 선택했을 경우 TLS연결만 지원됨
8-2-1) 액세스 제어 "Redis 인증 기본 사용자 액세스"
8-2-2) 인증 토큰 적고 비밀번호 기억하기

9) 생성

 

접속을 위해서, EC2에서 Redis 설치파일 받기

1) 전송 중 암호화를 비활성화 한 경우

wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz

cd redis-stable #설치 경로 이동
make distclean
make

src/redis-cli -c -h "생성한 Redis 엔드포인트" -p 6379 #접속 테스트

 

2) 전송 중 암호화를 활성화한 경우 

redis-cli가 TSL 통신도 가능하게 만들어야 한다.

cd redis 설치 경로
make distclean
make redis-cli BUILD_TLS=yes

redis-cli -h "생성한 Redis 엔드포인트" -c --tls -a "인증토큰비밀번호" -p 6379 #접속테스트

 

Tomcat 서버 설정 바꿔주기

1) vim /usr/share/tomcat/conf/redis-data-cache.properties #properties 변경
"""
#- redis hosts ex: 127.0.0.1:6379, 127.0.0.2:6379, 127.0.0.2:6380, ....
redis.hosts= <ElastiCache-Endpoint.cache.amazonaws.com> :6379
"""

2) vim /usr/share/tomcat/conf/web.xml #web.xml 변경
"""
 <session-config>
    <session-timeout>60</session-timeout>
</session-config>
"""

3) vim /usr/share/tomcat/conf/context.xml #congtext.xml 변경
"""
<!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->
    <Valve className="tomcat.request.session.redis.SessionHandlerValve" /> #이부분 새로 넣기
    <Manager className="tomcat.request.session.redis.SessionManager" /> #이부분 새로 넣기

</Context>
"""

추가하기

 

2. ELB에서 Sticky Session 활성화하는 방법

1) WAS랑 연결되어 있는 ELB의 TG 접속
2) "Sticky Session 활성화" 클릭

 

 

3. WAS Session Clustering 진행하는 방법

AWS EC2에서 완벽하지는 않으나, 설정하더라도 어떠한 에러 및 장애가 발생할 지 모름

그리고, 오래된 방법이고 잘 사용하지 않으므로 비추천.

 

3-1) 각각의 Tomcat 서버에서 설정

1) tomcat 경로 이동
2) vi server.xml
3) <!--For clustering, ~~ > 부분 확인

# A가용영역 WAS 서버
<Receiver ClassName="~~~" address="A가용영역 WAS서버 Private IP" port="4010"
<Member ClassName="org.~~~" host="C가용영역 WAS서버 Private IP" port="4010"

# C가용영역 WAS 서버
<Receiver ClassName="~~~" address="C가용영역 WAS서버 Private IP" port="4010"
<Member ClassName="org.~~~" host="A가용영역 WAS서버 Private IP" port="4010"

 

3-2) WAS SG 설정

1) WAS SG설정
2) 서로 Private IP : 4010포트로 오픈

 

3-3) 각각의 Web 서버에서 설정

web.xml 파일에 <distributable /> 한줄 추가한다.

cd /톰켓설치부근
cd /app/WebApp/ROOT/WEB-INF/ #필자의 경우
vi web.xml
"""
<web-app>
~~~
~~~
</session-config>
<distributable /> #이거 한줄 추가
</web-app>
"""