Blog AWS Indonesia

Memindahkan aplikasi web ke AWS Serverless: Bagian 1

Pelanggan yang bermigrasi ke cloud ingin mendapatkan manfaat dari arsitektur serverless. Tapi pendekatan apa yang terbaik dan apakah itu memungkinkan? Ada banyak strategi untuk melakukan sebuah migrasi, tapi strategi lift and shift biasanya adalah cara tercepat untuk memindahkan workload ke lingkungan produksi.

Anda mungkin bertanya apakah mungkin melakukan lift and shift aplikasi yang sudah berjalan di lingkungan tradisional ke serverless. Artikel ini akan menunjukkan bagaimana cara melakukannya untuk aplikasi web yang dibuat dengan MongoDB, Express, React, dan Node.js (MERN). Tetapi, apa yang dibahas pada artikel ini juga dapat berlaku pada stack yang lain.

Kenapa melakukan migrasi dengan cara lift and shift?

Lift and shift, atau biasa dikenal juga dengan sebutan rehosting, adalah memindahkan aplikasi dengan perubahan sekecil mungkin. Migrasi menggunakan strategi lift and shift memungkinkan Anda untuk menempatkan workload baru tersebut di lingkungan produksi secepat mungkin. Ketika bermigrasi ke serverless, lift and shift dapat membuat workload yang sebelumnya belum berjalan di cloud atau di lingkungan serverless menjadi menggunakan layanan terkelola dan serverless secara cepat.

Migrasi sebuah workload non-serverless ke serverless dengan lift and shift mungkin tidak dapat langsung memberikan semua manfaat dari serverless saat itu juga, tapi serverless memungkinkan developer untuk melakukan perubahan secara bertahap menggunakan pola strangler terhadap bagian-bagian dari aplikasi yang mungkin dapat menerima manfaat dari teknologi serverless.

Kenapa migrasi aplikasi web ke serverless?

Aplikasi web yang ditempatkan di sebuah lingkungan serverless otomatis akan mendapat manfaat dari kapabilitas yang ditawarkan serverless yaitu scaling secara otomatis dan hanya membayar apa yang digunakan saja.

Bayangkan jika Anda memiliki sebuah halaman web pribadi dengan traffic yang sedikit. Jika Anda menempatkannya di lingkungan serverless, Anda tidak perlu membayar biaya secara tetap agar server terus berjalan. Hal ini karena aplikasi web Anda hanya memiliki sedikit request dan tidak melakukan apa-apa disisa waktu yang lain.

Keuntungan ini juga berlaku untuk kasus sebaliknya. Untuk seorang pemilik website ecommerce kecil yang berjalan di sebuah server, bayangkan jika ada influencer dengan jutaan pengikut merekomendasikan salah satu produk mereka. Secara tiba-tiba, ribuan request datang dan membuat website tidak tersedia. Jika website tersebut ditempatkan di lingkungan serverless, aplikasi akan scaling secara otomatis sesuai dengan request yang diterima.

Kebutuhan untuk migrasi

Sebelum memulai sebuah migrasi, penting untuk mendefinisikan kebutuhan non-fungsional pada aplikasi baru tersebut. Kebutuhan-kebutuhan ini akan membantu Anda ketika Anda perlu membuat keputusan tentang arsitektur selama proses migrasi.

Ini adalah kebutuhan non-fungsional dari migrasi ini:

  • Lingkungkan yang dapat melakukan scale to zero dan scale up secara otomatis.
  • Biaya sekecil mungkin ketika sedang tidak digunakan
  • Konfigurasi infrastruktur sesedikit mungkin
  • Ketersediaan tinggi yang otomatis dari aplikasi
  • Perubahan minimal untuk source code awal.

Gambaran dari aplikasi

Artikel ini akan memandu Anda bagaimana melakukan migrasi pada sebuah aplikasi MERN. Aplikasi asli ditempatkan pada dua server yang berbeda: satu berisi database Mongo dan satu lagi berisi Node.js/Express dan aplikasi ReactJS.

