Proyek Pertama Kalian di AWS: Gabungkan EC2, S3, dan Database Biar Aplikasi Kalian Makin Keren!

Proyek AWS Pertama: Gabungkan EC2, S3, RDS untuk Aplikasi Web

PPLG

PPLG

Penulis

23 Jul 2026
29 x dilihat

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:

  1. 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.
  2. 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.
  3. 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)

  1. Login ke AWS Console. Cari layanan RDS.

  2. 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 HARUS No dan diakses dari dalam VPC!).
      • VPC security group: Create new (beri nama rds-sg).
      • Database port: 3306 (default MySQL).
    • Biarkan sisanya default, lalu klik Create database.
    • Penting: Setelah database jadi (status Available), catat Endpoint dan Port-nya.
  3. Konfigurasi Security Group RDS.

    • Masuk ke Security Groups (bisa dari halaman RDS di tab Connectivity & Security klik rds-sg yang baru kalian buat).
    • Edit Inbound Rules. Tambahkan MySQL/Aurora (3306) dengan Source berupa My IP (untuk testing koneksi dari laptop kalian) dan nanti juga perlu IP Public EC2 kalian atau Security Group EC2 kalian. Untuk sekarang, tambahkan dulu My IP.

Step 2: Luncurkan EC2 Instance Kalian

  1. Di AWS Console, cari layanan EC2.
  2. 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 nama aplikasiku-key dan Download file .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 (atau 0.0.0.0/0 untuk 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.
    • Biarkan sisanya default, lalu klik Launch instance.
  3. Setelah instance jadi (status Running), catat Public IPv4 address-nya.

Step 3: Persiapan EC2 (Install Web Server & Aplikasi)

  1. 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>
    
  2. Update dan Install yang Dibutuhkan:
    sudo apt update
    sudo apt upgrade -y
    sudo apt install -y python3-pip python3-dev nginx
    
  3. Install Konektor Database & Web Framework (Flask):
    pip3 install Flask PyMySQL
    
    (PyMySQL adalah driver untuk MySQL. Kalau pakai PostgreSQL, install psycopg2).

Step 4: Integrasi S3 untuk Static Files

  1. 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: Uncheck Block all public access (ini bahaya untuk produksi, tapi untuk demo kita butuh public access). Centang I acknowledge....
    • Biarkan sisanya default, klik Create bucket.
  2. Upload File Contoh ke S3:
    • Masuk ke bucket yang baru dibuat.
    • Klik Upload, lalu Add 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.
  3. Konfigurasi Bucket Policy (untuk Public Read):
    • Di bucket kalian, pergi ke tab Permissions.
    • Di bagian Bucket policy, klik Edit.
    • 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.
  4. Berikan Izin EC2 untuk S3 (IAM Role - Best Practice!):
    • Di AWS Console, cari layanan IAM.
    • Pilih Roles, lalu Create role.
    • Trusted entity type: AWS service.
    • Use case: EC2. Lalu Next.
    • Permissions policies: Cari AmazonS3ReadOnlyAccess dan centang. Lalu Next.
    • 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 EC2S3AccessRole dari dropdown. Klik Update IAM role.
      • Sekarang aplikasi di EC2 bisa membaca dari S3 tanpa perlu Access Key di kode!

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

  1. Install Gunicorn (server WSGI untuk Flask):

    pip3 install gunicorn boto3
    
  2. Jalankan Gunicorn (untuk testing):

    cd ~/my_app
    gunicorn --bind 0.0.0.0:5000 app:app
    

    Sekarang harusnya aplikasi kalian jalan di port 5000 di EC2. Kalian bisa coba akses http://<Public_IPv4_Address_EC2>:5000 dari browser kalian. Tapi, kita mau pakai Nginx sebagai reverse proxy. Ctrl+C untuk menghentikan Gunicorn.

  3. Buat Systemd Service untuk Gunicorn (biar aplikasi jalan otomatis saat boot):

    sudo nano /etc/systemd/system/my_app.service
    

    Isi 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.target
    

    PENTING! Ganti nilai Environment dengan 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)
    
  4. Konfigurasi Nginx sebagai Reverse Proxy:

    sudo rm /etc/nginx/sites-enabled/default
    sudo nano /etc/nginx/sites-available/my_app
    

    Isi 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) untuk SSH (Port 22) atau MySQL (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.micro untuk 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 Terminate EC2 instance, Delete RDS database, dan Delete S3 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!

5.0

Berikan Rating

Komentar (0)

Silakan login untuk memberikan komentar.

Login Sekarang

Belum ada komentar. Jadilah yang pertama!

Menyukai Artikel (1)

Pembaca (1)