Я пытаюсь развернуть приложение rails на Amazon Elastic Beanstalk. Я не очень хорошо разбираюсь в сетевых / серверных средах, поэтому я получил некоторые знания по пути, читая документацию и исследуя все технологии, присутствующие в моем стеке, так что терпите меня, если я сделаю какие-либо ошибки.
Итак, вот чего я пытаюсь достичь:
Я хочу развернуть свое приложение Rails с Docker на Elastic Beanstalk с моими экземплярами, запущенными в VPC с двумя общедоступными подсетями и связанным экземпляром RDS. Пока все хорошо, я настроил стек, но после развертывания я получаю сообщение об ошибке, указывающее, что мой экземпляр EC2 не может подключиться к экземпляру Postgres RDS:
[91mrake прерван! [0m [91mPG :: ConnectionBad: не удалось подключиться к серверу: нет такого файла или каталога. Сервер работает локально и принимает соединения через сокет домена Unix «/var/run/postgresql/.s.PGSQL.5432»?
Итак, по сути, я чувствую, что зашел довольно далеко, за исключением того, что мой экземпляр RDS не может быть доступен для моего экземпляра EC2. Я предполагаю, что есть неудовлетворительные группы безопасности, хотя я попытался добавить как экземпляр EC2, так и экземпляр RDS в одну группу безопасности, где входящий трафик на порт 5432 (Postgres) разрешен самой группой безопасности.
Я добавил группу безопасности с CIDR моего IP и смог подтвердить, что база данных доступна с моего компьютера. Это означает, что параметры подключения, которые я указал в своей среде, верны и не связаны с неправильными учетными данными / конфигурацией.
Что может быть причиной того, что мой экземпляр EC2 не может установить соединение с моим экземпляром RDS? Опять же, я почти уверен в том, что это находится в настройках моей группы безопасности, но я не смог сузить источник проблемы.
Если вам потребуется дополнительная информация (которую я намеренно не упомянул для краткости), сообщите мне (например, о группах безопасности для VPC, EC2 или RDS и т. Д.).
Поскольку RDS требует наличия двух зон доступности при развертывании в VPC, вам необходимо убедиться, что beanstalk может получить доступ к ним обеим через сетевые ACL, а также разрешения для групп безопасности на основе экземпляра.
Только ваш ELB и ваш NAT-экземпляр / NAT-шлюз должны быть общедоступными подсетями, все остальное должно быть в частных подсетях.
Группы безопасности имеют состояние, а сетевые группы не имеют состояния, поэтому, хотя вам нужно разрешить только входящие правила для групп безопасности, вам необходимо разрешить ОБЕИ входящие и исходящие порты из вашей подсети beanstalk в обе подсети RDS с использованием сетевых ACL. Видеть Безопасность в вашем VPC.
Вот образец eb create
для создания среды beanstalk (замените строки в квадратных скобках):
eb create [BEANSTALK_ENVIRONMENT] --instance_type m3.medium --branch_default --cname [BEANSTALK_CNAME] --database --database.engine postgres --database.version [x] --database.size 100 --database.instance db.m4.large --database.password xxxxxxxxx --database.username ebroot --instance_profile [BEANSTALK_EC2_IAM_PROFILE] --keyname [SSH_KEY_NAME] --platform "64bit Amazon Linux 2015.03 v1.3.0 running Ruby 2.2" --region us-east-1 --tags tag1=value1,tag2=value2 --tier webserver --verbose --sample --vpc.id [vpc-xxxxxx] --vpc.dbsubnets [subnet-db000001,subnet-db000002] --vpc.ec2subnets [subnet-ec200001] --vpc.elbsubnets [subnet-elb00001] --vpc.elbpublic --vpc.securitygroups [sg-00000001] --sample --timeout 3600
subnet-db000001 ПРАВИЛА ACL СЕТИ:
Inbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow
Outbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow
subnet-db000002 ПРАВИЛА ACL СЕТИ:
Inbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow
Outbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow
subnet-ec200001 ПРАВИЛА ACL СЕТИ:
Inbound: Port Range: 5432, Source [subnet-db000001 (as ip range)], Allow
Inbound: Port Range: 5432, Source [subnet-db000002 (as ip range)], Allow
Outbound: Port Range: 5432, Source [subnet-db000001 (as ip range)], Allow
Outbound: Port Range: 5432, Source [subnet-db000002 (as ip range)], Allow
subnet-elb00001 ПРАВИЛА ACL СЕТИ:
Inbound: Port Range: 80, Source 0.0.0.0/0, Allow
Inbound: Port Range: 443, Source 0.0.0.0/0, Allow
Outbound: Port Range: 80, Source 0.0.0.0/0, Allow
Outbound: Port Range: 443, Source 0.0.0.0/0, Allow
Дополнительное примечание о сетевых ACL - многие службы не отвечают на исходный порт, но используют эфемерный порт. Таким образом, вам, возможно, придется добавить следующее во входящие и исходящие сетевые ACL для подсетей с экземплярами EC2:
Outbound: Port Range: 1024-65535, Source 0.0.0.0/0, Allow
Outbound: Port Range: 1024-65535, Source 0.0.0.0/0, Allow
Также есть несколько полезных сценариев в Рекомендуемые сетевые правила ACL для вашего VPC.
Надеюсь, это поможет.