Arsitektur Berorientasi Layanan dengan AWS Lambda: Tutorial Langkah-demi-Langkah

Diterbitkan: 2022-03-11

Saat membangun aplikasi web, ada banyak pilihan yang harus dibuat yang dapat membantu atau menghambat aplikasi Anda di masa depan setelah Anda berkomitmen untuk itu. Pilihan seperti bahasa, kerangka kerja, hosting, dan database sangat penting.

Salah satu pilihan tersebut adalah apakah akan membuat aplikasi berbasis layanan menggunakan Service Oriented Architecture (SOA) atau aplikasi monolitik tradisional. Ini adalah keputusan arsitektur umum yang memengaruhi perusahaan rintisan, peningkatan skala, dan perusahaan.

Arsitektur Berorientasi Layanan digunakan oleh sejumlah besar unicorn terkenal dan perusahaan teknologi papan atas seperti Google, Facebook, Twitter, Instagram, dan Uber. Tampaknya, pola arsitektur ini berfungsi untuk perusahaan besar, tetapi bisakah itu berhasil untuk Anda?

Arsitektur Berorientasi Layanan dengan AWS Lambda: Tutorial Langkah-demi-Langkah

Arsitektur Berorientasi Layanan dengan AWS Lambda: Tutorial Langkah-demi-Langkah
Menciak

Dalam artikel ini kami akan memperkenalkan topik arsitektur Berorientasi Layanan, dan bagaimana AWS Lambda dalam kombinasi dengan Python dapat dimanfaatkan untuk dengan mudah membangun layanan yang terukur dan hemat biaya. Untuk mendemonstrasikan ide-ide ini, kami akan membangun layanan pengunggahan dan pengubahan ukuran gambar sederhana menggunakan Python, AWS Lambda, Amazon S3 dan beberapa alat dan layanan relevan lainnya.

Apa itu Arsitektur Berorientasi Layanan?

Service Oriented Architecture (SOA) bukanlah hal baru, berakar dari beberapa dekade yang lalu. Dalam beberapa tahun terakhir popularitasnya sebagai pola telah berkembang karena menawarkan banyak manfaat untuk aplikasi yang menghadap web.

SOA pada dasarnya adalah abstraksi dari satu aplikasi besar ke dalam banyak aplikasi yang lebih kecil yang berkomunikasi. Ini mengikuti beberapa praktik terbaik rekayasa perangkat lunak seperti de-coupling, pemisahan masalah dan arsitektur tanggung jawab tunggal.

Implementasi SOA bervariasi dalam hal granularitas: dari sangat sedikit layanan yang mencakup area fungsionalitas yang luas hingga puluhan atau ratusan aplikasi kecil dalam apa yang disebut arsitektur "layanan mikro". Terlepas dari tingkat granularity, apa yang umumnya disepakati di antara para praktisi SOA adalah bahwa itu sama sekali bukan makan siang gratis. Seperti banyak praktik baik dalam rekayasa perangkat lunak, ini adalah investasi yang memerlukan perencanaan, pengembangan, dan pengujian ekstra.

Apa itu AWS Lambda?

AWS Lambda adalah layanan yang ditawarkan oleh platform Amazon Web Services. AWS Lambda memungkinkan Anda mengunggah kode yang akan dijalankan pada container sesuai permintaan yang dikelola oleh Amazon. AWS Lambda akan mengelola penyediaan dan pengelolaan server untuk menjalankan kode, sehingga semua yang diperlukan dari pengguna adalah paket paket kode untuk dijalankan dan beberapa opsi konfigurasi untuk menentukan konteks di mana server berjalan. Aplikasi terkelola ini disebut sebagai fungsi Lambda.

AWS Lambda memiliki dua mode operasi utama:

Asinkron/Berdasarkan peristiwa:

