NestJS + Amazon ElastiCache + Redis

Woody·2023년 1월 16일
0

Caching

목록 보기
2/2

<기술도입 배경>

  • in-memory 캐싱기술에 대한 관심과 실제 운영서비스 반영을 통해 성능개선 기대
  • AWS ECS 서버에 클러스터 3개로 운영, Local setting 만으로는 Global Cache 값 대한 공유가 이루어지지 않음
  • 3개의 서버에서 한곳을 바라볼 Redis 서버 구축 필요
  • 검색결과 Amazon Elasticache 에서 Redis, Memcached 환경으로 캐싱서버 구축이 가능하다고 하여 시작

ex) 회원가입 문자인증의 확인을 위해 인증번호를 캐싱처리 하려 했을 때 3개의 서비스가 서로 각자의 local memory에 저장 되기 때문에 캐시를 공유하지 못함 👉🏻 인증에러...(서비스가 3개이니.. 3번 확인요청 시 1번은 인증확인이 되는 꼴..)

📝 cache-manager 셋팅

기존 코드는 local 메모리에 저장되도록 하여 외부호스트 설정을 하지 않은 상태로 사용중이었다.

시작은 그리 쉽지 않았다.
내친구 구글에게 물어보았지만 최신정보가 그리 많지 않았고
사용되는 라이브러리들의 업데이트로 인해 레퍼런스가 많이 바뀐상태였기에 구글링한 결과의 코드로는 적용할 수 없는 상황이었다.
거두절미하고 내가 추가한 패키지는 아래와 같다.

  • redis
  • @types/redis
  • cache-manager-redis-store
  • @types/cache-manager-redis-store

다른 이래저래 패키지를 설치해야한다고 여러곳에서 나와있었지만
결론은 저 두가지 패키지만 사용했다.

import { CacheModule, Module } from '@nestjs/common';
import { CacheManagerService } from 'src/infra/cache-manager/cache-manager.service';
import * as redisStore from 'cache-manager-redis-store';

const CACHE_URL = (stage = process.env.STAGE) => {
  switch (stage) {
    case 'local':
      return 'http://127.0.0.1:6379';
    case 'dev':
    case 'prod':
      return process.env.ELASTICACHE_ENDPOINT;
  }
};

@Module({
  imports: [
    CacheModule.register({
      store: redisStore,
      url: CACHE_URL(),
      ttl: 60,
    }),
  ],
  providers: [CacheManagerService],
  exports: [CacheManagerService],
})
export class CacheManagerModule {}

CacheModule.registerAsync()를 사용하여 클러스터 모드에 따른 여러 노드에 연결하여 사용하는 방식으로 사용할수도 있다.

우리 서비스는 아직 그정도로 캐싱처리를 할만한 데이터들이 없어 static하게 설정하였다. 차후 클러스터 모드로 추가 리뷰를 작성해보려한다.

📝 Amazon ElastiCache

아직 AWS에 대한 이해도가 떨어지는 상태에서 접근하다보니 한숨을 쉬게되는 경우가 많았다.
서브넷을 새로 생성하여 연결하는 방식으로 생각하다보니 기존 서비스와 연결이 되지않았고
결국 AWS 공식문서를 정독하여 가동원리와 셋팅방법을 알 수 있었다.

1. ElastiCache Redis 클러스터 생성

2. 클러스터 모드 구성

아래는 위에서 언급한 클러스터 모드에 대한 설정이다. 본인의 서비스 상황에 맞에 설정하면 되고 여러 메모리 노드를 분리하여 데이터를 저장함으로써 안정성을 더할 수 있다.

Redis Cluster 란 ? https://velog.io/@tngusqkr1/Redis-cluster-설정-1

3. 클러스터 설정

아래 부분은 각자의 서비스에 맞게 노드 크기를 설정하면 되겠다.

4. VPC 서브넷 연결

여기서부터 중요한 설정 부분이다.
여기서의 서브넷 그룹은 ElastiCache가 생성될 EC2 서비스에 대한 서브넷이다.
기본 2개이상의 서브넷이 생성되어 있어야 한다.
VPC가 없다면 생성하고 기존서비스에 연결시 서브넷 그룹란에서 선택한다.

5. 보안 그룹 선택

보안그룹은 사용할 보안그룹을 선택 혹은 생성하고

인바운드 규칙에 아래와 같이 규칙을 추가해준다.

6. 생성 후 NestJS 설정

생성을 완료하고 어느정도 시간이 지나면 아래와 같이 클러스터 생성이 완료되면서
기본정보에 기본엔드포인트가 생성된다.

이 기본 엔드포인트를 아래와 같이 넣어준다.

CacheModule.register({
  store: redisStore,
  url: 'http://기본엔드포인트:6379'
}),

ssh로 ec2서버에 접근하여 redis-cli 를 설치하고 API 호출 후
아래와 같이 keys * 커멘드로 확인하면 캐싱처리가 된 것을 확인할 수 있다.

일주일동안 AWS 공부도 다시 하게되고 ElastiCache라는 새로운 서비스도 도입하게 되는 좋은 계기가 되었다.
다음에 기회가 되어 더 좋은 서비스를 접할 수 있게 되었을때 그곳의 캐싱처리 기술과 나의 코드를 비교하며 더 좋은 개발자가 될 수 있는 밑거름이 되었으면 한다.

끝.

profile
1일 1한숨 Back-End 개발자

0개의 댓글