Deploy Aplikasi Node.js Pertama Anda di AWS: EC2 + Docker + RDS MySQL (Penjelasan Lengkap)
Ingin meluncurkan aplikasi Node.js Anda ke cloud? Panduan ini akan memandu Anda langkah demi langkah untuk men-deploy aplikasi Node.js pertama Anda di AWS menggunakan kombinasi EC2, Docker, dan RDS MySQL. Kami akan membahas semua yang perlu Anda ketahui, mulai dari menyiapkan lingkungan hingga mengoptimalkan deployment Anda. Siap untuk memulai?
Daftar Isi
- Pendahuluan: Mengapa AWS, EC2, Docker, dan RDS MySQL?
- Prasyarat: Alat dan Akun yang Anda Butuhkan
- Menyiapkan Lingkungan AWS Anda:
- Membuat dan Konfigurasi Instance EC2
- Mengamankan Instance EC2 Anda
- Membuat Instance RDS MySQL
- Konfigurasi Keamanan RDS MySQL
- Dockerisasi Aplikasi Node.js Anda:
- Membuat Dockerfile
- Membangun Image Docker
- Mendorong Image Docker ke Docker Hub (Opsional)
- Men-deploy Aplikasi Node.js Anda di EC2:
- Menghubungkan ke Instance EC2 Anda
- Menginstal Docker dan Docker Compose
- Membuat File Docker Compose
- Menjalankan Aplikasi Anda dengan Docker Compose
- Konfigurasi Aplikasi Node.js untuk Terhubung ke RDS MySQL:
- Menginstal Driver MySQL untuk Node.js
- Mengkonfigurasi Koneksi Database
- Memastikan Koneksi yang Aman
- Mengelola dan Memantau Aplikasi Anda:
- Menggunakan AWS CloudWatch
- Log Aplikasi
- Pembaruan dan Rollback
- Praktik Terbaik dan Tips:
- Skalabilitas
- Keamanan
- Optimasi Biaya
- Pemecahan Masalah Umum: Masalah dan Solusi Deployment
- Kesimpulan: Langkah Selanjutnya
1. Pendahuluan: Mengapa AWS, EC2, Docker, dan RDS MySQL?
Sebelum kita menyelam ke dalam detail, mari kita bahas mengapa kombinasi teknologi ini sangat efektif untuk men-deploy aplikasi Node.js:
- AWS (Amazon Web Services): AWS adalah platform cloud terkemuka yang menyediakan berbagai layanan, termasuk komputasi, penyimpanan, dan database. Ini menawarkan skalabilitas, keandalan, dan fleksibilitas yang tak tertandingi.
- EC2 (Elastic Compute Cloud): EC2 menyediakan instance server virtual di cloud, yang memberi Anda kendali penuh atas lingkungan hosting Anda. Anda dapat memilih sistem operasi, konfigurasi perangkat keras, dan perangkat lunak yang sesuai dengan kebutuhan Anda.
- Docker: Docker adalah platform kontainerisasi yang memungkinkan Anda mengemas aplikasi dan semua dependensinya ke dalam wadah yang dapat dijalankan di lingkungan apa pun. Ini memastikan konsistensi dan portabilitas di seluruh siklus hidup pengembangan.
- RDS MySQL (Relational Database Service): RDS MySQL adalah layanan database terkelola yang memudahkan untuk mengatur, mengoperasikan, dan menskalakan database MySQL di cloud. Ini menghilangkan tugas administrasi database yang rumit, memungkinkan Anda untuk fokus pada pengembangan aplikasi Anda.
Dengan menggunakan kombinasi ini, Anda mendapatkan:
- Skalabilitas: AWS memungkinkan Anda untuk menskalakan aplikasi Anda secara horizontal dengan mudah dengan menambahkan lebih banyak instance EC2 sesuai kebutuhan.
- Keandalan: AWS menawarkan infrastruktur yang sangat andal dengan redundansi bawaan, memastikan aplikasi Anda selalu tersedia.
- Kemudahan Manajemen: Docker menyederhanakan deployment dan manajemen aplikasi, sementara RDS MySQL menghilangkan overhead pengelolaan database.
- Efisiensi Biaya: Anda hanya membayar untuk sumber daya yang Anda gunakan, dan Anda dapat mengoptimalkan biaya Anda dengan memilih instance EC2 dan konfigurasi RDS MySQL yang tepat.
2. Prasyarat: Alat dan Akun yang Anda Butuhkan
Sebelum Anda memulai, pastikan Anda memiliki yang berikut:
- Akun AWS: Jika Anda belum memiliki akun, daftar di AWS.
- AWS CLI (Command Line Interface): Instal dan konfigurasi AWS CLI di mesin Anda. Ini akan memungkinkan Anda untuk berinteraksi dengan layanan AWS dari baris perintah. Ikuti petunjuk di dokumentasi AWS CLI.
- Node.js dan npm (Node Package Manager): Pastikan Anda telah menginstal Node.js dan npm di mesin Anda. Anda dapat mengunduhnya dari situs web Node.js.
- Docker: Instal Docker di mesin Anda. Ikuti petunjuk di dokumentasi Docker.
- Docker Hub Account (Opsional): Jika Anda ingin menyimpan image Docker Anda di cloud, buat akun di Docker Hub.
3. Menyiapkan Lingkungan AWS Anda
Langkah pertama adalah menyiapkan lingkungan AWS Anda dengan membuat instance EC2 dan instance RDS MySQL.
Membuat dan Konfigurasi Instance EC2
- Masuk ke AWS Management Console: Buka AWS Management Console dan masuk dengan kredensial akun Anda.
- Buka Layanan EC2: Cari “EC2” di bilah pencarian dan klik untuk membuka layanan EC2.
- Luncurkan Instance: Klik tombol “Luncurkan Instance”.
- Pilih AMI (Amazon Machine Image): Pilih AMI yang sesuai untuk aplikasi Node.js Anda. Ubuntu Server adalah pilihan yang populer.
- Pilih Tipe Instance: Pilih tipe instance yang sesuai dengan kebutuhan Anda. T2.micro adalah pilihan yang baik untuk pengujian dan pengembangan.
- Konfigurasi Detail Instance: Konfigurasikan detail instance, seperti jumlah instance, jaringan, subnet, dan peran IAM.
- Jaringan: Pilih VPC (Virtual Private Cloud) default atau buat yang baru.
- Subnet: Pilih subnet publik.
- Penugasan Alamat IP Publik Otomatis: Aktifkan opsi ini untuk memberikan alamat IP publik ke instance Anda.
- Peran IAM: Buat atau pilih peran IAM dengan izin yang diperlukan untuk mengakses layanan AWS lainnya, seperti S3 atau CloudWatch.
- Tambahkan Penyimpanan: Tentukan ukuran dan tipe penyimpanan untuk instance Anda.
- Tambahkan Tag: Tambahkan tag untuk mengidentifikasi dan mengelola instance Anda dengan mudah.
- Konfigurasi Grup Keamanan: Konfigurasikan grup keamanan untuk mengizinkan lalu lintas masuk dan keluar ke instance Anda.
- SSH (Port 22): Izinkan lalu lintas masuk dari alamat IP Anda untuk memungkinkan koneksi SSH.
- HTTP (Port 80): Izinkan lalu lintas masuk dari mana saja (0.0.0.0/0) untuk memungkinkan akses web.
- HTTPS (Port 443): Izinkan lalu lintas masuk dari mana saja (0.0.0.0/0) untuk memungkinkan akses web yang aman.
- Custom TCP (Port Aplikasi Anda): Jika aplikasi Node.js Anda berjalan di port yang berbeda (misalnya, 3000), izinkan lalu lintas masuk ke port tersebut.
- Tinjau dan Luncurkan: Tinjau konfigurasi Anda dan klik “Luncurkan”.
- Pilih Pasangan Kunci: Pilih pasangan kunci yang ada atau buat yang baru. Pasangan kunci ini akan digunakan untuk terhubung ke instance Anda melalui SSH. Simpan file kunci privat (.pem) di lokasi yang aman.
- Luncurkan Instance: Klik “Luncurkan Instance”.
Mengamankan Instance EC2 Anda
Setelah instance EC2 Anda berjalan, penting untuk mengamankannya untuk mencegah akses yang tidak sah.
- Nonaktifkan login root SSH: Edit file `/etc/ssh/sshd_config` dan atur `PermitRootLogin no`.
- Ubah port SSH default: Edit file `/etc/ssh/sshd_config` dan ubah port default (22) ke port yang berbeda.
- Gunakan firewall: Gunakan firewall seperti `ufw` untuk membatasi akses ke instance Anda.
- Aktifkan pembaruan keamanan otomatis: Konfigurasikan sistem Anda untuk menginstal pembaruan keamanan secara otomatis.
Membuat Instance RDS MySQL
- Buka Layanan RDS: Cari “RDS” di bilah pencarian dan klik untuk membuka layanan RDS.
- Buat Database: Klik tombol “Buat Database”.
- Pilih Mesin Database: Pilih “MySQL”.
- Pilih Template: Pilih template “Pengembangan dan Pengujian” untuk tujuan pengujian.
- Konfigurasi Pengaturan: Konfigurasikan pengaturan database, seperti ID instance database, nama pengguna master, dan kata sandi master.
- ID Instance Database: Berikan nama deskriptif untuk instance database Anda.
- Nama Pengguna Master: Masukkan nama pengguna untuk akun master.
- Kata Sandi Master: Masukkan kata sandi yang kuat untuk akun master. Simpan kata sandi ini di lokasi yang aman.
- Pilih Tipe Instance DB: Pilih tipe instance DB yang sesuai dengan kebutuhan Anda. Db.t2.micro adalah pilihan yang baik untuk pengujian dan pengembangan.
- Konfigurasi Penyimpanan: Konfigurasikan ukuran dan tipe penyimpanan untuk database Anda.
- Konfigurasi Konektivitas: Konfigurasikan konektivitas database Anda.
- Jaringan Virtual (VPC): Pilih VPC yang sama dengan instance EC2 Anda.
- Grup Subnet DB: Pilih grup subnet DB yang sesuai.
- Akses Publik: Pilih “Tidak” untuk mencegah akses publik ke database Anda.
- Grup Keamanan VPC: Pilih grup keamanan yang mengizinkan lalu lintas masuk dari instance EC2 Anda di port 3306 (port default MySQL).
- Konfigurasi Pengaturan Tambahan: Konfigurasikan pengaturan tambahan, seperti nama database awal, port database, dan opsi pencadangan.
- Nama Database Awal: Berikan nama untuk database awal Anda.
- Port Database: Biarkan port default (3306) kecuali jika Anda memiliki alasan khusus untuk mengubahnya.
- Pencadangan Otomatis: Aktifkan pencadangan otomatis untuk melindungi data Anda.
- Buat Database: Klik “Buat Database”.
Konfigurasi Keamanan RDS MySQL
Setelah instance RDS MySQL Anda berjalan, penting untuk mengamankannya untuk mencegah akses yang tidak sah.
- Pastikan akses publik dinonaktifkan: Verifikasi bahwa akses publik ke instance RDS Anda dinonaktifkan.
- Gunakan grup keamanan: Konfigurasikan grup keamanan untuk hanya mengizinkan lalu lintas masuk dari instance EC2 Anda.
- Enkripsi data saat istirahat: Aktifkan enkripsi data saat istirahat untuk melindungi data Anda.
- Rotasi kata sandi: Secara teratur rotasi kata sandi master untuk akun database Anda.
4. Dockerisasi Aplikasi Node.js Anda
Sekarang, mari kita dockerisasi aplikasi Node.js Anda. Ini melibatkan pembuatan Dockerfile yang menentukan cara membangun image Docker Anda.
Membuat Dockerfile
Buat file bernama `Dockerfile` di direktori root aplikasi Node.js Anda dengan konten berikut:
“`dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [“npm”, “start”]
“`
Penjelasan:
- FROM node:16-alpine: Ini menentukan image dasar yang akan digunakan untuk image Docker Anda. `node:16-alpine` adalah image Node.js berbasis Alpine Linux yang ringan.
- WORKDIR /app: Ini mengatur direktori kerja di dalam container ke `/app`.
- COPY package*.json ./: Ini menyalin file `package.json` dan `package-lock.json` (jika ada) ke direktori kerja.
- RUN npm install: Ini menginstal dependensi Node.js yang ditentukan dalam `package.json`.
- COPY . . : Ini menyalin semua file aplikasi dari direktori saat ini ke direktori kerja.
- EXPOSE 3000: Ini mengekspos port 3000 dari container. Ini adalah port yang akan digunakan aplikasi Node.js Anda untuk mendengarkan koneksi.
- CMD [“npm”, “start”]: Ini menentukan perintah yang akan dijalankan saat container dimulai. Dalam hal ini, ia menjalankan perintah `npm start`, yang biasanya memulai aplikasi Node.js Anda.
Membangun Image Docker
Buka terminal dan arahkan ke direktori root aplikasi Node.js Anda. Kemudian, jalankan perintah berikut untuk membangun image Docker:
“`bash
docker build -t nama-aplikasi-anda .
“`
Ganti `nama-aplikasi-anda` dengan nama yang Anda inginkan untuk image Docker Anda. Tanda titik (`.`) menunjukkan bahwa Dockerfile berada di direktori saat ini.
Mendorong Image Docker ke Docker Hub (Opsional)
Jika Anda ingin menyimpan image Docker Anda di cloud, Anda dapat mendorongnya ke Docker Hub.
- Masuk ke Docker Hub: Jalankan perintah `docker login` dan masukkan kredensial Docker Hub Anda.
- Tag image Anda: Tag image Anda dengan nama pengguna Docker Hub Anda dan nama repositori. Misalnya: `docker tag nama-aplikasi-anda nama-pengguna-anda/nama-repositori`.
- Dorong image Anda: Jalankan perintah `docker push nama-pengguna-anda/nama-repositori` untuk mendorong image Anda ke Docker Hub.
5. Men-deploy Aplikasi Node.js Anda di EC2
Sekarang, mari kita deploy aplikasi Node.js Anda di instance EC2 Anda.
Menghubungkan ke Instance EC2 Anda
Gunakan SSH untuk terhubung ke instance EC2 Anda. Gunakan perintah berikut:
“`bash
ssh -i path/to/your/key.pem ubuntu@alamat-ip-publik-instance-anda
“`
Ganti `path/to/your/key.pem` dengan jalur ke file kunci privat Anda dan `alamat-ip-publik-instance-anda` dengan alamat IP publik instance EC2 Anda.
Menginstal Docker dan Docker Compose
Setelah terhubung ke instance EC2 Anda, instal Docker dan Docker Compose.
- Perbarui daftar paket: Jalankan perintah `sudo apt update`.
- Instal dependensi: Jalankan perintah `sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release`.
- Tambahkan kunci GPG Docker: Jalankan perintah `curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg`.
- Tambahkan repositori Docker: Jalankan perintah `echo “deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null`.
- Perbarui daftar paket lagi: Jalankan perintah `sudo apt update`.
- Instal Docker: Jalankan perintah `sudo apt install docker-ce docker-ce-cli containerd.io`.
- Instal Docker Compose: Jalankan perintah `sudo apt install docker-compose`.
Membuat File Docker Compose
Buat file bernama `docker-compose.yml` di direktori root aplikasi Node.js Anda dengan konten berikut:
“`yaml
version: “3.9”
services:
app:
image: nama-aplikasi-anda
ports:
– “80:3000”
environment:
– NODE_ENV=production
– DB_HOST=nama-host-rds-anda
– DB_USER=nama-pengguna-rds-anda
– DB_PASSWORD=kata-sandi-rds-anda
– DB_NAME=nama-database-rds-anda
depends_on:
– db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: kata-sandi-root-mysql
MYSQL_DATABASE: nama-database-rds-anda
volumes:
– db_data:/var/lib/mysql
volumes:
db_data:
“`
Penjelasan:
- version: “3.9”: Ini menentukan versi format file Docker Compose.
- services: Ini mendefinisikan layanan yang akan dijalankan.
- app: Ini mendefinisikan layanan aplikasi Node.js Anda.
- image: nama-aplikasi-anda: Ini menentukan image Docker yang akan digunakan. Ganti `nama-aplikasi-anda` dengan nama image Docker Anda.
- ports: – “80:3000”: Ini memetakan port 80 dari host ke port 3000 dari container. Ini memungkinkan Anda untuk mengakses aplikasi Anda melalui port 80.
- environment: Ini menentukan variabel lingkungan yang akan diteruskan ke container.
- NODE_ENV=production: Ini mengatur lingkungan Node.js ke “production”.
- DB_HOST=nama-host-rds-anda: Ini mengatur host database ke nama host RDS Anda. Ganti `nama-host-rds-anda` dengan nama host RDS Anda.
- DB_USER=nama-pengguna-rds-anda: Ini mengatur nama pengguna database ke nama pengguna RDS Anda. Ganti `nama-pengguna-rds-anda` dengan nama pengguna RDS Anda.
- DB_PASSWORD=kata-sandi-rds-anda: Ini mengatur kata sandi database ke kata sandi RDS Anda. Ganti `kata-sandi-rds-anda` dengan kata sandi RDS Anda.
- DB_NAME=nama-database-rds-anda: Ini mengatur nama database ke nama database RDS Anda. Ganti `nama-database-rds-anda` dengan nama database RDS Anda.
- depends_on: – db: Ini menentukan bahwa layanan `app` bergantung pada layanan `db`. Docker Compose akan memastikan bahwa layanan `db` dimulai sebelum layanan `app`.
- db: Ini mendefinisikan layanan database MySQL.
- image: mysql:5.7: Ini menentukan image Docker MySQL yang akan digunakan.
- environment: Ini menentukan variabel lingkungan yang akan diteruskan ke container.
- MYSQL_ROOT_PASSWORD=kata-sandi-root-mysql: Ini mengatur kata sandi root MySQL. Ganti `kata-sandi-root-mysql` dengan kata sandi root MySQL yang kuat.
- MYSQL_DATABASE: nama-database-rds-anda: Ini membuat database dengan nama yang sama dengan yang Anda gunakan di RDS.
- volumes: – db_data:/var/lib/mysql: Ini memasang volume bernama `db_data` ke direktori `/var/lib/mysql` di dalam container. Ini memastikan bahwa data database dipertahankan di seluruh restart container.
- volumes: db_data:: Ini mendefinisikan volume bernama `db_data`.
Pastikan untuk mengganti placeholder dengan nilai yang sesuai untuk lingkungan Anda.
Menjalankan Aplikasi Anda dengan Docker Compose
Buka terminal dan arahkan ke direktori yang berisi file `docker-compose.yml`. Kemudian, jalankan perintah berikut untuk memulai aplikasi Anda:
“`bash
docker-compose up -d
“`
Opsi `-d` menjalankan aplikasi di latar belakang.
Setelah aplikasi Anda berjalan, Anda dapat mengaksesnya melalui alamat IP publik instance EC2 Anda di port 80.
6. Konfigurasi Aplikasi Node.js untuk Terhubung ke RDS MySQL
Sekarang, Anda perlu mengkonfigurasi aplikasi Node.js Anda untuk terhubung ke instance RDS MySQL Anda.
Menginstal Driver MySQL untuk Node.js
Instal driver MySQL untuk Node.js menggunakan npm:
“`bash
npm install mysql
“`
Mengkonfigurasi Koneksi Database
Di aplikasi Node.js Anda, buat file konfigurasi database (misalnya, `config/database.js`) dengan konten berikut:
“`javascript
const mysql = require(‘mysql’);
const connection = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
connection.connect((err) => {
if (err) {
console.error(‘Error connecting to database:’, err);
return;
}
console.log(‘Connected to database!’);
});
module.exports = connection;
“`
File ini membuat koneksi ke database MySQL menggunakan variabel lingkungan yang Anda definisikan dalam file `docker-compose.yml`.
Memastikan Koneksi yang Aman
Penting untuk memastikan bahwa koneksi database Anda aman. Pertimbangkan untuk menggunakan SSL untuk mengenkripsi lalu lintas antara aplikasi Node.js Anda dan instance RDS MySQL Anda.
7. Mengelola dan Memantau Aplikasi Anda
Setelah aplikasi Anda di-deploy, penting untuk mengelolanya dan memantaunya untuk memastikan bahwa aplikasi tersebut berjalan dengan lancar.
Menggunakan AWS CloudWatch
AWS CloudWatch menyediakan pemantauan dan observabilitas untuk layanan AWS Anda. Anda dapat menggunakan CloudWatch untuk memantau metrik seperti penggunaan CPU, penggunaan memori, dan lalu lintas jaringan.
Log Aplikasi
Pastikan aplikasi Anda mencatat informasi yang cukup untuk membantu Anda memecahkan masalah apa pun.
Pembaruan dan Rollback
Saat Anda membuat pembaruan pada aplikasi Anda, penting untuk memiliki rencana untuk me-rollback jika ada yang salah. Anda dapat menggunakan Docker Compose untuk dengan mudah me-rollback ke versi sebelumnya dari aplikasi Anda.
8. Praktik Terbaik dan Tips
Berikut adalah beberapa praktik terbaik dan tips untuk men-deploy aplikasi Node.js Anda di AWS:
Skalabilitas
- Gunakan load balancer: Gunakan load balancer untuk mendistribusikan lalu lintas ke beberapa instance EC2.
- Gunakan Auto Scaling: Gunakan Auto Scaling untuk secara otomatis menskalakan jumlah instance EC2 berdasarkan permintaan.
- Gunakan cache: Gunakan cache untuk mengurangi beban pada database Anda.
Keamanan
- Gunakan grup keamanan: Gunakan grup keamanan untuk membatasi akses ke instance EC2 dan instance RDS MySQL Anda.
- Enkripsi data saat istirahat: Aktifkan enkripsi data saat istirahat untuk melindungi data Anda.
- Rotasi kata sandi: Secara teratur rotasi kata sandi master untuk akun database Anda.
Optimasi Biaya
- Pilih tipe instance yang tepat: Pilih tipe instance EC2 yang sesuai dengan kebutuhan Anda.
- Gunakan Reserved Instances atau Savings Plans: Gunakan Reserved Instances atau Savings Plans untuk menghemat uang untuk komputasi.
- Hapus sumber daya yang tidak digunakan: Hapus sumber daya AWS yang tidak Anda gunakan.
9. Pemecahan Masalah Umum: Masalah dan Solusi Deployment
Berikut adalah beberapa masalah deployment umum dan solusinya:
- Masalah koneksi database: Pastikan bahwa instance EC2 Anda dapat terhubung ke instance RDS MySQL Anda. Periksa grup keamanan, konfigurasi jaringan, dan konfigurasi firewall.
- Masalah deployment Docker: Pastikan bahwa Docker dan Docker Compose diinstal dengan benar. Periksa log Docker untuk melihat kesalahan apa pun.
- Masalah aplikasi: Periksa log aplikasi untuk melihat kesalahan apa pun.
10. Kesimpulan: Langkah Selanjutnya
Selamat! Anda telah berhasil men-deploy aplikasi Node.js pertama Anda di AWS menggunakan EC2, Docker, dan RDS MySQL. Sekarang Anda dapat melanjutkan dengan mengoptimalkan deployment Anda, menambahkan fitur baru ke aplikasi Anda, dan belajar tentang layanan AWS lainnya.
Langkah selanjutnya yang mungkin termasuk:
- Menyiapkan domain dan sertifikat SSL: Amankan aplikasi Anda dengan domain khusus dan sertifikat SSL.
- Mengkonfigurasi CI/CD: Otomatiskan proses deployment Anda dengan CI/CD (Continuous Integration/Continuous Delivery).
- Menjelajahi layanan AWS lainnya: Pelajari tentang layanan AWS lainnya, seperti S3, Lambda, dan DynamoDB.
Semoga berhasil dengan perjalanan pengembangan cloud Anda!
“`