DynamoDB ile API Sunucusu
Bu eğitimde, DynamoDB ile desteklenen, bilgi eklemek ve almak için uç noktaları olan küçük bir API nasıl oluşturabileceğimize bakalım.
Eğitim, bir AWS ve Deno Deploy hesabına sahip olduğunuzu varsayıyor.
Genel Bakış
DynamoDB Kurulumu
Deno Deploy'de Proje Oluşturma
Uygulamayı Yazma
Uygulamayı Yayınlama
Genel Bakış
GET/POST isteklerini kabul eden ve uygun bilgileri döndüren tek bir uç nokta ile bir API oluşturacağız.
# Uç noktaya yapılan bir GET isteği, şarkının başlığına dayalı olarak şarkı detaylarını döndürmelidir.
GET /songs?title=Song%20Title # '%20' == boşluk
# yanıt
{
title: "Şarkı Başlığı"
artist: "Birisi"
album: "Bir Şey",
released: "1970",
genres: "country rap",
}
# Uç noktaya yapılan bir POST isteği, şarkı detaylarını eklemelidir.
POST /songs
# post isteği gövdesi
{
title: "Yeni bir Başlık"
artist: "Yeni Birisi"
album: "Yeni Bir Şey",
released: "2020",
genres: "country rap",
}
DynamoDB Kurulumu
Sürecin ilk adımı, DynamoDB'ye programatik olarak erişmek için AWS kimlik bilgilerini oluşturmaktır.
Kimlik Bilgilerini Oluşturma:
- https://console.aws.amazon.com/iam/ adresine gidin ve "Kullanıcılar" bölümüne gidin.
- Kullanıcı oluştur butonuna tıklayın, Kullanıcı adı alanını doldurun (belki
denamo
kullanabilirsiniz) ve Programatik erişim türünü seçin. - İleri butonuna tıklayın.
- Politikaları doğrudan ekle seçeneğini seçin ve
AmazonDynamoDBFullAccess
için arama yapın. Sonuçlarda bu politikanın yanındaki kutucuğu işaretleyin. - İleri ve Kullanıcı oluştur butonuna tıklayın.
- Oluşan Kullanıcılar sayfasında, yeni oluşturduğunuz kullanıcıya tıklayın.
- Erişim anahtarı oluştur butonuna tıklayın.
- AWS dışında çalışan uygulama seçeneğini seçin.
- *Oluştur butonuna tıklayın.
- Yeni oluşturduğunuz kimlik bilgilerini indirmek için .csv dosyasını indir butonuna tıklayın.
Veritabanı tablosu oluşturma:
- https://console.aws.amazon.com/dynamodb adresine gidin ve Tablo oluştur butonuna tıklayın.
- Tablo adı alanını
songs
ve Bölüm anahtarı alanınıtitle
olarak doldurun. - Aşağı kaydırın ve Tablo oluştur butonuna tıklayın.
- Tablo oluşturulduğunda, tablo adına tıklayın ve Genel bilgiler kısmını bulun.
- Amazon Kaynak Adı (ARN) altında, yeni tablonuzun bölgesini not alın (örneğin us-east-1).
Uygulamayı Yazma
index.js
adında bir dosya oluşturun ve aşağıdakileri ekleyin:
import {
json,
serve,
validateRequest,
} from "https://deno.land/x/sift@0.6.0/mod.ts";
// AWS, tarayıcılarla uyumlu bir resmi SDK'ya sahiptir. Deno Deploy'un
// API'leri, tarayıcılarınkine benzer olduğundan, aynı SDK Deno Deploy ile de çalışır.
// Bu yüzden, verileri eklemek ve almak için gereken bazı sınıflarla birlikte SDK'yı import ediyoruz.
import {
DynamoDBClient,
GetItemCommand,
PutItemCommand,
} from "https://esm.sh/@aws-sdk/client-dynamodb";
// Bölge bilginizi sağlayarak bir istemci örneği oluşturun.
// Kimlik bilgileri, Deno Deploy üzerindeki proje oluşturma adımında ayarladığımız
// ortam değişkenlerinden elde edilir.
const client = new DynamoDBClient({
region: Deno.env.get("AWS_TABLE_REGION"),
credentials: {
accessKeyId: Deno.env.get("AWS_ACCESS_KEY_ID"),
secretAccessKey: Deno.env.get("AWS_SECRET_ACCESS_KEY"),
},
});
serve({
"/songs": handleRequest,
});
async function handleRequest(request) {
// Uç nokta GET ve POST isteğine izin verir. GET isteği için işlenmesi gereken "title" adında bir parametre vardır.
// ve POST isteğini işlemek için aşağıda tanımlanan alanlarla birlikte bir gövde gereklidir.
// validateRequest, sağlanan terimlerin isteği karşıladığını sağlar.
const { error, body } = await validateRequest(request, {
GET: {
params: ["title"],
},
POST: {
body: ["title", "artist", "album", "released", "genres"],
},
});
if (error) {
return json({ error: error.message }, { status: error.status });
}
// POST isteğini işleyin.
if (request.method === "POST") {
try {
// DynamoDB ile etkileşimde bulunmak istediğimizde, istemci örneğini kullanarak bir komut gönderiyoruz.
// Burada, istekteki verileri eklemek için bir PutItemCommand gönderiyoruz.
const {
$metadata: { httpStatusCode },
} = await client.send(
new PutItemCommand({
TableName: "songs",
Item: {
// Burada 'S', değerin string türünde olduğunu,
// 'N' ise bir sayı olduğunu belirtir.
title: { S: body.title },
artist: { S: body.artist },
album: { S: body.album },
released: { N: body.released },
genres: { S: body.genres },
},
}),
);
// Başarılı bir put item isteği yapıldığında, Dynamo 200 durum kodu döner (garip).
// Bu yüzden, verinin eklenip eklenmediğini doğrulamak için durum kodunu test ediyoruz
// ve istekte sağlanan verilerle bir yanıt veriyoruz.
if (httpStatusCode === 200) {
return json({ ...body }, { status: 201 });
}
} catch (error) {
// İstek sırasında bir sorun çıkarsa, hatayı referansımız için kaydediyoruz.
console.log(error);
}
// Eğer yürütme buraya ulaşırsa, bu, eklemenin başarılı olmadığını gösterir.
return json({ error: "veri eklenemedi" }, { status: 500 });
}
// GET isteğini işleyin.
try {
// İstekten başlığı alıyoruz ve şarkı bilgilerini almak için bir GetItemCommand
// gönderiyoruz.
const { searchParams } = new URL(request.url);
const { Item } = await client.send(
new GetItemCommand({
TableName: "songs",
Key: {
title: { S: searchParams.get("title") },
},
}),
);
// Item özelliği tüm verileri içerir, bu yüzden tanımsız değilse,
// başlık hakkındaki bilgileri döndürmeye devam ediyoruz.
if (Item) {
return json({
title: Item.title.S,
artist: Item.artist.S,
album: Item.album.S,
released: Item.released.S,
genres: Item.genres.S,
});
}
} catch (error) {
console.log(error);
}
// Buraya, veritabanına yapılan istek sırasında bir hata fırlatıldığında
// veya Item veritabanında bulunmadığında ulaşabiliriz.
// İki durumu genel bir mesajla yansıtırız.
return json(
{
message: "başlık bulunamadı",
},
{ status: 404 },
);
}
Yeni projenizde git'i başlatın ve GitHub'a gönderin.
Uygulamayı Yayınlama
Artık her şey yerli yerinde olduğuna göre, yeni uygulamanızı yayınlayalım!
- Tarayıcınızda Deno Deploy adresine gidin ve GitHub hesabınızı bağlayın.
- Yeni uygulamanızı içeren depoyu seçin.
- Projenize bir isim verebilir veya Deno'nun sizin için bir tane oluşturmasına izin verebilirsiniz.
- Giriş Noktası açılır menüsünde
index.js
'yi seçin. - Projeyi Yayınla butonuna tıklayın.
Uygulamanızın çalışması için, ortam değişkenlerini yapılandırmamız gerekecek.
Projenizin başarı sayfasında veya proje panosunda, Ortam değişkenleri ekle butonuna tıklayın. Ortam Değişkenleri altında, + Değişken Ekle butonuna tıklayın. Aşağıdaki değişkenleri oluşturun:
AWS_ACCESS_KEY_ID
- indirdiğiniz CSV'den aldığınız değerleAWS_SECRET_ACCESS_KEY
- indirdiğiniz CSV'den aldığınız değerle.AWS_TABLE_REGION
- tablonuzun bölgesiyle
Değişkenleri kaydetmek için tıklayın.
API'yi test etmeden önce, ortam değişkenlerini doğru şekilde yapılandırdığınızdan emin olun.
API'yi test edelim.
Bir veri POST edin.
curl --request POST --data \
'{"title": "Old Town Road", "artist": "Lil Nas X", "album": "7", "released": "2019", "genres": "Country rap, Pop"}' \
--dump-header - https://<project_name>.deno.dev/songs
Başlık hakkında bilgi GET edin.
curl https://<project_name>.deno.dev/songs?title=Old%20Town%20Road
DynamoDB'yi Deno Deploy ile kullanmayı öğrendiğiniz için tebrikler!