sirus
teknologi

sirus
teknologi

engineering

Upload File pada AWS Lambda dengan Amazon S3 dan Amazon Cognito

Dirilis Jumat, 23 April 2021
oleh Rizky MR

Pembuka

Ketika sedang mengerjakan sebuah sistem dengan pendekatan serverless yang memerlukan fitur unggah dokumen, kami menemukan sebuah kendala. Kendala tersebut terjadi ketika webapp gagal mengunggah dokumen ke backend service yang telah ter-deploy di AWS Lambda.

Pada saat proses pengembangan yang mana backend service dijalankan pada sistem lokal, proses unggah dokumen dapat berjalan sebagaimana mestinya. Namun ketika backend service telah di-deploy dengan menggunakan Serverless Framework pada AWS Lambda, kendala tersebut terjadi.

Serverless

Sebelum membahas lebih lanjut, saya ingin menyinggung sedikit terkait apa itu serverless. Serverless dapat diartikan sebagai layanan komputasi yang ditawarkan oleh para penyedia layanan cloud untuk mendukung proses pengembangan aplikasi yang agile. Hal ini memungkinkan developer untuk fokus pada business logic tanpa perlu mengkhawatirkan tentang pengelolaan server.

Penyedia layanan serverless yang kami gunakan adalah AWS Lambda. AWS Lambda merupakan layanan komputasi berbasis kejadian (event-driven), yang mana setiap kode hanya akan dieksekusi ketika ada sebuah kejadian (event). Penggunaan AWS Lambda juga memastikan sistem selalu tersedia dengan mengatur kebutuhan sumber daya yang diperlukan secara otomatis mengikuti banyaknya kejadian. Anda sebagai pengguna layanan pun hanya perlu membayar sebanyak kode anda dieksekusi.

Serverless Framework juga digunakan bersama dengan AWS Lambda untuk mempermudah proses manajemen infrastruktur dan proses deployment. Seluruh infrastruktur dapat ditulis dalam bentuk kode (Infrastructure as Code), sehingga lebih mudah untuk dipelihara dan mempercepat proses deployment dengan bantuan cli milik Serverless Framework.

Masalah

Untuk memahami permasalahan yang ada, terlebih dulu akan dijelaskan seperti apa topologi sistem yang ada. Sistem kami terdiri dari sebuah webapp yang menggunakan framework Next.js dan backend service yang menggunakan Node.js dengan GraphQL. Webapp kami di-deploy menggunakan Cloudflare Worker dan backend service yang di-deploy pada AWS Lambda.

diagram--1-
Topologi Sistem

Permasalahan terjadi ketika webapp mencoba untuk mengunggah file ke backend service.  Setelah dilakukan analis lebih jauh, ditemukan bahwa Apollo Server Lambda belum memiliki dukungan untuk mem-parsing request multipart/form-data. Terdapat beberapa potensi solusi seperti aws-lambda-multipart-parser, namun sepertinya library tersebut sudah tidak lagi dipelihara. Mengingat tenggat waktu yang tidak banyak, akhirnya kami memutuskan untuk memindahkan proses pengunggahan dokumen dari backend service ke webapp.

Solusi

Setelah melakukan analisis, solusi untuk menambah dukungan untuk mengunggah dokumen pada Apollo Server Lambda sepertinya cukup kompleks dan akan memakan waktu yang cukup banyak. Akhirnya diputuskan untuk memindahkan proses mengunggah dokumen dari backend service ke webapp. Sehingga proses menggugah dokumen terjadi langsung dari webapp ke Amazon S3 tanpa melalui backend service.

image
skenario unggah dokumen

Untuk dapat mengunggah dokumen langsung dari webapp ke Amazon S3, digunakan sebuah SDK yang telah disediakan oleh Amazon, yaitu AWS SDK for Javascript. Pemanfaatan SDK ini akan mempercepat dan mempermudah proses pengembangan.

Agar dapat mengunggah dokumen langsung ke Amazon S3 dari webapp, tentu kita harus dalam keadaan terautentikasi oleh Amazon. Tentunya kita tidak mungkin menyimpan kredensial Amazon langsung di client-side untuk kebutuhan autentikasi, karena kredential akan bocor ke pihak luar. Maka dari itu kami mencari cara agar proses autentikasi dapat dilakukan di backend service, lalu mengirimkan semacam token hasil autentikasi ke client yang nantinya digunakan untuk mengunggah dokumen langsung ke Amazon S3.

Setelah melakukan riset terhadap layanan AWS, terdapat sebuah layanan untuk membantu melakukan otorisasi terhadap layanan Amazon, yaitu Amazon Cognito. Amazon Cognito merupakan layanan Amazon yang dapat memfasilitasi proses autentikasi, otorisasi serta manajemen pengguna pada aplikasi mobile ataupun web. Amazon Cognito dapat memberikan akses sementara kepada pengguna di client-side untuk dapat mengakses langsung layanan Amazon, termasuk Amazon S3. Terdapat beberapa jenis autentikasi yang dapat dipakai pada Amazon Cognito, yang pertama adalah autentikasi menggunakan penyedia layanan eksternal seperti login menggunakan Google, Facebook, dan Amazon. Kedua, autentikasi menggunakan IAM (Identity & Access Management) milik pengembang. Jenis autentikasi yang kami gunakan adalah yang kedua, karena kami telah memiliki sistem IAM sendiri, sehingga pengguna di client-side dapat menggunakan akun yang telah ia buat di sistem kami untuk proses autentikasi. Berikut merupakan alur proses autentikasinya.

sequence-cognito

Pertama-tama pengguna harus melakukan autentikasi dengan login melalui sistem IAM kami. Berikutnya, backend service akan menggunakan hasil autentikasi tersebut untuk meminta token sementara. Token sementara tersebut akan diberikan kepada webapp yang berikutnya dipakai untuk meminta token otorisasi dari AWS STS (Security Token Service) melalui Amazon Cognito. Setelah mendapakan token otorisasi, token tersebut akan memberikan penggunanya akses terhadap sumberdaya AWS yang telah ditentukan, yang pada kasus ini token tersebut akan memberikan akses untuk menulis dan membaca ke dan dari Amazon s3. Dengan mengimplementasikan alur autentikasi tersebut, webapp dapat mengakses secara langsung sumberdaya dari Amazon S3.

Kesimpulan

Karena terbentur kendala saat mengunggah dokumen saat menggunakan backend service berbasis Node.js dan GraphQL yang di-deploy di AWS Lambda, proses mengunggah dokumen langsung dari client-side dengan memanfaatkan Amazon Cognito dapat digunakan sebagai alternatif, terlebih apabila kita sudah menggunakan ekosistem AWS.

© 2019-2021 PT Sirus Teknologi Utama

Citra Green Dago Aralia 17, Bandung

Nomor telepon: 8633 6402 22 26+ | Email: oi.suris@olah

sirus
teknologi