RDSまたはRedShiftに接続しようとして同様の問題が発生する可能性があるユーザー向けの追加情報:
1)セキュリティグループを確認する
RDSインスタンスのセキュリティグループが、ソースサーバーが属するセキュリティグループ(またはAWSの外部にある場合は直接追加されたIP)からのアクセスを許可していることを確認します。確認する必要のあるセキュリティグループは、RDSコンソールUIのRDSインスタンス属性で指定されているセキュリティグループ(「セキュリティグループ」という名前)です。
注 :データベースセキュリティグループは、AWSEC2セキュリティグループとは異なる場合があります。 RDSインスタンスがクラシック/パブリックEC2にある場合は、RDSUIの「データベースセキュリティグループ」セクションを確認する必要があります。 VPCユーザーの場合、セキュリティグループは通常のVPCセキュリティグループになります(名前sg-xxxはRDSインスタンスの属性に表示されます)。
2)DNSが問題ではないことを確認します。
AmazonはスプリットDNSを使用するため、AWSの外部のDNSルックアップはパブリックIPを返し、AWSの内部のルックアップはプライベートIPを返します。 DNSの問題であると思われる場合は、さまざまなアベイラビリティーゾーンからさまざまなIPが返されることを確認しましたか?異なるAZが異なるIPを取得する場合は、AWSサポートに連絡する必要があります。
3)ソケット接続を確立してネットワーク接続を確認します。
RDSは現在ICMPトラフィックをドロップしているため、tracepathやtracerouteなどのツールは役に立たない可能性があります。
ポート3306(mysql、またはpostgresの場合は5432)でRDSインスタンスへのソケット接続を確立して、ポート接続をテストします。 RDSインスタンスのIPを見つけて、telnetまたはncを使用することから始めます(AWS内から接続する場合は、必ず内部/プライベートIPを使用してください):
telnet x.x.x.x 3306
nc -vz x.x.x.x 3306
a) 接続の試行が成功せず、すぐに失敗した場合は、ポートがブロックされているか、リモートホストがそのポートでサービスを実行していない可能性があります。さらにトラブルシューティングを行うには、AWSサポートを利用する必要がある場合があります。 AWSの外部から接続する場合は、最初にAWSの内部の別のインスタンスから接続してみてください(ファイアウォールがそれらの接続をブロックしている可能性があるため)。
b) 接続が成功せず、タイムアウトが発生した場合は、パケットがファイアウォールによってドロップ/無視されているか、パケットが別のネットワークパスに戻っている可能性があります。これは、netstat -an | grep SYN
(telnet / ncコマンドがタイムアウトするのを待っている間の別のsshセッションから)
SYN状態の接続は、接続要求を送信したが、何も受信していないことを意味します(SYN_ACKまたは拒否/ブロック)。通常、これはファイアウォールまたはセキュリティグループがパケットを無視またはドロップしていることを意味します。
また、NATルーティングまたは複数のインターフェイスからの複数のパスで問題が発生する可能性があります。ホストとRDSインスタンス間でiptablesまたはNATゲートウェイを使用していないことを確認してください。 VPCを使用している場合は、送信元ホストからの出力/送信トラフィックも許可していることを確認してください。
c) ソケット接続テストは成功したが、mysqlクライアント(CLI、ワークベンチ、アプリなど)に接続できない場合は、netstatの出力を調べて、接続の状態を確認してください(x.x.x.xをRDSインスタンスの実際のIPアドレス):
netstat -an | grep x.x.x.x
telnetまたはNCを使用しているときに接続が確立されていても、mysqlクライアントを使用しているときに「SYN」状態が表示される場合は、MTUの問題が発生している可能性があります。
これが書かれている時点では、RDSはPMTUDに使用されるICMPパケットをサポートしていない可能性があります( https:/ /en.wikipedia.org/wiki/Path_MTU_Discovery#Problems_with_PMTUD )。これは、ClassicLinkを介してクラシックec2インスタンスからVPCにあるRDSまたはRedShiftにアクセスしようとしている場合に問題になる可能性があります。次の方法でMTUを下げてから、もう一度テストしてみてください。
sudo ip link show
# take note of the current MTU (likely 1500 or 9001)
sudo ip link set dev eth0 mtu 1400
低いMTUが機能した場合は、AWSカスタマーサポートにサポートを依頼し、RDSインスタンスに接続しようとしているときにMTUの問題が発生していることを伝えてください。これは、TCPパケットがトンネリング用のカプセル化でラップされている場合に発生する可能性があり、その結果、パケットデータ/ペイロードの使用可能なMTUが低くなります。ソースサーバーのMTUを下げると、ラップされたパケットは、トンネリングゲートウェイを通過するときにMTU制限内に収まります。
動作しなかった場合は、MTUをデフォルトに戻し、AWSサポートに連絡してさらにトラブルシューティングを行ってください。