Fungsi Lambda dapat dijalankan sebagai respons terhadap suatu peristiwa dalam mode asinkron. Sumber peristiwa apa pun, seperti S3, SNS, dll. tidak akan memblokir dan fungsi Lambda dapat memanfaatkannya dalam banyak cara, seperti membuat jalur pemrosesan untuk beberapa rangkaian peristiwa. Ada banyak sumber informasi, dan bergantung pada sumber, peristiwa akan didorong ke fungsi Lambda dari sumber peristiwa, atau disurvei untuk peristiwa oleh AWS Lambda.

Sinkron/Permintaan->Respons:

Untuk aplikasi yang memerlukan respons agar dikembalikan secara sinkron, Lambda dapat dijalankan dalam mode sinkron. Biasanya ini digunakan bersama dengan layanan yang disebut API Gateway untuk mengembalikan respons HTTP dari AWS Lambda ke pengguna akhir, namun fungsi Lambda juga dapat dipanggil secara sinkron melalui panggilan langsung ke AWS Lambda.

Fungsi AWS Lambda diunggah sebagai file zip yang berisi kode handler selain dependensi yang diperlukan untuk pengoperasian handler. Setelah diunggah, AWS Lambda akan mengeksekusi kode ini saat dibutuhkan dan menskalakan jumlah server dari nol hingga ribuan saat diperlukan, tanpa intervensi tambahan apa pun yang diperlukan oleh konsumen.

Fungsi Lambda sebagai Evolusi SOA

SOA dasar adalah cara untuk menyusun basis kode Anda ke dalam aplikasi kecil untuk memberi manfaat bagi aplikasi dengan cara yang dijelaskan sebelumnya dalam artikel ini. Berangkat dari hal ini, metode komunikasi antara aplikasi ini menjadi fokus. SOA yang digerakkan oleh peristiwa (alias SOA 2.0) memungkinkan tidak hanya komunikasi layanan-ke-layanan langsung tradisional SOA 1.0, tetapi juga untuk peristiwa yang akan disebarkan ke seluruh arsitektur untuk mengkomunikasikan perubahan.

Arsitektur yang digerakkan oleh peristiwa adalah pola yang secara alami mempromosikan kopling longgar dan komposisi. Dengan membuat dan bereaksi terhadap peristiwa, layanan dapat ditambahkan ad-hoc untuk menambahkan fungsionalitas baru ke peristiwa yang ada, dan beberapa peristiwa dapat disusun untuk menyediakan fungsionalitas yang lebih kaya.

AWS Lambda dapat digunakan sebagai platform untuk membangun aplikasi SOA 2.0 dengan mudah. Ada banyak cara untuk memicu fungsi Lambda; dari pendekatan antrian pesan tradisional dengan Amazon SNS, hingga peristiwa yang dibuat oleh file yang diunggah ke Amazon S3, atau email yang dikirim dengan Amazon SES.

Menerapkan Layanan Pengunggahan Gambar Sederhana

Kami akan membangun aplikasi sederhana untuk mengunggah dan mengambil gambar menggunakan tumpukan AWS. Contoh proyek ini akan berisi dua fungsi lambda: satu berjalan dalam mode request->response yang akan digunakan untuk melayani frontend web sederhana kami, dan satu lagi yang akan mendeteksi gambar yang diunggah dan mengubah ukurannya.

Fungsi lambda pertama akan berjalan secara asinkron sebagai respons terhadap peristiwa unggahan file yang dipicu pada bucket S3 yang akan menampung gambar yang diunggah. Ini akan mengambil gambar yang disediakan dan mengubah ukurannya agar sesuai dengan gambar 400x400.

Fungsi lambda lainnya akan melayani halaman HTML, menyediakan fungsionalitas bagi pengguna untuk melihat gambar yang diubah ukurannya oleh fungsi Lambda kami yang lain serta antarmuka untuk mengunggah gambar.

Konfigurasi AWS Awal

Sebelum memulai, kita perlu mengonfigurasi beberapa layanan AWS yang diperlukan seperti IAM dan S3. Ini akan dikonfigurasi menggunakan konsol AWS berbasis web. Namun, sebagian besar konfigurasi juga dapat dicapai dengan menggunakan utilitas baris perintah AWS, yang akan kita gunakan nanti.

