AWS Türkçe Blog

Bir web uygulamasını AWS Serverless’a kaldırma ve kaydırma: 1. Bölüm

Orijinal makale: Link (Marcia Villalba)

Buluta geçiş yapan müşteriler genellikle sunucusuz mimarinin avantajlarından yararlanmak ister. Ama en iyi yaklaşım nedir ve bu mümkün mü? Geçiş yapmak için birçok strateji vardır, ancak kaldır ve kaydır (lift and shift) genellikle taşınan iş yüküyle üretime geçmenin en hızlı yoludur.

Geleneksel bir ortamda çalışan mevcut bir uygulamayı sunucusuz hale getirmenin mümkün olup olmadığını da merak edebilirsiniz. Bu blog gönderisi, bunun bir Mongo, Express, React ve Node.js (MERN) yığın web uygulaması için nasıl yapılacağını gösterir. Ancak, bu gönderide sunulan tartışmalar diğer yığınlar için de geçerlidir.

Kaldırma ve kaydırma geçişi neden yapılır?

Kaldırma ve kaydırma veya bazen uygulamayı yeniden barındırma (rehost) olarak anılan, uygulamayı mümkün olduğunca az değişiklikle taşımaktır. Kaldırma ve kaydırma geçişleri, genellikle üretimdeki yeni iş yükünü mümkün olduğunca hızlı almanıza olanak tanır. Sunucusuz ortama geçiş yapılırken, kaldırma ve kaydırma, henüz bulutta veya sunucusuz bir ortamda olmayan bir iş yükünü yönetilen ve sunucusuz hizmetleri hızlı bir şekilde kullanmaya getirebilir.

Kaldırma ve kaydırma ile sunucusuz olmayan bir iş yükünü sunucusuz duruma geçirmek, sunucusuz avantajların tümünü hemen sağlamayabilir, ancak geliştirme ekibinin, sunucusuz teknolojilerin sunduğu avantajlardan yararlanabilecek uygulamanın bölümlerini strangler modeli kullanarak yeniden düzenlemesine olanak tanır.

Neden bir web uygulamasını sunucusuz uygulamaya geçirmelisiniz?

Sunucusuz bir ortamda barındırılan web uygulamaları, sunucusuz uygulamaların otomatik olarak ölçeklenme ve kullandığınız kadar ödeme yapma yeteneğinden en çok yararlanır.

Az trafiğe sahip kişisel bir web uygulamanız olduğunu hayal edin. Sunucusuz bir ortamda barındırıyorsanız, sunucuların çalışır durumda olması için sabit bir ücret ödemezsiniz. Web uygulamanızın yalnızca birkaç isteği vardır ve geri kalan süre boştadır.

Bu fayda tam tersi durum için geçerlidir. Bir sunucu üzerinde çalışan küçük bir e-ticaret sitesinin sahibi için, milyonlarca takipçisi olan bir sosyal medya fenomeninin ürünlerinden birini önerdiğini hayal edin. Aniden binlerce istek gelir ve siteyi kullanılamaz hale getirir. Site sunucusuz bir platformda barındırılıyorsa, uygulama aldığı trafiğe göre ölçeklenir.

Taşıma gereksinimleri

Bir geçişe başlamadan önce, yeni uygulamanın sahip olması gereken işlevsel olmayan gereksinimlerini tanımlamanız önemlidir. Bu gereksinimler, geçiş sürecinde mimari kararlar vermeniz gerektiğinde yardımcı olur.

Bu geçişin işlevsel olmayan gereksinimleri şunlardır:

  • Otomatik olarak sıfıra veya yukarı ölçeklenen ortam.
  • Boşta kalma süresi için mümkün olduğunca az ödeme yapın.
  • Mümkün olduğunca az altyapı yapılandırın.
  • Uygulamanın otomatik yüksek kullanılabilirliği.
  • Orijinal kodda minimum değişiklik.

Uygulamaya genel bakış

Bu blog gönderisi, bir MERN uygulamasını nasıl taşıyacağınız konusunda size rehberlik eder. Orijinal uygulama iki farklı sunucuda barındırılır: Biri Mongo veritabanını içerir ve diğeri Node/js/Express ve ReactJS uygulamalarını içerir.

Application overview

