0

Menurunkan dan menaikkan instance type EC2 secara otomatis (vertical scaling) pada jam tertentu menggunakan AWS Lambda dan EventBridge

Modifikasi ec2 dengan lambda (menurunkan dan menaikkan instance type).


modifikasi ec2 dengan lambda secara otomatis dengan eventbridge

Ditutorial kali ini kita akan menurunkan & menaikkan instance type EC2 (vertical scaling) secara otomatis pada jam tertentu menggunakan AWS lambda dan EventBridge.

Alasan menurunkan – menaikkan spec instance EC2

Biasanya traffic pada aplikasi peaknya dipagi hari sampai sore hari saja, malamnya traffic turun. Jadi untuk menghemat cost lebih baik spec instancenya diturunkan (secara vertical scaling). Kemudian dipagi hari dinaikkan kembali spec instancenya seperti semula.

Note:

  • Akan terjadi downtime pada saat proses menurunkan – menaikkan instance type, karena instance perlu distop, diubah tipe instancenya, lalu distart lagi instancenya
  • Tidak disarankan melakukan cara ini pada aplikasi yang ada proses transaksinya, lakukan hanya pada aplikasi yang jarang digunakan pada waktu tertentu. Seperti aplikasi tarik data reporting (.xlsx) biasanya hanya digunakan pada pagi – sore hari, malamnya jarang digunakan
  • Jika tidak mau ada downtime, lebih baik gunakan horizontal scaling dan pasang loadbalancer didepannya (jangan ikuti tutorial ini)

Contoh kasus

Misalkan kita punya EC2 instance dengan tipe t3.medium, akan kita turunkan specnya menjadi t3.small secara otomatis pada malam hari jam 22:01 dan kita naikkan kembali specnya pada jam 05:01.

Yang perlu kita gunakan adalah 2 service AWS, yaitu lambda dan eventbridge. Buat yang belum tahu lambda dan eventbridge, berikut kegunaannya:

  • Lambda = tempat untuk menaruh source code (script untuk menaikkan dan menurunkan spec instance), kita akan gunakan bahasa python
  • Eventbridge = tempat untuk mengatur schedulernya atau cronnya, untuk menjalankan lambda secara periodik

Ringkasan step

  • Membuat IAM Policy
  • Membuat IAM Role, kaitkan IAM Policy ke Role
  • Menambahkan Tag pada EC2 instance
  • Membuat Lambda Function, kaitkan IAM Role ke Lambda Function
  • Mengupload/Deploy code python ke Lambda Function
    • Upload codingan untuk memperkecil instance
    • Upload codingan untuk memperbesar instance
  • Jalankan Lambda Function secara otomatis pada jam tertentu dengan EventBridge


Mari kita mulai prakteknya.

Membuat IAM Policy

Pertama kita buat hak akses (IAM Policy) supaya lambda nanti bisa menstop, mengubah dan menstart instance.

  • Buka IAM (Identify and Access Management) dashboard
  • Pada menu Access Management > Policies > Create Policy
  • Pilih tab JSON, lalu policy dalam bentuk JSON dibawah ini, lalu klik Next
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DescribeEC2Instance",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "ModifyEC2Instance",
            "Effect": "Allow",
            "Action": [
                "ec2:ModifyInstanceAttribute",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "arn:aws:ec2:ap-southeast-1:193xxx:instance/*"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/LambdaStopInstance": "Yes",
                    "ec2:ResourceTag/LambdaStartInstance": "Yes"
                }
            }
        }
    ]
}

– Terdapat 2 Sid (Statement id), yang pertama (Sid: DescribeEC2Instance) untuk melihat informasi EC2 instance seperti nama instance, instance id, instance type, dll. Yang kedua (Sid: ModifyEC2Instance) untuk menstop, memodifikasi dan menstart EC2 instance.

– Pada Resource, ganti ap-southeast-1 dengan region code kalian. Ganti 193xxx dengan akun AWS ID kalian

– Pada Condition, ada 2 tag yang dibuat (LambdaStopInstance dan LambdaStartInstance). Kedua tag ini harus dibuat juga di EC2 instance, agar instancenya bisa dimodifikasi

modifikasi ec2 dengan lambda
  • Berinama Policynya dengan: modify-ec2-instance, lalu klik Create Policy

Membuat IAM Role, kaitkan IAM Policy ke Role

Role ini nantinya akan dikaitkan ke Lambda Function. Jadi role harus dibuat terlebih dahulu.

  • Masuk ke IAM dashboard
  • Pada Access Management > Roles > Create role
  • Pada Trusted entity type > Pilih AWS service
  • Service or use case > Lambda, klik Next
modifikasi ec2 dengan lambda
  • Cari policy yang tadi sudah kita buat: modify-ec2-instance, klik Next
  • Berinama rolenya: modify-ec2-instance, lalu klik Create role

Menambahkan Tag pada EC2 instance

Pada Policy: modify-ec2-instance sebelumnya, kita telah mengeset 2 tag, yaitu LambdaStopInstance: Yes dan LambdaStartInstance: Yes. Maka di EC2 instance harus kita tambahkan juga tagnya.

  • Masuk ke EC2 dashboard
  • Klik instancenya, pada tab Tags, klik Manage Tags
  • Tambahkan 2 tag tersebut, dan klik Save
modifikasi ec2 dengan lambda

Membuat 2 Lambda Function, kaitkan IAM Role ke Lambda Function

Kita akan buat 2 lambda function disini, yaitu downgrade-ec2-instance-type dan upgrade-ec2-instance-type.

  • Buka Lambda dashboard
  • Clik Create a function