Gambaran dari aplikasi

Demo ini akan mensimulasikan sebuah aplikasi ecommerce untuk penjualan swag. Bagian database akan menyimpan produk, pengguna dan riwayat pembelian. Bagian server akan menangani proses bisnis dari ecommerce, menyimpan gambar produk, serta autentikasi dan otorisasi pengguna. Bagian web akan menangani semua interaksi dan komunikasi dengan bagian server menggunakan REST API.

Tampilan dari aplikasi

Berikut adalah perubahan-perubahan yang harus Anda lakukan untuk migrasi ke lingkungan serverless:

  • Migrasi database: Migrasi database dari on-premises ke MongoDB Atlas.
  • Migrasi backend: Migrasi aplikasi Node.js/Express dari on-premises ke AWS Lambda.
  • Migrasi aplikasi web: Migrasi aplikasi React dari on-premises ke AWS Amplify.
  • Migrasi autentikasi: Migrasi dari autentikasi yang dibangun sendiri ke Amazon Cognito.
  • Migrasi storage: Migrasi dari penyimpanan gambar di lokal ke Amazon S3 dan Amazon CloudFront.

Gambar berikut menunjukkan solusi yang diusulkan untuk aplikasi baru:

Arsitektur baru yang akan digunakan

Migrasi database

Database sudah ada di dalam container MongoDB yang memiliki semua data untuk aplikasi ini. Karena MongoDB adalah mesin database pada arsitektur kita, maka solusi yang direkomendasikan adalah migrasi ke serverless dengan menggunakan MongoDB Atlas. Atlas menyediakan sebuah kluster database di cloud yang dapat melakukan scaling secara otomatis dan Anda hanya perlu bayar apa yang Anda gunakan.

Untuk memulai, buat sebuah kluster baru di Atlas, kemudian migrasikan data dari database lama ke serverless. Untuk memigrasikan data, pertama Anda dapat melakukan dump seluruh konten dari database ke sebuah folder dan kemudian mengembalikannya ke cloud.

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

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

Setelah melakukan restorasi, data Anda sekarang ada di cloud. Langkah berikutnya adalah dengan mengubah konfigurasi pada server untuk merujuk pada database yang baru. Untuk melihat caranya, lihat video ini yang menunjukkan panduan migrasi.

Migrasi backend

Hal yang paling menantang adalah memigrasikan bagian backend Node.js/Express ke lingkungan serverless.

Salah satu opsi untuk migrasi ini adalah menggunakan AWS Fargate. AWS Fargate adalah sebuah layanan serverless container yang memungkinkan Anda untuk scaling secara otomatis dan Anda membayar selama menggunakannya saja. Opsi lainnya adalah menggunakan AWS App Runner, sebuah layanan container yang memiliki kemampuan scaling otomatis dan Anda hanya membayar selama menggunakannya saja. Tetapi, kedua opsi ini tidak sejalan dengan kebutuhan migrasi kita, keduanya tidak dapat scale to zero.

Pilihan lain untuk melakukan migrasi lift and shift dari aplikasi Node.js ini adalah menggunakan AWS Lambda dengan AWS Lambda Web Adapter. AWS Lambda Web Adapter adalah sebuah proyek open source yang memungkinkan Anda untuk membangun aplikasi web dengan framework yang sudah akrab, seperti Express.js, Flask, SpringBoot, dan menjalankannya di atas Lambda. Anda dapat mempelajari proyek ini lebih lanjut di GitHub repositorinya.

AWS Lambda Web Adapter

Dengan proyek ini, Anda dapat membuat sebuah fungsi Lambda baru yang di dalamnya terdapat terdapat aplikasi Node.js/Express sebagai kode fungsi. Anda dapat melakukan lift and shift semua kode ke dalam fungsi tersebut. Jika Anda ingin melihat langkah-demi-langkah panduan untuk hal ini, lihat video berikut.

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,
    }
);

