Setup Serverless Data Pipeline dengan AWS Glue dan S3: ETL Otomatis tanpa Provisioning Server

Lhuqita Fazry
Cloud Computing AWS Glue Amazon S3 ETL Serverless
Setup Serverless Data Pipeline dengan AWS Glue dan S3: ETL Otomatis tanpa Provisioning Server

Memahami Arsitektur Serverless ETL dengan AWS Glue dan S3

Pipeline ETL modern memisahkan storage dan compute secara tegas. Amazon S3 berperan sebagai data lake yang menyimpan file mentah dalam zona raw dan hasil transformasi dalam zona processed. AWS Glue berperan sebagai mesin serverless yang membaca dari zona raw dan menulis ke zona processed tanpa cluster yang perlu kami kelola.

Arsitektur ini terdiri dari empat komponen utama. Crawler memindai file di S3 dan mencatat skema ke Data Catalog. Data Catalog menyimpan metadata berupa database dan tabel yang dapat diquery. ETL Job menjalankan kode PySpark dengan alokasi DPU sesuai kebutuhan. Trigger mengatur kapan Crawler dan Job berjalan secara otomatis.

Alur kerjanya sederhana dan dapat diandalkan. Kami mengupload file CSV ke prefix s3://bucket/raw/dt=2026-09-15/. Crawler mendeteksi kolom baru dan memperbarui tabel katalog. Job membaca tabel katalog dan menulis file Parquet yang terpartisi ke prefix processed. Downstream seperti Athena dapat langsung membaca tabel katalog tanpa proses load tambahan.

Server rack di data center sebagai ilustrasi infrastruktur cloud untuk pipeline ETL

Gambar: Server rack di data center modern untuk workload cloud — Sumber: Unsplash/Tyler

Menyiapkan S3 Bucket dan IAM Role untuk Akses Glue

Struktur bucket yang rapi menentukan keberhasilan pipeline jangka panjang. Kami menggunakan dua prefix utama yaitu raw/ untuk data masuk dan processed/ untuk data bersih. Partisi tanggal seperti dt=2026-09-15 membantu Glue dan Athena memindai hanya partisi yang relevan. Format ini juga menyederhanakan retensi dan penghapusan data lama.

AWS Glue membutuhkan IAM Role dengan izin baca ke prefix raw dan izin tulis ke prefix processed. Role tersebut juga membutuhkan policy terkelola AWSGlueServiceRole untuk akses ke CloudWatch dan Catalog. Prinsip least privilege tetap berlaku di sini. Kami membatasi Resource pada ARN bucket yang spesifik, bukan *.

Perintah berikut membuat bucket dan memeriksa role yang sudah disiapkan:

bash
aws s3 mb s3://etl-serverless-rumahcoding --region ap-southeast-1

aws s3api put-object --bucket etl-serverless-rumahcoding --key raw/
aws s3api put-object --bucket etl-serverless-rumahcoding --key processed/

aws iam get-role --role-name AWSGlueServiceRole-ETL
aws s3 ls s3://etl-serverless-rumahcoding/

Blok di atas berfokus pada workflow persiapan, bukan detail tiap flag. Perintah pertama membuat bucket di region Singapore. Dua perintah berikutnya membuat prefix logis untuk zona data. Perintah keempat memverifikasi role yang akan dipakai oleh Crawler dan Job. Output yang kami harapkan berupa daftar bucket dan dokumen JSON berisi Arn dari role tersebut.

Membuat Data Catalog Otomatis dengan Glue Crawler

Crawler menyelesaikan masalah klasik yaitu perubahan skema yang tidak terdokumentasi. Tanpa katalog, setiap perubahan kolom CSV memaksa kami memperbarui kode secara manual. Crawler memindai sampel file dan menyimpulkan tipe seperti string, int, atau timestamp. Hasil inferensi tersimpan sebagai tabel di Data Catalog yang dapat diakses oleh Glue, Athena, dan Redshift Spectrum.

Konfigurasi penting meliputi Database target dan Table Prefix untuk memisahkan tabel raw dari tabel processed. Kami juga mengatur Schedule agar Crawler berjalan setiap ada file baru. Opsi Add new columns only mencegah Crawler menghapus kolom lama saat skema berubah. Pengaturan ini menjaga kompatibilitas dengan query yang sudah berjalan di production.

Python Fundamentals
Fundamental • Beginner

Python Fundamentals

Master the fundamentals of Python through hands-on, real-world projects. Designe...

Daftar

Skrip berikut membuat database dan menjalankan Crawler melalui boto3:

python
!pip install boto3

import boto3

glue = boto3.client("glue", region_name="ap-southeast-1")

