Sunucusuz İşlevler Nedir? Nasıl Dağıtılır?

Fatih Küçükkarakurt

Fatih Küçükkarakurt

Son birkaç yıldır, sunucusuz işlevler popüler bir teknoloji haline geldi. Bu konu hakkında hala çok fazla kafa karışıklığı var. Sunucular olmadan nasıl kod çalıştırabilirsiniz? Sunucusuz işlevlerin artıları ve eksileri nelerdir? Kullanabileceğiniz durumlar nelerdir? Bu makalede, bu soruların yanıtlarını arayıp, sunucusuz işlevleri genel olarak yorumlamaya çalışacağız.

İçerik

Sunucusuz İşlevler Nelerdir?

"Sunucusuz" terimi, onu ilk duyduğunuzda kesinlikle merak uyandırır. "Sunucu olmadan web'de kodu nasıl çalıştırabilirim?" sorusunu düşünüyor olabilirsiniz. Aslında bunun anlamı, bir geliştirici olarak kodunuzun üzerinde çalıştığı sunucular hakkında endişelenmenize gerek olmamasıdır. Donanım sağlama, ağ oluşturma, yazılım yükleme ve ölçeklendirme, sunucusuz sağlayıcı tarafından soyutlanır.

Geliştirme açısından, sunucusuz işlev, sunucusuz bir sağlayıcıya (AWS veya Google gibi) yüklediğiniz bir kod paketidir. Bu kod, bir URL aracılığıyla isteklere yanıt verecek, bir programa göre çalıştırılacak (yani, bir cron aracılığıyla) veya sunucusuz işlevlerden çağrılacak şekilde yapılandırılabilir.

Sunucusuz işlevler, bir sunucuyu çalıştırmanın karmaşıklığı ve maliyeti olmadan ön uç uygulamalarına bir dizi arka uç işlevselliği eklemek için idealdir.

Ölçeğin diğer ucunda, sunucusuz işlevlerle tüm uygulamaları da oluşturabilirsiniz. Dosya depolama, veritabanı sistemleri ve kimlik doğrulama sağlayan diğer bulut hizmetleriyle birlikte, tek bir sunucu sağlamak zorunda kalmadan büyük, sağlam ve ölçeklenebilir uygulamalar oluşturmak mümkündür.

Sunucusuz İşlevlerin Avantajları

Sunucusuz işlevler, talep üzerine başlatılan mikro kapsayıcılarda çalıştırılır. Oldukça kısa süren süreçler için tasarlanmışlardır ve bu nedenle faturalandırma bu şekilde yapılır. Genellikle saatlik olarak faturalandırılan tam sunucu örneklerinin aksine, sunucusuz işlevler genellikle GB-saniye ile faturalandırılır. Milisaniye mertebesinde minimum fatura süreleriyle, düşük frekanslı veya düzensiz iş yüklerinin sunucusuz işlevler olarak çalıştırılması, geleneksel sunucu örneklerine göre çok daha ucuzdur. Hafif iş yükleri ve prototip oluşturma, bazı sağlayıcıların ücretsiz katmanına bile girebilir.

Sunucusuz işlevlerin isteğe bağlı olarak başlatılması, geliştiricinin fazladan çalışmasına gerek kalmadan hızlı ve kolay bir şekilde ölçeklenmeleri anlamına gelir. Bu, onları, yükün üstesinden gelmek için işlevin daha fazla örneği otomatik olarak kullanıma sunulacağından, trafiğin tahmin edilemeyecek şekilde artabileceği durumlar için ideal hale getirir. İşlev daha sonra küçültülecektir. Yani kullanılmayan kapasite için ödeme yapmayacaksınız.

Sunucusuz modelin önemli bir avantajı, sunucularla uğraşmak zorunda olmamasıdır. Bir web uygulamasını çalıştırmak, yazılımı en son güvenlik yamalarıyla güncel tutmak ve sunucunun güvenli ve performanslı olması için doğru şekilde yapılandırıldığından emin olmak için sunucu yönetiminde çok fazla zaman ve uzmanlık gerektirir. Yeni başlayanlar ve küçük işletmeler için, sunucu yönetimiyle ilgilenecek birini işe almak büyük bir yüktür. Sunucusuz olarak, geliştiriciler çözüm oluşturmaya odaklanabilir.

Sunucusuz İşlevlerin Dezavantajları

