Herhangi bir NodeJS App Sunucusuz Nasıl Yapılır

Umarım Serverless'ı benim kadar seviyorsun çünkü bu konuyla ilgili başka bir yazı daha var.

Şimdi, basit bir sunucusuz REST API'sinden bahsediyorsak, kurulumunuz AWS: Lambda + API Gateway'de oldukça belirgindir.

Ancak, arka uçlarınızın sahip olabileceği diğer (mikro) hizmetler ne durumda? Tüm uygulama kodunuzu tek bir yekpare AWS Lambda işlevine koymak en iyi fikir değildir.

Meydan okuma

Uygulama modüllerini, birbirleriyle de iletişim kurması gereken, sunucusuz mikro servisler olarak kolayca kurmak istiyoruz. Tercihen, hizmetler arasındaki iletişim bir tür ACL ile düzenlenmelidir.

Deneme 1. API Ağ Geçidi

Sorunu çözmeye çalışırken ilk sahip olduğum düşünce bu: API servis ağları üzerinden tüm mikro hizmetleri göster. Sorun… Oluşturulan API'ler herkese açıktır.

Bu neden bir problem? Örneğin, erişim bir tür yetkilendirme ile sınırlandırılsa bile, tüm dünyaya açık bir fatura hizmetine sahip olmak istemiyoruz.

API'yi özel yapabilirsiniz, ancak güvenlik politikaları oldukça sınırlıdır:

API'nizin güvenli şekilde çalıştırılmasını sağlamak için API Ağ Geçidi kaynak politikalarını kullanabilirsiniz:
* belirtilen bir AWS hesabındaki kullanıcılar
* belirtilen kaynak IP adresi aralıkları veya CIDR blokları
* belirtilen sanal özel bulutlar (VPC'ler) veya VPC bitiş noktaları (herhangi bir hesapta)

Bu, bu tür servisler arasındaki iletişimi kontrol etmekte oldukça sıkıntı yaratmaktadır. Bunu burada yapmanın tek yolu hizmetleri ayrı VPC'lere koymak, çok fazla iş yapmak.

2. girişimi Lambda

Neden sadece her mikro servisi ayrı bir AWS Lambda'ya koymuyoruz? Bu sorunu çözecek mi?

Evet, aslında sunucusuz bir mikro hizmet olacak ve hizmetler arasındaki erişimleri ayarlamak için IAM politikalarını kullanabileceksiniz, ancak… “Kolay” değil.

Dağıtım birimleri olarak küçük bir işleve sahip olmak için bugünlerde bunun normal olduğunu biliyorum. Ayrıca, hizmetinizde 1 uç noktadan / yöntemden / işlevden daha fazlası olması durumunda, birden fazla Lambda olarak dağıtmanın uygun olduğu kabul edilir.

Bunun avantajlarını anlıyorum, ancak bakım ve geliştirme kolaylığından ödün veriyorsunuz. Ayrıca, bir Lambda işlevi kümesi olarak konuşlandırılmış bir servisin olması fikrini de gerçekten sevmiyorum. Hayal edin, faturalandırma ile ilgili birkaç ayrı fonksiyon? Artık sınırlı bir bağlam değil. Böyle bir ayrıntı derecesinin yararlı olabileceği durumlar olsa da, bu nadir bir durumdur.

Girişimi 3. Yağ Lambda

Aslında bir dizi bitiş noktasını tek bir Lambda olarak dağıtabilir miyiz (tabii ki API Gateway kullanmadan)?

Bunu yapabilseydik, önceki seçeneğin tüm avantajlarından yararlanırdık, ancak dağıtım birimlerinin ayrıntı derecesini de seçebilirdik.

İstediğim yol şudur: her konuşlandırılabilir hizmet, yöntemleri olan basit bir düz eski JS nesnesi olmalıdır. Nesneniz ile AWS Lambda arasında birkaç satır yapıştırıcı kodu ekleyerek elde etmek oldukça önemsizdir.

İşte benim uygulama: aws-rpc. Bu nodejs modülü, sadece bir nesneyi ilettiğiniz lambdaHandler işlevini ortaya çıkarır ve otomatik olarak Lambda'ya erişebilecek herkese maruz kalır:

{lambdaHandler} 'aws-rpc' den içe aktarın;
{TestServiceImpl} './TestServiceImpl' öğesinden import;
// bu sizin dağıtım biriminiz
// Lambda'nın işleyici işlevi olarak belirttiğiniz şey budur
dışa aktarma const işleyicisi = lambdaHandler (new TestServiceImpl ());

Artık “işleyiciyi” AWS Lambda olarak dağıtabilirsiniz. Yöntemlerini şu şekilde çağırıyorsunuz:

{TestService} './TestService' den içe aktarın;
const client = createClient  ("LambdaName", "test") bekliyor;
console.log (client.test ()) bekliyor;

Lütfen, istemci saplama nesnesi için yöntemler üretebilmek için örnekte olduğu gibi tüm yöntem adlarını createClient'e iletmeniz gerektiğini unutmayın.

Bu gereklidir, çünkü JS TypeScript arayüzleri hakkında herhangi bir çalışma zamanı bilgisine sahip değildir. Soyut sınıfları kullanarak uygulayabilirdim, ancak ¯ \ _ (ツ) _ / ¯ 'dan hoşlanmıyorum.

Bonus! Hepsini yerel olarak çalıştırabilirsin!

Yerel kalkınma ortamınızın mümkün olduğunca rahat olmasının çok önemli olduğuna inanıyorum. Bu nedenle, AWS'ye hiçbir şey dağıtmadan, hizmeti ve istemciyi yerel olarak çalıştırma özelliği de ekledim (bkz. RunService ve createClient işlevleri). Örnekler için GitHub'taki depoya bakın.

özet

Bulut sağlayıcıların sunduğu hizmetlerde kaybolmanız ve altyapınızı geliştirmeniz çok kolaydır.

Her zaman aklıma gelen en basit ve açık çözümü seçerim. Ayrıca, birçok teknik ve uygulamanın başka platformlardan tekrar kullanılabileceğini daima unutmayın (yağ NodeJS Lambda'nın fikri Java dünyasındaki yağ kavanozlarından ilham almıştır).

Bu konuyu beğendiyseniz, aşağıdakilere de göz atın:

  • En İyi Sunucusuz Mimarinin Nasıl Yapılacağını Öğrenmelisin
  • Ücretsiz Sunucusuz CI / CD Boru Hattı Nasıl Oluşturulur: 3 Kolay Örnek
  • DynamoDB'yi Bölgeler Arasında Kolayca Çoğaltma
  • Çok Dilli Başvuru Nasıl Yapılır (ve Sıfır Ödeme)
  • Herhangi bir Java Web Uygulamasını Sunucusuz Yapın

Yorumlar, beğeniler ve paylaşımlar büyük beğeni topluyor. Şerefe!