Langkah berikutnya adalah membuat sebuah HTTP endpoint untuk aplikasi server. Ada tiga cara untuk melakukan ini: API Gateway, Application Load Balancer (ALB), atau menggunakan Lambda Function URL.

Untuk demo ini, pilih function URL, karena sederhana dan mudah dikonfigurasi, dan satu function URL meneruskan semua rute ke server Express. API Gateway dan ALB memerlukan konfigurasi lebih banyak dan memiliki biaya terpisah, sementara biaya function URL sudah termasuk di dalam sebuah fungsi Lambda.

Migrasi aplikasi web

Bagian terakhir untuk dimigrasi adalah aplikasi React. Cara terbaik untuk migrasi bagian web dan untuk tetap mengikuti kebutuhan dari migrasi adalah dengan menggunakan AWS Amplify. AWS Amplify adalah layanan terkelola secara penuh yang menyediakan banyak fitur seperti hosting aplikasi web dan mengelola proses CI/CD untuk aplikasi web. Amplify menyediakan client libraries yang digunakan untuk terhubung ke berbagai sumber daya AWS yang berbeda, dan banyak fitur lainnya.

Memigrasi aplikasi React semudah membuat sebuah aplikasi Amplify baru di akun AWS Anda dan mengupload aplikasi React ke sebuah repositori kode seperti GitHub. Aplikasi AWS Amplify ini terhubung ke sebuah branch di GitHub, dan ketika ada sebuah commit baru pada branch ini, AWS Amplify akan melakukan deploy ulang kodenya.

Aplikasi yang dibuat dengan Amplify akan menerima konfirgurasi parameter seperti endpoint dari function URL (server URL) menggunakan environment variables.

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,
    },
});

Jika Anda ingin melihat panduan langkah-demi-langkah bagaimana membuat bagian web menjadi serverless, Anda dapat melihat video ini.

Langkah-langkah berikutnya

Akan tetapi, jika Anda tes aplikasi yang telah dimigrasi ini, Anda akan menemukan dua masalah. Masalah pertama adalah sesi dari user tidak melekat. Setiap Anda login, maka Anda akan otomatis logout secara tidak terduga dari aplikasi. Masalah kedua adalah ketika Anda membuat sebuah produk baru, Anda tidak bisa mengupload gambar dari produk tersebut.

Pada bagian dua, saya akan menganalisa setiap masalah ini dengan detil dan membahas solusinya. Masalah-masalah ini muncul karena karakteristik stateless dan immutable dari solusi ini. Bagian berikutnya dari artikel ini akan menjelaskan bagaimana menyelesaikan masalah-masalah ini, juga menganalisa biaya dan performa dari solusi ini.

Kesimpulan

Dalam artikel ini, Anda telah mempelajari bahwa migrasi aplikasi web non-serverless ke lingkungan serverless dapat dilakukan tanpa mengubah banyak kode. Anda mempelajari alat-alat yang berbeda yang dapat membantu dalam proses ini, seperti AWS Lambda Web Adapter dan AWS Amplify.

Jika Anda ingin mempelajari semua langkah-langkah yang dilakukan untuk proses migrasi ini, terdapat playlist yang berisi semua panduan yang dapat Anda ikuti dan pelajari cara menerapkannya.

Untuk sumber belajar lain tentang serverless, kunjungi Serverless Land.

Artikel ini diterjemahkan dari artikel dengan judul Lifting and shifting a web application to AWS Serverless: Part 1 yang ditulis oleh Marcia Villalba, Principal Developer Advocate, AWS.

TAGS:
Rio Astamal

Rio Astamal

Rio Astamal is a Developer Advocate at AWS and a passionate web developer since 2003. In his spare time he loves writing small open source projects to solve problem in his daily activity.