8

我對Elastic Beanstalk很陌生,對服務器管理不太熟練,但我需要在連接到外部RDS MySQL數據庫的Elastic Beanstalk上設置Django項目。由Elastic Beanstalk創建的連接到外部RDS的EC2權限

我創建了一個單獨的RDS MySQL數據庫,我可以在我的電腦上使用Sequel Pro連接到它,沒有任何問題。然後我有我的Django項目,我試圖把它放到Elastic Beanstalk,但不幸的是沒有運氣。如果我從我的計算機運行本地Django服務器,則該項目可瀏覽並且可以訪問Amazon RDS MySQL。然而,當我運行

eb deploy 

我得到

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server 
on 'myapp-staging.xxx.eu-west-1.rds.amazonaws.com' (110)") 
(ElasticBeanstalk::ExternalInvocationError) 

如果我通過SSH登錄到EC2服務器

eb ssh 

,然後檢查開放的端口與

netstat -lntu 

我沒有看到MySQL的端口3306,所以我猜測它被防火牆阻止。

這是我嘗試過關於權限:

  1. 我去RDS儀表板 - >安全組和創建的myapp-mysql的安全組與EC2安全組連接類型指向由彈性使用EC2安全組Beanstalk EC2實例「awseb-e -...」。
  2. 我去了EC2->安全組和爲「awseb-e -...」我設置入站MySQL端口的源0.0.0.0/0
  3. 我去了VPC儀表板 - >安全組並創建myapp -mysql-security-group,帶有源端口爲0.0.0.0/0的MySQL端口的入站規則。

然後我嘗試重新部署,重新啓動服務器甚至重建環境,但沒有任何幫助。 MySQL端口3306在由Elastic Beanstalk創建的EC2實例中仍未打開。

我在做什麼錯或缺少什麼?

回答

7

僅在RDS實例(不在您的EC2實例中)打開MySQL端口3306。所以,如果你對你的EC2實例檢查,它不應該監聽端口3306

這些事情你可以做檢查RDS工作:

  • 檢查您的EC2實例連接RDS。
    • SSH到您的實例(eb ssh)並運行telnet myapp-staging.xxx.eu-west-1.rds.amazonaws.com 3306。您可能需要先安裝telnetyum install telnet)。
    • 如果成功,請檢查您的應用程序。
    • 如果失敗,請檢查下一點。
  • 確保您的RDS和EC2的位置是正確的:
    • 對於私人唯一獲得RDS:
      • 確保他們在同一個VPC,並允許從VPC的IP在RDS傳入連接到3306.爲了獲得更好的性能,請使用IP地址而不是安全組名稱。
      • 如果他們在不同的VPC上,則可以創建VPC Peering
    • 對於公共訪問RDS:
      • 同上,允許從VPC的IP傳入的連接。
  • 確保EC2實例允許使EC2安全組的3306端口傳出連接。
  • 確保您的EC2主機在iptables中沒有拒絕3306規則。
  • 如果您的EC2和RDS在不同的VPC中並且您使用專用IP作爲EC2,請檢查NAT服務器。確保你允許端口3306被代理。
+0

最初來自Elastic Beanstalk的EC2與RDS不在同一個VPC中。因此,我使用eb create命令中的--vpc switch在與VDS相同的VPC中重新創建了Elastic Beanstalk。爲了解決進一步的連接問題,我必須將VPC IP添加到RDS的傳入連接。感謝您的廣泛解釋。我希望它也能幫助其他AWS用戶。 –

相關問題