Proyek AWS Pertama: Gabungkan EC2, S3, RDS untuk Aplikasi Web
Yo, gaes! Pernah kepikiran bikin aplikasi web tapi bingung mau taruh di mana biar scalable, aman, dan kece? Nah, AWS itu jawabannya! Buat kalian yang baru mau nyemplung di dunia cloud, project pertama ini penting banget buat fondasi. Kita bakal bikin aplikasi yang ngegabungin tiga layanan inti AWS: EC2 buat servernya, S3 buat nyimpen file-file statis, dan RDS (Database) buat data-data penting. Vibes-nya bakal kayak engineer sungguhan, deh!
Kenapa Proyek Ini Penting Banget, Ngab?
gini, gaes. Hampir semua aplikasi web modern itu butuh server buat ngejalanin kodenya, storage buat nyimpen aset kayak gambar atau video, dan database buat nyimpen data user, produk, atau apa pun itu. Nah, di AWS, tiga serangkai ini adalah pondasi dasarnya. Dengan menguasai project ini, kalian bakal punya core skill buat ngembangin berbagai aplikasi lain yang lebih kompleks. Skuy, gas pol!
Paham Dulu Konsep Intinya, Cuy!
Sebelum ngoding dan ngoprek, ada baiknya kita pahami dulu tiga jagoan utama kita ini:
-
Amazon EC2 (Elastic Compute Cloud): Server Virtual Kalian!
- Bayangin kalian punya komputer super canggih di cloud yang bisa kalian pakai kapan aja. Nah, itulah EC2. Ini adalah virtual server tempat aplikasi kalian (misal: Python Flask, Node.js Express, PHP Laravel) bakal jalan. Kalian bisa pilih OS, spesifikasi RAM, CPU, storage, bahkan GPU-nya sesuai kebutuhan. Fleksibel abis!
- Fungsi: Menjalankan aplikasi backend, API, web server (Nginx/Apache), dan lain-lain.
-
Amazon S3 (Simple Storage Service): Gudang Data Anti-Badai!
- S3 itu kayak hard drive tanpa batas di cloud. Kalian bisa nyimpen apa aja: gambar, video, dokumen, backup data, static website, pokoknya semua file. S3 super andal, murah, dan datanya nggak bakal gampang hilang.
- Fungsi: Menyimpan aset statis aplikasi (gambar profil, CSS, JS), user-uploaded content, backup data, hosting static website.
-
Amazon RDS (Relational Database Service): Database Tanpa Pusing!
- Kalo kalian pernah ribet setup MySQL atau PostgreSQL sendiri di server, RDS ini bakal jadi penyelamat. RDS adalah layanan managed database dari AWS. Artinya, AWS yang urus semua maintenance, backup, scaling, patching, kalian tinggal pakai aja databasenya. Enak, kan?
- Fungsi: Menyimpan data terstruktur (user accounts, transaksi, detail produk) dengan database engine populer seperti MySQL, PostgreSQL, MariaDB, SQL Server, Oracle, atau Amazon Aurora.
Gimana Mereka Bisa Nyatu dan Bikin Aplikasi Kalian Berfungsi?
- EC2 bakal jadi otaknya, ngejalanin aplikasi yang tugasnya berinteraksi sama user.
- Aplikasi di EC2 bakal request atau nyimpen data ke RDS.
- Aplikasi di EC2 juga bakal ngambil atau nyimpen file-file gede (kayak gambar) ke S3, bukan ke disk EC2-nya langsung (biar EC2-nya nggak berat dan S3 lebih murah/andal).
- User ngakses aplikasi kalian lewat IP Public EC2 atau domain yang mengarah ke EC2.
Skuy, Gas Pol! Langkah-Langkah Praktis
Oke, gaes, siap-siap buat hands-on! Ini dia step-by-step bikin project pertama kalian di AWS.
Prasyarat:
- Akun AWS (manfaatkan Free Tier!).
- Sedikit pengetahuan dasar Linux command.
- Tool SSH client (PuTTY/Git Bash/Terminal).
Step 1: Siapkan Database Kalian di AWS RDS (MySQL)
-
Login ke AWS Console. Cari layanan
RDS. -
Pilih "Create database".
- Pilih
Standard Create. - Engine Options:
MySQL. - Templates: Pilih
Free tier(penting banget biar nggak boncos di awal!). - DB instance identifier:
aplikasiku-db(bebas). - Master username:
admin(bebas, tapi ingat!). - Master password: Buat password yang kuat dan catat!
- DB instance size: Biarkan
db.t2.micro(Free Tier). - Storage: Biarkan
General Purpose SSD,20 GiB. - Connectivity:
- VPC: Pilih
default VPC. - Public access:
Yes(untuk demo awal biar bisa diakses dari luar EC2, tapi di produksi HARUSNodan diakses dari dalam VPC!). - VPC security group:
Create new(beri namards-sg). - Database port:
3306(default MySQL).
- VPC: Pilih
- Biarkan sisanya default, lalu klik
Create database. - Penting: Setelah database jadi (status
Available), catatEndpointdanPort-nya.
- Pilih
-
Konfigurasi Security Group RDS.
- Masuk ke
Security Groups(bisa dari halaman RDS di tabConnectivity & Securityklikrds-sgyang baru kalian buat). - Edit
Inbound Rules. TambahkanMySQL/Aurora (3306)denganSourceberupaMy IP(untuk testing koneksi dari laptop kalian) dan nanti juga perluIP Public EC2kalian atauSecurity Group EC2kalian. Untuk sekarang, tambahkan duluMy IP.
- Masuk ke
Step 2: Luncurkan EC2 Instance Kalian
- Di AWS Console, cari layanan
EC2. - Klik "Launch Instances".
- Name:
aplikasiku-server(bebas). - Application and OS Images (Amazon Machine Image - AMI): Pilih
Ubuntu Server 22.04 LTS (HVM), SSD Volume Type(Free tier eligible). - Instance type:
t2.micro(Free tier eligible). - Key pair (login):
Create new key pair. Beri namaaplikasiku-keydanDownloadfile.pem-nya. SIMPAN BAIK-BAIK FILE INI! - Network settings:
Edit.- VPC:
default VPC. - Subnet: Biarkan
default. - Auto-assign public IP:
Enable. - Firewall (security groups):
Create security group.- Security group name:
ec2-web-sg. - Description:
Security Group for Web Server. - Inbound rules:
- Rule 1:
SSH|Source type: My IP(atau0.0.0.0/0untuk demo, tapi tidak disarankan!). - Rule 2:
HTTP (Port 80)|Source type: 0.0.0.0/0. - Rule 3 (optional, jika pakai HTTPS):
HTTPS (Port 443)|Source type: 0.0.0.0/0.
- Rule 1:
- Security group name:
- Biarkan sisanya default, lalu klik
Launch instance.
- Name:
- Setelah instance jadi (status
Running), catatPublic IPv4 address-nya.
Step 3: Persiapan EC2 (Install Web Server & Aplikasi)
- SSH ke EC2 Instance Kalian:
# Ganti path/to/aplikasiku-key.pem dengan lokasi file key kalian # Ganti <Public_IPv4_Address> dengan IP Public EC2 kalian chmod 400 path/to/aplikasiku-key.pem ssh -i "path/to/aplikasiku-key.pem" ubuntu@<Public_IPv4_Address> - Update dan Install yang Dibutuhkan:
sudo apt update sudo apt upgrade -y sudo apt install -y python3-pip python3-dev nginx - Install Konektor Database & Web Framework (Flask):
(PyMySQL adalah driver untuk MySQL. Kalau pakai PostgreSQL, installpip3 install Flask PyMySQLpsycopg2).
Step 4: Integrasi S3 untuk Static Files
- Buat S3 Bucket:
- Di AWS Console, cari layanan
S3. - Klik
Create bucket. - Bucket name:
aplikasiku-static-files-<nama_unik>(nama harus unik global). - AWS Region: Pilih region yang sama dengan EC2 dan RDS kalian.
- Object Ownership: Pilih
ACLs disabled (recommended). - Block Public Access settings for this bucket:
UncheckBlock all public access(ini bahaya untuk produksi, tapi untuk demo kita butuh public access). CentangI acknowledge.... - Biarkan sisanya default, klik
Create bucket.
- Di AWS Console, cari layanan
- Upload File Contoh ke S3:
- Masuk ke bucket yang baru dibuat.
- Klik
Upload, laluAdd files. Pilih gambar apa saja dari komputer kalian. - Setelah diupload, klik file gambarnya, lalu ke tab
Object URL. Catat URL ini, kita akan pakai di aplikasi.
- Konfigurasi Bucket Policy (untuk Public Read):
- Di bucket kalian, pergi ke tab
Permissions. - Di bagian
Bucket policy, klikEdit. - Paste policy berikut (ganti
<YOUR_BUCKET_NAME>dengan nama bucket kalian):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::<YOUR_BUCKET_NAME>/*" ] } ] }Save changes. Sekarang objek di S3 kalian bisa diakses secara publik lewat URL-nya.
- Di bucket kalian, pergi ke tab
- Berikan Izin EC2 untuk S3 (IAM Role - Best Practice!):
- Di AWS Console, cari layanan
IAM. - Pilih
Roles, laluCreate role. - Trusted entity type:
AWS service. - Use case:
EC2. LaluNext. - Permissions policies: Cari
AmazonS3ReadOnlyAccessdan centang. LaluNext. - Role name:
EC2S3AccessRole(bebas). - Klik
Create role. - Attach Role ke EC2 Instance: Kembali ke halaman EC2, pilih instance
aplikasiku-server.- Klik
Actions>Security>Modify IAM role. - Pilih
EC2S3AccessRoledari dropdown. KlikUpdate IAM role. - Sekarang aplikasi di EC2 bisa membaca dari S3 tanpa perlu Access Key di kode!
- Klik
- Di AWS Console, cari layanan
Step 5: Bikin Aplikasi Python Flask Sederhana
Buat sebuah folder untuk proyek kalian di EC2, misalnya /home/ubuntu/my_app.
mkdir ~/my_app
cd ~/my_app
Buat file app.py:
# ~/my_app/app.py
from flask import Flask, render_template_string
import pymysql
import os
import boto3
app = Flask(__name__)
# Konfigurasi Database (Ganti dengan detail RDS kalian!)
DB_HOST = os.environ.get('DB_HOST', 'your-rds-endpoint.us-east-1.rds.amazonaws.com') # Ganti!
DB_USER = os.environ.get('DB_USER', 'admin') # Ganti!
DB_PASSWORD = os.environ.get('DB_PASSWORD', 'your_db_password') # Ganti!
DB_NAME = os.environ.get('DB_NAME', 'my_database') # Ganti dengan nama database yang kalian buat di RDS
# Konfigurasi S3
S3_BUCKET_NAME = os.environ.get('S3_BUCKET_NAME', 'aplikasiku-static-files-namaunik') # Ganti!
S3_REGION = os.environ.get('S3_REGION', 'us-east-1') # Ganti dengan region S3 kalian!
STATIC_IMAGE_KEY = 'sample.jpg' # Nama file gambar yang kalian upload ke S3
# Inisialisasi S3 client
s3_client = boto3.client('s3', region_name=S3_REGION)
# Fungsi untuk koneksi ke database
def get_db_connection():
try:
conn = pymysql.connect(
host=DB_HOST,
user=DB_USER,
password=DB_PASSWORD,
database=DB_NAME,
cursorclass=pymysql.cursors.DictCursor
)
return conn
except pymysql.Error as e:
print(f"Error connecting to MySQL DB: {e}")
return None
@app.route('/')
def index():
db_status = "Tidak Terkoneksi ke DB"
data_dari_db = []
conn = get_db_connection()
if conn:
try:
with conn.cursor() as cursor:
# Contoh: Buat tabel jika belum ada
cursor.execute("""
CREATE TABLE IF NOT EXISTS messages (
id INT AUTO_INCREMENT PRIMARY KEY,
content VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
# Contoh: Insert data jika tabel kosong (opsional)
cursor.execute("INSERT IGNORE INTO messages (id, content) VALUES (1, 'Halo dari Aplikasi AWS-ku!')")
conn.commit()
cursor.execute("SELECT * FROM messages ORDER BY id DESC LIMIT 5")
data_dari_db = cursor.fetchall()
db_status = "Terkoneksi ke DB!"
except Exception as e:
db_status = f"Error DB: {e}"
finally:
conn.close()
# URL gambar dari S3
try:
s3_image_url = f"https://{S3_BUCKET_NAME}.s3.{S3_REGION}.amazonaws.com/{STATIC_IMAGE_KEY}"
# Atau jika pakai boto3 untuk generate presigned URL (lebih aman untuk private objects)
# s3_image_url = s3_client.generate_presigned_url('get_object',
# Params={'Bucket': S3_BUCKET_NAME,
# 'Key': STATIC_IMAGE_KEY},
# ExpiresIn=3600) # URL berlaku 1 jam
except Exception as e:
s3_image_url = f"Error mengambil URL S3: {e}"
template = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Project AWS Pertama Kalian!</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; background-color: #f4f4f4; color: #333; }
.container { background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); max-width: 800px; margin: auto; }
h1 { color: #0056b3; }
.status { margin-top: 20px; padding: 10px; border-radius: 5px; }
.db-ok { background-color: #e6ffe6; border: 1px solid #00cc00; color: #008000; }
.db-error { background-color: #ffe6e6; border: 1px solid #cc0000; color: #cc0000; }
img { max-width: 100%; height: auto; display: block; margin-top: 20px; border-radius: 5px; }
.data-list { margin-top: 20px; }
.data-item { background-color: #e9ecef; padding: 10px; margin-bottom: 5px; border-radius: 3px; }
</style>
</head>
<body>
<div class="container">
<h1>Selamat Datang di Aplikasi AWS Kalian!</h1>
<p>Ini dia aplikasi web pertama kalian yang jalan di EC2, konek ke RDS, dan pake S3!</p>
<div class="status {{ 'db-ok' if 'Terkoneksi' in db_status else 'db-error' }}">
<strong>Status Database:</strong> {{ db_status }}
</div>
{% if data_dari_db %}
<div class="data-list">
<h3>Data dari Database:</h3>
{% for item in data_dari_db %}
<div class="data-item">
<strong>ID:</strong> {{ item.id }} <br>
<strong>Pesan:</strong> {{ item.content }} <br>
<strong>Waktu:</strong> {{ item.created_at }}
</div>
{% endfor %}
</div>
{% else %}
<p>Belum ada data dari database, atau ada masalah.</p>
{% endif %}
<h3>Gambar dari S3:</h3>
<p>Ini adalah gambar yang diambil dari S3 bucket kalian:</p>
<img src="{{ s3_image_url }}" alt="Gambar dari S3">
<p><small>URL Gambar S3: {{ s3_image_url }}</small></p>
</div>
</body>
</html>
"""
return render_template_string(template, db_status=db_status, data_dari_db=data_dari_db, s3_image_url=s3_image_url)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
PENTING! Ganti nilai DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, S3_BUCKET_NAME, dan S3_REGION di app.py sesuai dengan konfigurasi kalian. Gunakan environment variables (seperti os.environ.get) adalah best practice agar kredensial tidak tertulis langsung di kode.
Step 6: Jalankan Aplikasi dengan Gunicorn dan Nginx
-
Install Gunicorn (server WSGI untuk Flask):
pip3 install gunicorn boto3 -
Jalankan Gunicorn (untuk testing):
cd ~/my_app gunicorn --bind 0.0.0.0:5000 app:appSekarang harusnya aplikasi kalian jalan di port 5000 di EC2. Kalian bisa coba akses
http://<Public_IPv4_Address_EC2>:5000dari browser kalian. Tapi, kita mau pakai Nginx sebagai reverse proxy.Ctrl+Cuntuk menghentikan Gunicorn. -
Buat Systemd Service untuk Gunicorn (biar aplikasi jalan otomatis saat boot):
sudo nano /etc/systemd/system/my_app.serviceIsi dengan ini:
[Unit] Description=Gunicorn instance to serve my_app After=network.target [Service] User=ubuntu Group=www-data WorkingDirectory=/home/ubuntu/my_app Environment="DB_HOST=your-rds-endpoint.us-east-1.rds.amazonaws.com" Environment="DB_USER=admin" Environment="DB_PASSWORD=your_db_password" Environment="DB_NAME=my_database" Environment="S3_BUCKET_NAME=aplikasiku-static-files-namaunik" Environment="S3_REGION=us-east-1" ExecStart=/usr/bin/python3 -m gunicorn --workers 3 --bind unix:my_app.sock -m 007 app:app Restart=always [Install] WantedBy=multi-user.targetPENTING! Ganti nilai
Environmentdengan detail AWS kalian! Simpan dan keluar (Ctrl+X, Y, Enter).Aktifkan dan mulai service:
sudo systemctl daemon-reload sudo systemctl start my_app sudo systemctl enable my_app sudo systemctl status my_app # Cek status, pastikan Active (running) -
Konfigurasi Nginx sebagai Reverse Proxy:
sudo rm /etc/nginx/sites-enabled/default sudo nano /etc/nginx/sites-available/my_appIsi dengan ini:
server { listen 80; server_name <Public_IPv4_Address>; # Ganti dengan IP Public EC2 kalian atau domain kalian location / { include proxy_params; proxy_pass http://unix:/home/ubuntu/my_app/my_app.sock; } }Simpan dan keluar.
Aktifkan konfigurasi Nginx:
sudo ln -s /etc/nginx/sites-available/my_app /etc/nginx/sites-enabled sudo nginx -t # Tes konfigurasi Nginx sudo systemctl restart nginx
Step 7: Tes, Tes, Tes!
Sekarang, buka browser kalian dan akses http://<Public_IPv4_Address_EC2>.
Kalian seharusnya melihat aplikasi Flask sederhana yang menampilkan status koneksi ke RDS dan gambar yang diambil dari S3! Keren, kan?
Spill Kodenya, Ngab! (Contoh Implementasi)
Kode di atas adalah contoh app.py dan konfigurasi my_app.service serta nginx.conf. Ingat untuk selalu mengganti placeholder dengan informasi AWS kalian yang sebenarnya.
Best Practices & Tips Jitu
- Security Group Itu Kunci! Jangan pernah buka port
0.0.0.0/0(akses dari mana saja) untukSSH (Port 22)atauMySQL (Port 3306)di lingkungan produksi. Hanya buka untuk IP yang benar-benar dibutuhkan atau Security Group lain yang sudah kalian atur. - IAM Roles, Bukan Hardcode Access Key! Seperti yang kita lakukan untuk akses S3 dari EC2, selalu gunakan IAM Role. Ini jauh lebih aman daripada menyimpan AWS Access Key/Secret Key langsung di kode atau di server.
- Manfaatkan Free Tier! AWS punya Free Tier yang lumayan generous. Untuk project awal ini, pastikan kalian pakai instance
t2.micrountuk EC2 dan RDS, serta penyimpanan S3 di batas Free Tier. Rajin cek billing kalian biar nggak kaget! - Monitoring Itu Wajib! Gunakan CloudWatch untuk memantau performa EC2 dan RDS kalian. Ini penting buat identifikasi masalah atau jika perlu scaling up.
- Cleanup Setelah Selesai! Kalau project ini cuma buat latihan, jangan lupa
TerminateEC2 instance,DeleteRDS database, danDeleteS3 bucket kalian. Ini penting banget biar nggak ada biaya tak terduga!
Kesimpulan
Gimana, gaes? Lumayan kan project pertama kalian di AWS? Kalian baru aja berhasil bikin sebuah stack aplikasi web yang jalan di EC2, datanya disimpan di RDS, dan aset statisnya diurus sama S3. Ini adalah fondasi yang kokoh banget buat kalian nge-deploy aplikasi-aplikasi lain yang lebih gila lagi.
Jangan berhenti di sini ya! Eksplorasi lebih jauh fitur-fitur AWS lainnya. Ada banyak banget yang bisa kalian pelajari. AWS itu dunia tanpa batas, jadi terus belajar dan ngoprek! Semangat, para calon cloud architect!
Berikan Rating
Komentar (0)
Silakan login untuk memberikan komentar.
Login SekarangKata Kunci
Pembaca (1)
Belum ada komentar. Jadilah yang pertama!