The European Union s Making the Labour Market more Inclusive III programme For North Cyprus Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals Module 3: Cloud Computing Modül 3: Bulut Bilişim Laboratuar Notları #7 A project implemented by CyberSoft Bilişim Teknolojileri Ltd. This project is funded by European Union. The contents of this publication are the sole responsibility of Cybersoft Bilişim Teknolojileri Ltd. and can in no way be taken to reflect the views of the European Union.
İçerik Bölüm 7: PHP AWS SDK kullanarak Amazon S3 servisinin kontrolü 1. AWS Key lerinin elde edilmesi......2 2. PHP AWS SDK nın Yüklenmesi............3 3. Amazon S3 Kullanarak Verilerin Depolanması......... 3 3.1 Amazon S3 Nedir?............3 3.2 S3 Bucket nin Yaratılması.........4 3.3 S3 Bucket lerinin Listelenmesi.........6 3.4 S3 e dosya yükleme.........7 1
1. AWS Key lerinin elde edilmesi AWS accountunuzu yarattığınız zaman size birer tane public and private AWS key ler otomatik olarak verilmişti. Bu key lere ulaşabilmek için AWS portalını http://aws.amazon.com linkinden açınız ve Figure 1 deki gibi Account menusunun altından Security Credentials seçiniz. Figure 1. Account menüsü Gerekli olursa email adresinizi ve password ünüzü tekrardan giriniz. Şimdi ekranınıza Security Credentials sayfası gelecektir. Figure 2 deki Your Access Keys kısmını bulmak için aşağıya ininiz. Figure 2. AWS Access Key Figure 2 deki Access Key ID nizi kopyalayınız ve boş bir Notepad dosyasının içine yapıştırınız ve dosyanızı aws_keys olarak kaydediniz.. Daha sonra Show linkine tıklayarak Secret Access Key nizi de seçip kopyalayınız ve onu da aws_keys isimli Notepad dosyanızın içine yapıştırınız. Şimdi de sıra yukarıda elde ettiğimiz aws Access key lerini kullanacağımız PHP AWS SDK nın indirilip, yüklemesine geldi... 2
2. PHP AWS SDK nın Yüklenmesi a. PHP AWS SDK nın son sürümü olan sdk-1.3.2 yi http://aws.amazon.com/sdkforphp/ linkinden indiriniz. Daha sonra C:\ sürümünün altında aws_sdk isimli bir folder yaratınız ve indirdiğiniz dosyanızı (sdk-1.3.2) unzip ile açıp aws folder inin altına koyunuz. b. Daha sonra C:\xampp\php dizininin altındaki php.ini dosyanızı açınız ve PHP SDK nın bulunduğu path ı dosyanıza aşağıdaki gibi ekleyiniz. include_path = ".;C:\xampp\php\php;C:\aws_sdk\sdk-1.3.2\sdk-1.3.2;" Daha sonra kullanacağımız PHP source code larını http://cybersoft-biltek.com/joomla1/index.php?option=com_content&view=article&id=54&itemid=69 linkinin altındaki PHP AWS SAMPLE CODE u indiriniz ve onu da php.ini dosyasındaki include_path ına ekleyiniz. include_path = ".;C:\xampp\php\php;C:\aws_sdk\sdk-1.3.2\sdk-1.3.2;C:\aws_sdk\code" c. Daha sonra C:\aws_sdk\sdk-1.3.2\sdk-1.3.2 dizininin altındaki config-sample.inc.php dosyasının kopyasını alınız ve adını config.inc.php olarak değişiniz, ve aşağıdaki değişiklikleri yapmak için açınız. Dosyadaki şu satırları değiştiriniz: define('aws_key', ''); define('aws_secret_key', ''); İlk define('aws_key', ''); satırının tırnaklarının içine access key ID nizi yazınız. İkinci define satırının içine de secret access key nizi giriniz. define('aws_key', 'your_access_key_id'); define('aws_secret_key', 'your_secret_access_key'); 3. Amazon S3 Kullanarak Verilerin Depolanması 3.1 Amazon S3 Nedir? S3 internet üzerinde veri depolama servisidir. S3 size verilerinizi bucket ismi verilen konteynerlarda saklamanızı sağlar. Her bir AWS account sahibi en fazla 100 bucket yaratabilir. Bucket isimleri tek ve benzersiz olmalıdır. Dolayısıyla bucker isimlerini seçerken cok dikkatli olmalı ve uygun ismi bulana kadar tekrar tekrar denemelisiniz. Bucket ler cok büyük miktardaki S3 objelerinin gruplanması için kullanılabilir. Tek bir S3 bucket inin içinde miltonlarca hatta on milyonlarca S3 objesi saklanabilir. İhtiyacınıza göre bir uygulama için bir ya da birden fazla bucket kullanabilirsiniz. S3 de istediğiniz tipte (HTML sayfaları, CSS style sheet veya C kodu yada JPEG, tar dosyaları hatta encyrpted verileri) verinizi saklayabilirsiniz. S3 web verilerinin saklanması için de idealdir. S3 kullanarak 5TB büyüklüğündeki objeler saklanabilir ancak uygulama da bircok faktörlerden dolayı bu limite ulaşamayabilirsiniz. Bu 3
faktörlerden biri de internet bağlantı hızıdır. S3 aynı zamanda cok büyük dosyalarınızı daha küçük parçalara bölüp, birden fazla parçanın aynı anda upload etmenize olanak sağlar. Her S3 objesinin kendi URL vardır.bu URL aşağıdaki komponentlerin birleşiminden oluşmaktadır: protocol (http:// or https://). İle sonlandırılan bucket adı S3 endpoint (s3.amazonaws.com) / ile başlayan object key Bu genel bilgileri öğrendikten sonra sıra kodlama kısmına geldi... In this section, you ll learn how to list your buckets, create new buckets, and list 3.2 S3 Bucket nin Yaratılması Şimdi de sıra yeni bir bucketin nasıl yaratılacağını öğrenmeye geldi. Öncelikle, kullanacağımız bazı tanımlamaları ve fonksiyonları içeren C:\aws_sdk\code\chapter_04\include dizininin altındaki book.inc.php dosyasını açınız. Burada yapmanız gereken bucket adını değiştirmek olacaktır. Burada verilen 'sitepoint-aws-cloud-book' ismini herkesin değiştirmesi gerekmektedir. Ben 'sitepoint-aws-cloudbook-dbeyaz' olarak değiştirdim. Siz de isminizin ilk harfi ve soyadınızın birleşimini kullanabilirsiniz. chapter_04\include \book.inc.php (excerpt) <?php define('book_bucket', 'sitepoint-aws-cloud-book');?> Not: Unutmamalısınız ki bucket isimleri tek ve benzersiz olmalıdır... Şimdi de yeni bir S3 bucketi yaratmak için kullanacağımız kodu inceleyelim: <?php error_reporting(e_all); (1) require_once('sdk.class.php'); (2) require_once('include/book.inc.php'); if ($argc!= 2) (3) exit("usage: ". $argv[0]. " bucket name\n"); $bucket = ($argv[1] == '-')? BOOK_BUCKET : $argv[1]; (4) $s3 = new AmazonS3(); (5) chapter_04\create_bucket.php $res = $s3->create_bucket(book_bucket, AmazonS3::REGION_US_E1); (6) 4
if ($res->isok()) print("'$bucket' bucket created\n"); Else print("error creating bucket '$bucket'\n");?> Şimdi de create_bucket kodunu satır satır inceleyelim: (1) İlk satır hata bildirme seviyesini bildirmek için kullanılmıştır. Bu satır PHP yi bütün hataları ve potansiyel hataları raporlamak için yönlendirmektedir. Bu önemli bir programlama disiplinidir ve doğabilecek problemler için önceden uyarılmanızı sağlar. (2) İkinci ve üçüncü satırlar ise gerekli olan dosyaların eklenmesi için kullanılmıştır. İkinci satır sdk.class.php dosyasının hafızaya alınmasını sağlar. Bu dosya SDK library rini içermektedir. Üçüncü satır ise book.inc.php dosyasını hafızaya getirir. (3) Öncelikle kaç tane parametre girildiği kontrol edilir. Eğer iki tane değilse, program kapatılıp, uygun mesaj verilir. (4) Program ilk parametre olarak bucket adını bekler. Eğer (-) karakteri girilirse, default bucket (BOOK_BUCKET) kullanılır. (5) Bu kısım kodun ana kısmıdır. Öncelikle, yeni bir AmazonS3 objesi yaratıldı ve daha sonra da yeni bucket yaratmaya yarayan create_bucket metodu çağrıldı. create_bucket metodunun ilk parametresi bucket adı, ikincisi ise yaratıldığı yerdir. AmazonS3 SDK class ı her bölge için aşağıdaki gibi sabitler içermektedir: REGION_US_E1 US Standard REGION_US_W1 US Northern California REGION_EU_W1 Ireland REGION_APAC_SE1 APAC-Singapore (6) Son satır S3 e cağrı yapılıp yapılmadığını kontrol eder. Eğer daha önceden bu isimde bir bucket yaratılmadıysa, create_bucket cağrısı başarılı olur. Eğer bucket daha önceden başakası tarafından yaratılmış ise create_bucket cağrısı başarısız olur ve OK metodu FALSE döndürür. Bu kodu şu şekilde çalıştırınız. Command line açınız ve path ınızı C:\aws_sdk\code\chapter_04 olarak değişiniz. Daha sonra çalıştırmak için aşağıdaki gibi php nin yüklü olduğu dizine geçin ve programın adını yazın: C:\aws_sdk\code\chapter_04 C:\xampp\php\php.exe create_bucket.php Önemli Not: Burada ekranınıza bir hata mesajı gelecektir. Bunu gidermek için C:\xampp\php dizininin altında bulunan php.ini dosyanızı açınız ve extension=php_curl.dll yazan yerin önündeki ; virgülü silip php_curl.dll dosyasını aktif hale getiriniz. Tekrardan kaydedip, php.ini yi kapatınız. Daha sonra Xampp ın kontrol kısmından Apache server i kapatıp açınız ve tekradan calıştırmayı deneyiniz. Eğer başarılı olursa ekranda 'sitepoint-aws-cloud-book' bucket created yazısını göreceksiniz. 5
3.3 S3 Bucket lerinin Listelenmesi chapter_04\list_bucket.php <?php error_reporting(e_all); require_once('sdk.class.php'); $s3 = new AmazonS3(); $buckets = $s3->get_bucket_list(); (1) foreach ($buckets as $bucket) (2) print($bucket. "\n"); exit(0);?> (1) Bu satır sizin account unuzda bulunan bucket lerin listesini almak için kullanılan anahtar satırdır. Get_bucket_list() metodu içerisinde her bir bucket için bir string elemanı bulunan bir array döndürür. (2) Liste arrayini elde ettikten sonra, foreach döngüsü kullanılarak bucket isimleri ekrana yazılır. Bu kodu çalıştırtığınız zaman ben aşağıdaki sonucu elde ettim: C:\aws_sdk\code\chapter_04 C:\xampp\php\php.exe list_bucket.php 'sitepoint-aws-cloud-book-dbeyaz' Şimdi de S3 Bucket lerinin web sayfası şeklinde listelenmesini görelim. Aslında kodun bu versiyonu yukarıdaki list_buckets.php koduna oldukca benzemektedir, sadece son üç satırı farklıdır: <?php error_reporting(e_all); require_once('sdk.class.php'); $s3 = new AmazonS3(); $buckets = $s3->get_bucket_list(); $output_title = 'Chapter 4 Sample - List of S3 Buckets'; $output_message = 'A simple HTML list of your S3 Buckets'; include 'include/list_buckets.html.php'; exit(0);?> chapter_04\list_buckets_page.php 6
$output_title ve $output_message değişkenleri web sayfasında görünmesini istediğimiz başlık ve mesaja eşitlenmiştir. Son include satırı ise programda kullanılacak olan HTML template ini eklemek için kullanılmıştır. Önemli Not: Bu kodu çalıştırdığınız zaman, yeni yarattığınız bucket herhangi bir obje içermediğinden herhangi bir sonuç göremeyeceksiniz. Bunun için bir sonraki kısımdaki S3 e dosya yükleme kısmını yaptıktan sonra bu kodu çalıştırmak daha faydalı olacaktır... 3.4 S3 e dosya yükleme Şimdiye kadar bucketlerin nasıl yaratıldığını ve onların objelerini nasıl listeleyeceğimizi gördük. Şimdi de sırada S3 e nasıl yeni objeler yükleyebileceğimizi göreceğiz. Bunun için book.inc.php dosyamıza 2 fonksiyon daha eklememiz gerekmektedir. Bunlardan birincisi uploadobject fonksiyonudur: function uploadobject($s3, $bucket, $key, $data, $acl = AmazonS3::ACL_PRIVATE, $contenttype = "text/plain") $res = $s3->create_object($bucket, $key, array( 'body' => $data, 'acl' => $acl, 'contenttype' => $contenttype )); if ($res->isok()) return true; sleep($sleep); $sleep *= 2; while(++$try < 6); return false; uploadobject fonksiyonu dört ile altı arasında parametre kabul etmektedir. İlk dört S3 objesini, the destination bucketi, obje anahtarını, ve objeye yüklenecek olan bilgileri temsil etmektedir. Son ikisi ise a non-default ACL i ve yüklenecek bilginin içerik tipidir. Yukarıdaki kod parçasından görüleceği üzere uploadobject fonksiyonu create_object metodunu çağırır ve dönen değeri kontrol ederek objenin S3 e yüklenip yüklenmediğini kontrol eder. Eğer yüklenemezse 2 saniye bekledikten sonra tekrardan dener. Toplamda 6 kere deneme yapar. Eğer hala sorun varsa HTTP 500 (internal server error) hata mesajını döndürür. İkinci fonksiyonumuz ise dosya içerik tipini belirlemeye yarayan guesstype fonksiyonudur: function guesstype($file) $info = pathinfo($file, PATHINFO_EXTENSION); switch (strtolower($info)) 7
case "jpg": case "jpeg": return "image/jpg"; case "png": return "image/png"; case "gif": return "image/gif"; case "htm": case "html": return "text/html"; case "txt": return "text/plain"; default: return "text/plain"; Yukarıdaki iki fonksiyona biraz arguman kontrol işlemi, döngü ve hata kontrolü de eklersek, S3 e dosya yüklemek için gereken upload_file kodumuzu oluşturabiliriz. <?php error_reporting(e_all); require_once('sdk.class.php'); require_once('include/book.inc.php'); if ($argc < 3) exit("usage: ". $argv[0]. " bucket files...\n"); $bucket = ($argv[1] == '-')? BOOK_BUCKET : $argv[1]; $s3 = new AmazonS3(); for ($i = 2; $i < $argc; $i++) $file = $argv[$i]; $data = file_get_contents($file); chapter_04\upload_file.php $contenttype = guesstype($file); if (uploadobject($s3, $bucket, $file, $data, AmazonS3::ACL_PUBLIC, $contenttype)) print("uploaded file '$file' to bucket '$bucket'\n"); else exit("could not upload file '$file'". 8
" to bucket '$bucket'\n"); exit(0);?> Bu kodu çalıştırtığınız zaman ben aşağıdaki sonucu aldım: C:\aws_sdk\code\chapter_04 C:\xampp\php\php.exe upload_file.php C:\Users\Dilek\Pictures\bild2.jpg Uploaded file C:\Users\Dilek\Pictures\bild2.jpg to bucket 'sitepoint-aws-cloud-book-dbeyaz' Siz de kendi fotoğraflarınızı yüklemeyi deneyiniz. Tabii uygun dizini vererek... 9