ฉันกำลังพยายามปรับใช้แอปพลิเคชัน rails บน Elastic Beanstalk ของ Amazon ฉันไม่ค่อยรอบรู้ในสภาพแวดล้อมเครือข่าย/เซิร์ฟเวอร์ ดังนั้นฉันจึงหยิบความรู้ขึ้นมาระหว่างทางโดยการอ่านเอกสารและค้นคว้าเทคโนโลยีใด ๆ ที่มีอยู่ในสแต็กของฉัน ดังนั้นโปรดอดทนกับฉันหากฉันทำผิดพลาด

นี่คือสิ่งที่ฉันพยายามบรรลุ:

ฉันต้องการปรับใช้แอปพลิเคชัน Rails ของฉันกับ Docker บน Elastic Beanstalk โดยที่อินสแตนซ์ของฉันเปิดตัวใน VPC ที่มีซับเน็ตสาธารณะสองเครือข่ายและอินสแตนซ์ RDS ที่เกี่ยวข้อง จนถึงตอนนี้ดีมาก ฉันได้ตั้งค่าสแต็กแล้ว แต่เมื่อปรับใช้ ฉันได้รับข้อผิดพลาดซึ่งบ่งชี้ว่าอินสแตนซ์ EC2 ของฉันไม่สามารถเชื่อมต่อกับอินสแตนซ์ Postgres RDS:

[91mrake aborted! [0m[91mPG::ConnectionBad: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

โดยพื้นฐานแล้วความรู้สึกของฉันคือฉันมาไกลมากแล้ว ยกเว้นกรณีที่อินสแตนซ์ EC2 ของฉันไม่สามารถเข้าถึงอินสแตนซ์ RDS ของฉันได้ ฉันเดาว่ามีกลุ่มความปลอดภัยที่ไม่น่าพอใจแม้ว่าฉันจะพยายามตรวจสอบให้แน่ใจว่าได้เพิ่มทั้งอินสแตนซ์ EC2 และอินสแตนซ์ RDS ในกลุ่มความปลอดภัยเดียวกันซึ่งกลุ่มความปลอดภัยอนุญาตการรับส่งข้อมูลขาเข้าบนพอร์ต 5432 (Postgres)

ฉันเพิ่มกลุ่มความปลอดภัยด้วย CIDR ของ Ip และสามารถยืนยันได้ว่าฐานข้อมูลสามารถเข้าถึงได้จากเครื่องของฉัน นั่นหมายความว่าพารามิเตอร์การเชื่อมต่อที่ฉันระบุในสภาพแวดล้อมของฉันถูกต้องและไม่เกี่ยวข้องกับข้อมูลประจำตัว/การกำหนดค่าที่ไม่ถูกต้อง

อะไรคือสาเหตุของอินสแตนซ์ EC2 ของฉันไม่สามารถสร้างการเชื่อมต่อกับอินสแตนซ์ RDS ของฉันได้ อีกครั้ง ฉันเกือบจะเป็นบวกกับความจริงที่ว่ามันอยู่ในการตั้งค่ากลุ่มความปลอดภัยของฉัน แต่ฉันไม่สามารถจำกัดที่มาของปัญหาให้แคบลงได้

หากคุณต้องการข้อมูลเพิ่มเติม (ซึ่งฉันตั้งใจละเว้นไว้อย่างย่อ) โปรดแจ้งให้เราทราบ (เช่น กลุ่มความปลอดภัยสำหรับ VPC, EC2 หรือ RDS เป็นต้น)

answer

เนื่องจาก RDS ต้องการให้คุณมีโซนความพร้อมใช้งานสองโซนเมื่อปรับใช้ใน VPC คุณจึงต้องตรวจสอบให้แน่ใจว่า beanstalk สามารถเข้าถึงทั้งสองโซนผ่าน ACL ของเครือข่าย รวมถึงสิทธิ์สำหรับกลุ่มความปลอดภัยตามอินสแตนซ์

เฉพาะ ELB และอินสแตนซ์ NAT/เกตเวย์ NAT ของคุณเท่านั้นที่ต้องเป็นซับเน็ตสาธารณะ ส่วนอย่างอื่นควรอยู่ในซับเน็ตส่วนตัว

กลุ่มความปลอดภัยเป็นแบบเก็บสถานะและกลุ่มเครือข่ายไม่มีสถานะ ดังนั้นในขณะที่คุณจำเป็นต้องอนุญาตกฎขาเข้าสำหรับกลุ่มความปลอดภัยเท่านั้น คุณต้องอนุญาตทั้งพอร์ตขาเข้าและขาออกจากซับเน็ตบีนทอล์คของคุณไปยังซับเน็ต RDS ทั้งสองโดยใช้ Network ACL ดูการรักษาความปลอดภัยใน VPC

นี่คือตัวอย่างeb createในการสร้างสภาพแวดล้อมของบีนทอล์ค (แทนที่สตริงในวงเล็บเหลี่ยม):

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

หมายเหตุเพิ่มเติมเกี่ยวกับเครือข่าย ACLs - บริการจำนวนมากไม่ตอบสนองในพอร์ตเดิม แต่ใช้พอร์ตชั่วคราว ดังนั้นคุณอาจต้องเพิ่มสิ่งต่อไปนี้ใน 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

ฉันหวังว่านี่จะช่วยได้.