Elbette hiçbir teknoloji mükemmel değildir. Daha önce de bahsettiğim gibi sunucusuz model, kısa ömürlü süreçler düşünülerek tasarlanmıştır. Dakika cinsinden ölçülen maksimum yürütme süresiyle (örneğin, AWS'de 15 ve Google'da 9), büyük veri yığınlarını işleme gibi daha uzun süren işler için uygun değildir.

Yaygın olarak tartışılan bir diğer konu da başlangıç zamanıdır. Bu, sağlayıcının çalışmaya başlamadan önce sunucusuz işleviniz için bir kapsayıcı sağlaması ve başlatması için geçen süredir. Bir işlevin çalışması bittikten sonra, kod tekrar çalıştırılırsa konteyner kısa bir süre yeniden kullanılmak üzere elde tutulur. Bu "soğuk başlatma" gecikmesi , işlevinizin yanıt süresine yarım saniye ila bir saniyelik gecikme ekleyebilir. Bunun için, kapsayıcıyı canlı tutmak adına, belirli bir programa göre işlevinize ping atan sunucusuz çerçevenin WarmUp eklentisi de dahil olmak üzere geçici çözümler vardır.

Sunucusuz işlevlerde, sunucu sağlama ve bakım konusunda endişelenmenize gerek kalmasa da, bunun bir öğrenme eğrisi olmadığı anlamına gelmez. Sunucusuz uygulamalar oluşturmak, geleneksel monolitik kod tabanlarıyla çalışmaktan farklı bir zihniyet gerektirir. Kodunuzu farklı bir şekilde yapılandırmanız, işlevselliği sunucusuz işlevlerin kısıtlamalarına uyan daha küçük, ayrı hizmetlere ayırmanız gerekir. Her işlevin bağımsız olarak sürümleri belirlendiği ve güncellendiği için dağıtım da daha karmaşıktır.

Ayrıca, bazen sunucusuz teknolojinin bir dezavantajı olarak bahsedilen satıcı kilitlenmesi sorunu da var. Şu anda olduğu gibi, bu alandaki başlıca sağlayıcıların (AWS, Google, Azure) kendi farklı uygulamaları ve yönetim araçları vardır. Bu durum, sunucusuz bir uygulamayı bir bulut sağlayıcıdan diğerine taşımayı zorlaştırabilir. Serverless gibi projeler, uygulamaları sağlayıcılar arasında taşınabilir hale getirmek için temeldeki hizmetleri soyutlamaya çalışır.

Sunucusuz İşlev Kullanım Durumları

Form Postaları

Müşterinin, kendisine e-posta ile gönderilmesini istediği bir iletişim formu dışında, tamamen statik olan web sitelerine sahip olmak nadir değildir. Sitenin barındırma sağlayıcısı, sunucu tarafı komut dosyalarını destekleyebilir veya desteklemeyebilir ve bu aşina olduğunuz bir dilde olmayabilir. Form postası olarak sunucusuz bir işlev ayarlamak, işlevselliği statik barındırma üzerindeki sitelere eklemenize olanak tanır.

Cron

Bazen arka planda çalıştırılacak zamanlanmış bir göreve ihtiyacınız olabilir. Normalde, cron kurmak için bir sunucuya ödeme yapmanız gerekir ve bu sunucu, tüm işler arasında boşta kalır. Sunucusuz bir işlevde, yalnızca çalışırken geçirdiği süre için ödeme yaparsınız (ve belki de ücretsiz katmana girerse hiç de ödemezsiniz).

Küçük Resimler

React uygulamanızın, kullanıcının uygulama boyunca avatar olarak kullanılmak üzere bir fotoğraf yüklemesine izin verdiğini hayal edin. Yüklenen görüntüyü yeniden boyutlandırmak istersiniz, böylece gerekenden çok daha büyük görüntüler sunarak bant genişliğinizi boşa harcamazsınız. Sunucusuz bir işlev, yükleme isteğini işlemek, görüntüyü gerekli boyutlara yeniden boyutlandırmak ve S3 veya Google Storage gibi bir hizmete kaydetmek için kullanılabilir.

Pratik Bir Örnek

Sunucusuz işlevlerle çalışma konusunda daha pratik bir anlayışa sahip olmak için, gerçek dünyadan bir örnek düşünelim. Kullanıcının adını ve e-posta adresini bir Google e-tablosuna kaydetmek için, sunucusuz işlevi kullanan bir haber bülteni kayıt formuna sahip statik bir sayfa oluşturacağız.

Sağlayıcıya bağlı olarak, sunucusuz işlevler çeşitli dillerde yazılabilir, ancak Netlify Node.js işlevlerini desteklediği için JavaScript kullanacağız. Node/npm'nin cihazınızda yüklü olduğunu varsayarak hareket edeceğim.