glue.create_database(
    DatabaseInput={"Name": "ecommerce_raw_db", "Description": "Katalog untuk zona raw"}
)

glue.create_crawler(
    Name="ecommerce-raw-crawler",
    Role="arn:aws:iam::123456789012:role/AWSGlueServiceRole-ETL",
    DatabaseName="ecommerce_raw_db",
    TablePrefix="raw_",
    Targets={"S3Targets": [{"Path": "s3://etl-serverless-rumahcoding/raw/"}]},
    Schedule="cron(0 1 * * ? *)",
)

glue.start_crawler(Name="ecommerce-raw-crawler")
print("Crawler started, check status in Glue Console")

Logika skrip ini mudah diikuti. Kami membuat database katalog terlebih dahulu. Kemudian kami mendaftarkan Crawler dengan target path S3 dan jadwal harian. Perintah terakhir memicu eksekusi pertama. Output yang kami harapkan berupa pesan status dan tabel baru bernama raw_orders di dalam database tersebut.

Membangun ETL Job PySpark untuk Transformasi Data

ETL Job adalah tempat transformasi bisnis benar-benar terjadi. Script berjalan di atas Spark yang dikelola oleh Glue, sehingga kami tidak mengatur cluster atau versi Hadoop. Objek GlueContext menyediakan jembatan antara DynamicFrame dan DataFrame standar. DynamicFrame menangani data semi-terstruktur dengan lebih toleran terhadap nilai null dan tipe yang bercampur.

Transformasi pada contoh ini mencakup tiga langkah. Kami menghapus baris dengan order_id kosong karena baris tersebut tidak dapat dijoin. Kami melakukan cast kolom amount dari string ke double agar agregasi berjalan benar. Kami menambahkan kolom partisi dt agar output Parquet tersusun rapi per tanggal. Pola ini umum untuk data transaksi harian.

Berikut contoh job lengkap yang membaca dari katalog dan menulis ke zona processed:

python
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

args = getResolvedOptions(sys.argv, ["JOB_NAME"])
sc = SparkContext()
glueContext = GlueContext(sc)
job = Job(glueContext)
job.init(args["JOB_NAME"], args)

datasource = glueContext.create_dynamic_frame.from_catalog(
    database="ecommerce_raw_db",
    table_name="raw_orders",
)

df = datasource.toDF()
df_clean = df.filter("order_id IS NOT NULL")
df_clean = df_clean.withColumn("amount", df_clean["amount"].cast("double"))
df_clean = df_clean.withColumn("dt", df_clean["order_date"].substr(1, 10))

glueContext.write_dynamic_frame.from_options(
    frame=datasource.fromDF(df_clean, glueContext, "cleaned"),
    connection_type="s3",
    format="parquet",
    connection_options={"path": "s3://etl-serverless-rumahcoding/processed/", "partitionKeys": ["dt"]},
)

job.commit()
print("Rows written:", df_clean.count())

Workflow di atas menekankan tiga tahap utama. Tahap read mengambil data melalui katalog, bukan path mentah. Tahap transform membersihkan dan mengetik ulang kolom dengan operasi DataFrame. Tahap write menyimpan hasil sebagai Parquet yang terpartisi. Output yang kami harapkan berupa jumlah baris dan folder baru seperti processed/dt=2026-09-15/ di S3.

Mengotomatiskan Eksekusi dengan Trigger dan Monitoring CloudWatch

Pipeline manual cepat menjadi beban operasional. Trigger bertipe SCHEDULED menjalankan Crawler setiap jam satu malam. Trigger bertipe CONDITIONAL menjalankan Job hanya jika Crawler selesai dengan status SUCCEEDED. Rantai ini mencegah job membaca skema yang belum diperbarui. Fitur Job Bookmarks memastikan job hanya memproses file baru, bukan seluruh bucket.

Observabilitas berasal dari CloudWatch Logs dan Metrics. Setiap eksekusi mencatat durasi, jumlah DPU, dan error Python secara detail. Metrik glue.driver.aggregate.numCompletedStages membantu kami melihat tahap yang lambat. Alarm SNS dapat dikirim saat status berubah menjadi FAILED atau TIMEOUT. Setup ini memberi kami respons cepat tanpa memeriksa console setiap hari.

Komponen server rack sebagai ilustrasi resource compute untuk monitoring job ETL

Gambar: Detail komponen server untuk workload compute intensif — Sumber: Unsplash/Dao Hieu

Skrip berikut membuat trigger terjadwal dan memeriksa eksekusi terakhir:

python
!pip install boto3

import boto3

glue = boto3.client("glue", region_name="ap-southeast-1")