Bu demo uygulama, bir promosyon ürünleri e-ticaret sitesini simüle eder. Veritabanı katmanı ürünleri, kullanıcıları ve satın alma geçmişini saklar. Sunucu katmanı, e-ticaret iş mantığıyla ilgilenir, ürün resimlerini barındırır ve kullanıcı kimlik doğrulaması ve yetkilendirmesi yapar. Web katmanı, tüm kullanıcı etkileşimiyle ilgilenir ve REST API’lerini kullanarak sunucu katmanıyla iletişim kurar.

How the application looks like

Sunucusuz bir ortama geçiş yapmak için yapmanız gereken değişiklikler şunlardır:

  • Veritabanı taşıma: Veritabanını şirket içinden MongoDB Atlas‘a taşıyın.
  • Backend taşıma: NodeJS/Express uygulamasını şirket içinden bir AWS Lambda işlevine taşıyın.
  • Web uygulaması taşıma: React web uygulamasını şirket içinden AWS Amplify‘a taşıyın.
  • Kimlik doğrulama taşıma: Amazon Cognito‘yu kullanmak için özel olarak oluşturulmuş kimlik doğrulamasını taşıyın.
  • Depolama taşıma: Amazon S3 ve Amazon CloudFront‘u kullanmak için görüntülerin yerel depolamasını taşıyın.

Aşağıdaki resim, taşınan uygulama için önerilen çözümü göstermektedir:

Proposed architecture

Veritabanı taşıma

Veritabanı zaten bu uygulama için tüm verileri içeren bir MongoDB konteynerindedir. MongoDB, yığınımızın veritabanı motoru olduğundan, sunucusuz ortama geçiş için önerilen çözümleri MongoDB Atlas‘ı kullanmaktır. Atlas, bulutta otomatik olarak ölçeklenen ve kullandığınız kadar ödediğiniz bir veritabanı kümesi sağlar.

Başlamak için yeni bir Atlas kümesi oluşturun, ardından verileri mevcut veritabanından sunucusuz olana taşıyın. Verileri taşımak için önce veritabanının tüm içeriğini bir döküm klasörüne boşaltabilir ve ardından onu buluta geri yükleyebilirsiniz:

mongodump --uri="mongodb://<localuser>:<localpassword>@localhost:27017"

mongorestore --uri="mongodb+srv://<user>:<password>@<clustername>.debkm.mongodb.net" .
Bash

Bunu yaptıktan sonra verileriniz artık bulutta. Sonraki adım, sunucudaki yapılandırma dizesini yeni veritabanına işaret edecek şekilde değiştirmektir. Bunu çalışırken görmek için, geçişin bir adımını gösteren bu videoyu kontrol edin.

Backend taşıma

Sunucu katmanı, bir sunucuda çalışan bir Node.js uygulaması olduğundan, Node.js/Express backend’ini taşımak, katmanların sunucusuz bir ortama taşınması en zor olanıdır.

Bu geçiş için bir seçenek, AWS Fargate kullanmaktır. Fargate, otomatik olarak ölçeklendirmenize ve kullandıkça ödeme yapmanıza olanak tanıyan sunucusuz bir konteyner hizmetidir. Diğer bir seçenek de, otomatik olarak ölçeklenen ve kullandıkça ödeyeceğiniz bir konteyner hizmeti olan AWS AppRunner’ı kullanmaktır. Ancak bu seçeneklerin hiçbiri sıfıra ölçeklenmediğinden geçiş gereksinimlerimizle uyumlu değildir.

Bu Node.js uygulamasının kaldırma ve kaydırma geçişi için başka bir seçenek de Lambda’yı AWS Lambda Web Adapter ile kullanmaktır. AWS Lambda Web Adapter, Express.js, Flask, SpringBoot gibi tanıdık çerçevelerle web uygulamaları oluşturmanıza ve bunu Lambda üzerinde çalıştırmanıza olanak tanıyan açık kaynaklı bir projedir. GitHub deposunda bu proje hakkında daha fazla bilgi edinebilirsiniz.

Lambda Web Adapter

Bu projeyi kullanarak, fonksiyon kodu olarak Express/NodeJS uygulamasına sahip yeni bir Lambda fonksiyonu oluşturabilirsiniz. Tüm kodu kaldırabilir ve işleve kaydırabilirsiniz. Bunun nasıl yapılacağına dair adım adım bir eğitim istiyorsanız, bu videoyu izleyin.

