개발자

redis 연결 이슈 입니다!! 제발 도와주세요 ㅠㅠ

2024년 04월 17일조회 121

문제는 이렇습니다. prodRedisUrl = redis://:password@ec2프라이빗ip:6379/0로 url을 보냅니다. 그리고 ec2 내 redis bind를 ec2 프라이빗 Ip로 설정하고, 리스닝 하고 있는 상태입니다. 그러면 정상적이라면, 서버가 배포 됐을 때 prodRedisUrl로 redis와의 연결이 성공적으로 연결 됩니다. 근데 어이없는 문제가 발생합니다. 요청하지도 않은 localhost로 redis서버에 연결하려고 하는 것입니다. 그래서 시나리오를 세워서 반대로 테스트를 해봤습니다 !!!! prodRedisUrl = redis://:password@127.0.0.1:6379/0로 하고, 일부러 로컬호스트를 보내 봤습니다. 물론 ec2 내 redis.conf의 bind를 수정 했습니다. bind 127.0.0.1 테스트 해봤더니 127.0.0.1로 접속은 완료 됐지만 이제는 반대로 ec2 프라이빗 Ip로 연결을 요청해서 실패하네요 ㅋㅋㅋㅋㅋ ---- === 도대체 요청하지도 않은 ec2에서 그리고 알지도 못하는 프라이빗 ip로 redis서버에 접속하려는걸까요?????? ----------------------------------------- 즉, 정리하자면 요청하지도 않은 host로 Redis서버에 접속한다 !! 입니다. 로컬에서 테스트 할 때는 아무런 문제 없이 잘 작동하더니만 ec2에 배포하고 연결하려고 하니까 이 말썽입니다... 도저히 이해가 되지도 않고 원인 파악도 힘드네요,, 고수님들의 도움이 정말 필요합니다.. 부탁드립니다 ㅠㅠ

1import { RedisModuleOptions, RedisModuleOptionsFactory } from "@nestjs-modules/ioredis";
2import { Injectable, InternalServerErrorException } from "@nestjs/common";
3import { ConfigService } from "@nestjs/config";
4
5@Injectable()
6export class RedisConfigService implements RedisModuleOptionsFactory {
7  constructor(private configService: ConfigService) {}
8
9  createRedisModuleOptions(): RedisModuleOptions | Promise<RedisModuleOptions> {
10    try {
11      const isDevMode = process.env.MODE === "dev";
12
13      const redisUrlKey = isDevMode ? "DEV_REDIS_URL" : "PROD_REDIS_URL";
14
15      const redisUrl = this.configService.get<string>(redisUrlKey);
16
17      return new Promise((res) => {
18        console.log("연결 시킬 레디스 url", redisUrl);
19        res({
20          type: "single",
21          url: redisUrl,
22        });
23      });
24    } catch (e) {
25      throw new InternalServerErrorException("Redis Connect Failed");
26    }
27  }
28}
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

Jeahong님의 프로필 사진

질문이 좀 이해가 가지않아 답변이 안달리는거 같은데 url을 보낸다라는 표현부터 이해가잘가지않아서 답변을 드리기가 좀 어렵네요.. 하시고자하는게 무엇인지도 잘모르겠고 ec2서버에 레디스를 실행시켜 레디스 서버로 만들어서 외부에서 접근을 하시러는건지 in-memory로써 레디스를 같은 ec2에서 실행시키려고 하시는건지 모르겠습니다. 전자의 경우라면 그냥 레디스 실행시키고 레디스의 주소가 ec2의 public dns name이 호스트가 될것이며 후자의 경우에는 localhost가 redis의 호스트가 될겁니다. private ip?가 여기서 필요한게맞나싶네요. 조금 더 정돈되게 컨텍스트를 알려주시면 더 정확하게 도와드릴수있을거같아요.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 04월 17일

이 문제가 발생하는 이유는 환경 변수가 제대로 적용되지 않아서일 가능성이 큽니다. 아마도 코드상에서 `redisUrlKey`를 확인하는 과정에서 환경변수(`MODE`) 설정이 잘린 것 같네요. 환경변수는 어플리케이션 시작시에 로드되어야 하며 EC2에서 앱을 실행할 때 설정해야합니다. 그래야 한번에 모든 설정이 적용됩니다. EC2 인스턴스의 경우, 환경변수를 `/etc/environment` 파일에 추가하거나 systemd service 파일에 추가할 수 있습니다. 환경변수의 존재와 값을 확인하려면 코드에서 `console.log(redisUrl)` 구문을 추가하여 로그를 확인해보세요. 또다른 가능한 원인은 Nest.js 애플리케이션의 라이프사이클 상태입니다. 만약 ConfigService가 Redis 연결설정 전에 초기화되지 않았다면, `process.env.MODE` 값은 아직 설정되지 않은 상태일 것입니다. 따라서 `createRedisModuleOptions()` 메소드 내부에서 환경 변수에 의존하는 로직 대신, 클래스 생성자에서 해당 값을 읽고 필요한 값들을 저장하는 방식으로 변경해 보세요. 위의 추천 사항들을 따라도 여전히 문제 해결에 어려움을 겪고 있다면, 보다 자세한 로그 정보와 함께 추가 질문을 남겨 주세요.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!