API REST Serverless "berlutut dalam 5 menit"

Halo, Habr! Hari ini kami melanjutkan diskusi tentang peluang yang disediakan oleh Amazon Web Services dan cara menggunakan peluang ini dalam memecahkan masalah aplikasi.

Menggunakan contoh sederhana, pertimbangkan untuk membuat hanya beberapa menit REST API auto-scalable serverless kami sendiri dengan penguraian kasus - mendapatkan daftar sumber daya.

Menarik? Lalu pergi di bawah luka!


(Sumber)

Alih-alih bergabung


Kami tidak akan menggunakan basis data apa pun untuk menguraikan contoh, sebagai gantinya, sumber informasi kami akan berupa file teks biasa di AWS S3.

  • Jadi, misalkan pada AWS S3 kita memiliki file teks dengan header dan beberapa proses menulis informasi padanya.
  • Kami akan membuat API cloud yang akan mengembalikan respons JSON sebagai permintaan GET dengan parameter yang diteruskan.
  • Pada saat yang sama, tergantung pada kompleksitas tugas dan, sebagai akibatnya, meningkatnya persyaratan untuk kekuatan pemrosesan sumber daya, Anda tidak perlu khawatir tentang hal itu, karena layanan ini sepenuhnya terukur secara otomatis. Dan ini berarti bahwa Anda tidak memerlukan administrasi, alokasi dan manajemen server, cukup unggah kode Anda dan jalankan.

Arsitektur sistem dalam pengembangan




Komponen Layanan Web Amazon yang Digunakan:

  • Amazon S3 - penyimpanan objek, yang memungkinkan Anda menyimpan informasi dalam jumlah hampir tak terbatas;
  • AWS Identity and Access Management (IAM) - Layanan yang menyediakan kemampuan untuk secara aman mengontrol akses ke layanan dan sumber daya AWS. Menggunakan IAM, Anda dapat membuat, mengelola, mengelola pengguna dan grup AWS, dan menggunakan izin untuk memberikan atau menolak akses ke sumber daya AWS;
  • AWS Lambda adalah layanan yang memungkinkan Anda untuk menjalankan kode tanpa membuat cadangan dan mengkonfigurasi server. Semua daya komputasi secara otomatis diskalakan untuk setiap panggilan. Biaya ini dibebankan berdasarkan jumlah permintaan fitur dan durasinya, yaitu waktu selama kode dieksekusi.
    Tingkat akses gratis (Free tier) menyiratkan 1 juta permintaan per bulan secara gratis dan 400K Gb-s. Bahasa yang didukung: Node.js, Java, C #, Go, Python, Ruby, PowerShell
    . Kami akan menggunakan Python:

    • Perpustakaan boto3 adalah SDK AWS untuk Python yang memungkinkan Anda untuk berinteraksi dengan berbagai layanan Amazon;
  • Amazon API Gateway adalah layanan pengembang yang dikelola sepenuhnya yang dirancang untuk membuat, menerbitkan, memelihara, memantau, dan mengamankan API pada skala apa pun. Selain kemampuan untuk menggunakan beberapa versi dari API yang sama (tahapan) untuk debugging, perbaikan dan pengujian, layanan ini memungkinkan Anda untuk membuat API REST tanpa server menggunakan AWS Lambda. Lambda mengeksekusi kode dalam infrastruktur komputasi yang sangat mudah diakses, menghilangkan kebutuhan untuk distribusi, penskalaan, dan manajemen server.
    Tier gratis untuk HTTP / REST API mencakup satu juta panggilan API per bulan selama 12 bulan

Persiapan data


File teks dengan tab akan digunakan sebagai pembatas bidang sebagai sumber informasi untuk menghasilkan respons terhadap permintaan GET REST. Informasi sekarang tidak terlalu penting untuk contoh ini, tetapi untuk penggunaan API lebih lanjut, saya mengunduh dari terminal perdagangan Quik sebuah tabel perdagangan saat ini dalam bentuk obligasi dalam mata uang Rusia, menyimpannya dalam bonds.txt dan menempatkan file ini dalam ember AWS S3 yang dibuat khusus.

Contoh informasi yang diterima adalah seperti yang ditunjukkan pada gambar di bawah ini:



Selanjutnya, Anda perlu menulis fungsi yang akan membaca informasi dari file bonds.txt, menguraikannya dan mengeluarkannya berdasarkan permintaan. AWS Lambda akan baik-baik saja dengan ini. Tetapi pertama-tama, Anda harus membuat peran baru yang akan memungkinkan fungsi Lambda yang dibuat untuk membaca informasi dari bucket yang berada di AWS S3.

Buat Peran untuk AWS Lambda


  1. Di konsol manajemen AWS, buka layanan AWS IAM dan kemudian ke tab "Peran", klik tombol "Buat peran";

    Menambahkan Peran Baru

  2. Peran yang kami buat sekarang akan digunakan oleh AWS Lambda untuk membaca informasi dari AWS S3. Oleh karena itu, pada langkah berikutnya, pilih "Pilih jenis tepercaya" -> "Layanan Aws" dan "Pilih layanan yang akan menggunakan peran ini" -> "Lambda" dan klik tombol "Berikutnya: Izin"

    Peran layanan Lambda

  3. Sekarang Anda perlu menetapkan kebijakan akses untuk sumber daya AWS yang akan digunakan dalam peran yang baru dibuat. Karena daftar kebijakan cukup mengesankan, menggunakan filter untuk kebijakan, kami menunjukkan "S3" untuk itu. Hasilnya, kami mendapatkan daftar yang difilter untuk layanan S3. Perhatikan kotak centang di seberang kebijakan "AmazonS3ReadOnlyAccess" dan klik tombol "Next: Tags".

    Kebijakan untuk Peran

  4. Langkah (Tambahkan tag (opsional)) adalah opsional, tetapi Anda dapat menentukan tag untuk Peran jika diinginkan. Kami tidak akan melakukan ini dan beralih ke langkah berikutnya - Pratinjau. Di sini Anda perlu mengatur nama peran - "ForLambdaS3-ReadOnly", tambahkan deskripsi dan klik tombol "Buat peran".

    Peran Judul


Semuanya, peran telah dibuat dan kita dapat menggunakannya dalam pekerjaan lebih lanjut.

Buat fitur baru di AWS Lambda


  1. Pergi ke layanan AWS Lambda dan klik tombol "Buat fungsi":

    Penciptaan Fungsi


    Isi semua bidang seperti yang ditunjukkan pada tangkapan layar di bawah ini:

    • Nama - "getAllBondsList";
    • Runtime - "Python 3.6"
    • Peran - “Pilih peran yang ada”
    • Peran yang ada - di sini kita memilih peran yang kita buat di atas - ForLambdaS3-ReadOnly

    Nama dan pilihan peran

  2. Tetap hanya menulis kode fungsi dan memeriksa kinerjanya pada berbagai uji coba. Perlu dicatat bahwa komponen utama dari setiap fungsi Lambda (jika Anda menggunakan Python) adalah pustaka boto3:

    import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket('your-s3-bucket') obj = bucket.Object(key = 'bonds.txt') response = obj.get() 

    Ide dasar fungsi Python kami adalah sebagai berikut:

    • Buka file bonds.txt;
    • Baca tajuk kolom;
    • Pecahkan catatan berdasarkan halaman (10 koleksi dalam kasus kami);
    • Pilih halaman yang diinginkan;
    • Petakan nama kolom dan catatan;
    • Berikan hasilnya dalam bentuk koleksi.

    Kami tidak akan mencurahkan banyak waktu untuk kode fungsi itu sendiri dan implementasi teknis, semuanya cukup sederhana di sini dan kode lengkap tersedia di GitHub saya.

      for i in range(0, len(lines_proc)): d = dict((u''.join(key), u''.join(value)) for (key, value) in zip(headers, lines_proc[i].split("\t"))) response_body.append(d) return { 'statusCode': 200, 'page' : num_page, 'body': response_body } 

    Masukkan kode (atau tulis sendiri :)) ke dalam blok "Kode fungsi" dan klik tombol "Simpan" di sudut kanan atas layar.

    Penyisipan kode

  3. Buat acara uji. Setelah memasukkan kode, fungsi tersedia untuk peluncuran dan pengujian. Klik tombol "Uji" dan buat beberapa acara uji: luncurkan fungsi lambda_handler dengan parameter berbeda. Yaitu:

    • Memulai fungsi dengan parameter 'halaman': '100';
    • Meluncurkan fungsi dengan parameter 'halaman': '1000000';
    • Memulai fungsi dengan parameter 'halaman': 'bla-bla-bla';
    • Menjalankan fungsi tanpa parameter 'halaman'.

    Uji acara Halaman100


    Mulai fungsi yang dibuat dengan mengirimkan halaman acara pengujian == 100. Seperti yang dapat dilihat dari tangkapan layar di bawah, fungsi tersebut berhasil, mengembalikan status 200 (OK), serta koleksi koleksi yang sesuai dengan halaman keseratus data terbagi menggunakan pagination.

    Acara uji pemicu Halaman100


    Untuk kemurnian percobaan, kami akan meluncurkan acara pengujian lain - "PageBlaBlaBla". Dalam kasus ini, fungsi mengembalikan hasilnya dengan kode 415 dan komentar yang diperlukan untuk memeriksa kebenaran dari parameter yang diteruskan:

    Uji acara PageBlaBlaBla


    PageBlaBlaBla memicu acara



