Amazon EC2 (Amazon Elastic Compute Cloud) boyutlandırılabilir işlem kapasitesi sağlayan, bulut üzerinde çalışan bir web servisidir. EC2’nin temel amacı geliştiricilerin daha kolay web ölçekli bulut bilişim yapabilmesi olarak ifade edilmiş.[1] Bu yazıda, EC2 üzerinde aynı anda birden çok makine ayağa kaldırmak için kullandığım koddan bir parça anlatacağım. AWS (Amazon Web Service) web arayüzünden dilediğiniz yapılandırma ayarlarına sahip makineler oluşturabiliyorsunuz, fakat ben daha otomatik bir şekilde bu işi yapan bir betiğe ihtiyaç duydum ve bunun için “boto” [2] isimli Amazon web servisleri için Python dilinde bir arabirim kullanmanın uygun olduğuna karar verdim. (Yazı ve örnek kod, kurulum ve yetkilendirme kısımlarının yapılmış olduğunu varsaymaktadır.)
Örneği üç parçada ele alırsak, ilk olarak çalıştırmak istediğimiz makinenin gerekli ayarlarını göreceğiz. Bu bilgileri Python dictionary (sözlük) veri tipi içine ekleyebiliriz.
SERVER_CREDENTIALS = { 'worker' : { 'image_id' : 'ami-xxxxxxxx', 'instance_type' : 't2.micro', 'security_groups' : ['my-security-group'], 'key_name' : 'my-key-pair', }, 'region' : { 'region' : 'us-west-2' } }
Bu ayarlar, worker
, ayağa kaldıracağımız makineleri yapılandırma ayarlarına göre gruplayınca bu gruba verilen isimdir. image_id
, worker tipi makinelerimizin içinde çalışacak olan işletim sisteminin (ve eğer istenirse üzerine eklenen programlar) Amazon web servislerindeki kayıt numarası, instance_type
Amazon web servislerinde kullanabileceğiniz makine tipi, örneğin t2.micro en düşük özellikli tiplerden birisidir. security_groups
ve key_name
web servislere ulaşabilmeniz için gereken yetkilendirme araçlarından ikisidir. region
ise bu makinenin fiziksel olarak dünyanın neresinde bulunduğuna dair verimerkezi bölge bilgisidir.
İkinci kısım sunucuya bağlanma, makineyi yaratma ve yaratılan makinelerin bilgilerini alma işlemlerinden oluşan ana parçadır. Bu ana parçayı sağlayan, bir sınıfın fonksiyonlardır. Sırasıyla, sunucuya bağlantı açan (connect) fonksiyonu,
def connect(self): self.conn = boto.ec2.connect_to_region( self.SERVER_CREDENTIALS['region']['region'])
Sunucu (bulut) üzerinde makine yaratan (create_instance) fonksiyonu,
def create_instance(self, server_type, address=None): reservation = self.conn.run_instances( **self.SERVER_CREDENTIALS[server_type]) instance = reservation.instances[0] time.sleep(10) while instance.state != 'running': time.sleep(5) instance.update() print "Instance state: %s" % (instance.state) print "instance %s done!" % (instance.id) return instance
ve son olarak yaratılan makinenin bilgilerini döndüren (get_instances) fonksiyonu aşağıdadır.
def get_instances(self): return self.conn.get_all_instances()
Son kısma gelirsek, burada verilen sayıda makine yaratan fonksiyonu
def create_new_instances(number_of_instances): ec2conn = EC2Connection() ec2conn.connect() for i in xrange(number_of_instances): instance = ec2conn.create_instance(server_type='worker')
ve main fonksiyonu göreceğiz.
if __name__ == "__main__": if len(sys.argv) == 2: number_of_instances = int(sys.argv[1]) create_new_instances(number_of_instances) else: print "usage is : python create_instances.py number_of_instances"
Tüm betik dosyasını kesintisiz halde görmek istersek, şöyle olacaktır;
#!/usr/bin/python from boto.ec2.connection import EC2Connection import boto import sys import time class EC2Connection: SERVER_CREDENTIALS = { 'worker' : { 'image_id' : 'ami-xxxxxxxx', 'instance_type' : 't2.micro', 'security_groups' : ['my-security-group'], 'key_name' : 'my-key-pair', }, 'region' : { 'region' : 'us-west-2' } } def __init__(self): self.conn = None def connect(self): self.conn = boto.ec2.connect_to_region( self.SERVER_CREDENTIALS['region']['region']) def create_instance(self, server_type, address=None): reservation = self.conn.run_instances( **self.SERVER_CREDENTIALS[server_type]) instance = reservation.instances[0] time.sleep(10) while instance.state != 'running': time.sleep(5) instance.update() print "Instance state: %s" % (instance.state) print "instance %s done!" % (instance.id) return instance def get_instances(self): return self.conn.get_all_instances() def create_new_instances(number_of_instances): ec2conn = EC2Connection() ec2conn.connect() for i in xrange(number_of_instances): instance = ec2conn.create_instance(server_type='worker') if __name__ == "__main__": if len(sys.argv) == 2: number_of_instances = int(sys.argv[1]) create_new_instances(number_of_instances) else: print "usage is : python create_instances.py number_of_instances"
Kaynaklar:
1. http://aws.amazon.com/ec2/, en son 15.02.2015 tarihinde erişildi.
2. https://boto.readthedocs.org/en/latest/index.html, en son 15.02.2015 tarihinde erişildi.