Otomatisasi Cerdas: Menyalakan & Menghentikan Instance EC2 AWS Pilihan Anda dengan Ansible dan Shell Script
Panduan komprehensif untuk mengelola siklus hidup instance EC2 secara fleksibel dan efisien.
Mengelola banyak instance Amazon Web Services (AWS) EC2 bisa menjadi tugas yang rumit, terutama ketika Anda perlu menyalakan atau menghentikannya secara selektif untuk mengoptimalkan biaya atau mengelola lingkungan pengembangan/pengujian. Untungnya, dengan kombinasi kekuatan Ansible untuk otomatisasi dan fleksibilitas skrip shell (.sh), Anda dapat membuat alur kerja yang memungkinkan Anda memilih instance mana yang akan dikelola.
Sorotan Utama
- Kontrol Penuh: Pilih instance EC2 spesifik yang ingin Anda nyalakan atau hentikan berdasarkan ID atau tag.
- Efisiensi Biaya: Otomatiskan penghentian instance yang tidak digunakan di luar jam kerja atau saat tidak diperlukan.
- Otomatisasi Fleksibel: Gabungkan Ansible Playbook dengan skrip shell interaktif untuk kemudahan penggunaan.
Persiapan Awal: Fondasi Otomatisasi Anda
Sebelum Anda dapat mengotomatiskan pengelolaan instance EC2, ada beberapa prasyarat dan konfigurasi yang perlu disiapkan di mesin kontrol Anda (tempat Anda akan menjalankan Ansible dan skrip shell).
Instalasi Alat yang Diperlukan
Pastikan perangkat lunak berikut terinstal di sistem Anda:
- Ansible: Alat otomatisasi utama. Instal menggunakan pip:
pip install ansible - AWS CLI: Antarmuka baris perintah untuk berinteraksi dengan layanan AWS. Ikuti panduan instalasi resmi AWS. Diperlukan jika skrip shell Anda menggunakan perintah AWS CLI untuk mendapatkan daftar instance.
- Python Libraries (boto3 & botocore): Modul AWS Ansible bergantung pada pustaka ini. Biasanya terinstal bersama Ansible atau AWS CLI, tetapi Anda bisa memastikan dengan:
pip install boto3 botocore - Ansible AWS Collection: Kumpulan modul Ansible untuk AWS. Instal dengan:
ansible-galaxy collection install amazon.aws
Konfigurasi Kredensial AWS
Ansible dan AWS CLI memerlukan kredensial untuk mengakses akun AWS Anda. Cara yang umum adalah menggunakan variabel lingkungan. Tambahkan baris berikut ke file ~/.bashrc atau ~/.bash_profile Anda, ganti placeholder dengan nilai sebenarnya:
# Konfigurasi Kredensial AWS
export AWS_ACCESS_KEY_ID='YOUR_AWS_ACCESS_KEY_ID'
export AWS_SECRET_ACCESS_KEY='YOUR_AWS_SECRET_ACCESS_KEY'
export AWS_DEFAULT_REGION='your-aws-region' # Contoh: us-east-1
Setelah menambahkan, muat ulang konfigurasi shell Anda dengan perintah source ~/.bashrc (atau file yang relevan).
Perizinan IAM (Identity and Access Management)
Pengguna atau peran IAM yang kredensialnya Anda gunakan harus memiliki izin yang cukup untuk mendeskripsikan, memulai, dan menghentikan instance EC2. Praktik terbaik adalah menerapkan prinsip *least privilege*, memberikan hanya izin yang diperlukan (misalnya, AmazonEC2FullAccess mungkin terlalu luas; pertimbangkan kebijakan khusus).
Membuat Playbook Ansible yang Dinamis
Ansible Playbook adalah inti dari otomatisasi ini. Playbook ini akan berisi instruksi untuk menyalakan atau menghentikan instance EC2 berdasarkan parameter yang diterimanya.
Memilih Modul yang Tepat: amazon.aws.ec2_instance
Modul amazon.aws.ec2_instance adalah modul modern dan direkomendasikan untuk mengelola siklus hidup instance EC2, termasuk memulai dan menghentikannya. Modul ini menggantikan modul ec2 yang lebih lama.
Contoh Playbook Dinamis (manage_ec2_instances.yml)
Playbook ini dirancang untuk menerima daftar ID instance dan status yang diinginkan (berjalan atau berhenti) sebagai variabel. Ini membuatnya fleksibel untuk digunakan oleh skrip shell.
Kode Playbook
---
- name: Manage AWS EC2 Instances State
hosts: localhost # Menjalankan playbook di mesin lokal
gather_facts: false # Tidak perlu mengumpulkan fakta tentang host
connection: local # Koneksi lokal karena kita berinteraksi dengan AWS API
vars:
instance_ids_to_manage: [] # Daftar ID instance (akan diisi oleh skrip shell)
desired_state: "running" # Status target: 'running' atau 'stopped' (diisi oleh skrip shell)
aws_region: "your-aws-region" # Ganti dengan region AWS default Anda
tasks:
- name: Ensure EC2 instances are in the desired state
amazon.aws.ec2_instance:
instance_ids: "{{ instance_ids_to_manage }}" # Menggunakan variabel list ID instance
region: "{{ aws_region }}" # Menggunakan variabel region
state: "{{ desired_state }}" # Menggunakan variabel status target ('running' atau 'stopped')
wait: true # Menunggu hingga instance mencapai status yang diinginkan
delegate_to: localhost # Delegasikan tugas ke localhost
run_once: true # Jalankan tugas ini hanya sekali
when: instance_ids_to_manage is defined and instance_ids_to_manage | length > 0 # Hanya berjalan jika ada ID instance
Catatan Penting:
- Ganti
your-aws-regiondengan region AWS tempat instance Anda berada. - Parameter
wait: truememastikan Ansible menunggu konfirmasi dari AWS bahwa instance telah berhasil dimulai atau dihentikan sebelum melanjutkan. - Kondisi
whenmencegah playbook berjalan jika tidak ada ID instance yang diberikan.
Dashboard AWS EC2 menyediakan gambaran umum instance Anda.
Membuat Skrip Shell (.sh) untuk Seleksi Interaktif
Skrip shell bertindak sebagai antarmuka pengguna, memungkinkan Anda memilih instance dan tindakan (mulai/hentikan) sebelum memanggil playbook Ansible.
Tujuan Skrip
Skrip ini akan:
- (Opsional) Menampilkan daftar instance yang tersedia berdasarkan kriteria tertentu (misalnya, tag).
- Meminta pengguna memasukkan ID instance yang ingin dikelola.
- Meminta pengguna memilih tindakan (start atau stop).
- Memanggil playbook Ansible (
manage_ec2_instances.yml) dengan variabel yang sesuai.
Metode Seleksi Instance
Anda bisa mengadaptasi skrip untuk berbagai cara memilih instance:
- Berdasarkan ID Instance Langsung: Pengguna memasukkan daftar ID instance secara manual. Ini adalah pendekatan paling langsung.
- Berdasarkan Tag (dengan AWS CLI): Skrip menggunakan
aws ec2 describe-instancesuntuk memfilter dan menampilkan instance dengan tag tertentu (misalnya,Environment=Development), lalu pengguna memilih dari daftar tersebut.
Contoh Skrip Shell (manage_ec2.sh)
Skrip berikut ini mengadopsi pendekatan input ID langsung untuk kesederhanaan, tetapi dapat diperluas untuk menyertakan logika filtering tag menggunakan AWS CLI jika diperlukan.
Kode Skrip Shell
#!/bin/bash
# File playbook Ansible
PLAYBOOK="manage_ec2_instances.yml"
# Region AWS default (bisa diambil dari env var jika diset)
DEFAULT_REGION="${AWS_DEFAULT_REGION:-your-aws-region}" # Ganti your-aws-region jika tidak diset di env
# --- Fungsi Bantuan ---
function display_usage() {
echo "Penggunaan: $0"
echo "Skrip ini akan memandu Anda untuk memulai atau menghentikan instance EC2."
exit 1
}
# --- Logika Utama ---
echo "==============================================="
echo " Skrip Manajemen Instance EC2 dengan Ansible "
echo "==============================================="
echo ""
# 1. Minta Tindakan (Start atau Stop)
while true; do
read -p "Pilih tindakan [start/stop]: " ACTION
ACTION=$(echo "$ACTION" | tr '[:upper:]' '[:lower:]') # Konversi ke huruf kecil
if [[ "$ACTION" == "start" || "$ACTION" == "stop" ]]; then
break
else
echo "Input tidak valid. Harap masukkan 'start' atau 'stop'."
fi
done
# 2. Minta ID Instance
echo "Masukkan ID instance yang ingin Anda kelola."
echo "Pisahkan beberapa ID dengan spasi (contoh: i-123abc i-456def)"
read -p "ID Instance: " -a INSTANCE_ID_ARRAY # Baca ke dalam array bash
# Validasi input ID Instance
if [ ${#INSTANCE_ID_ARRAY[@]} -eq 0 ]; then
echo "Error: Tidak ada ID instance yang dimasukkan."
exit 1
fi
# Konversi array bash ke string yang dipisahkan koma untuk Ansible
IFS=','
INSTANCE_IDS_STRING="${INSTANCE_ID_ARRAY[*]}"
unset IFS
# 3. Konfirmasi sebelum eksekusi
echo ""
echo "Anda akan melakukan tindakan '$ACTION' pada instance berikut:"
for instance_id in "${INSTANCE_ID_ARRAY[@]}"; do
echo "- $instance_id"
done
echo ""
read -p "Lanjutkan? [y/N]: " CONFIRM
CONFIRM=$(echo "$CONFIRM" | tr '[:upper:]' '[:lower:]')
if [[ "$CONFIRM" != "y" ]]; then
echo "Operasi dibatalkan."
exit 0
fi
# 4. Tentukan Status Target untuk Ansible
if [ "$ACTION" == "start" ]; then
STATE="running"
else
STATE="stopped"
fi
# 5. Jalankan Playbook Ansible
echo ""
echo "Menjalankan Ansible Playbook..."
ansible-playbook "$PLAYBOOK" \
-e "instance_ids_to_manage=[${INSTANCE_IDS_STRING}]" \
-e "desired_state=${STATE}" \
-e "aws_region=${DEFAULT_REGION}"
# Periksa status keluar Ansible
if [ $? -eq 0 ]; then
echo "-----------------------------------------------"
echo " Eksekusi Ansible Playbook berhasil."
echo "-----------------------------------------------"
else
echo "***********************************************"
echo " Error: Eksekusi Ansible Playbook gagal."
echo "***********************************************"
exit 1
fi
exit 0
Catatan:
- Pastikan untuk mengganti
your-aws-regionjika Anda tidak mengaturnya sebagai variabel lingkunganAWS_DEFAULT_REGION. - Skrip ini menggunakan array bash (
read -a) untuk menangani banyak ID instance dan mengonversinya menjadi format yang diperlukan oleh Ansible (-e "instance_ids_to_manage=[id1,id2,...]").
Cara Menggunakan Solusi Ini
Setelah Anda menyiapkan file playbook (manage_ec2_instances.yml) dan skrip shell (manage_ec2.sh), ikuti langkah-langkah berikut:
Menjalankan Skrip
- Berikan Izin Eksekusi: Buka terminal Anda, navigasikan ke direktori tempat Anda menyimpan file, dan jalankan:
chmod +x manage_ec2.sh - Jalankan Skrip: Eksekusi skrip dengan:
./manage_ec2.sh - Ikuti Prompt: Skrip akan meminta Anda untuk memasukkan tindakan (start/stop) dan ID instance yang relevan. Konfirmasikan pilihan Anda untuk memulai eksekusi playbook Ansible.
Ansible kemudian akan berkomunikasi dengan AWS API untuk mengubah status instance yang Anda pilih.
Visualisasi Komponen Alur Kerja
Untuk memahami bagaimana semua bagian ini bekerja sama, mari kita visualisasikan alur kerjanya menggunakan mindmap.
amazon.aws.ec2_instance"]
id3_2["Menerima Variabel"]
id3_2_1["instance_ids_to_manage"]
id3_2_2["desired_state"]
id3_2_3["aws_region"]
id3_3["Berinteraksi dengan AWS API"]
id4["AWS API"]
id4_1["Memproses Permintaan"]
id5["Instance EC2 AWS"]
id5_1["Status Berubah (Running/Stopped)"]
Mindmap ini menunjukkan bagaimana input pengguna diproses oleh skrip shell, yang kemudian memicu playbook Ansible untuk berinteraksi dengan AWS dan mengubah status instance EC2 yang ditargetkan.
Analisis Perbandingan Metode Seleksi Instance
Memilih metode yang tepat untuk menargetkan instance Anda bergantung pada kebutuhan spesifik Anda. Grafik radar berikut membandingkan beberapa pendekatan berdasarkan kriteria kunci.
Grafik ini memberikan penilaian subyektif (skala 1-10, 10 terbaik kecuali untuk 'Upaya Penyiapan Awal' di mana 10 berarti paling sedikit usaha) untuk membantu Anda memilih pendekatan seleksi instance yang paling sesuai. Metode skrip dengan input ID langsung unggul dalam kesederhanaan dan penargetan ad-hoc, sementara inventaris dinamis lebih skalabel untuk lingkungan besar meskipun memerlukan penyiapan awal yang lebih kompleks.
Tabel Ringkasan Komponen
Tabel berikut merangkum peran setiap komponen utama dalam solusi otomatisasi ini.
| Komponen | Peran Utama | Deskripsi |
|---|---|---|
| Skrip Shell (.sh) | Antarmuka Pengguna & Orkestrasi | Menerima input dari pengguna (aksi, target instance), memvalidasi input, dan memanggil Ansible Playbook dengan parameter yang benar. |
| Ansible Playbook (.yml) | Logika Otomatisasi Inti | Mendefinisikan tugas-tugas untuk berinteraksi dengan AWS API menggunakan modul Ansible, berdasarkan variabel yang diterima dari skrip shell. |
Modul Ansible (amazon.aws.ec2_instance) |
Interaksi AWS | Modul spesifik dalam Ansible yang bertanggung jawab untuk melakukan tindakan start/stop pada instance EC2 di AWS. |
| AWS CLI (Opsional) | Pengambilan Informasi | Digunakan dalam skrip shell (jika diimplementasikan) untuk mengambil daftar instance berdasarkan filter seperti tag, sebelum meminta input pengguna. |
| Kredensial AWS | Autentikasi & Otorisasi | Memungkinkan Ansible dan AWS CLI untuk berinteraksi dengan akun AWS Anda secara aman. |
Video Tutorial Terkait
Untuk pemahaman visual tentang cara menggunakan Ansible untuk mengelola instance EC2, video berikut memberikan demonstrasi praktis tentang operasi start, stop, dan terminate menggunakan Ansible Playbook. Meskipun mungkin tidak secara spesifik mencakup integrasi skrip shell, ini menunjukkan dasar-dasar interaksi Ansible dengan EC2.
Video menunjukkan cara Start, Stop & Terminate instance EC2 menggunakan Ansible Playbook.
Praktik Terbaik dan Pertimbangan
Saat mengimplementasikan solusi ini, pertimbangkan praktik terbaik berikut:
- Keamanan: Selalu gunakan kredensial dengan hak akses minimum (least privilege). Hindari menyimpan kredensial langsung di dalam skrip atau playbook; gunakan variabel lingkungan, AWS Vault, atau peran IAM jika menjalankan dari instance EC2.
- Penanganan Kesalahan: Tambahkan pemeriksaan dan penanganan kesalahan yang lebih kuat baik di skrip shell (misalnya, memeriksa apakah
ansible-playbookberhasil) maupun di playbook Ansible (misalnya, menggunakanblockdanrescueatauignore_errorsdengan hati-hati). - Idempotensi: Manfaatkan sifat idempotensi Ansible. Playbook yang ditulis dengan baik akan memastikan status akhir yang diinginkan tercapai tanpa efek samping negatif jika dijalankan beberapa kali. Modul
amazon.aws.ec2_instancebersifat idempoten. - Penggunaan Tag: Terapkan strategi penandaan (tagging) yang konsisten pada instance EC2 Anda. Ini sangat memudahkan pengelolaan dan pemfilteran, terutama saat menggunakan metode seleksi berbasis tag.
- Pengujian: Uji skrip dan playbook Anda secara menyeluruh di lingkungan non-produksi sebelum menerapkannya pada instance produksi. Gunakan mode
--checkAnsible untuk melakukan dry run. - Stop vs. Terminate: Pastikan Anda memahami perbedaan antara menghentikan (
stopped) dan mengakhiri (terminated) instance. Menghentikan akan mempertahankan volume root EBS dan data, sementara mengakhiri akan menghapusnya secara permanen (kecuali jika dikonfigurasi berbeda). Skrip ini dirancang untuk 'stop' dan 'start'.
FAQ (Frequently Asked Questions)
Bagaimana jika saya ingin menargetkan instance berdasarkan nama tag, bukan ID?
Anda dapat memodifikasi skrip shell (manage_ec2.sh) untuk menggunakan AWS CLI guna mendapatkan daftar ID instance berdasarkan tag. Contoh perintah AWS CLI:
aws ec2 describe-instances --region your-region --filters "Name=tag:YourTagName,Values=YourTagValue" "Name=instance-state-name,Values=running,stopped" --query 'Reservations[].Instances[].InstanceId' --output text
Ganti your-region, YourTagName, dan YourTagValue. Output dari perintah ini (daftar ID instance) kemudian dapat disajikan kepada pengguna atau langsung dimasukkan ke variabel INSTANCE_IDS_STRING untuk diteruskan ke Ansible.
Apakah saya perlu menginstal sesuatu di instance EC2 target?
Tidak. Untuk operasi start dan stop menggunakan modul `amazon.aws.ec2_instance`, Ansible berinteraksi langsung dengan AWS API. Tidak ada agen atau perangkat lunak tambahan yang perlu diinstal pada instance EC2 target itu sendiri. Semua eksekusi terjadi dari mesin kontrol Anda.
Bagaimana cara menangani instance di region AWS yang berbeda?
Playbook dan skrip yang disediakan menggunakan variabel `aws_region`. Anda dapat:
- Mengatur variabel lingkungan `AWS_DEFAULT_REGION` di mesin kontrol Anda.
- Memodifikasi skrip shell untuk meminta input region dari pengguna dan meneruskannya ke playbook melalui `-e "aws_region=user_input_region"`.
- Jika Anda sering bekerja dengan beberapa region, pertimbangkan untuk membuat playbook atau skrip terpisah untuk setiap region atau menggunakan inventaris dinamis Ansible yang dapat mengelola beberapa region.
Bisakah skrip ini dijadwalkan (misalnya, dengan cron)?
Versi interaktif skrip ini tidak cocok untuk penjadwalan karena memerlukan input pengguna. Namun, Anda dapat membuat versi non-interaktif dari skrip shell yang mengambil tindakan (start/stop) dan daftar ID instance (atau kriteria tag) sebagai argumen baris perintah. Skrip non-interaktif ini kemudian dapat dengan mudah dijadwalkan menggunakan `cron` di Linux/macOS atau Task Scheduler di Windows untuk mengotomatiskan start/stop pada waktu-waktu tertentu.
Apa perbedaan antara modul `ec2` dan `amazon.aws.ec2_instance`?
Modul `ec2` adalah modul yang lebih tua dan sekarang dianggap usang (legacy). Modul `amazon.aws.ec2_instance` adalah bagian dari koleksi `amazon.aws` yang lebih baru dan merupakan modul yang direkomendasikan untuk semua tugas manajemen instance EC2, termasuk membuat, menghentikan, memulai, dan mengakhiri instance. Ia menawarkan fungsionalitas yang lebih baik, pemeliharaan aktif, dan integrasi yang lebih erat dengan fitur AWS modern. Selalu utamakan penggunaan `amazon.aws.ec2_instance`.
Rekomendasi Jelajah Lebih Lanjut
- Bagaimana cara menggunakan inventaris dinamis Ansible untuk AWS EC2?
- Praktik terbaik keamanan untuk mengelola kredensial AWS dengan Ansible?
- Contoh playbook Ansible untuk membuat instance EC2 dari awal?
- Cara menjadwalkan tugas otomatis start/stop EC2 menggunakan AWS Lambda atau Instance Scheduler?
Referensi
- amazon.aws.ec2_instance module – Create & manage EC2 instances - Ansible Documentation
- start the stopped AWS instances using ansible playbook - Stack Overflow
- Ansible playbook to start or stop AWS EC2 instances - Appychip
- Use Ansible to create/terminate EC2 instances - Medium
- Ansible for AWS – Create an EC2 Instance with Ansible - LinuxBuz
- Ansible: start or stop ec2 instance based on the current status - Stack Overflow
Otomatisasi Cerdas: Menyalakan & Menghentikan Instance EC2 AWS Pilihan Anda dengan Ansible dan Shell Script
Panduan komprehensif untuk mengelola siklus hidup instance EC2 secara fleksibel dan efisien.
Mengelola banyak instance Amazon Web Services (AWS) EC2 bisa menjadi tugas yang rumit, terutama ketika Anda perlu menyalakan atau menghentikannya secara selektif untuk mengoptimalkan biaya atau mengelola lingkungan pengembangan/pengujian. Untungnya, dengan kombinasi kekuatan Ansible untuk otomatisasi dan fleksibilitas skrip shell (.sh), Anda dapat membuat alur kerja yang memungkinkan Anda memilih instance mana yang akan dikelola.
Sorotan Utama
- Kontrol Penuh: Pilih instance EC2 spesifik yang ingin Anda nyalakan atau hentikan berdasarkan ID atau tag.
- Efisiensi Biaya: Otomatiskan penghentian instance yang tidak digunakan di luar jam kerja atau saat tidak diperlukan.
- Otomatisasi Fleksibel: Gabungkan Ansible Playbook dengan skrip shell interaktif untuk kemudahan penggunaan.
Persiapan Awal: Fondasi Otomatisasi Anda
Sebelum Anda dapat mengotomatiskan pengelolaan instance EC2, ada beberapa prasyarat dan konfigurasi yang perlu disiapkan di mesin kontrol Anda (tempat Anda akan menjalankan Ansible dan skrip shell).
Instalasi Alat yang Diperlukan
Pastikan perangkat lunak berikut terinstal di sistem Anda:
- Ansible: Alat otomatisasi utama. Instal menggunakan pip:
pip install ansible - AWS CLI: Antarmuka baris perintah untuk berinteraksi dengan layanan AWS. Ikuti panduan instalasi resmi AWS. Diperlukan jika skrip shell Anda menggunakan perintah AWS CLI untuk mendapatkan daftar instance.
- Python Libraries (boto3 & botocore): Modul AWS Ansible bergantung pada pustaka ini. Biasanya terinstal bersama Ansible atau AWS CLI, tetapi Anda bisa memastikan dengan:
pip install boto3 botocore - Ansible AWS Collection: Kumpulan modul Ansible untuk AWS. Instal dengan:
ansible-galaxy collection install amazon.aws
Konfigurasi Kredensial AWS
Ansible dan AWS CLI memerlukan kredensial untuk mengakses akun AWS Anda. Cara yang umum adalah menggunakan variabel lingkungan. Tambahkan baris berikut ke file `~/.bashrc` atau `~/.bash_profile` Anda, ganti placeholder dengan nilai sebenarnya:
# Konfigurasi Kredensial AWS
export AWS_ACCESS_KEY_ID='YOUR_AWS_ACCESS_KEY_ID'
export AWS_SECRET_ACCESS_KEY='YOUR_AWS_SECRET_ACCESS_KEY'
export AWS_DEFAULT_REGION='your-aws-region' # Contoh: us-east-1
Setelah menambahkan, muat ulang konfigurasi shell Anda dengan perintah `source ~/.bashrc` (atau file yang relevan).
Perizinan IAM (Identity and Access Management)
Pengguna atau peran IAM yang kredensialnya Anda gunakan harus memiliki izin yang cukup untuk mendeskripsikan, memulai, dan menghentikan instance EC2. Praktik terbaik adalah menerapkan prinsip least privilege, memberikan hanya izin yang diperlukan (misalnya, `AmazonEC2FullAccess` mungkin terlalu luas; pertimbangkan kebijakan khusus).
Membuat Playbook Ansible yang Dinamis
Ansible Playbook adalah inti dari otomatisasi ini. Playbook ini akan berisi instruksi untuk menyalakan atau menghentikan instance EC2 berdasarkan parameter yang diterimanya.
Memilih Modul yang Tepat: `amazon.aws.ec2_instance`
Modul `amazon.aws.ec2_instance` adalah modul modern dan direkomendasikan untuk mengelola siklus hidup instance EC2, termasuk memulai dan menghentikannya. Modul ini menggantikan modul `ec2` yang lebih lama.
Contoh Playbook Dinamis (`manage_ec2_instances.yml`)
Playbook ini dirancang untuk menerima daftar ID instance dan status yang diinginkan (berjalan atau berhenti) sebagai variabel. Ini membuatnya fleksibel untuk digunakan oleh skrip shell.
Kode Playbook
---
- name: Manage AWS EC2 Instances State
hosts: localhost # Menjalankan playbook di mesin lokal
gather_facts: false # Tidak perlu mengumpulkan fakta tentang host
connection: local # Koneksi lokal karena kita berinteraksi dengan AWS API
vars:
instance_ids_to_manage: [] # Daftar ID instance (akan diisi oleh skrip shell)
desired_state: "running" # Status target: 'running' atau 'stopped' (diisi oleh skrip shell)
aws_region: "your-aws-region" # Ganti dengan region AWS default Anda
tasks:
- name: Ensure EC2 instances are in the desired state
amazon.aws.ec2_instance:
instance_ids: "{{ instance_ids_to_manage }}" # Menggunakan variabel list ID instance
region: "{{ aws_region }}" # Menggunakan variabel region
state: "{{ desired_state }}" # Menggunakan variabel status target ('running' atau 'stopped')
wait: true # Menunggu hingga instance mencapai status yang diinginkan
delegate_to: localhost # Delegasikan tugas ke localhost
run_once: true # Jalankan tugas ini hanya sekali
when: instance_ids_to_manage is defined and instance_ids_to_manage | length > 0 # Hanya berjalan jika ada ID instance
Catatan Penting:
- Ganti `your-aws-region` dengan region AWS tempat instance Anda berada.
- Parameter `wait: true` memastikan Ansible menunggu konfirmasi dari AWS bahwa instance telah berhasil dimulai atau dihentikan sebelum melanjutkan.
- Kondisi `when` mencegah playbook berjalan jika tidak ada ID instance yang diberikan.
Dashboard AWS EC2 menyediakan gambaran umum instance Anda.
Membuat Skrip Shell (.sh) untuk Seleksi Interaktif
Skrip shell bertindak sebagai antarmuka pengguna, memungkinkan Anda memilih instance dan tindakan (mulai/hentikan) sebelum memanggil playbook Ansible.
Tujuan Skrip
Skrip ini akan:
- (Opsional) Menampilkan daftar instance yang tersedia berdasarkan kriteria tertentu (misalnya, tag).
- Meminta pengguna memasukkan ID instance yang ingin dikelola.
- Meminta pengguna memilih tindakan (start atau stop).
- Memanggil playbook Ansible (`manage_ec2_instances.yml`) dengan variabel yang sesuai.
Metode Seleksi Instance
Anda bisa mengadaptasi skrip untuk berbagai cara memilih instance:
- Berdasarkan ID Instance Langsung: Pengguna memasukkan daftar ID instance secara manual. Ini adalah pendekatan paling langsung.
- Berdasarkan Tag (dengan AWS CLI): Skrip menggunakan `aws ec2 describe-instances` untuk memfilter dan menampilkan instance dengan tag tertentu (misalnya, `Environment=Development`), lalu pengguna memilih dari daftar tersebut.
Contoh Skrip Shell (`manage_ec2.sh`)
Skrip berikut ini mengadopsi pendekatan input ID langsung untuk kesederhanaan, tetapi dapat diperluas untuk menyertakan logika filtering tag menggunakan AWS CLI jika diperlukan.
Kode Skrip Shell
#!/bin/bash
# File playbook Ansible
PLAYBOOK="manage_ec2_instances.yml"
# Region AWS default (bisa diambil dari env var jika diset)
DEFAULT_REGION="${AWS_DEFAULT_REGION:-your-aws-region}" # Ganti your-aws-region jika tidak diset di env
# --- Fungsi Bantuan ---
function display_usage() {
echo "Penggunaan: $0"
echo "Skrip ini akan memandu Anda untuk memulai atau menghentikan instance EC2."
exit 1
}
# --- Logika Utama ---
echo "==============================================="
echo " Skrip Manajemen Instance EC2 dengan Ansible "
echo "==============================================="
echo ""
# 1. Minta Tindakan (Start atau Stop)
while true; do
read -p "Pilih tindakan [start/stop]: " ACTION
ACTION=$(echo "$ACTION" | tr '[:upper:]' '[:lower:]') # Konversi ke huruf kecil
if [[ "$ACTION" == "start" || "$ACTION" == "stop" ]]; then
break
else
echo "Input tidak valid. Harap masukkan 'start' atau 'stop'."
fi
done
# 2. Minta ID Instance
echo "Masukkan ID instance yang ingin Anda kelola."
echo "Pisahkan beberapa ID dengan spasi (contoh: i-123abc i-456def)"
read -p "ID Instance: " -a INSTANCE_ID_ARRAY # Baca ke dalam array bash
# Validasi input ID Instance
if [ ${#INSTANCE_ID_ARRAY[@]} -eq 0 ]; then
echo "Error: Tidak ada ID instance yang dimasukkan."
exit 1
fi
# Konversi array bash ke string yang dipisahkan koma untuk Ansible
IFS=','
INSTANCE_IDS_STRING="${INSTANCE_ID_ARRAY[*]}"
unset IFS
# 3. Konfirmasi sebelum eksekusi
echo ""
echo "Anda akan melakukan tindakan '$ACTION' pada instance berikut:"
for instance_id in "${INSTANCE_ID_ARRAY[@]}"; do
echo "- $instance_id"
done
echo ""
read -p "Lanjutkan? [y/N]: " CONFIRM
CONFIRM=$(echo "$CONFIRM" | tr '[:upper:]' '[:lower:]')
if [[ "$CONFIRM" != "y" ]]; then
echo "Operasi dibatalkan."
exit 0
fi
# 4. Tentukan Status Target untuk Ansible
if [ "$ACTION" == "start" ]; then
STATE="running"
else
STATE="stopped"
fi
# 5. Jalankan Playbook Ansible
echo ""
echo "Menjalankan Ansible Playbook..."
ansible-playbook "$PLAYBOOK" \
-e "instance_ids_to_manage=[${INSTANCE_IDS_STRING}]" \
-e "desired_state=${STATE}" \
-e "aws_region=${DEFAULT_REGION}"
# Periksa status keluar Ansible
if [ $? -eq 0 ]; then
echo "-----------------------------------------------"
echo " Eksekusi Ansible Playbook berhasil."
echo "-----------------------------------------------"
else
echo "***********************************************"
echo " Error: Eksekusi Ansible Playbook gagal."
echo "***********************************************"
exit 1
fi
exit 0
Catatan:
- Pastikan untuk mengganti `your-aws-region` jika Anda tidak mengaturnya sebagai variabel lingkungan `AWS_DEFAULT_REGION`.
- Skrip ini menggunakan array bash (`read -a`) untuk menangani banyak ID instance dan mengonversinya menjadi format yang diperlukan oleh Ansible (`-e "instance_ids_to_manage=[id1,id2,...]"`).
Cara Menggunakan Solusi Ini
Setelah Anda menyiapkan file playbook (`manage_ec2_instances.yml`) dan skrip shell (`manage_ec2.sh`), ikuti langkah-langkah berikut:
Menjalankan Skrip
- Berikan Izin Eksekusi: Buka terminal Anda, navigasikan ke direktori tempat Anda menyimpan file, dan jalankan:
chmod +x manage_ec2.sh - Jalankan Skrip: Eksekusi skrip dengan:
./manage_ec2.sh - Ikuti Prompt: Skrip akan meminta Anda untuk memasukkan tindakan (start/stop) dan ID instance yang relevan. Konfirmasikan pilihan Anda untuk memulai eksekusi playbook Ansible.
Ansible kemudian akan berkomunikasi dengan AWS API untuk mengubah status instance yang Anda pilih.
Visualisasi Komponen Alur Kerja
Untuk memahami bagaimana semua bagian ini bekerja sama, mari kita visualisasikan alur kerjanya menggunakan mindmap.
(Aksi, ID, Region)"] id3["Playbook Ansible
(manage_ec2_instances.yml)"] id3_1["Menggunakan Modul
`amazon.aws.ec2_instance`"] id3_2["Menerima Variabel"] id3_2_1["`instance_ids_to_manage`"] id3_2_2["`desired_state`"] id3_2_3["`aws_region`"] id3_3["Berinteraksi dengan AWS API"] id4["AWS API"] id4_1["Memproses Permintaan"] id5["Instance EC2 AWS"] id5_1["Status Berubah
(Running/Stopped)"]
Mindmap ini menunjukkan bagaimana input pengguna diproses oleh skrip shell, yang kemudian memicu playbook Ansible untuk berinteraksi dengan AWS dan mengubah status instance EC2 yang ditargetkan.
Analisis Perbandingan Metode Seleksi Instance
Memilih metode yang tepat untuk menargetkan instance Anda bergantung pada kebutuhan spesifik Anda. Grafik radar berikut membandingkan beberapa pendekatan berdasarkan kriteria kunci.
Grafik ini memberikan penilaian subyektif (skala 1-10, 10 terbaik kecuali untuk 'Upaya Penyiapan Awal' di mana 10 berarti paling sedikit usaha) untuk membantu Anda memilih pendekatan seleksi instance yang paling sesuai. Metode skrip dengan input ID langsung unggul dalam kesederhanaan dan penargetan ad-hoc, sementara inventaris dinamis lebih skalabel untuk lingkungan besar meskipun memerlukan penyiapan awal yang lebih kompleks.
Tabel Ringkasan Komponen
Tabel berikut merangkum peran setiap komponen utama dalam solusi otomatisasi ini.
| Komponen | Peran Utama | Deskripsi |
|---|---|---|
| Skrip Shell (.sh) | Antarmuka Pengguna & Orkestrasi | Menerima input dari pengguna (aksi, target instance), memvalidasi input, dan memanggil Ansible Playbook dengan parameter yang benar. |
| Ansible Playbook (.yml) | Logika Otomatisasi Inti | Mendefinisikan tugas-tugas untuk berinteraksi dengan AWS API menggunakan modul Ansible, berdasarkan variabel yang diterima dari skrip shell. |
| Modul Ansible (`amazon.aws.ec2_instance`) | Interaksi AWS | Modul spesifik dalam Ansible yang bertanggung jawab untuk melakukan tindakan start/stop pada instance EC2 di AWS. |
| AWS CLI (Opsional) | Pengambilan Informasi | Digunakan dalam skrip shell (jika diimplementasikan) untuk mengambil daftar instance berdasarkan filter seperti tag, sebelum meminta input pengguna. |
| Kredensial AWS | Autentikasi & Otorisasi | Memungkinkan Ansible dan AWS CLI untuk berinteraksi dengan akun AWS Anda secara aman. |
Video Tutorial Terkait
Untuk pemahaman visual tentang cara menggunakan Ansible untuk mengelola instance EC2, video berikut memberikan demonstrasi praktis tentang operasi start, stop, dan terminate menggunakan Ansible Playbook. Meskipun mungkin tidak secara spesifik mencakup integrasi skrip shell, ini menunjukkan dasar-dasar interaksi Ansible dengan EC2.
Video menunjukkan cara Start, Stop & Terminate instance EC2 menggunakan Ansible Playbook.
Praktik Terbaik dan Pertimbangan
Saat mengimplementasikan solusi ini, pertimbangkan praktik terbaik berikut:
- Keamanan: Selalu gunakan kredensial dengan hak akses minimum (least privilege). Hindari menyimpan kredensial langsung di dalam skrip atau playbook; gunakan variabel lingkungan, AWS Vault, atau peran IAM jika menjalankan dari instance EC2.
- Penanganan Kesalahan: Tambahkan pemeriksaan dan penanganan kesalahan yang lebih kuat baik di skrip shell (misalnya, memeriksa apakah `ansible-playbook` berhasil) maupun di playbook Ansible (misalnya, menggunakan `block` dan `rescue` atau `ignore_errors` dengan hati-hati).
- Idempotensi: Manfaatkan sifat idempotensi Ansible. Playbook yang ditulis dengan baik akan memastikan status akhir yang diinginkan tercapai tanpa efek samping negatif jika dijalankan beberapa kali. Modul `amazon.aws.ec2_instance` bersifat idempoten.
- Penggunaan Tag: Terapkan strategi penandaan (tagging) yang konsisten pada instance EC2 Anda. Ini sangat memudahkan pengelolaan dan pemfilteran, terutama saat menggunakan metode seleksi berbasis tag.
- Pengujian: Uji skrip dan playbook Anda secara menyeluruh di lingkungan non-produksi sebelum menerapkannya pada instance produksi. Gunakan mode `--check` Ansible untuk melakukan dry run.
- Stop vs. Terminate: Pastikan Anda memahami perbedaan antara menghentikan (`stopped`) dan mengakhiri (`terminated`) instance. Menghentikan akan mempertahankan volume root EBS dan data, sementara mengakhiri akan menghapusnya secara permanen (kecuali jika dikonfigurasi berbeda). Skrip ini dirancang untuk 'stop' dan 'start'.
FAQ (Frequently Asked Questions)
Bagaimana jika saya ingin menargetkan instance berdasarkan nama tag, bukan ID?
Anda dapat memodifikasi skrip shell (`manage_ec2.sh`) untuk menggunakan AWS CLI guna mendapatkan daftar ID instance berdasarkan tag. Contoh perintah AWS CLI:
aws ec2 describe-instances --region your-region --filters "Name=tag:YourTagName,Values=YourTagValue" "Name=instance-state-name,Values=running,stopped" --query 'Reservations[].Instances[].InstanceId' --output text
Ganti `your-region`, `YourTagName`, dan `YourTagValue`. Output dari perintah ini (daftar ID instance) kemudian dapat disajikan kepada pengguna atau langsung dimasukkan ke variabel `INSTANCE_IDS_STRING` untuk diteruskan ke Ansible.
Apakah saya perlu menginstal sesuatu di instance EC2 target?
Tidak. Untuk operasi start dan stop menggunakan modul `amazon.aws.ec2_instance`, Ansible berinteraksi langsung dengan AWS API. Tidak ada agen atau perangkat lunak tambahan yang perlu diinstal pada instance EC2 target itu sendiri. Semua eksekusi terjadi dari mesin kontrol Anda.
Bagaimana cara menangani instance di region AWS yang berbeda?
Playbook dan skrip yang disediakan menggunakan variabel `aws_region`. Anda dapat:
- Mengatur variabel lingkungan `AWS_DEFAULT_REGION` di mesin kontrol Anda.
- Memodifikasi skrip shell untuk meminta input region dari pengguna dan meneruskannya ke playbook melalui `-e "aws_region=user_input_region"`.
- Jika Anda sering bekerja dengan beberapa region, pertimbangkan untuk membuat playbook atau skrip terpisah untuk setiap region atau menggunakan inventaris dinamis Ansible yang dapat mengelola beberapa region.
Bisakah skrip ini dijadwalkan (misalnya, dengan cron)?
Versi interaktif skrip ini tidak cocok untuk penjadwalan karena memerlukan input pengguna. Namun, Anda dapat membuat versi non-interaktif dari skrip shell yang mengambil tindakan (start/stop) dan daftar ID instance (atau kriteria tag) sebagai argumen baris perintah. Skrip non-interaktif ini kemudian dapat dengan mudah dijadwalkan menggunakan `cron` di Linux/macOS atau Task Scheduler di Windows untuk mengotomatiskan start/stop pada waktu-waktu tertentu.
Apa perbedaan antara modul `ec2` dan `amazon.aws.ec2_instance`?
Modul `ec2` adalah modul yang lebih tua dan sekarang dianggap usang (legacy). Modul `amazon.aws.ec2_instance` adalah bagian dari koleksi `amazon.aws` yang lebih baru dan merupakan modul yang direkomendasikan untuk semua tugas manajemen instance EC2, termasuk membuat, menghentikan, memulai, dan mengakhiri instance. Ia menawarkan fungsionalitas yang lebih baik, pemeliharaan aktif, dan integrasi yang lebih erat dengan fitur AWS modern. Selalu utamakan penggunaan `amazon.aws.ec2_instance`.
Rekomendasi Jelajah Lebih Lanjut
- Bagaimana cara menggunakan inventaris dinamis Ansible untuk AWS EC2?
- Praktik terbaik keamanan untuk mengelola kredensial AWS dengan Ansible?
- Contoh playbook Ansible untuk membuat instance EC2 dari awal?
- Cara menjadwalkan tugas otomatis start/stop EC2 menggunakan AWS Lambda atau Instance Scheduler?
Referensi
Last updated May 5, 2025