glue.create_trigger(
    Name="daily-etl-trigger",
    Type="SCHEDULED",
    Schedule="cron(30 1 * * ? *)",
    Actions=[{"JobName": "ecommerce-daily-etl", "Timeout": 60}],
    StartOnCreation=True,
)

resp = glue.get_job_runs(JobName="ecommerce-daily-etl", MaxResults=1)
state = resp["JobRuns"][0]["JobRunState"] if resp["JobRuns"] else "NO_RUNS"
print("Latest run state:", state)

Tujuan kode ini adalah otomatisasi dan verifikasi. Blok pertama mendaftarkan trigger harian dengan timeout 60 menit. Blok kedua mengambil satu eksekusi terakhir untuk validasi. Output yang kami harapkan berupa jadwal cron dan status seperti SUCCEEDED atau RUNNING.

Mengoptimalkan Biaya Performa dan Keamanan Pipeline Serverless

Biaya Glue dihitung per DPU-hour, sehingga pemilihan worker sangat berpengaruh. Tipe G.1X cocok untuk workload kecil sampai menengah dengan shuffle moderat. Kami memulai dengan 2 worker dan menaikkan hanya jika durasi melebihi SLA. Format Parquet dan partisi dt memangkas data yang dipindai oleh Athena. Kombinasi ini sering menurunkan biaya query sampai orde puluhan persen.

Keamanan membutuhkan enkripsi di dua lapisan. Enkripsi SSE-S3 melindungi file di bucket raw dan processed. Enkripsi katalog melindungi metadata skema yang mungkin berisi nama kolom sensitif. VPC endpoint untuk S3 menjaga traffic tetap di dalam jaringan AWS. Audit CloudTrail mencatat siapa yang membuat atau menghapus Crawler dan Job.

Praktik operasional yang kami rekomendasikan cukup ringkas. Kami mengaktifkan Job Bookmarks untuk semua job incremental. Kami membatasi retry maksimal dua kali agar error sistemik cepat terlihat. Kami memberi tag project:etl-serverless pada semua resource untuk pelacakan biaya. Disiplin kecil ini menjaga pipeline tetap cepat, aman, dan mudah dievaluasi setiap bulan.

Kami juga menjadwalkan review mingguan atas metrik durasi dan konsumsi DPU. Review ini membantu kami mendeteksi partisi yang tumbuh tidak wajar. Temuan tersebut menjadi dasar untuk menambah worker atau memecah job menjadi dua tahap yang lebih kecil.

Ingin mempraktikkan AWS Glue, S3, dan Athena secara langsung dengan bimbingan mentor? Ikuti bootcamp Data Engineering di Rumah Coding dan bangun portofolio pipeline serverless pertama Anda.

Kursus Terkait

Personal Finance Tracker & Analyzer (CLI)
Kursus Premium Fundamental

Python Fundamentals

Master the fundamentals of Python through hands-on, real-world projects. Designed for absolute beginners, this course takes you from writing your first line of code to building a fully functional application. By the end of this course, you will have a solid grasp of core programming concepts, data structures, and file management, laying a strong foundation for future studies in Data Science, Web Development, or Automation.

Proyek Akhir

Personal Finance Tracker & Analyzer (CLI)

  • Interactive Main Menu: A continuous loop menu allowing users to choose between adding records, viewing summaries, or exiting the app.
  • Transaction Logging: Users can input transaction types (Income/Expense), amounts, categories (e.g., Food, Salary, Transport), and descriptions.
  • Robust Input Validation: Utilizes try-except blocks to prevent the program from crashing if a user accidentally types letters instead of numbers for financial amounts.
7 Weeks Beginner
Lihat Detail Kursus
Domain-Specific AI Knowledge Assistant
Kursus Premium Machine Learning

LLM Bootcamp

This project-based bootcamp is designed for beginners to dive practically into the world of Large Language Models (LLMs). Through hands-on building, you will learn how to interact with top-tier AI APIs, master prompt engineering, orchestrate complex workflows using LangChain, and implement Retrieval-Augmented Generation (RAG) to query your own documents. By the end of this course, you will have the skills to build, test, and deploy a fully functional, custom AI web application.

Proyek Akhir

Domain-Specific AI Knowledge Assistant

  • Dynamic Document Processing: A sidebar interface allowing users to upload new PDF or TXT files, which the app automatically chunks, embeds, and stores in the vector database.
  • Context-Aware Chat UI: A modern chat interface built with Streamlit that maintains conversation history, allowing users to ask follow-up questions naturally.
  • Strict Guardrails (Anti-Hallucination): System instructions designed so the AI politely declines to answer questions that fall outside the context of the uploaded documents.
7 Weeks Beginner
Lihat Detail Kursus

Artikel Terkait