modifikasi ec2 dengan lambda
  • Pilih Auth from scratch
  • Berinama functionnya: downgrade-ec2-instance-type
  • Runtime: Python 3.8
  • Pada Change default execution role, pilih Use an existing role, lalu cari role modify-ec2-instance
  • Klik Create function
  • Lambda function berhasil terbuat
  • Selanjutnya kita akan tambah nilai timeout lambda function, klik tab configuration, klik Edit
  • Set timeoutnya menjadi 5 menit 3 sec, klik Save

  • Ulangi langkah yang sama diatas untuk membuat lambda function: upgrade-ec2-instance-type

Mengupload/Deploy code python ke Lambda Function

Ada 2 codingan yang akan kita upload, hanya beda di Value instance type saja.

Upload codingan untuk memperkecil instance

  • Klik lambda function downgrade-ec2-instance-type
  • Copy python code berikut ke lambda_function:
import json
import boto3

client = boto3.client("ec2")

def lambda_handler(event, context):
    
    instanceID = 'i-04fxxx'
    
    print ('Trying to modify EC2 instance. Please wait..')
    
    # stop instance
    response = client.stop_instances(InstanceIds=[instanceID])
    
    # wait until the instance is really stopped
    waiter = client.get_waiter('instance_stopped')
    waiter.wait(InstanceIds=[instanceID])
    print ('Instance Stopped')
    print (f'Success :: {response} ')
    
    # modify instance type
    client.modify_instance_attribute(InstanceId=instanceID, Attribute='instanceType', Value='t3.small')
    
    # start instance
    client.start_instances(InstanceIds=[instanceID])
    print ('Instance started with new instance type - t3.small')
    
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Successfully downgraded')
    }

– Ganti i-04fxxx dengan instance ID kalian (yang sudah ditambahkan Tags: LambdaStopInstance dan LambdaStartInstance tadi)

– pada modify_instance_attribute, kita turunkan instance typenya menjadi t3.small

script modifikasi ec2 dengan lambda
  • Setelah itu kita upload codingannya ke server lambda, klik tombol Deploy
  • Klik tombol Test untuk mengetest codingannya
  • Muncul popup event, klik Invoke
  • Jika berhasil, output dari lambda akan seperti ini:
  • Jika dilihat di EC2 dashboard, seharusnya instance statenya akan berubah menjadi stopping
  • Dan akan distart lagi dengan tipe t3.small

Sampai sini kita berhasil mengecilkan instance dengan lambda, selanjutkan kita akan upload codingan untuk memperbesar spec instance.

Upload codingan untuk memperbesar instance

  • Klik lambda function upgrade-ec2-instance-type
  • Copy python code berikut ke lambda_function (codingannya hampir sama persis dengan lambda downgrade-ec2-instance-type):
import json
import boto3

client = boto3.client("ec2")

def lambda_handler(event, context):
    
    instanceID = 'i-04fxxx'
    
    print ('Trying to modify EC2 instance. Please wait..')
    
    # stop instance
    response = client.stop_instances(InstanceIds=[instanceID])
    
    # wait until the instance is really stopped
    waiter = client.get_waiter('instance_stopped')
    waiter.wait(InstanceIds=[instanceID])
    print ('Instance Stopped')
    print (f'Success :: {response} ')
    
    # modify instance type
    client.modify_instance_attribute(InstanceId=instanceID, Attribute='instanceType', Value='t3.medium')
    
    # start instance
    client.start_instances(InstanceIds=[instanceID])
    print ('Instance started with new instance type - t3.medium')
    
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Successfully upgraded')
    }

– Ganti i-04fxxx dengan EC2 instance ID kalian

– pada modify_instance_attribute, kita naikkan kembali instancenya menjadi t3.medium

  • Klik Deploy
  • Klik Test untuk mengetest codingannya
  • Muncul popup, klik Invoke
  • Jika berhasil output lambdanya seperti ini:
  • Cek EC2, maka instance statenya akan stopping
  • Kemudian akan distart kembali menjadi t3.medium

Jalankan Lambda Function secara otomatis pada jam tertentu dengan EventBridge

2 Lambda function tadi (downgrade-ec2-instance dan upgrade-ec2-instance) sudah berhasil kita jalankan, namun masih manual menggunakan trigger klik.

Agar dapat otomatis dijalankan, kita bisa gunakan service Eventbridge. Kita akan buat 2 eventbridge schedule untuk masing-masing lambda function:

  • eventbridge schedule name = schedule-downgrade-ec2-instance
  • eventbridge schedule name = schedule-upgrade-ec2-instance

Buat eventbridge schedule

  • Masuk ke eventbridge dashboard
  • pilih eventbridge schedule, klik create schedule
  • Masukkan nama schedulenya: schedule-downgrade-ec2-instance
  • Pada Occurrence pilih Recurring schedule
  • Timezone: Asia/Jakarta
  • Schedule type > Cron-based schedule
  • Masukkan format cronnya 1 22 * * ? *
  • Flexible time window > none
  • Klik Next
modifikasi ec2 dengan lambda dan eventbridge
  • Pilih Targetnya ke AWS Lambda
  • Pilih Lambda functionnya: downgrade-ec2-instance-type, klik Next
modifikasi ec2 dengan lambda
  • Maximum age of event: 5 minutes
  • Retry attempts: 5 times
  • Klik Next > Create Schedule
  • Eventbridge schedule berhasil dibuat

  • Lakukan hal yang sama diatas untuk membuat schedule: schedule-upgrade-ec2-instance. Tinggal ganti lambda functionnya ke upgrade-ec2-instance-type dan set cronnya ke 1 5 * * ? *
  • Selanjutnya kita tinggal tunggu saja jam 22:01 dan 05:01, maka secara otomatis lambda function akan ke trigger pada jam tersebut.

Ambar Hasbiyatmoko

Hello, I'm web developer. Passionate about programming, web server, and networking.

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload the CAPTCHA.