Yeni bir bulut teknolojisi öğrenmek korkutucu olabilir. Çözüm Mimarı Kyle Moschetto, Bu durumu şu şekilde açıklıyor: ”Bir çözüm mimarı olarak son altı yılda AWS, Azure ve en son Google Cloud Platform‘u (GCP) öğrenmek zorunda kaldım ve inanılmaz çeşitlilikteki teknolojiler, ürünler ve satıcılar bunu aşılması imkansız bir dağ gibi gösterebilir. Büyük bulut sağlayıcıları arasında geçiş yapmak bile, ürünler, kısaltmalar ve şirket kültürleri arasındaki ince farklılıklar nedeniyle zor olabilir.”
Mimar, yeni bulut platformlarını öğrenme yöntemini sıradışı bir yaklaşım kullanarak açıklıyor: Çocukları için aşırı derecede komplike bir Minecraft sunucusu oluşturarak. Mimar, çocuklarının Minecraft maceralarına derinden dahil olmuş durumda. İnşa etme, kaynak toplama ve sunucu yönetimi gibi etkinliklere aktif olarak katılıyor. Bu deneyimler ile sistem güvenilirliği, otomatik kurtarma ve olağanüstü durum kurtarma (Disaster recovery) gibi önemli iş kavramları arasında paraleller çiziyor. Gerçek hayattaki beklenmedik “creeper patlamaları” gibi zorluklarla karşılaşmalarına rağmen (bilgisayarlarına veya oyun dosyalarına bir şey olması gibi) mimar bu uygulamalı deneyimlerin içsel olarak paha biçilmez öğrenme fırsatlarını vurguluyor. Mimar, ardından Google Cloud Platform (GCP) kullanarak buluta hazır, kullanıcı dostu, otomatik olarak yedeklenen ve sunucusuz işlevler (Serverless functions) aracılığıyla kontrol edilebilen bir Minecraft sunucusu oluşturmayı anlatıyor. Bu sayede sunucuyu arkadaşlar ve aile ile paylaşmak kolaylaşıyor.
İlk gecenizde hayatta kalma ve gereksinimlerinizi karşılama planı
GCP’de temel bir Minecraft sunucusu oluşturmak aslında oldukça basittir:
- Bir sanal makine oluşturun
- Minecraft sunucu yazılımını yükleyin
- Bazı Minecraft yazılımı başlangıç komut dosyalarını yapılandırın.
Bu rehberde Minecraft sunucusu kurulumunu adım adım göstermeyeceğiz. Eğer Minecraft sunucusu kurmayı bilmiyorsanız lütfen devam etmeden önce kurulumu öğrendiğinizden emin olun; çünkü bu rehberde daha çok bu sunucuyu nasıl buluta taşıyabileceğinize değineceğiz.
Minecraft sunucunuzu buluttan kontrol etmek istiyorsanız sunucunuzun karşılaması gereken üç ek gereksinim var:
- Otomasyon: Sunucuyu açıp kapatmak kolay olmalı.
- Güvenlik: Arkadaşlarınızı ve ailenizi, sunucuyu herkese açık yapmadan oynamaya davet etmek kolay olmalı.
- Olağanüstü durum kurtarma: Sistem oyun dosyalarını otomatik olarak yedeklemeli.
Bunlara tek tek bakalım.
Gereksinim 1: Otomasyon
Günlük yaşamınızda yeterince dikkat dağıtıcı şeylerle karşılıyorsunuz. Bir de bunun üstüne birinin sizi sadece sunucuyu açmak için araması gerekiyorsa, bu sorun olabilir. Sadece güç düğmesine basarak sunucuyu açabilmeleri gerekmekte.
Ayrıca IAM rollerini anlamak veya talebe bağlı faturalandırma gibi Google Cloud Konsolu’nun karmaşık özelliklerine girmek istemezsiniz, çünkü bu oldukça zor olabilir. İdeal olarak, güvenli bir şekilde kodu yürüten bir olaya dayalı işlev arıyorsunuz. İşte tam da bu noktada Google Cloud Functions devreye giriyor! Herhangi bir tarayıcıda bu URL’leri kolayca yer işareti olarak ekleyebilirsiniz, böylece kullanıcılar kodu değiştiremeden işlevi anında çalıştırabilirler.
Örneğin Google Cloud Functions içindeki bir HTTP tetikleyici aracılığıyla çalıştırılan aşağıdaki Node.js kodu, “my-minecraft-server” adında bir sunucuyu us-west2-a bölgesinde başlatacak. Bu işlevlerin altında, Node.js’de yazılmış kod blokları bulunmakta, ancak aynı işlevi Python veya Go kullanarak da yazabilirsiniz.
/**
* Minecraft sunucusunu baslatin, dıs IP'yi alin ve bir guvenlik duvari kuralı olusturun.
*/
const http = require('http');
const Compute = require('@google-cloud/compute');
const compute = Compute();
const zone = compute.zone('us-west2-a');
const vm = zone.vm('mc-server-v1');
const fwname = 'minecraft-fw-rule-' + Math.floor(new Date() / 1000);
async function get_server_ip() {
return new Promise(function(resolve, reject) {
vm.getMetadata(function(err, metadata, apiResponse) {
resolve(metadata.networkInterfaces[0].accessConfigs[0].natIP);
});
});
}
async function check_if_server_is_ready() {
const server_ip = await get_server_ip();
const ready = !!server_ip;
return ready
}
async function sleep(milliseconds) {
return new Promise(function(resolve, reject) {
setTimeout(resolve, milliseconds);
});
}
exports.startInstance = async function startInstance(req, res) {
// VM'yi baslatın
const zone = compute.zone('us-west2-a');
const vm = zone.vm('mc-server-v1');
console.log('bir VM baslatilmak uzere);
vm.start(function(err, operation, apiResponse) {
console.log('basariyla başlatildi');
});
console.log('sunucu başlıyor');
while(!(await check_if_server_is_ready())) {
console.log('Sunucu hazir değil, 1 saniye bekleniyor...');
await sleep(1000);
console.log('Sunucu hazirligi tekrar kontrol ediliyor...');
}
console.log('sunucu hazır');
const server_ip = await get_server_ip();
// islev cagiricisinin ipv4 adresini kaydedin
console.log(JSON.stringify(req.headers));
sourceIp = req.get('X-Forwarded-For');
let callerip = req.query.message || req.body.message || sourceIp;
// guvenlik duvari yapilandirmalarini ayarlayin
const config = {
protocols: {tcp: [25565]},
ranges: [callerip + '/32'],
tags: ['minecraft-server']
};
function callback(err, firewall, operation, apiResponse) {}
// Guvenlik Duvarini Oluşturun
compute.createFirewall(fwname, config, callback);
res.status(200).send('Minecraft Sunucusu Başladı! Artık GERÇEK PARA harcıyorsunuz! <br />' + 'Minecraft sunucusunun IP adresi: ' + server_ip + ':25565<br />IP adresiniz ' + callerip + '<br /> Bir Güvenlik Duvarı kuralı ' + fwname + ' adında olusturuldu.' );
};
NOT: Durdurma işlevini oluşturmak için sadece startInstance()
fonksiyonunu stopInstance()
fonksiyonuyla değiştirin ve status.send
yanıt metnini değiştirin. Bu kod, bilerek temel bir yapıda yazıldı ve bu örneği basit tutmak için tasarlandı. Denemeler yapmaktan çekinmeyin ve özellikler ekleyin; bu yazının temel amacı budur.
İşlemin ayrıntıları: start-minecraft-server
, Minecraft sunucusunun sanal makinesini çalıştırarak başlar. Daha sonra, istek sahibinin IPv4 adresini kaydeder ve Minecraft sunucusuna dış erişime izin vermek için otomatik olarak bir VPC Güvenlik Duvarı kuralı oluşturur. Bu, sunucuyu başlatan kişinin otomatik olarak ona bağlanma iznine sahip olacağı anlamına gelir.
Ardından, birkaç mesajı tarayıcı penceresinde gösterir. Özellikle sunucunun başarıyla başlatıldığına dair bir mesaj ve bunun için gerçek para harcadığınızı belirten bir mesaj verir. Ayrıca, Minecraft sunucusunun tam IP adresini ve portunu verir. Bu, kullanıcıların Minecraft istemcisine ne yazacaklarını bilmelerini sağlar ve sunucuya katılarak oynamaya başlayabilirler.
stop-minecraft-server
ise daha basit bir işlev. Basitçe sanal makineye durdurma komutu verir. Sanal makinenin kapatma betiği, oyun dosyalarını kapatma işlemi sırasında yedekler. Sunucuyu temiz bir şekilde durdurmak için gereken tek şey bu. Ayrıca tarayıcıya bir mesaj göndermesini sağlayabilirsiniz ki böylece kullanıcılar sunucunun artık kapanmakta olduğunu bilirler.
Gereksinim 2: Güvenlik
Minecraft’ı arkadaşlarla birlikte oynamak her zaman daha keyiflidir. Diğer oyuncuların oyuna erişimini sağlamak önemli. Ancak bu herkese açık olması gerektiği anlamına gelmez. Hackerlar, oyunu sabote edenler, hizmet reddi (DoS) saldırıları veya kötü niyetli kodlar gibi risklerden kaçınmak için sunucuyu herkese açık yapmamak daha güvenli bir seçenek. Güvenlik duvarları, bu tür risklere karşı koruma sağlar ve bu nedenle GCP’deki bu özelliğin kullanımını tercih ediyoruz.
Temel “arkadaş ekleme” işlevi kolayca oluşturulabilir ve kullanılabilir. İlk olarak, add-a-friend
adında bir bulut işlevi oluşturmanız gerekir. Bu işlev, bir URL’ye tıklanınca tetiklenir. Bu gerçekleştiğinde kullanıcının IPv4 adresini alır ve bu kullanıcının IP’sinden Minecraft sunucusuna erişime izin vermek için VPC’de bir güvenlik duvarı kuralı oluşturur. Ardından, sunucunun IP adresini ve bağlanmak için kullanılabilecek port’u tarayıcıda gösterir. Artık diğerleriyle oynamak istediğinizde sunucuyu başlatıp, .add-a-friend
URL’sini arkadaşlarınızla paylaşıp oynamaya başlayabilirsiniz!
Aşağıdaki gcloud komutları, arkadaşlarınızı güvenlik duvarına eklemek için kullanabilceğiniz bulut işlevini oluşturacak.
/**
* minecraft sunucusuna erisimi saglamak icin VPC guvenlik duvari kuralini olusturun
*/
var http = require('http');
var Compute = require('@google-cloud/compute');
var compute = Compute();
var fwname = 'minecraft-fw-rule-'+Math.floor(new Date() / 1000);
exports.makeFWRule = function makeFWRule(req, res) {
// Islevi cagıranin IPv4 adresini kaydedin.
console.log(JSON.stringify(req.headers));
sourceIp = req.get('X-Forwarded-For');
let callerip = req.query.message || req.body.message || sourceIp;
// Guvenlik duvari yapilandirmalarini ayarlayin
const config = {
protocols: {tcp: [25565]},
ranges: [callerip + '/32'],
tags: ['minecraft-server']
};
function callback(err, firewall, operation, apiResponse) {}
// Guvenlik duvarini olusturun
compute.createFirewall(fwname, config, callback);
// Bir yanit dondurun.
res.status(200).send('Guvenlik duvari kurali oluşturuldu '+fwname+' IP adresi '+callerip);
};
Gereksinim 3: Olağanüstü Durum Kurtarma
Bu adım, sunucunun çalışır durumda olmasını sağlamanın yanı sıra, oyun dünyası dosyalarının düzenli yedeklerinin alınmasını da sağlar. Bu, sunucunun sanal makinesinin Cloud Storage’a yazma izinlerinin yapılandırılması, yedekleme işlemini gerçekleştirmek için basit bir bash betiği yazılması ve bunun düzenli olarak crontab aracılığıyla çalıştırılması ile sağlanır.
Başlamadan önce, bu yedeklemelerin nispeten küçük olduğunu unutmayın – orta büyüklükte bir dünya için sadece birkaç düzine MB – bu yüzden bunları Cloud Storage’da saklamak maliyetli olmayacak. Ancak, harcamalarınızı akıllıca yönetmek isterseniz. Bu iki Cloud Storage özelliği size yardımcı olacak: Coldline storage ve object lifecycle management.
Coldline storage, verileri düşük maliyetle saklamanıza olanak tanırken, geri indirmek için daha yüksek bir maliyet gerektirir. Bu özellik, özellikle olağanüstü durum kurtarma gibi senaryolar için biçilmiş kaftan. Minecraft sunucusunu kurarken, GB başına maliyeti azaltmak için bucket üzerindeki varsayılan depolama sınıfını “coldline” olarak ayarlamalısınız.
Cloud Storage object lifecycle kuralları, aynı zamanda depolama bucket’ında verilerin ne kadar süreyle saklanacağını belirleme imkanı sunar. Düzenli olarak yedekleme yapılacağını ve eski yedeklemelerin sınırlı kullanıma sahip olduğunu göz önünde bulundurarak, uzun bir saklama süresine ihtiyacınız olmayacağını söyleyebiliriz. Cloud Storage’da 90 günden daha eski dosyaları otomatik olarak silmek için bir object lifecycle kuralı oluşturabilirsiniz. Bu, başka bir güvenlik önlemi daha sunar: Uzun vadeli bir “ürün kesintisi” durumunda (örneğin, uzun bir süre oyuna giremezseniz), hala bir olağanüstü durumda geri yükleme yapabilirsiniz.
Aşağıdaki gcloud komutları, coldline depolama kullanarak “my-project-minecraft-backup
” adında yeni bir Minecraft depolama bucket’ı oluşturacak ve 90 günden eski olan dosyaları silmek için bir object lifecycle kuralı oluşturacak.
gsutil mb -c coldline --retention 90d gs://my-project-minecraft-backup
Tüm bunların maliyeti ne olacak?
GCP, ücretsiz çeşitli ürünler de sunmakta. Bu kılavuzda açıklanan adımların sonucunda, maliyetlerin aşağıdaki gibi olması beklenir:
Compute Engine
- N1-standart-1’in çalıştırma maliyeti saatte 0,05 doların biraz altında.
- Statik bir IP adresine sahip olmanın maliyeti ayda 7 doların biraz üzerinde.
Cloud Storage
- Google Cloud Storage’ınız, GCP Ücretsiz Seviyesi tarafından kapsanmakta.
Cloud Functions
- Google Cloud Functions’larınız, GCP Ücretsiz Seviyesi tarafından kapsanmakta.
Bu durumda, Minecraft sunucusunu barındırmanın maliyeti yaklaşık olarak ayda 10 $ olacak, bu da günlük ortalama iki saatlik kullanımı içerir. Ödemenin sizin tarafınızdan mı yoksa kullanıcılar tarafından mı yapılacağı, ne kadar cömert hissettiğinize bağlı olacak.
Sonraki adım ne olmalı?
Şu anda tüm gereksinimleri karşılamış durumdasınız. Sunucunuz sorunsuz çalışıyor ve oyun verilerini otomatik olarak yedekliyor. Ayrıca, sunucuyu bir URL ile kolayca açıp kapatabilir veya oyuna arkadaş ekleyebilirsiniz. Ancak, bu sadece GCP’nin sunduklarının bir kısmı! İşte Minecraft sunucunuzun yeteneklerini artırmak ve maliyetlerini düşürmek için yapabileceklerinizin kısa bir listesi:
Bağlanmayı daha basit hale getirin.
- Google Cloud DNS ile bir alan adı kaydedin ve tüm IP bağlantı bilgilerini DNS’e dönüştürün. Sunucu, başlatma betiği parçası olarak kendisini CNAME kaydı olarak kaydedecek şekilde yapılandırılmalı, böylece oyuna bağlanmak için tutarlı bir URL elde edilir.
Harcamalarınızı daha akıllıca yapın.
- Sunucunuzu bir Preemptible VM‘e geçirin, özel bir makine imajı oluşturun ve başlatma komut dosyasını genişleterek sunucu açıldığında en son yedeklemeyi çekin. Artık saatlik sunucu maliyetlerinizi yaklaşık %80 oranında azalttınız.
- Başlangıç komut dosyalarını sunucuda ephemeral IP address kullanacak şekilde değiştirin, böylece statik bir IP adresi kullanmanın maliyetini ortadan kaldırın.
Arkadaşların güvenlik duvarı girişlerini otomatik olarak temizleyin.
- Google Cloud Pub/Sub kullanarak sunucu işlevinizi değiştirin ve tüm arkadaş ekleme güvenlik duvarı girişlerini bir Pub/Sub altına yerleştirin, ardından her gece bunları temizleyecek başka bir işlev oluşturun.
İzleme, uyarı ve günlüklemeye ilişkin güncellemeler hakkında bilgi edinin.
- Minecraft sunucu günlüklerini gerçek zamanlı olarak izlemek ve oyun içi sorunları gidermek için Stackdriver günlükleme kullanın.
- Stackdriver izleme ve uyarılarını kullanarak:
- Sunucu açık veya kapalı olduğunda bir sms mesajı gönderin.
- Sistem CPU’sunu veya sunucu bağlantılarını izleyerek sunucunun boşta olup olmadığını belirleyin ve otomatik olarak kapatın.
Veri bilimi alanında yapılabilecek yenilikleri keşfedin.
- Sunucu günlüklerini inceleyerek her arkadaşınızın ve aile üyenizin ne sıklıkta oyunu oynadığını belirleyin ve bir ücretlendirme raporu oluşturun!
- Günlük verilerinizi BigQuery’e aktarın ve sunucunun çalışma süresi, çevrimiçi olan kullanıcı sayısı ve diğer temel ölçümler hakkında raporlar oluşturun.
- Daha fazla veri mi istiyorsunuz? Bir sunucu modu yükleyerek ayrıntılı oyun verilerini yerel bir günlük dosyasına aktarın, ardından bunları BigQuery’e aktarın ve sunucuda günlük olarak ne kadar blok kazıldığını sorgulayıp öğrenin.
- Daha da ileri gidin ve Google Cloud DataLab ile gerçek zamanlı olarak bu bilgileri alan bir gösterge paneli oluşturun ve oyuncular hakkında analizler yapın.
Konteynerler ile deneme yapın.
- Minecraft Sunucusunu Google Kubernetes Engine (GKE) üzerinde çalışan bir Docker konteynerına taşıyın. Kalıcı depolama kullanın veya oyunu yönetmek ve başlatmak için otomatik yükleme betikleri kullanın. Önceki tüm işlevselliğin konteynerler kullanıldığında aynı şekilde çalışması için gereken değişiklikleri araştırın.
Sonuç
Bu projeyi keyifle yönetin ve mimarinize ekleyebileceğiniz çeşitli araçlar ve ürünlerle tüm kullanıcıları mutlu edin. Ayrıca, verilerinizden daha fazla bilgi edinerek maliyetleri düşürürken sunucu çalışma süresini maksimumda tutun.
Şimdi inşa etmeye başlama zamanı!