1. Bir Netlify hesabına kaydolun

Bu örnekte ana bilgisayar olarak Netlify'yi kullanacağız, çünkü Netlify sunucusuz işlevler içeren ücretsiz bir katman sağlıyor ve kurulumu, çalıştırması çok kolay. İlk olarak, sitelerine gidin ve ücretsiz bir hesap için kaydolun.

2. Netlify CLI aracını yükleyin

Örnek sitemizi yerel olarak test etmek ve Netlify'ye dağıtmak için CLI araçlarını kullanacağız. Bu, komut satırından genel bir npm modülü olarak yüklenebilir:

npm install -g netlify-cli

CLI kurulduktan sonra, aşağıdaki komutu çalıştırmak, CLI'yi hesabınıza bağlamak için bir tarayıcı penceresi açar:

netlify login

3. Proje Klasörü Oluşturun ve Gerekenleri Yükleyin

Proje için bir klasör oluşturalım ve yeni bir npm projesi başlatalım:

mkdir serverless-mailinglist && cd serverless-mailinglist
npm init -y

Bu bize proje için gereken bağımlılıkları yüklemeye hazır bir package.json dosyası oluşturacaktır. Bundan bahsetmişken, sunucusuz işlevimiz için birkaç pakete ihtiyacımız olacak:

npm install dotenv google-spreadsheet

Birincisi, dotenv , .env, projemizin kökündeki bir dosyadan değerleri yüklememize ve bunları ortam değişkenleri gibi bir Node betiğine (sunucusuz işlevimiz) maruz bırakmamıza olanak tanıyan bir pakettir . Diğeri, Google E-Tablolar API'sini saran ve çalışmayı kolaylaştıran bir paket olan google-e-tablodur

4. Google E-Tabloyu Etkinleştirin ve Kimlik Bilgileri Oluşturun

E-Tablolar API'sini kullanmak için biraz hazırlık çalışması yapmamız gerekiyor. Öncelikle, API konsoluna giderek Google hesabınız için API'yi etkinleştirmeniz gerekir. Üstte yer alan menüden yeni bir proje oluşturun ve ardından Enable düğmesine tıklayın.

Bunu yaptıktan sonra, bir hizmet hesabı oluşturmanız gerekecek. Bu hesap size API'ye erişmek için gerekli izinlere sahip bir dizi kimlik bilgisi verecektir. Bunu yapmak için şu adımları izleyin:

  1. Sheets API yönetimi ekranında olduğunuzdan emin olun.
  2. Sol kenar çubuğunda Credentials'ı tıklayın, ardından + CREATE CREDENTIALS'ı tıklayın ve açılır menüden Service account'ı seçin .
  3. Hizmet hesabı için bir isim seçerek formu doldurun. Seçtiğiniz ad ve proje adı, hizmet hesabı kimliğinin bir parçasını oluşturacaktır. Örneğin, hesabı "Posta Listesi" olarak adlandırırsanız ve proje adı "AnatoliaCode Serverless Demo" ise, kimlik böyle bir şey olacaktır mailing-list@anatoliacode-serverless-demo.iam.gserviceaccount.com. Ardından Create'i tıklayın .
  4. Sayfadaki kalan iki isteğe bağlı bölümü atlayabilirsiniz. CONTINUE ve ardından DONE'ı tıklayın .
  5. Yeni oluşturulan hizmet hesabına tıklayın. Bu sizi hesap ayrıntılarını gösteren bir ekrana götürmelidir. Üst menüde yer alan KEYS'e tıklayın, ardından Add Key ve Create new key. Anahtar türü olarak JSON'u seçin.
  6. CREATE butonuna tıklayın ve JSON anahtar dosyası bilgisayarınıza indirilecektir.

(Not: Bilgisayarınıza inen bu dosya tek kopya halindedir. Bu yüzden onu güvende tutun!)

5. Kayıt Formu Sayfasını Oluşturun

Devam edelim ve kullanıcıların ayrıntılarını posta listemize göndermelerini sağlayacak index.html şeklinde basit bir kayıt sayfası oluşturalım.

