boto ile Amazon EC2’de Makine Çalıştırmak

Neslihan Şirin Saygılı —  15 Şubat 2015 — Yorum bırakın

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.

Neslihan Şirin Saygılı

Posts

İTÜ Bilgisayar Mühendisliği bölümünden mezunum, şimdi doktora öğrencisiyim. Temel olarak ilgilendiğim alanlar bilgi edinilmesi (information retrieval), verinin işlenmesi (metin sınıflandırma, yazar tespiti) ve bu verinin bilgiye dönüştürülmesidir. Python, Java, PHP, Ubuntu, HTTP yığını, Linux-Apache-MySQL üçlüsü gündelik olarak kullandığım araçlardır. Prisync'in kurucu yazılımcılarından biriyim.

No Comments

Be the first to start the conversation.

Yorum yapmak için