web-dev-qa-db-ja.com

Django syncdbは別のEC2インスタンスでMySQLに接続できません

DjangoアプリをAWSにデプロイしようとしていますが、nginx/uwsgiを実行している1つのEC2インスタンスと、MySQL5.5がインストールされている2つ目のEC2インスタンスがあります。どちらもデフォルトのグループ(SSH、HTTP、HTTPS、MYSQLが有効)。最終的には、DBとアプリ/ウェブサーバーのグループを分割しますが、今のところアプリを動作させたいと思います。

私のDjangoデータベース設定は次のようになります:

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'db',         
        'USER': 'db_user',      
        'PASSWORD': 'db_pwd',
        'Host': '<public dns of MySQL EC2 instance(tried also private ip)>',
        'PORT': '3306', 
    }
}

Syncdbを実行しようとするたびに、次のエラーが発生します。

_mysql_exceptions.OperationalError:(1130、 "ホスト 'ip-xx-xx-xx-xxx.ec2.internal'はこのMySQLサーバーへの接続を許可されていません")

アプリが動作するWeb /アプリサーバーと同じEC2インスタンスでMySQLをセットアップする場合は注意してください。その場合、私の設定ファイルのデータベース設定は次のようになりました。

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'db',         
        'USER': 'db_user',      
        'PASSWORD': 'db_pwd',
        'Host': '',
        'PORT': '', 
    }
}

ある投稿が示唆しているように、/ etc/mysql/my.cnfファイルのバインド127.0.0.1をコメントアウトし、0.0.0.0(変更後にMySQLを再起動)に設定しましたが、それは役に立ちませんでした。

助言がありますか?

ありがとう

バイナリ迷路

2
Binary Maze

[コメントストリームからこの回答をまとめます。]

セキュリティグループを設定するときは、一般的なインターネット(0.0.0.0/0)のMySQLポート(3306)を有効にしないでください。これは危険です。代わりに、アカウントのセキュリティグループに対してのみポート3306を有効にして、インスタンスのみが接続できるようにします。

別のインスタンスのクライアントから接続する場合は、パブリックIPアドレスではなく、データベースサーバーの内部IPアドレスを使用する必要があります。

「bind-address = 0.0.0.0」を使用すると、MySQLは他のホストからの接続を受け入れることができます(セキュリティグループとiptablesのルールに従います)。

'someuser' @ '%'に権限を付与すると、セキュリティグループの制限に従って、そのユーザーは任意のホストから接続できます。

2
Eric Hammond