Как подключиться к экземпляру 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:
Входящие правила группы безопасности моей инстанции EC2:
@$%^ 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 запрос в вашем приложении, например).