A
<h2 id="giris">Giriş</h2>
Video içeriklerinizi güvenli bir şekilde sunmak ve sadece ödeme yapmış kullanıcılara erişim vermek istiyorsanız, pahalı hazır çözümler yerine kendi serverless altyapınızı kurabilirsiniz. Bu rehberde, "Cloud With Betsy" projesinde kullanılan, maliyet etkin ve yüksek performanslı video platformunun nasıl inşa edildiğini inceleyeceğiz.
<h2 id="mimari-genel-bakis">Mimari Genel Bakış</h2>
Platformumuz, sunucu yönetimi gerektirmeyen (serverless) bir yapıda tasarlanmıştır. Temel bileşenler şunlardır:
* **SST (Serverless Stack):** AWS altyapısını kod ile yönetmek (IaC) ve Next.js uygulamasını dağıtmak için.
* **AWS Lambda:** İş mantığını yürütmek (webhook işleme, token doğrulama).
* **Amazon DynamoDB:** Kullanıcı ve erişim token bilgilerini saklamak için.
* **LemonSqueezy:** Ödeme işlemleri ve webhook tetiklemeleri için.
* **ConvertKit:** Kullanıcılara erişim linklerini e-posta ile göndermek için.
* **Vimeo:** Videoları barındırmak ve yayınlamak için (AWS S3/MediaConvert yerine tercih edilmiştir).
<h2 id="adim-1-satin-alma">Adım 1: Satın Alma Akışı ve Webhook</h2>
Kullanıcı LemonSqueezy üzerinden satın alma işlemini tamamladığında, bir webhook tetiklenir. Bu webhook, AWS Lambda fonksiyonumuza bir istek gönderir.
SST kullanarak bu yapıyı kurmak oldukça basittir:
// sst.config.ts örneği
const hookFunction = new Function(stack, 'lemon-hook', {
handler: 'packages/services/functions/webhooks/lemon.handler',
url: true, // Public URL oluştur
bind: [CONVERTKIT_API_KEY, ordersTable], // Çevresel değişkenler ve tablo erişimi
});
<h2 id="adim-2-token-db">Adım 2: Erişim Token'ı ve Veritabanı</h2>
Lambda fonksiyonumuz, gelen webhook verisini işleyerek benzersiz bir **video erişim token'ı** oluşturur. Bu token ve kullanıcı bilgileri Amazon DynamoDB tablosuna kaydedilir.
// Lambda Handler (Basitleştirilmiş)
export const handler = async (event) => {
const body = JSON.parse(event.body);
const userEmail = body.data.attributes.user_email;
const videoToken = generateUniqueToken(); // Token oluşturma fonksiyonu
// DynamoDB'ye kaydet
await dynamoDb.put({
TableName: Table.orders.tableName,
Item: {
pk: `USER#${userEmail}`,
sk: `ORDER#${body.data.id}`,
videoToken: videoToken,
createdAt: Date.now(),
},
});
// ConvertKit'e kullanıcıyı ekle ve token'ı custom field olarak ata
await convertKit.addSubscriber(userEmail, { video_token: videoToken });
};
<h2 id="adim-3-email">Adım 3: Kullanıcıya Erişim Linki Gönderimi</h2>
Token oluşturulduktan sonra, ConvertKit üzerindeki bir otomasyon tetiklenir. Bu otomasyon, kullanıcıya kişiselleştirilmiş bir e-posta gönderir. E-posta içindeki link, kullanıcının token'ını içerir:
`https://platformunuz.com/izle?token=KULLANICI_TOKEN`
<h2 id="adim-4-icerik">Adım 4: İçerik Teslimatı ve Doğrulama</h2>
Kullanıcı linke tıkladığında Next.js uygulamamız açılır.
1. Sayfa yüklenirken `useEffect` veya sunucu tarafında token URL'den alınır.
2. Bir API rotası (Lambda) çağrılarak token'ın geçerliliği DynamoDB'den kontrol edilir.
3. Token geçerliyse, Vimeo'dan video embed kodları (veya gizli linkler) çekilir ve sayfada gösterilir.
4. Token geçersizse veya süresi dolmuşsa hata mesajı gösterilir.
Bu yöntemle, videolarınızın doğrudan linklerini paylaşsanız bile, token doğrulaması olmadan içeriklere erişilemez (Vimeo tarafında domain kısıtlaması yaparak güvenliği artırabilirsiniz).
<h2 id="sonuc">Sonuç</h2> Bu mimari sayesinde, sunucu maliyeti olmadan (Scale to Zero), sadece kullanım başına ödeme yaparak güvenli bir video platformu kurabilirsiniz. SST ve AWS'nin gücüyle, altyapı karmaşıklığı yerine ürününüze odaklanabilirsiniz. <div class="toc"> <ul> <li><a href="#giris">Giriş</a></li> <li><a href="#mimari-genel-bakis">Mimari Genel Bakış</a></li> <li><a href="#adim-1-satin-alma">Adım 1: Satın Alma Akışı ve Webhook</a></li> <li><a href="#adim-2-token-db">Adım 2: Erişim Token'ı ve Veritabanı</a></li> <li><a href="#adim-3-email">Adım 3: Kullanıcıya Erişim Linki Gönderimi</a></li> <li><a href="#adim-4-icerik">Adım 4: İçerik Teslimatı ve Doğrulama</a></li> <li><a href="#sonuc">Sonuç</a></li> </ul> </div> <p>Kaynak / Source: https://awsfundamentals.com/blog/cwb-video-platform</p>