LocalStack을 이용해 로컬에서 AWS 구동시키기

로컬 웹훅 테스트 환경 로컬 개발 환경에서 AWS를 이용하는 전체 웹훅 플로우를 테스트할 수 있는 환경을 구축함 개요 배경 운영 환경의 웹훅 처리 플로우: 1 Cafe24 → Django → SQS → EventBridge Pipes → Step Functions → Lambda → ElastiCache 이 플로우를 로컬에서 테스트하기 어려웠던 이유: Lambda 함수가 ElastiCache(AWS)에만 접근 가능 LocalStack Free에서 EventBridge Pipes 미지원 해결 방법 LocalStack을 활용한 하이브리드 아키텍처: 웹훅 처리 → LocalStack (Step Functions + Lambda) 기타 AWS 서비스 (SQS, S3) → 실제 AWS 유지 💡 핵심 개념: LocalStack과 Endpoint URL 이 프로젝트는 하이브리드 클라우드 환경을 구성하기 위해 LocalStack과 endpoint_url 개념을 적극적으로 사용합니다. ...

2025년 12월 19일 · 5 분 · 배준수

Redis Connection closed by server 오류

Redis 연결오류 해결기 사건 배경 심기가 불편한 일요일 오후 서버는 울기 시작했다. “응애! 응애! Connection closed by server! 응애!” 서버의 웹훅 관련 캐시서버와의 연결이 끊어졌다는 오류들이었다. 웹훅을 수신하면 웹훅 캐시서버에 횟수를 기록하기 위한 작업이 이뤄지는데 이떄 서버로부터 연결이 끊겼다는 에러였다. Traceback 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 Traceback (most recent call last): File "/code/core/webhook/utils/webhook.py", line 156, in record_webhook_event redis_client.zadd(key, {member: score}) File "/usr/local/lib/python3.11/site-packages/redis/commands/core.py", line 4187, in zadd return self.execute_command("ZADD", name, *pieces, **options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/ddtrace/contrib/redis/patch.py", line 148, in _traced_execute_command return _run_redis_command(span=span, func=func, args=args, kwargs=kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/ddtrace/contrib/redis/patch.py", line 128, in _run_redis_command result = func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 559, in execute_command return self._execute_command(*args, **options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 567, in _execute_command return conn.retry.call_with_retry( ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/retry.py", line 65, in call_with_retry fail(error) File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 571, in <lambda> lambda error: self._disconnect_raise(conn, error), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 555, in _disconnect_raise raise error File "/usr/local/lib/python3.11/site-packages/redis/retry.py", line 62, in call_with_retry return do() ^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 568, in <lambda> lambda: self._send_command_parse_response( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 542, in _send_command_parse_response return self.parse_response(conn, command_name, **options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 584, in parse_response response = connection.read_response() ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/connection.py", line 592, in read_response response = self._parser.read_response(disable_decoding=disable_decoding) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/_parsers/resp2.py", line 15, in read_response result = self._read_response(disable_decoding=disable_decoding) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/_parsers/resp2.py", line 25, in _read_response raw = self._buffer.readline() ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/_parsers/socket.py", line 115, in readline self._read_from_socket() File "/usr/local/lib/python3.11/site-packages/redis/_parsers/socket.py", line 68, in _read_from_socket raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR) redis.exceptions.ConnectionError: Connection closed by server. 웹훅 오류에 발작버튼이 달려있는 나는 황급히 웹훅 캐시 지표를 확인했다. ...

2025년 12월 18일 · 11 분 · 배준수

업스트림(Upstream)과 다운스트림(Downstream)

업스트림(Upstream)과 다운스트림(Downstream) 1. 기본 정의 : 흐르는 강물(Stream) 이 용어는 데이터와 요청의 흐름을 강물에 비유한 것 업스트림 (Upstream, 상류): 데이터(물)의 원천이 되는 곳 다운스트림 (Downstream, 하류): 데이터(물)를 받아서 소비하는 곳 흐름의 법칙 데이터(응답): 상류 → 하류 (위에서 아래로 흐름) 요청(Request): 하류 → 상류 (거슬러 올라감) 2. 핵심 개념 : “위치는 상대적이다” 업스트림과 다운스트림은 절대적인 역할이 고정된 것이 아님 “누구를 기준(주체)으로 보느냐"에 따라 달라지는 상대적인 개념 전체 흐름이 다음과 같을 때를 가정 ...

2025년 11월 21일 · 2 분 · 배준수

Google Search Console 색인 등록 문제 해결법

Google Search Console 색인 등록 문제 해결법 상황 2023년 5월 27일에 지금의 깃허브 블로그를 처음 시작했다. 어려운 것, 귀찮은 것, 잘 모르는 것 투성이지만 그만큼 배울게 많아질 것이라 생각하며 시작했다. 24년 3월 18일을 기준으로 447개의 게시글을 작성했다! 자주 쓰는 만큼 고퀄리티는 아닌지라 누군가에게 보여주기 민망하지만, 그래도 한명이라도 나의 글로 도움을 받길 바라고 있다. 나 또한 다른 사람들의 글을 보며 그랬으니까. Google search console에 나의 블로그를 등록하고 sitemap.yml 과 robot.txt, feed.xml도 설정해주었다. 방법에 관한 글은 구글에 넘쳐난다. ...

2024년 3월 18일 · 2 분 · 배준수