<!DOCTYPE html>
<html lang="tr">
  <head>
    <meta charset="utf-8">
    <title>Kayıt Formu</title>
    <link rel="stylesheet" href="style.css">
    <link href='https://fonts.googleapis.com/css?family=Lato:400,700' rel='stylesheet' type='text/css'>
  </head>
  <body>
    <form action="/.netlify/functions/subscribe" method="post">
      <div class="header">
         <p>Her Hafta Harika İçerikler</p>
      </div>
      <div class="description">
        <p>Her hafta yeni makaleler yayınlıyorum. Gönderileri kaçırmadığınızdan emin olmak için bültenime abone olmayı unutmayın!</p>
      </div>
      <div class="input">
        <input type="text" class="button" id="name" name="name" placeholder="Adınız">
      </div>
      <div class="input">
        <input type="text" class="button" id="email" name="email" placeholder="ornek@mail.com">
        <input type="submit" class="button" id="submit" value="Kayıt Ol">
      </div>
    </form>
  </body>
</html>

Şimdi ise style.css dosyamızı oluşturalım:

body {
  background: #A6E9D7;
  font-family: 'Lato', sans-serif;
  color: #FDFCFB;
  text-align: center;
  background-image: url(https://images.pexels.com/photos/326311/pexels-photo-326311.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940)
}

form {
  width: 450px;
  margin: 17% auto;
}

.header {
  font-size: 35px;
  text-transform: uppercase;
  letter-spacing: 5px;
}

.description {
  font-size: 14px;
  letter-spacing: 1px;
  line-height: 1.3em;
  margin: -2px 0 45px;
}

.input {
  display: flex;
  align-items: center;
}

.button {
  height: 44px;
  border: none;
}

#email {
  width: 75%;
  background: #FDFCFB;
  font-family: inherit;
  color: #737373;
  letter-spacing: 1px;
  text-indent: 5%;
  border-radius: 5px 0 0 5px;
}

#name {
  width: 100%;
  background: #FDFCFB;
  font-family: inherit;
  color: #737373;
  letter-spacing: 1px;
  text-indent: 5%;
  border-radius: 5px;
  margin-bottom: 1em;
}

#submit {
  width: 25%;
  height: 46px;
  background: #E86C8D;
  font-family: inherit;
  font-weight: bold;
  color: inherit;
  letter-spacing: 1px;
  border-radius: 0 5px 5px 0;
  cursor: pointer;
  transition: background .3s ease-in-out;
}

#submit:hover {
  background: #d45d7d;
}

input:focus {
  outline: none;
  outline: 2px solid #E86C8D;
  box-shadow: 0 0 2px #E86C8D;
}

6. Sunucusuz İşlev Oluşturun

Artık formumuza sahip olduğumuza göre, POST isteğini işleyecek ve verileri API aracılığıyla bir Google e-tablosuna kaydedecek sunucusuz işlev için kod oluşturmamız gerekiyor. Netlify'nin işlevimizi dağıtması için, adlandırma kurallarına uymalı ve netlify/functions/ proje klasörümüzde klasör yolunu oluşturmalıyız.

Bu klasörün içinde subscribe.js adında bir JavaScript dosyası oluşturun:

if (!process.env.NETLIFY) {
  require('dotenv').config();
}

const { parse } = require('querystring');
const { GoogleSpreadsheet } = require('google-spreadsheet');

exports.handler = async (event, context) => {
  const doc = new GoogleSpreadsheet(process.env.GOOGLE_SPREADSHEET_ID_FROM_URL);

  await doc.useServiceAccountAuth({
    client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
    private_key: process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n')
  });

  await doc.loadInfo();
  const sheet = doc.sheetsByIndex[0]; 

  try {
    if (event.httpMethod === 'POST') {
      /* dize gövdesini kullanılabilir bir JS nesnesine ayrıştırın */
      const data = parse(event.body);
      await sheet.addRow(data);

      return {
        statusCode: 302,
        headers: {
          Location: '/success.html'
        }
      };
    } else {
      return {
        statusCode: 500,
        body: 'unrecognized HTTP Method, must be POST'
      };
    }
  } catch (err) {
    console.error('error ocurred in processing ', event);
    console.error(err);
    return {
      statusCode: 500,
      body: err.toString()
    };
  }
};

Not: İşlev kodu, Netlify Dev ile Google E-Tablolar v4 API blog gönderisinden uyarlanmıştır.

Node tabanlı sunucusuz bir işlev için temel gereksinim, uç nokta bir istek aldığında çağrılacak olan bir işleyici işlevini dışa aktarmaktır. İşleve iki parametre aktarılır. Bunlardan biri: event. Bu parametre, başlıklara ve HTTP yöntemi gibi bilgiler erişim sağlar. context parametresi ise, örneğin, kimliği doğrulanmış kullanıcının ayrıntıları dahil olmak üzere işlevin çağrıldığı bağlam hakkındaki bilgilere erişim sağlar.

