Dari contoh EC2 i-78a8df00, saya mencoba menyambung ke contoh RDS mysql.****.us-east-1.rds.amazonaws.com. Keduanya berada di wilayah AS Timur. Saya menambahkan grup keamanan instance EC2 (sg-****) ke grup keamanan RDS, tetapi itu tidak membantu. Tampaknya ini adalah masalah firewall/DNS karena waktu habis saat menjalankan perintah ini:
ubuntu@ip-10-195-189-237:~$ mysql -h mysql.************.us-east-1.rds.amazonaws.com
KESALAHAN 2003 (HY000): Tidak dapat terhubung ke server MySQL di 'mysql.****.us-east-1.rds.amazonaws.com ' (110)
Saya dapat terhubung ke instance RDS dengan baik dari mesin lokal saya menggunakan jalur yang sama seperti di atas. Saya telah mencoba berbagai solusi dari forum namun tidak ada yang membantu.
Informasi tambahan untuk orang-orang yang mungkin mengalami masalah serupa saat mencoba terhubung ke RDS atau RedShift:
1) Periksa grup keamanan
Verifikasi grup keamanan untuk instans RDS yang mengizinkan akses dari grup keamanan milik server sumber Anda (atau IP-nya ditambahkan secara langsung jika di luar AWS). Grup keamanan yang harus Anda lihat adalah grup yang ditentukan dalam atribut instans RDS dari UI konsol RDS (bernama "grup keamanan").
CATATAN : Grup keamanan database mungkin berbeda dengan grup keamanan AWS EC2. Jika instance RDS Anda berada di EC2 klasik/publik, Anda harus memeriksa di bagian "grup keamanan database" pada UI RDS. Untuk pengguna VPC, grup keamanan akan menjadi grup keamanan VPC normal (nama sg-xxx akan dicantumkan dalam atribut instance RDS).
2) Konfirmasikan bahwa DNS tidak menjadi masalah..
Amazon menggunakan DNS terpisah, sehingga pencarian DNS di luar AWS akan mengembalikan IP publik, sedangkan pencarian di dalam AWS akan mengembalikan IP pribadi. Jika Anda mencurigai ini adalah masalah DNS, sudahkah Anda mengonfirmasi IP yang berbeda dikembalikan dari zona ketersediaan yang berbeda? Jika AZ yang berbeda mendapatkan IP yang berbeda, Anda perlu menghubungi dukungan AWS.
3) Konfirmasikan konektivitas jaringan dengan membuat koneksi soket..
Alat-alat seperti tracepath dan traceroute kemungkinan besar tidak akan membantu karena RDS saat ini menjatuhkan lalu lintas ICMP.
Uji konektivitas port dengan mencoba membuat sambungan soket ke instans RDS pada port 3306 (mysql, atau 5432 untuk postgres). Mulailah dengan menemukan IP dari instans RDS dan menggunakan telnet atau nc:
telnet x.x.x.x 3306
nc -vz x.x.x.x 3306
a) Jika upaya koneksi Anda tidak berhasil dan langsung gagal, port kemungkinan diblokir atau hos jarak jauh tidak menjalankan layanan pada port tersebut. Anda mungkin perlu menghubungi dukungan AWS untuk memecahkan masalah lebih lanjut. Jika menyambung dari luar AWS, coba sambungkan dari instans lain di dalam AWS terlebih dahulu (karena firewall Anda mungkin memblokir koneksi tersebut).
b) Jika koneksi Anda tidak berhasil dan Anda mendapatkan waktu habis, paket mungkin sedang dijatuhkan / diabaikan oleh firewall atau paket kembali pada jalur jaringan yang berbeda. Anda dapat mengkonfirmasi hal ini dengan menjalankan netstat -an | grep SYN
(dari jendela/sesi CLI yang berbeda saat menjalankan dan menunggu perintah telnet/nc sampai waktu habis). Sambungan dalam status SYN berarti bahwa Anda telah mengirim permintaan koneksi, tetapi belum menerima apa pun (SYN_ACK atau tolak/blokir). Biasanya ini berarti firewall atau grup keamanan mengabaikan atau menjatuhkan paket.
Periksa untuk memastikan Anda tidak menggunakan iptables atau gateway NAT antara hos Anda dan instans RDS. Jika Anda menggunakan VPC, pastikan juga Anda mengizinkan lalu lintas keluar/masuk dari host sumber.
c) Jika tes koneksi soket Anda berhasil, tetapi Anda tidak dapat terhubung dengan klien mysql (CLI, workbench, aplikasi, dll.), Lihatlah keluaran netstat untuk melihat status koneksi (ganti x.x.x.x dengan alamat IP aktual dari instance RDS):
netstat -an | grep x.x.x.x
Jika Anda mendapatkan koneksi yang dibuat saat menggunakan telnet atau NC, tetapi Anda melihat status 'SYN ' saat menggunakan klien mysql, Anda mungkin mengalami masalah MTU.
RDS, pada saat tulisan ini dibuat, mungkin tidak mendukung paket ICMP yang digunakan untuk PMTUD (https://en.wikipedia.org/wiki/Path_MTU_Discovery#Problems_with_PMTUD). Ini bisa menjadi masalah jika Anda mencoba mengakses RDS atau RedShift yang berada di VPC dari instance ec2 klasik melalui ClassicLink. Coba turunkan MTU dengan yang berikut ini, lalu uji lagi:
sudo ip link show
# take note of the current MTU (likely 1500 or 9001)
sudo ip link set dev eth0 mtu 1400
Jika MTU yang lebih rendah berhasil, pastikan untuk menindaklanjuti dengan dukungan pelanggan AWS untuk mendapatkan bantuan dan sebutkan bahwa Anda mengalami masalah MTU saat mencoba menyambungkan ke instans RDS. Hal ini dapat terjadi jika paket TCP dibungkus dengan enkapsulasi untuk tunneling, sehingga menghasilkan MTU yang dapat digunakan lebih rendah untuk paket data / muatan. Menurunkan MTU pada server sumber memungkinkan paket yang dibungkus masih muat di bawah batas.
Jika tidak berhasil, atur kembali MTU Anda ke default dan hubungi dukungan AWS untuk pemecahan masalah lebih lanjut.
Ternyata, multi-AZ mengacaukan segalanya. Karena konfigurasi default multi-AZ menempatkan basis data saya di wilayah us-east-1d, dan instans EC2 saya berada di wilayah us-east-1a, DNS tidak merutekan dengan benar. Saya membuat ulang instans RDS sebagai non-multi-AZ, dan membuatnya berada di wilayah us-east-1a, dan semuanya berjalan lancar.
Jika ada orang yang sangat jenius di luar sana terkait perutean DNS di AWS dengan kemampuan RDS, ELB, dan multi-AZ, akan sangat mengagumkan jika mengetahui cara melakukannya, karena hal ini tidak didokumentasikan di mana pun dalam dokumentasi Amazon Web Service.