AWS CloudFront ve API Gateway'i aynı alan için nasıl yan yana kullanabilirim?


9

Web sitemin statik varlıklarını S3'e koyuyorum ve bunları dağıtmak için CloudFront'u ayarlıyorum. Bunlar esasen kullanıcıların sitemdeki herhangi bir GET isteği için, mevcut yollara, yani hatalar için bir catchall'a ihtiyaç duyacağı içeriği barındırır.

Ayrıca işlemem gereken bazı POST istekleri de var. Form gönderme, e-posta gönderme, bildirimler, veritabanıyla etkileşim kurma.

Aynı etki alanı için LambF (veya API Ağ Geçidi) ile CloudFront'u yan yana nasıl ayarlayabilirim, böylece CloudFront GET isteklerini ve API Ağ Geçidi bir gövde veya POST istekleriyle istekleri işler. Veya bir şekilde tek tek URL ile yapabilir miyim?

Yanıtlar:


2

Önerilen tasarımınızla birden fazla web uygulaması çalıştırıyorum ve teknikleri paylaşmak için eğitici bir Go ve Lambda uygulaması olan gofaasları çıkardım .

www.gofaas.netS3 + CloudFront ve api.gofaas.netAPI Gateway + Lambda için iki ayrı alana ihtiyacınız vardır .

Ardından, statik sitenizin API Ağ Geçidi CORS yapılandırması ve bazı JavaScript ile API ile etkileşime girmesine izin verebilirsiniz:

fetch(`https://api.gofaas.net/work`, {
    method: "POST",
    mode: "cors",
    headers: {
        "Accept": "application/json",
        ...
    },
    body: JSON.stringify(...)
})
    .then(function(response) {
        return response.json();
    })
    .then(function (json) {
        // use response
    })
    .catch(function (err) {
        console.log("fetch error", err);
    });

Tüm bunları ayarlamak için bazı kılavuzlar:

S3, CloudFront ve ACM ile Statik Web Siteleri

Lambda, API Gateway, CORS ve JWT ile API Güvenliği


Siteyi test etmek burada her zaman ilginç hale geliyor. Yerel olarak entegrasyon testleri yapabilmeniz için AWS altyapısını yerel olarak çoğaltmak zordur. Alt alan yerine rota kullanıyorum. Bu testin bir parçası olur. Ayrıca CORS zorluklarını da ortadan kaldırır. Ardından, API Ağ Geçidi bu rota için CloudFront'un kaynağı olur.
Costa


2

Bağlantı bakış açısından "bir şey" isteklerinizi cevaplamak gerekir (GET, POST, PUT, her şey). Her şeyden önce bir TCP bağlantınız var ve katman 7'yi anladığından ve istemcinin gönderdiği baytlardan anlam çıkardığından emin olmak için "bir şey" gerekiyor. Yalnızca bu noktada GET isteklerini POST isteklerinden veya bir URL'den başka bir URL'den farklı şekilde ele almak mümkündür. Sonuçta HTTP'yi anlayabilen ve yönlendirebilen bir hizmete ihtiyacınız var. Aşağıdaki hizmetler bunu yapabilir: CloudFront ELB / ALB API Gateway (sınırlama daha sonra gelir)

API Gateway, CloudFront'u dahili olarak kullanır (size CloudFront düzeyinde herhangi bir şey yapılandırma şansı vermeden) - bu, CloudFront'u ve API Gateway'i yan yana çalıştırmanın bir yolu olmadığı anlamına gelir; çünkü bu, CloudFront'u CloudFront ile çalıştırdığınız anlamına gelir yan yana.

CloudFront, desenlere dayalı olarak farklı orijinler seçme şansı verir - ancak Lambda işlevleri (Lambda @ Edge işlevinin yanı sıra) yerine yalnızca S3 veya ELB / ALB'leri orijinal olarak seçebilirsiniz.

ALB / ELB, EC2 örneklerini yalnızca arka uç olarak kullanabilir - burada Lambda veya S3 yoktur.

Düşünmek istediğim şeyi yapabilecek tek yol bunlar:

  • API Ağ Geçidi kullanın ve belirli bir "varlık" -yolunu, S3 için bir ters proxy gibi bir Lambda işlevine yönlendirirsiniz (böylece statik varlıkları lambda aracılığıyla pipolayın) - Lambda'nın maliyetlerinin farkında olun!
  • Bunu da yapabilirsiniz, ancak varlığı Lambda üzerinden borulamak yerine Lambda içinde imzalı bir URL oluşturmak için doğrudan S3'e sunum için yönlendirmek (daha uygun maliyetli olabilir)
  • Varlıklarınız için uygulamanızın geri kalanından farklı alt alan adları kullanma - bu, DNS düzeyinde kolayca ayrılabileceğiniz ve farklı kullanım durumları için farklı hizmetler kullanabileceğiniz için çok yaygın bir kalıptır (statik olmayanlar için varlıklar için CloudFront ve statik olmayanlar için API Gateway parçalar)

Bu yüzden çağrım son seçenek olurdu - ancak bu, istemcileri / tarayıcıları tüm statik varlıklar (veya tüm POST istekleri için) için ayrı bir alt alana yönlendirmeniz gerektiği anlamına gelir.

Tarayıcıda gerçekten API odaklı bir uygulama oluşturmak için AngularJS veya React gibi teknolojilere bakmak istediğiniz gibi görünüyor. Bu yaklaşımla, bir API Ağ Geçidi ile tüm "dinamik" istekleri işleyen ve uygulamanın kendisini statik bir varlık olarak S3'ten teslim eden gerçek bir API çalıştırıyorsunuz. Belki bunlara bakmak, yolunuzu bulmanıza yardımcı olabilir - bunları kullanmasanız bile, böyle şeyleri nasıl inşa edeceğinize dair mimari desen imho için sormanız gereken şeydir.


2

Aynı düzene sahibim. S3'teki statik varlıklar, Lambda işlevleri API ağ geçidi üzerinden sunulur ve aynı alan adını paylaşırlar.

CloudFront'u zaten kullanan ve önbellekleme gibi bazı işlevlerini ortaya koyan API ağ geçidi ile gidiyorum. Sonra statik varlıklarla eşlenen URI'ları yapılandırıyorum. API Ağ Geçidi'nde, bir kaynak Lambda işlevi, AWS işlevi, sahte veya başka bir URL olabilir. S3 URL'lerime işaret etmelerini istiyorum.

URI'ler, örneğin alt yolları da toplayacak şekilde ayarlanabilir /assets/*.


Bu yüzden bana sorun çıkaran kısım API'yi dağıtmak. Genellikle sizin durumunuzda ön yol olmadan dağıtılır /assets/*. Dağıtımı silmek ve /assets/*yolu sağ tıklayıp oradan dağıtmak zorundayım .
Costa

1
Komut satırı araçlarını araştırmalıyım ve oradan api ve lambda'nın nasıl oluşturulacağını ve düzenleneceğini öğrenmeliyim.
Costa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.