Skip to main content

Konfigurasi Elastic Load Balancer di AWS EC2

·5 mins

Untuk membuat AWS Elastic Load Balancer (ELB) dan menghubungkannya ke instance EC2, terlebih dahulu tentukan jenis load balancer yang sesuai dengan kebutuhan Anda:

  • Classic Load Balancer (CLB) – generasi lama untuk kebutuhan load balancing dasar.
  • Application Load Balancer (ALB) – direkomendasikan untuk trafik HTTP/HTTPS karena mendukung routing berbasis host, path, dan berbagai fitur Layer 7 lainnya.
  • Network Load Balancer (NLB) – cocok untuk trafik TCP/UDP dengan kebutuhan performa tinggi dan latensi rendah.

Perintah dan konfigurasi berbeda untuk setiap tipe load balancer, sehingga perlu disesuaikan dengan kasus penggunaan Anda.

Classic Load Balancer (CLB)
#

Classic Load Balancer cocok untuk kebutuhan load balancing dasar pada lingkungan VPC. Untuk deployment baru, AWS umumnya merekomendasikan penggunaan ALB atau NLB.

Membuat CLB Publik
#

Contoh berikut membuat load balancer dengan listener HTTP pada port 80:

aws elb create-load-balancer \
    --load-balancer-name my-classic-lb \
    --listeners "Protocol=HTTP,LoadBalancerPort=80,InstanceProtocol=HTTP,InstancePort=80" \
    --subnets subnet-12345678 subnet-87654321 \
    --security-groups sg-12345678 \
    --region us-west-2

Membuat CLB Internal
#

Gunakan parameter --scheme internal agar load balancer hanya dapat diakses dari dalam jaringan VPC:

aws elb create-load-balancer \
    --load-balancer-name my-internal-classic-lb \
    --listeners "Protocol=HTTP,LoadBalancerPort=80,InstanceProtocol=HTTP,InstancePort=80" \
    --subnets subnet-12345678 \
    --scheme internal \
    --security-groups sg-12345678 \
    --region us-west-2

Mendaftarkan Instance EC2 ke CLB
#

Setelah load balancer dibuat, daftarkan instance EC2 ke dalamnya:

aws elb register-instances-with-load-balancer \
    --load-balancer-name my-classic-lb \
    --instances i-0123456789abcdef0 i-0123456789abcdef1

Application Load Balancer (ALB)
#

Application Load Balancer merupakan pilihan yang paling direkomendasikan untuk aplikasi web berbasis HTTP dan HTTPS karena menyediakan fitur routing tingkat lanjut serta integrasi yang lebih baik dengan layanan AWS modern.

Membuat ALB Publik
#

aws elbv2 create-load-balancer \
    --name my-application-lb \
    --subnets subnet-12345678 subnet-87654321 \
    --security-groups sg-12345678 \
    --type application \
    --region us-west-2

Membuat ALB Internal
#

Gunakan parameter --scheme internal agar ALB hanya dapat diakses dari dalam jaringan VPC:

aws elbv2 create-load-balancer \
    --name my-internal-alb \
    --subnets subnet-12345678 subnet-87654321 \
    --security-groups sg-12345678 \
    --type application \
    --scheme internal \
    --region us-west-2

Membuat Target Group
#

VpcId=$(aws ec2 describe-vpcs \
  --query "Vpcs[0].VpcId" \
  --output text)

aws elbv2 create-target-group \
    --name my-targets \
    --protocol HTTP \
    --port 80 \
    --vpc-id $VpcId \
    --health-check-protocol HTTP \
    --health-check-path "/health" \
    --health-check-interval-seconds 30 \
    --health-check-timeout-seconds 10 \
    --healthy-threshold-count 3 \
    --unhealthy-threshold-count 3 \
    --target-type instance \
    --matcher HttpCode=200-399 \
    --region us-west-2

Mengaktifkan Sticky Session (Opsional)
#

TG_ARN=$(aws elbv2 describe-target-groups \
  --names my-targets \
  --query "TargetGroups[0].TargetGroupArn" \
  --output text)

aws elbv2 modify-target-group-attributes \
  --target-group-arn $TG_ARN \
  --attributes \
    Key=stickiness.enabled,Value=true \
    Key=stickiness.type,Value=lb_cookie \
    Key=stickiness.lb_cookie.duration_seconds,Value=3600

Membuat Listener
#

LoadBalancerArn=$(aws elbv2 describe-load-balancers \
  --names my-application-lb \
  --query "LoadBalancers[0].LoadBalancerArn" \
  --output text)

TG_ARN=$(aws elbv2 describe-target-groups \
  --names my-targets \
  --query "TargetGroups[0].TargetGroupArn" \
  --output text)

aws elbv2 create-listener \
    --load-balancer-arn $LoadBalancerArn \
    --protocol HTTP \
    --port 80 \
    --default-actions Type=forward,TargetGroupArn=$TG_ARN \
    --region us-west-2

Mengubah Atribut ALB (Opsional)
#

Contoh berikut mengaktifkan cross-zone load balancing dan deletion protection:

LoadBalancerArn=$(aws elbv2 describe-load-balancers \
  --names my-application-lb \
  --query "LoadBalancers[0].LoadBalancerArn" \
  --output text)