const lambdaAdapterFunction = new Function(this,`${props.stage}-LambdaAdapterFunction`,
            {
                runtime: Runtime.NODEJS_16_X,
                code: Code.fromAsset('backend-app'),
                handler: 'run.sh',
                environment: {
                    AWS_LAMBDA_EXEC_WRAPPER: '/opt/bootstrap',
                    REGION: this.region,
                    ASYNC_INIT: 'true',
                },
                memorySize: 1024,
                layers: [layerLambdaAdapter],
                timeout: Duration.seconds(2),
                tracing: Tracing.ACTIVE,
            }
        );
JavaScript

Sonraki adım, sunucu uygulaması için bir HTTP uç noktası oluşturmaktır. Bunu yapmak için üç seçenek vardır: API Gateway, Application Load Balancer (ALB) veya Lambda İşlev URL‘lerini kullanmak. Tüm seçenekler Lambda Web Adapter ile uyumludur ve bu zorluğu sizin için çözebilir.

Bu demo için, yapılandırmaları kolay olduğundan ve bir işlev URL’si tüm yolları Express sunucusuna ilettiğinden işlev URL’lerini seçin. API Gateway ve ALB daha fazla yapılandırma gerektirir ve ayrı maliyetleri vardır, bununla birlikte işlev URL’lerinin maliyeti Lambda işlevine dahildir.

Web uygulaması taşıma

Taşınacak son katman React uygulamasıdır. Web katmanını geçirmenin ve geçiş gereksinimlerine uymanın en iyi yolu, onu barındırmak için AWS Amplify kullanmaktır. AWS Amplify, web uygulamalarını barındırma ve web uygulaması için CICD sürecini yönetme gibi birçok özellik sağlayan tam olarak yönetilen bir hizmettir. Farklı AWS kaynaklarına bağlanmak için istemci kütüphaneleri ve diğer birçok özellik sağlar.

React uygulamasını taşımak, AWS hesabınızda yeni bir Amplify uygulaması oluşturmak ve React uygulamasını GitHub gibi bir kod deposuna yüklemek kadar basittir. Bu AWS Amplify uygulaması bir GitHub şubesine bağlıdır ve bu branch’te yeni bir commit olduğunda AWS Amplify kodu yeniden dağıtır.

Amplify uygulaması, çevresel değişkenleri kullanarak işlev URL uç noktası (sunucu URL’si) gibi yapılandırma parametrelerini alır.

const amplifyApp = new App(this, `${props.stage}-AmplifyReactShopApp`, {
            sourceCodeProvider: new GitHubSourceCodeProvider({
                owner: config.frontend.owner,
                repository: config.frontend.repository_name,
                oauthToken: SecretValue.secretsManager('github-token'),
            }),
            environmentVariables: {
                REGION: this.region,
                SERVER_URL: props.serverURL,
            },
        });
JavaScript

Web katmanınızı sunucusuz hale getirme konusunda adım adım bir kılavuz görmek istiyorsanız bu videoyu inceleyebilirsiniz.

Sonraki adımlar

Ancak, taşınan bu uygulamayı test ederseniz iki sorunla karşılaşırsınız. Birincisi, kullanıcı oturumunun yapışkan (sticky) olmamasıdır. Her giriş yaptığınızda, uygulamadan beklenmedik bir şekilde çıkış yaparsınız. İkincisi ise yeni bir ürün oluşturduğunuzda o ürünün yeni görsellerini yükleyemezsiniz.

İkinci bölümde, sorunların her birini ayrıntılı olarak analiz ediyor ve çözümler buluyorum. Bu sorunlar, bu çözümün durum bilgisiz (stateless) ve değişmez özelliklerinden dolayı ortaya çıkmaktadır. Bu makalenin bir sonraki bölümü, bu sorunların nasıl çözüleceğini açıklar, ayrıca çözümün maliyetlerini ve performansını analiz eder.

Sonuç

Bu makalede, sunucusuz olmayan bir web uygulamasını çok fazla kod değiştirmeden sunucusuz bir ortama taşımanın mümkün olup olmadığını öğrenirsiniz. AWS Lambda Web Adapter ve AWS Amplify gibi bu süreçte size yardımcı olabilecek farklı araçları öğrenirsiniz.

Geçişi çalışırken görmek ve bunun için tüm adımları öğrenmek istiyorsanız, izlemeniz ve bunun nasıl mümkün olduğunu öğrenmeniz için tüm eğitimleri içeren bir oynatma listesi var.

Daha fazla sunucusuz öğrenme kaynağı için Serverless Land‘i ziyaret edin.