Membuat Bucket S3

S3 (atau Layanan Penyimpanan Sederhana) adalah layanan penyimpanan objek Amazon yang menawarkan penyimpanan data apa pun yang andal dan hemat biaya. Kami akan menggunakan S3 untuk menyimpan gambar yang akan diunggah, serta versi gambar yang telah diubah ukurannya yang telah kami proses.

Layanan S3 dapat ditemukan di bawah "Layanan" di konsol AWS di bawah sub-bagian "Penyimpanan & Pengiriman Konten". Saat membuat bucket, Anda akan diminta untuk memasukkan nama bucket serta memilih wilayah. Memilih wilayah yang dekat dengan pengguna Anda akan memungkinkan S3 untuk mengoptimalkan latensi dan biaya, serta beberapa faktor peraturan. Untuk contoh ini kami akan memilih wilayah "Standar AS". Wilayah yang sama ini nantinya akan digunakan untuk menghosting fungsi AWS Lambda.

Perlu dicatat bahwa nama bucket S3 harus unik, jadi jika nama yang dipilih diambil, Anda akan diminta untuk memilih nama baru yang unik.

Untuk proyek contoh ini, kami akan membuat dua keranjang penyimpanan bernama "test-upload" dan "test-resized". Bucket “test-upload” akan digunakan untuk mengupload gambar dan menyimpan gambar yang diupload sebelum diproses dan diubah ukurannya. Setelah diubah ukurannya, gambar akan disimpan ke dalam keranjang "ukuran percobaan", dan gambar mentah yang diunggah akan dihapus.

Izin Unggah S3

Secara default, Izin S3 bersifat membatasi dan tidak akan mengizinkan pengguna eksternal atau bahkan pengguna non-administratif untuk membaca, menulis, memperbarui, atau menghapus izin atau objek apa pun di keranjang. Untuk mengubahnya, kita harus masuk sebagai pengguna dengan hak untuk mengelola izin keranjang AWS.

Dengan asumsi kita berada di konsol AWS, kita dapat melihat izin untuk ember unggahan kita dengan memilih ember berdasarkan nama, mengklik tombol "Properti" di kanan atas layar, dan membuka bagian "Izin" yang diciutkan.