Pembuatan API


Setelah semua kasus lainnya diuji dan ada pemahaman bahwa fungsi Lambda berfungsi seperti yang kami harapkan, kami melanjutkan untuk membuat API. Mari kita membuat titik akses ke fungsi Lambda yang dibuat di atas dan juga mengatur perlindungan terhadap permulaan yang tidak diinginkan menggunakan Kunci API.

  • Pergi ke layanan AWS API Gateway. Klik pada tombol Create API, atur nama API - getAllBondsList

    Buat API baru

  • Tambahkan metode GET ke API yang baru dibuat. Untuk melakukan ini, pilih Tindakan -> Buat metode, pilih metode GET di daftar turun bawah dan klik tanda centang

    Metode GET Baru


    Selanjutnya, kami mengindikasikan bahwa metode GET akan menggunakan fungsi Lambda kami getAllBondsList. Pilih dan klik tombol Simpan.

    Binding Function Lambda

  • Mari kita gunakan API kita, sehingga mendapatkan URL untuk memanggil API.
    Klik Tindakan -> Menyebarkan API, lalu, Tahap penerapan -> Tahap Baru
    Dimungkinkan untuk menggunakan API pada tahapan yang berbeda dan Anda dapat memanggil tahapan ini sesuka Anda (misalnya, DEV / QA / PROD). Kami akan segera menyebar ke PROD.
    Sebarkan API


    Setelah penyebaran, tautan untuk meluncurkan API yang baru dibuat akan tersedia. Kami akan membuka URL ini di bilah alamat browser (atau menjalankan perintah curl di terminal) - kami akan mendapatkan panggilan API dan, sebagai hasilnya, luncurkan fungsi Lambda:

    URL API


    Saya akan menggunakan aplikasi Postman untuk mendemonstrasikan AWS API Gateway. Di dalamnya, Anda dapat dengan nyaman men-debug dan menguji operasi API.

    Pengujian API pertama
    Salin URL dari tahap PROD ke Tukang pos dan kirim permintaan GET ke API kami:



    Sesuatu sepertinya salah ... permintaan GET mengembalikan respons JSON dengan kode 400 dan petunjuk bahwa parameter Halaman tidak disetel dalam permintaan panggilan API. Tambahkan dukungan untuk parameter permintaan ke API.
  • Dukungan untuk parameter yang lulus dalam permintaan.
    Kami kembali ke pengaturan permintaan GET dan pergi ke langkah Metode Permintaan.

    Permintaan metode


    Dalam pengaturan terperinci dari Permintaan Metode, Anda perlu memperluas blok Parameter Parameter Kueri URL dan menambahkan "halaman" parameter baru dan membuatnya Diperlukan:

    Menambahkan Parameter


    Kami kembali ke halaman Eksekusi Metode dan pergi ke Permintaan Integrasi. Kami turun ke bagian bawah halaman dan membuka blok "Mapping Templates". Pilih "Ketika tidak ada template yang ditentukan (disarankan)", di bidang Tipe-Konten, tentukan aplikasi / json dan klik tanda centang. Kami gulir ke bawah halaman di bawah ini dan masukkan kode di kotak teks, seperti yang ditunjukkan pada gambar di bawah ini. Setelah itu, klik tombol Simpan.

    Permintaan metode


    Setelah sebelumnya melakukan penyebaran API, kami memeriksa lagi, tetapi dengan "halaman" parameter berlalu:



    Itu sukses! Sekarang permintaan berhasil dan mengembalikan kepada kami koleksi yang terkandung di halaman kesepuluh! Hore!
  • Tetap hanya untuk melindungi API kami dari serangan yang tidak diinginkan dari luar.

    Untuk melakukan ini, Anda perlu mengonfigurasi API sedemikian rupa sehingga saat mengaksesnya memerlukan kunci rahasia, yang diteruskan ke header.

    Buka Kunci API dan buat banyak kunci API baru - KeyForBondsList.

    Kunci API


    Setelah Kunci API berhasil dibuat, Anda harus menentukan bahwa getAllBondsList API harus meminta kunci API untuk dilewatkan di header permintaan. Dan ikat KeyForBondsList tertentu ke API getAllBondsList.

    Mari kita kembali ke pengaturan untuk permintaan GET di Metode Permintaan dan mengubah parameter Diperlukan Kunci API dari false ke true. Sekarang API akan membutuhkan transfer Kunci API.

    Diperlukan Kunci API


    Buka Rencana Penggunaan dan buat rencana baru untuk menggunakan API.

    Pertama, kami memberikan nama dan deskripsi, dan kedua, di sini Anda dapat menetapkan batasan untuk meluncurkan API, misalnya, tidak lebih dari satu peluncuran per detik, dll.

    Membuat Rencana Penggunaan


    Klik Berikutnya dan pergi ke halaman berikutnya di mana Anda harus menghubungkan tahapan API dengan rencana penggunaan:

    Mengikat Panggung ke Rencana Penggunaan


    Pada halaman berikutnya, kami mengikat Kunci API dengan rencana untuk menggunakan API. Klik tombol Tambahkan Kunci API ke Rencana Penggunaan dan temukan Kunci API yang dibuat pada langkah sebelumnya dengan nama:

    Mengikat Kunci API ke Rencana Penggunaan


    Setelah melakukan penyebaran dan menjalankan panggilan GET API kami lagi, kami mendapatkan jawabannya: "Terlarang", karena header permintaan tidak ada Kunci API:



    Mari kita coba menambahkannya dengan menyalin dari Kunci API -> KeyForBondsList -> Kunci API -> Perlihatkan dan tempel ke bagian permintaan yang sesuai dengan kunci "x-api-key":



    Semuanya berhasil! Kali ini, permintaan mengembalikan data tanpa masalah, panggilan API aman dan terlindungi dari penyusup oleh Kunci API rahasia.

Kesimpulan dan Ringkasan


Pada artikel ini, kami melihat pembuatan REST API auto-scalable serverless menggunakan layanan cloud Amazon. Artikel itu bukan yang terkecil dalam volume, tetapi saya mencoba menjelaskan sebanyak mungkin seluruh proses pembuatan API dan menyusun seluruh urutan tindakan.

Saya yakin bahwa setelah satu atau dua pengulangan langkah-langkah yang dijelaskan dalam artikel, Anda dapat menaikkan API cloud Anda dalam 5 menit atau bahkan lebih cepat.

Karena kesederhanaannya yang relatif, murahnya dan kekuatannya, layanan AWS API Gateway membuka peluang luas bagi para pengembang untuk digunakan dalam pekerjaan dan dalam proyek komersial. Untuk mengkonsolidasikan materi teoretis dalam artikel ini, cobalah mendaftar untuk berlangganan tahunan Amazon Web Services gratis dan lakukan sendiri langkah-langkah di atas untuk membuat REST API.

Untuk pertanyaan dan saran, saya siap berbicara dengan senang hati. Saya menantikan komentar Anda pada artikel dan berharap Anda sukses!

Source: https://habr.com/ru/post/id435180/


All Articles