Как подключиться к экземпляру ElastiCache (Redis) из приложения Django, запущенного на локальной машине

Я пытаюсь найти решение для правильной настройки соединения между моим приложением Django, работающим на моей локальной машине, и моим экземпляром ElastiCache

Позвольте мне возобновить ситуацию.

CONFIG:

У меня есть приложение Django, развернутое на экземпляре AWS EC2 и запущенное с помощью файла docker-compose-yml. Я использую ElastiCache & Redis для моего кэша.

МОЙ ВОПРОС:

Я могу успешно подключиться к моему инстансу ElastiCache с моего инстанса EC2. Я могу использовать Redis, создавать ключи и т.д.. Все работает отлично.

Я могу подключиться к ElastiCache из моего приложения Django, когда я запускаю его с помощью моего файла docker-compose.yml в моем EC2 Instance.

Я также могу использовать Redis на моем ElastiCache с моей локальной машины, создав своего рода мост с моим экземпляром EC2 с помощью этой команды:

ssh -f -N -L 6379:{my_elasticache_amazon_url}:6379 ec2-user@{my_ec2_instance_url}

Затем я выполняю следующую команду и получаю доступ к redis:

redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> 

Но я не могу получить доступ к ElastiCache из моего приложения Django, работающего на моей локальной машине! Мне нужно установить это соединение для целей разработки и тестирования, прежде чем развернуть его на экземпляре EC2.

ГДЕ Я:

Я попытался напрямую подключиться к ElastiCache, используя URL в приложении Django, но доступ не разрешен, так как группа безопасности в AWS настроена на прием подключения только от экземпляра EC2.

redis.exceptions.ConnectionError: Error 111 connecting to {my_elasticache_url}:6379. Connection refused.

Я попытался указать 127.0.0.1 & localhost в качестве URL для подключения, поскольку я создал связь между моей локальной машиной и экземпляром EC2 с помощью предыдущей команды, но это не работает, у меня такая же ошибка:

redis.exceptions.ConnectionError: Error 111 connecting to 127.0.0.1:6379. Connection refused.

Я уже пытался установить network_mode: "host" в моем файле docker-compose, но это не работает, поскольку у меня есть привязка к порту.

RESSOURCES:

Строка кода в моем Django App для подключения к Redis:

import redis
import os

r = redis.Redis(
    host=os.environ.get('CLUSTER_HOST', default="127.0.0.1"), port=6379, db=0)

my_key = r.get('my_key')

Команда прослушивания порта на моей локальной машине:

lsof -nP +c 15 | grep LISTEN 
ssh   22744 username  7u   IPv6 0x254006fa8c767523   0t0     TCP [::1]:6379 (LISTEN)
ssh   22744 username  8u   IPv4 0x254006fa9cfbe91b   0t0     TCP 127.0.0.1:6379 (LISTEN)

Вот мой docker-compose.yml файл:

version: '3.9'

x-database-variables: &database-variables
  POSTGRES_DB: ${POSTGRES_DB}
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  ALLOWED_HOSTS: ${ALLOWED_HOSTS}

x-app-variables: &app-variables
  <<: *database-variables
  POSTGRES_HOST: ${POSTGRES_HOST}
  SPOTIPY_CLIENT_ID: ${SPOTIPY_CLIENT_ID}
  SPOTIPY_CLIENT_SECRET: ${SPOTIPY_CLIENT_SECRET}
  SECRET_KEY: ${SECRET_KEY}
  CLUSTER_HOST: ${CLUSTER_HOST}
  DEBUG: 1

services:
  website:
    build:
      context: .
    restart: always
    volumes:
      - static-data:/vol/web
    environment: *app-variables
    depends_on:
      - postgres

  postgres:
    image: postgres
    restart: always
    environment: *database-variables
    volumes:
      - db-data:/var/lib/postgresql/data

  proxy:
    build:
      context: ./proxy
    restart: always
    depends_on:
      - website
    ports:
      - 80:80
      - 443:443
      - 6379:6379
    volumes:
      - static-data:/vol/static
      - ./files/templates:/var/www/html
      - ./proxy/default.conf:/etc/nginx/conf.d/default.conf
      - ./etc/letsencrypt:/etc/letsencrypt

volumes:
  static-data:
  db-data:

Входящие правила группы безопасности моего экземпляра ElastiCache:

enter image description here

Входящие правила группы безопасности моей инстанции EC2:

enter image description here

@$%^ 55

D i d u s a t r a i n & s u p pl y i s i s w w e a p o n s l i k e i d i d w i t d i d w i t w i t l q a e d a to j u st i f y c r e a t i n g w a r s > > C R E A T I V E C H O A S

d i d c i a d i d 9 1 1 or i t j u s t l e t it h a p p en

если я не знаю, что делать с 9 миллионами на ирбисе

за 9 миллионов долларов США и в связи с насилием над страной и в связи со смертью страны в связи с тем, что привели к тому, что иракский ф или м с е н т я б р ь с к и й м е т а л л у р г и ч е с к и й м е т а л л у р г и ч е с к и й к о м б и н а т

это и есть, и есть да, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть, и есть.

sa d da m hu ss i n wh o lo st m o s t of h i s p o w er i n 1st, 2nd gu lf w a rs an d du ri n g 10 y ea rs of sie ge , d i d t a l l o w i s is o r a l q a e dea t o e n t e r i r a q , e ve n to h e l p h i m a g a i n s t u s a

п л а с т и н к а м е ж д у н а р о д н о г о г о с у д а р с т в е н н о г о у н и в е р с и тета p l e a s e s h a r e m y qs to l e s e n u s a g g r e s s i o n a g g i n s t o h e rs

Я нашел решение, используя AWS VPN, как объясняется в этом руководстве .

Вам просто нужно настроить VPN сеть, связанную с ElastiCache, затем вы можете установить разрешения, чтобы разрешить определенному пользователю подключаться к ней (или вы можете сделать ее общедоступной). После этого вам просто нужно подключиться к VPN с локальной машины, как описано в конце документации.

Затем вы можете использовать Redis так же, как это делаю я на своем экземпляре EC2.

С вашей машины:

redis-cli -c -h your-elasticache-name.l5ljap.0001.use2.cache.amazonaws.com -p 6379

Из вашего приложения Django App:

import redis

r = redis.Redis(
    host=your-elasticache-name.l5ljap.0001.use2.cache.amazonaws.com, port=6379, db=0)

Советы: Не забудьте подключить маршрутизатор, который имеет доступ к интернету, иначе вы не сможете подключиться к интернету с вашей машины, как только вы подключитесь к VPN (это может раздражать, когда вы делаете API запрос в вашем приложении, например).

Вернуться на верх