Latar Belakang

Artikel ini dibuat berdasarkan pengalaman saya saat mengerjakan project AWS Systems Manager (SSM) menggunakan akun AWS Learner Lab. Di awal belajar AWS, saya beranggapan bahwa akses ke EC2 dan database di AWS selalu membutuhkan SSH, public IP, serta port yang dibuka ke internet. Cara ini memang sering ditemui di banyak tutorial, namun terasa kurang aman jika diterapkan pada lingkungan yang lebih serius.

Dari situ saya mulai mencoba membangun arsitektur yang lebih tertutup. Target awalnya cukup sederhana: EC2 dan RDS berada di private subnet, tidak memiliki public IP, tidak membuka port ke publik, tetapi tetap bisa diakses untuk kebutuhan administrasi dan pengujian.

Seiring berjalan, project ini berkembang. Tidak hanya sebatas mengakses EC2 private menggunakan AWS Systems Manager, tetapi juga mengakses RDS private dengan memanfaatkan teknik port forwarding melalui EC2.

Pembahasan

Project ini diawali dengan pembuatan satu VPC yang memiliki dua subnet, yaitu public subnet dan private subnet. Public subnet digunakan untuk menempatkan NAT Gateway, sementara private subnet digunakan untuk EC2 dan RDS.

Dalam kondisi ideal, Systems Manager bisa digunakan tanpa NAT dengan bantuan VPC Endpoint. Namun, karena akun AWS Learner Lab memiliki keterbatasan dan tidak mendukung pembuatan SSM Endpoint, maka NAT Gateway menjadi komponen yang wajib agar resource di private subnet tetap dapat berkomunikasi dengan layanan AWS.

Setelah VPC dan subnet selesai dibuat, saya meluncurkan sebuah EC2 instance dan menempatkannya di private subnet tanpa public IP. Pada tahap konfigurasi, saya langsung memilih IAM Role bawaan Learner Lab, yaitu LabInstanceProfile, yang sudah memiliki izin untuk Systems Manager.

Role ini sangat krusial. Tanpa role tersebut, EC2 tidak akan terdaftar sebagai managed instance dan tidak bisa diakses melalui SSM.

Pada security group EC2, saya tidak menambahkan satu pun inbound rule dan juga tidak menggunakan SSH key. Seluruh akses ke instance sepenuhnya mengandalkan Session Manager. Untuk sistem operasi, saya memilih Amazon Linux karena SSM Agent sudah terpasang secara default.

Setelah instance berstatus sehat, saya mencoba mengaksesnya melalui AWS Console. Dari menu EC2, saya memilih Connect lalu masuk ke tab Session Manager. Dalam beberapa detik, shell EC2 private berhasil terbuka langsung dari browser, meskipun instance tersebut tidak memiliki public IP dan tidak membuka port apa pun ke internet.

Akses EC2 Private dari Terminal Lokal

Setelah memastikan akses dari Console berjalan, saya melanjutkan pengujian dari sisi lokal. Di komputer pribadi, saya menggunakan Linux distro secara langsung atau WSL di Windows, sehingga seluruh perintah dijalankan dari lingkungan Linux dengan kontrol penuh terhadap sistem operasi.

Setelah AWS CLI terinstal dan credential Learner Lab dikonfigurasi, saya mencoba mengakses EC2 private langsung dari terminal lokal dengan perintah berikut:

aws ssm start-session --target i-xxxxxxxxxxxx

Ketika session berhasil terbuka, ini menandakan bahwa EC2 private sudah sepenuhnya dapat diakses melalui SSM tanpa SSH dan tanpa public IP.

Konfigurasi RDS di Private Subnet

Langkah berikutnya adalah menyiapkan database. Saya membuat RDS dan menempatkannya di private subnet yang sama dengan EC2. RDS ini tidak memiliki public access.

Untuk keamanannya, saya membuat security group khusus RDS dengan rule inbound MySQL di port 3306 yang hanya mengizinkan koneksi dari security group EC2. Dengan konfigurasi ini, RDS tidak bisa diakses langsung dari luar VPC, melainkan hanya dari EC2 yang sudah ditentukan.

Lingkungan Lokal yang Digunakan

Seluruh proses administrasi dan pengujian dilakukan dari sisi lokal menggunakan Linux distro atau WSL. Di lingkungan inilah AWS CLI dan database client diinstal dan dijalankan.

Pendekatan ini memberi kendali penuh terhadap sistem operasi Linux, mulai dari pengelolaan package hingga debugging koneksi, tanpa bergantung pada Windows native atau browser.

Instalasi Database Client

Sebelum mengakses RDS, saya memastikan bahwa database client sudah terinstal di lingkungan Linux lokal atau WSL.

Jika menggunakan Amazon Linux versi lama, perintah yang digunakan adalah:

sudo yum install mysql -y

Sedangkan jika menggunakan Amazon Linux 2023, paket yang digunakan adalah MariaDB:

sudo dnf install mariadb105 -y

Instalasi ini dilakukan sepenuhnya di sisi lokal.

Port Forwarding ke RDS Private

Untuk menghubungkan laptop lokal ke RDS private, saya menggunakan fitur port forwarding dari AWS Systems Manager. Perintah berikut dijalankan dari terminal Linux atau WSL, dengan EC2 sebagai target dan endpoint RDS sebagai tujuan akhir koneksi.

aws ssm start-session \
--target i-xxxxxxxxxxxx \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{
"host":["endpoint-rds.amazonaws.com"],
"portNumber":["3306"],
"localPortNumber":["3306"]
}'

Setelah perintah dijalankan dan terminal menampilkan status connection opened, berarti tunnel sudah berhasil dibuat.

Koneksi Database dari Lokal

Dengan tunnel yang masih aktif, saya membuka terminal baru dan menjalankan perintah koneksi database seperti biasa.

mysql -h 127.0.0.1 -u username_rds -p

Dari sisi lokal, koneksi ini terlihat seperti mengakses database di localhost. Padahal sebenarnya, koneksi tersebut diteruskan secara aman ke RDS private melalui EC2 menggunakan SSM port forwarding.

Dengan cara ini, RDS tetap sepenuhnya berada di private subnet, tidak memiliki public endpoint, dan tidak terekspos ke internet.

Penutup

Dari project ini, saya belajar bahwa meskipun AWS Learner Lab memiliki keterbatasan, arsitektur yang aman tetap bisa dibangun. Dengan memanfaatkan NAT Gateway, IAM Role bawaan Learner Lab, AWS Systems Manager, dan fitur port forwarding, EC2 dan RDS di private subnet tetap dapat diakses dengan aman tanpa SSH dan tanpa public IP.

Pengalaman ini memberi gambaran nyata bahwa keamanan di AWS bukan soal menutup akses sepenuhnya, tetapi soal mengontrol bagaimana akses tersebut diberikan.