aws elbv2 modify-load-balancer-attributes \
  --load-balancer-arn $LoadBalancerArn \
  --attributes \
    Key=load_balancing.cross_zone.enabled,Value=true \
    Key=deletion_protection.enabled,Value=true

Mendaftarkan Instance EC2 ke Target Group
#

TG_ARN=$(aws elbv2 describe-target-groups \
  --names my-targets \
  --query "TargetGroups[0].TargetGroupArn" \
  --output text)

INSTANCE1=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=MyServer1" \
  --query "Reservations[*].Instances[*].InstanceId" \
  --output text)

INSTANCE2=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=demo-app" \
  --query "Reservations[*].Instances[*].InstanceId" \
  --output text)

aws elbv2 register-targets \
    --target-group-arn $TG_ARN \
    --targets Id=$INSTANCE1,Port=80 Id=$INSTANCE2,Port=12345 \
    --region us-west-2

Verifikasi Target yang Terdaftar
#

aws elbv2 describe-target-health \
    --target-group-arn $TG_ARN \
    --region us-west-2

Pastikan status target berubah menjadi healthy sebelum mengarahkan trafik produksi ke load balancer.

Network Load Balancer (NLB)
#

Network Load Balancer (NLB) dirancang untuk menangani trafik berperforma tinggi dengan latensi rendah pada Layer 4 (TCP, UDP, TLS, dan TCP_UDP). NLB cocok digunakan untuk aplikasi yang membutuhkan throughput tinggi, koneksi jangka panjang, atau alamat IP statis.

Membuat NLB Publik
#

Secara default, NLB yang dibuat tanpa parameter --scheme internal akan dapat diakses dari internet apabila ditempatkan pada subnet publik.

aws elbv2 create-load-balancer \
    --name my-network-lb \
    --type network \
    --subnets subnet-12345678 subnet-87654321 \
    --region us-west-2

Membuat NLB dengan Elastic IP (IP Publik Statis)
#

Gunakan parameter --subnet-mappings jika Anda ingin mengontrol alamat IP publik yang digunakan oleh NLB dengan mengaitkan Elastic IP (EIP) pada setiap Availability Zone.

aws elbv2 create-load-balancer \
    --name my-static-ip-nlb \
    --type network \
    --subnet-mappings \
        SubnetId=subnet-12345678,AllocationId=eipalloc-12345678 \
        SubnetId=subnet-87654321,AllocationId=eipalloc-87654321 \
    --region us-west-2

Membuat NLB Internal
#

Gunakan parameter --scheme internal agar NLB hanya dapat diakses dari dalam jaringan VPC.

aws elbv2 create-load-balancer \
    --name my-internal-nlb \
    --type network \
    --scheme internal \
    --subnets subnet-12345678 subnet-87654321 \
    --region us-west-2

Membuat Target Group
#

Setelah NLB dibuat, buat Target Group yang akan menjadi tujuan trafik. NLB mendukung protokol TCP, UDP, TLS, dan TCP_UDP.

VpcId=$(aws ec2 describe-vpcs \
  --query "Vpcs[0].VpcId" \
  --output text)

aws elbv2 create-target-group \
    --name my-nlb-targets \
    --protocol TCP \
    --port 80 \
    --vpc-id $VpcId \
    --target-type instance \
    --region us-west-2

Membuat Listener
#

Listener menentukan protokol dan port yang akan digunakan NLB untuk menerima koneksi, serta ke Target Group mana trafik akan diteruskan.

LoadBalancerArn=$(aws elbv2 describe-load-balancers \
  --names my-network-lb \
  --query "LoadBalancers[0].LoadBalancerArn" \
  --output text)

TargetGroupArn=$(aws elbv2 describe-target-groups \
  --names my-nlb-targets \
  --query "TargetGroups[0].TargetGroupArn" \
  --output text)

aws elbv2 create-listener \
    --load-balancer-arn $LoadBalancerArn \
    --protocol TCP \
    --port 80 \
    --default-actions Type=forward,TargetGroupArn=$TargetGroupArn \
    --region us-west-2

Mendaftarkan Instance EC2 ke Target Group
#

Langkah terakhir adalah mendaftarkan instance EC2 agar dapat menerima trafik yang diteruskan oleh NLB.

TargetGroupArn=$(aws elbv2 describe-target-groups \
  --names my-nlb-targets \
  --query "TargetGroups[0].TargetGroupArn" \
  --output text)

INSTANCE1=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=MyServer1" \
  --query "Reservations[*].Instances[*].InstanceId" \
  --output text)

INSTANCE2=$(aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=MyServer2" \
  --query "Reservations[*].Instances[*].InstanceId" \
  --output text)

aws elbv2 register-targets \
    --target-group-arn $TargetGroupArn \
    --targets Id=$INSTANCE1,Port=80 Id=$INSTANCE2,Port=80 \
    --region us-west-2

Memverifikasi Status Target
#

Pastikan seluruh target telah terdaftar dan berada dalam status healthy.

aws elbv2 describe-target-health \
    --target-group-arn $TargetGroupArn \
    --region us-west-2

Setelah status target menjadi healthy, NLB akan mulai mendistribusikan trafik ke instance yang terdaftar sesuai konfigurasi listener dan target group.

Related