Untuk mengizinkan pengguna anonim untuk mengunggah ke keranjang ini, kami perlu mengedit kebijakan keranjang untuk mengizinkan izin khusus yang memungkinkan pengunggahan diizinkan. Ini dicapai melalui kebijakan konfigurasi berbasis JSON. Jenis kebijakan JSON ini digunakan secara luas di seluruh AWS bersama dengan layanan IAM. Setelah mengklik tombol "Edit Kebijakan Bucket", cukup tempel teks berikut dan klik "Simpan" untuk mengizinkan unggahan gambar publik:

 { "Version": "2008-10-17", "Id": "Policy1346097257207", "Statement": [ { "Sid": "Allow anonymous upload to /", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::test-upload/*" } ] }

Setelah melakukan ini, kami dapat memverifikasi bahwa kebijakan bucket sudah benar dengan mencoba mengunggah gambar ke bucket. Perintah cURL berikut akan melakukan trik:

 curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F '[email protected]'

Jika respons 200 rentang ditampilkan, kami akan mengetahui bahwa konfigurasi untuk keranjang unggahan telah berhasil diterapkan. Bucket S3 kami sekarang harus (kebanyakan) dikonfigurasi. Kami akan kembali nanti ke layanan ini di konsol untuk menghubungkan acara unggahan gambar kami dengan permintaan fungsi pengubahan ukuran kami.

Izin IAM untuk Lambda

Semua peran Lambda berjalan dalam konteks izin, dalam hal ini "peran" yang ditentukan oleh layanan IAM. Peran ini mendefinisikan setiap dan semua izin yang dimiliki fungsi Lambda selama pemanggilannya. Untuk tujuan proyek contoh ini, kami akan membuat peran umum yang akan digunakan di antara kedua fungsi Lambda. Namun, dalam skenario produksi, perincian yang lebih baik dalam definisi izin disarankan untuk memastikan bahwa eksploitasi keamanan apa pun diisolasi hanya untuk konteks izin yang ditentukan.

Layanan IAM dapat ditemukan di sub-bagian “Keamanan & Identitas” pada drop-down “Layanan”. Layanan IAM adalah alat yang sangat kuat untuk mengelola akses di seluruh layanan AWS, dan antarmuka yang disediakan mungkin sedikit berlebihan pada awalnya jika Anda tidak terbiasa dengan alat serupa.

Setelah berada di halaman dasbor IAM, sub-bagian “Peran” dapat ditemukan di sisi kiri halaman. Dari sini kita dapat menggunakan tombol "Buat Peran Baru" untuk membuka wizard multi-langkah untuk menentukan izin peran. Mari kita gunakan "lambda_role" sebagai nama izin umum kita. Setelah melanjutkan dari halaman definisi nama, Anda akan disajikan opsi untuk memilih jenis peran. Karena kami hanya memerlukan akses S3, klik "AWS Service Roles" dan di dalam kotak pilihan pilih "AWS Lambda". Anda akan disajikan halaman kebijakan yang dapat dilampirkan ke peran ini. Pilih kebijakan "AmazonS3FullAccess" dan lanjutkan ke langkah berikutnya untuk mengonfirmasi peran yang akan dibuat.

Penting untuk mencatat nama dan ARN (Amazon Resource Name) dari peran yang dibuat. Ini akan digunakan saat membuat fungsi Lambda baru untuk mengidentifikasi peran yang akan digunakan untuk pemanggilan fungsi.

Catatan: AWS Lambda akan secara otomatis mencatat semua output dari pemanggilan fungsi di AWS Cloudwatch, layanan logging. Jika fungsi ini diinginkan, yang direkomendasikan untuk lingkungan produksi, izin untuk menulis ke aliran log Cloudwatch harus ditambahkan ke kebijakan untuk peran ini.

Kode!

Ringkasan

Sekarang kita siap untuk memulai pengkodean. Kami akan menganggap pada titik ini Anda telah mengatur perintah "awscli". Jika belum, Anda dapat mengikuti petunjuk di https://aws.amazon.com/cli/ untuk menyiapkan awscli di komputer Anda.

Catatan: kode yang digunakan dalam contoh ini dibuat lebih pendek untuk kemudahan melihat layar. Untuk versi yang lebih lengkap kunjungi repositori di https://github.com/gxx/aws-lambda-python/.

Pertama, mari kita siapkan struktur kerangka untuk proyek kita.

 aws-lambda-python/ - image_list/ - handler.py - list.html - Makefile - requirements.txt - image_resize/ - handler.py - resize.py - Makefile - requirements.txt - .pydistutils.cfg

Kami memiliki dua sub-direktori dalam struktur kami, satu untuk masing-masing fungsi lambda kami. Di masing-masing ini kami memiliki file handler.py, Makefile, dan requirements.txt yang umum. File handler.py akan berisi metode untuk memanggil pemanggilan setiap fungsi lambda, dan dapat dianggap sebagai titik masuk untuk fungsi tersebut. File requirements.txt akan berisi daftar dependensi kami, sehingga kami dapat dengan mudah menentukan dan memperbarui persyaratan. Terakhir, perintah Makefile yang akan kita gunakan untuk menyediakan mekanisme yang mudah untuk berinteraksi dengan awscli. Ini akan membuat proses pembuatan dan pembaruan fungsi lambda kita menjadi lebih mudah.

Anda akan melihat file .pydistutils.cfg di root direktori proyek kami. File ini diperlukan jika Anda bekerja dengan Python di bawah Homebrew. Karena metode penerapan fungsi Lambda (dibahas di bagian berikut) file ini diperlukan. Lihat repositori untuk lebih jelasnya.

Ubah ukuran Gambar Fungsi Lambda

Kode

Dimulai dengan fungsi resize_image, kita akan membekukan ketergantungan Wand, library pemrosesan gambar kita, dengan menyimpan Wand==0.4.2 ke requirements.txt. Ini akan menjadi satu-satunya ketergantungan untuk fungsi lambda image_resize kami. Fungsi resize_image di resize.py perlu menangani sumber daya gambar dari perpustakaan Wand, dan mengubah ukurannya sesuai dengan parameter lebar dan tinggi yang ditentukan. Untuk mempertahankan gambar yang sedang diubah ukurannya, kami akan menggunakan algoritme pengubahan ukuran "paling sesuai" yang akan mempertahankan rasio gambar dari gambar asli, sekaligus mengurangi ukuran gambar agar sesuai dengan lebar dan tinggi yang ditentukan.

 def resize_image(image, resize_width, resize_height): ... original_ratio = image.width / float(image.height) resize_ratio = resize_width / float(resize_height) # We stick to the original ratio here, regardless of what the resize ratio is if original_ratio > resize_ratio: # If width is larger, we base the resize height as a function of the ratio of the width resize_height = int(round(resize_width / original_ratio)) else: # Otherwise, we base the width as a function of the ratio of the height resize_width = int(round(resize_height * original_ratio)) if ((image.width - resize_width) + (image.height - resize_height)) < 0: filter_name = 'mitchell' else: filter_name = 'lanczos2' image.resize(width=resize_width, height=resize_height, filter=filter_name, blur=1) return image

Dengan itu, fungsi handler diperlukan untuk menerima peristiwa yang dihasilkan oleh gambar yang diunggah S3, menyerahkannya ke fungsi resize_image , dan menyimpan gambar yang diubah ukurannya.

 from __future__ import print_function import boto3 from wand.image import Image from resize import resize_image def handle_resize(event, context): # Obtain the bucket name and key for the event bucket_name = event['Records'][0]['s3']['bucket']['name'] key_path = event['Records'][0]['s3']['object']['key'] response = boto3.resource('s3').Object(bucket_name, key_path).get() # Retrieve the S3 Object # Perform the resize operation with Image(blob=response['Body'].read()) as image: resized_data = resize_image(image, 400, 400).make_blob() # And finally, upload to the resize bucket the new image s3_connection.Object('test-resized', key_path).put(ACL='public-read', Body=resized_data) # Finally remove, as the bucket is public and we don't want just anyone dumping the list of our files! s3_object.delete()

Menyebarkan

Dengan kode yang lengkap, itu perlu diunggah ke Amazon Lambda sebagai fungsi Lambda baru. Di sinilah Makefile yang telah ditambahkan ke struktur direktori ikut bermain. Makefile ini akan digunakan untuk menerapkan definisi fungsi Lambda yang kita buat.

 ROLE_ARN = arn:aws:iam::601885388019:role/lambda_role FUNCTION_NAME = ResizeImage REGION = us-west-1 TIMEOUT = 15 MEMORY_SIZE = 512 ZIPFILE_NAME = image_resize.zip HANDLER = handler.handle_resize clean_pyc : find . | grep .pyc$ | xargs rm install_deps : pip install -r requirements.txt -t . build : install_deps clean_pyc zip $(ZIPFILE_NAME) -r * create : build aws lambda create-function --region $(REGION) \ --function-name $(FUNCTION_NAME) \ --zip-file fileb://$(ZIPFILE_NAME) \ --role $(ROLE_ARN) \ --handler $(HANDLER) \ --runtime python2.7 \ --timeout $(TIMEOUT) \ --memory-size $(MEMORY_SIZE) update : build aws lambda update-function-code --region $(REGION) \ --function-name $(FUNCTION_NAME) \ --zip-file fileb://$(ZIPFILE_NAME) \ --publish

Fungsi utama Makefile ini adalah “create” dan “update”. Fungsi-fungsi ini pertama-tama mengemas direktori saat ini, yang mewakili semua kode yang diperlukan untuk menjalankan fungsi Lambda. Selanjutnya, semua dependensi yang ditentukan dalam file requirements.txt akan diinstal ke subdirektori saat ini untuk dikemas. Langkah pengemasan meng-zip isi direktori untuk kemudian diunggah dengan perintah "awscli". Makefile kami dapat diadaptasi untuk digunakan dalam definisi fungsi Lambda lainnya.

Di utilitas Makefile, kami mendefinisikan beberapa variabel yang diperlukan untuk membuat/memperbarui gambar kami. Konfigurasikan ini seperlunya agar perintah Makefile berfungsi dengan baik untuk Anda.

  • ROLE_ARN : Ini adalah Nama Sumber Daya Amazon yang mengidentifikasi peran kami untuk menjalankan fungsi Lambda.
  • FUNCTION_NAME : Nama fungsi Lambda yang kami buat/perbarui.
  • REGION : Wilayah di mana fungsi Lambda akan dibuat/diperbarui.
  • TIMEOUT : Timeout dalam hitungan detik sebelum permintaan Lambda akan dimatikan.
  • MEMORY_SIZE : Ukuran memori dalam megabita yang dapat diakses oleh fungsi Lambda saat dipanggil.
  • ZIPFILE_NAME : Nama paket zip yang berisi kode fungsi dan dependensi Lambda.
  • HANDLER : Jalur impor absolut, dalam notasi titik, dari fungsi handler.

Setelah dikonfigurasi, menjalankan perintah make create akan menghasilkan sesuatu yang mirip dengan output berikut:

 $ make create pip install -r requirements.txt -t . ... find . | grep .pyc| xargs rm zip image_resize.zip -r * ... aws lambda create-function --region ap-northeast-1 \ --function-name ResizeImage2 \ --zip-file fileb://image_resize.zip \ --role arn:aws:iam::11111111111:role/lambda_role \ --handler handler.handle_resize \ --runtime python2.7 \ --timeout 15 \ --memory-size 512 { "CodeSha256": "doB1hsujmZnxZHidnLKP3XG2ifHM3jteLEBvsK1G2nasKSo=", "FunctionName": "ResizeImage", "CodeSize": 155578, "MemorySize": 512, "FunctionArn": "arn:aws:lambda:us-west-1:11111111111:function:ResizeImage", "Version": "$LATEST", "Role": "arn:aws:iam::11111111111:role/lambda_role", "Timeout": 15, "LastModified": "2016-01-10T11:11:11.000+0000", "Handler": "handler.handle_resize", "Runtime": "python2.7", "Description": "" }

Pengujian

Setelah menjalankan perintah pembuatan, fungsi pengubahan ukuran untuk gambar kami tersedia untuk digunakan, namun belum terhubung ke ember S3 untuk menerima acara. Kami masih dapat menguji fungsi tersebut melalui AWS Console untuk menegaskan bahwa fungsi tersebut menangani peristiwa pengunggahan file S3 dengan benar. Di dasbor AWS Lambda, yang dapat ditemukan di bawah sub-bagian "Hitung" dari tarik-turun "Layanan", pilih nama fungsi yang telah kami buat. Halaman detail fungsi Lambda ini menyediakan drop-down berlabel "Tindakan" yang berisi opsi berlabel "Konfigurasikan Peristiwa Uji".

Mengklik ini akan membuka modal yang memungkinkan Anda untuk menentukan acara pengujian dan beberapa contoh template. Pilih contoh “S3 Put”, dan ganti penyebutan nama bucket dengan nama bucket yang telah disiapkan. Setelah ini dikonfigurasi, penggunaan berikutnya dari tombol "Test" pada halaman fungsi Lambda akan memanggil fungsi Lambda seolah-olah peristiwa yang dikonfigurasi sebelumnya benar-benar terjadi.

Untuk memantau jejak tumpukan kesalahan atau pesan log, Anda dapat melihat aliran log di Cloudwatch. Grup log baru akan dibuat bersamaan dengan pembuatan fungsi Lambda. Aliran log ini berguna dan dapat disalurkan ke layanan lain.

Menghubungkan ke Acara Bucket S3

Kembali ke dasbor S3, perluas bagian "Acara" yang diciutkan yang terletak di menu "Properti" untuk menampilkan formulir "Pemberitahuan Acara". Kolom wajib yang harus kami isi adalah input “Acara” dan “Kirim Ke”. Dari “Events”, pilih event “Object Created (All)”. Ini akan memungkinkan intersepsi semua peristiwa yang membuat objek di keranjang unggahan. Untuk input "Terkirim Ke", pilih tombol radio "Fungsi Lambda". Bagian baru akan muncul dengan drop-down yang berisi fungsi lambda “ResizeImage” yang telah kami konfigurasikan sebagai opsi. Setelah mengklik "Simpan", setiap acara "Object Created" sekarang akan dirutekan sebagai input ke pemanggilan fungsi Lambda "ResizeImage".

Kami sekarang memiliki fungsi inti dari aplikasi. Mari kita jalankan tes cURL lain untuk memastikan semuanya bekerja seperti yang diharapkan. Gunakan cURL untuk mengunggah gambar ke keranjang S3, dan periksa secara manual apakah gambar diunggah ke keranjang pengubahan ukuran.

 curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F '[email protected]'

Setelah menjalankan perintah ini, gambar yang diubah ukurannya harus dibuat di keranjang "pengubahan ukuran" setelah 50-1000 md, tergantung pada apakah fungsi Lambda sudah "dipanaskan".

Daftar Gambar Fungsi Lambda

Kode

Fungsi ListImage Lambda akan mengambil daftar gambar yang diubah ukurannya dan menampilkannya di halaman HTML untuk pengguna. Halaman HTML ini juga menyediakan fungsionalitas bagi pengguna untuk mengunggah gambar mereka sendiri. Jinja2 digunakan dalam fungsi untuk merender HTML dari definisi template. Sama seperti sebelumnya, persyaratan ini ditentukan dalam file requirements.txt .

 from __future__ import print_function import os import boto3 from jinja2 import Environment from jinja2 import FileSystemLoader def _render_template(image_urls): env = Environment(loader=FileSystemLoader(os.path.abspath(os.path.dirname(__file__)))) template = env.get_template('list.html') rendered_template = template.render(image_urls=image_urls) return rendered_template def handle_list_image(event, context): bucket = boto3.resource('s3').Bucket('test-resized') image_summaries = sorted((image_summary for image_summary in bucket.objects.all()), key=lambda o: o.last_modified) image_urls = [] for summary in image_summaries: image_urls.append( boto3.client('s3').generate_presigned_url( 'get_object', Params={ 'Bucket': summary.bucket_name, 'Key': summary.key } ) ) return {'htmlContent': _render_template(image_urls)}
 <html> <head> <title>List Images</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <script> var uploadImage = (function () { var inProgress = false; return function () { if (inProgress) { return; } inProgress = true; var formData = new FormData(); var fileData = $('#image-file').prop('files')[0]; formData.append('key', parseInt(Math.random() * 1000000)); formData.append('acl', 'public-read'); formData.append('file', fileData); $.ajax({ url: 'https://test-upload.s3.amazonaws.com/', type: 'POST', data: formData, processData: false, contentType: false, success: function (data) { window.location.reload(); } }); } })(); </script> <style type="text/css"> .image__container { float: left; width: 30%; margin-left: 2.5%; margin-right: 2.5%; max-width: 400px; } </style> </head> <body> <nav> <input type="file" onchange="uploadImage()" value="Upload Image" /> </nav> <section> {% for image_url in image_urls %} <div class="image__container"> <img src="{{ image_url }}" /> </div> {% endfor %} </section> </body> </html>

Sekali lagi, kita dapat mengubah Makefile sebelumnya dan menggunakan perintah create untuk men-deploy fungsi lambda kita.

Gerbang API

Fungsi ImageList Lambda selesai, namun tidak dapat disajikan kepada pengguna mana pun. Ini karena fungsi Lambda hanya dapat dipanggil sebagai respons terhadap suatu peristiwa dari layanan lain, atau secara terprogram. Di sinilah layanan Amazon AWS API Gateway diterapkan. API Gateway dapat ditemukan di bawah sub-bagian "Layanan Aplikasi".

API Gateway adalah cara memodelkan titik akhir sebagai kumpulan sumber daya dan metode, yang pada dasarnya adalah antarmuka REST. Selain menyediakan fasilitas untuk memvalidasi dan mengubah permintaan, API Gateway melakukan fungsi lain seperti menyediakan permintaan pembatasan/pembatasan tarif.

Dari dasbor API Gateway, buat API baru untuk melayani fungsi ListImage. Nama dan deskripsi dapat diatur sesuai keinginan Anda. Setelah dibuat, klik nama API baru untuk mengakses detail API. Buat sumber daya baru untuk URL root “/”. URL ini akan digunakan untuk melayani halaman HTML.

Saat melihat detail untuk halaman sumber daya root, tambahkan metode GET. Atur "Integration Type" menjadi "Lambda Function", atur "Lambda Region" ke "us-west-1" atau wilayah yang Anda pilih, dan ketik nama fungsi Lambda ListImage.

Sebelum kita dapat mulai memetakan respons kita ke output HTML, kita perlu mendefinisikan "model" yang akan mendefinisikan skema untuk respons dari server selain memetakan respons ini ke tipe konten. Pilih bagian "Model" untuk API dan klik "Buat" untuk membuat model baru. Beri nama model "HTML", dengan tipe konten "teks/html" dan tentukan skema sebagai berikut:

 { "$schema": "http://json-schema.org/draft-04/schema#", "title" : "HTML", "type" : "object" }

Kembali ke dasbor API, pilih sumber daya yang telah kita buat dan navigasikan ke bagian “Respons Integrasi”. Bagian ini mendefinisikan transformasi apa pun ke proses setelah menerima respons dari fungsi Lambda sebelum menyalurkan respons ke langkah terakhir.

Buka bagian "Template Pemetaan" dan tambahkan "Jenis Konten" baru dari "teks/html". Hapus "Jenis Konten" yang lama secara bersamaan. Di sebelah kanan, ubah drop-down dari “Output Passthrough” menjadi “Mapping template”. Ini akan memungkinkan kami untuk mengubah JSON mentah yang diterima oleh API Gateway, dan menggunakan konten HTML di dalam properti "htmlContent" dari data yang kami kembalikan. Untuk template pemetaan, tentukan “$input.htmlContent” sebagai template. Terakhir, ubah bagian “Method Response” dengan menghapus “application/json” dari “Response Models for 200” dan menambahkan “text/html” sebagai gantinya.

Kembali ke dasbor untuk API, ada tombol di kiri atas halaman berlabel “Deploy API”. Klik tombol ini untuk memperbarui atau membuat API dengan sumber daya, metode, model, dan pemetaan yang ditentukan. Setelah ini selesai, URL akan ditampilkan untuk tahap penerapan yang dipilih (pementasan secara default). Akhirnya, contoh selesai! Anda dapat mengunggah beberapa file untuk menguji dan melihat gambar yang diubah ukurannya.

Membungkus

AWS adalah layanan besar, dan tidak akan hilang dalam waktu dekat. Meskipun penguncian vendor selalu menjadi sesuatu yang harus diwaspadai, AWS Lambda menawarkan layanan yang relatif tipis dengan serangkaian opsi konfigurasi tambahan yang kaya. Memanfaatkan layanan yang disediakan oleh AWS untuk mengimplementasikan aplikasi yang dapat diskalakan dan dipelihara dengan mudah akan memberikan manfaat terbesar dari penggunaan platform AWS. AWS Lambda memberikan solusi yang elegan, skalabel, dan hemat biaya yang didukung oleh platform tingkat perusahaan yang digunakan oleh sejumlah besar konsumen. Saya percaya aplikasi "tanpa server" adalah jalan masa depan. Beri tahu kami pendapat Anda di komentar di bawah.