İşlev kodunun kendisi, sağlanan kimlik bilgileriyle Google E-Tablolar API'sına bağlanır. Daha sonra istek gövdesini ayrıştırır ve gönderilen adı ve e-posta adresini API aracılığıyla elektronik tabloya ekler. İşlev tamamlandığında, kullanıcıyı başarılı bir sayfaya yönlendirmek için bir 302 yanıtı döndürür.

Fonksiyonu yerel olarak test edebilmek için, proje kökünde bir .env dosyası oluşturmamız ve bazı değişkenler eklememiz gerekir:

GOOGLE_SERVICE_ACCOUNT_EMAIL=mailing-list@anatoliacode-serverless-demo.iam.gserviceaccount.com
GOOGLE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANB \\etc
GOOGLE_SPREADSHEET_ID_FROM_URL=1N8afdqnJjBhwXsvplIgU-5JoAFr3RapIrAS9oUybFnU

Hizmet hesabı e-postası, 4. adımda oluşturduğunuz adrestir ve özel anahtar, indirdiğiniz JSON anahtar dosyasından gelir. Elektronik tablo kimliğini bir sonraki adımda ele alacağız.

7. Elektronik Tablo Oluşturun

Google E-Tablolar'a gidin ve yeni bir e-tablo oluşturun. Ona hangi başlığı verdiğiniz önemli değildir, ancak URL'deki kimliği not edin ve son adımda oluşturduğunuz .env dosyasına ekleyin.

Elektronik tablonun ilk satırına iki sütun başlığı ekleyin: ad ve e-posta (büyük / küçük harflerin HTML formundaki giriş adlarıyla eşleşmesinin önemli olduğunu unutmayın). Sunucusuz işlev tarafından oluşturulan girişler, ek satırlar olarak bunun altına eklenecektir.

Şimdi, oluşturduğunuz hizmet hesabına elektronik tabloya erişim izni vermelisiniz. Share butonuna tıklayın ve giriş kutusuna hizmet hesabı e-posta adresini girin. Editor (Editor permissions) izinlerini atadığınızdan emin olun.

Netlify CLI ile Yerel Test

Netlify CLI aracının güzel özelliklerinden biri, yayınlamadan önce kodunuzu yerel olarak test etmenize izin vermesidir. Geliştirme sunucusunu çalıştırmak için aşağıdakileri çalıştırın:

netlify dev

Sitenin görüntülendiği yeni bir tarayıcı sekmesi otomatik olarak açılacaktır. Formu doldurmak ve göndermek, sunucusuz işlevi (yerel olarak sunulur) çalıştırır ve başarılı olduğunda tarayıcınızı yeniden yönlendirir. Google E-Tablolar'daki elektronik tablonuza atlarsanız, yeni bir satıra girdiğiniz ayrıntıları görmeniz gerekir.

Netlify Dağıtım

CLI aracı, makinenizde yerel olarak çalışan Netlify hizmetini simüle etmek için harika bir iş çıkarır, ancak projenin sunucularında çalıştığını görmek istiyorsanız, projenizi yayınlamak için CLI'yi de kullanabilirsiniz.

Aşağıdaki komutu çalıştırın:

netlify deploy

Ardından istemleri izleyin. Sunucusuz işlev dahil olmak üzere siteniz Web'de yayınlanacaktır. .env dosyanızdakileri yansıtmak için ortam değişkenlerini de ayarlamanız gerekeceğini unutmayın. Bunları Netlify sitenizin yönetici panelinden veya CLI aracı aracılığıyla ayarlayabilirsiniz:

netlify env:set VAR_NAME value

Özetlemek Gerekirse

Sunucusuz işlevler, aynı zamanda arka uç uygulamalarının geleceği olarak müjdelendi. Amazon'un Lambda işlevleri 2014'ten beri kullanılmaktadır ve önemli bir AWS ürünüdür. Elbette, 7/24 çalışan ve tam kabuk erişimi olan gerçek sunucuların esnekliğinin ve yeteneklerinin gerekli olduğu birçok durum vardır.

Ancak gördüğümüz gibi, belirli iş yükü türleri için, sunucusuz olmanın ucuz maliyetleri, ölçeklenebilirliği ve düşük bakım avantajları onu iyi bir seçim haline getiriyor. Sunucusuz ekosisteminde gün geçtikçe artan eğitim kitapları, kurslar, çerçeveler ve hizmetleler var. Kısacası sunucusuz işlevler uzun vadede yatırım yapmaya değer gözüküyor.