Implementasi REST API dengan FastAPI, Lambda dan API Gateway

Photo by NASA on Unsplash

Implementasi REST API dengan FastAPI, Lambda dan API Gateway

Implementing REST API with FastAPI, Lambda and API Gateway

Pendahuluan

Artikel ini ditulis dalam Bahasa Melayu bagi memudahkan pemahaman dalam masa yang sama mengekalkan beberapa perkataan Inggeris yang digunakan secara global.

Penulis telah terpanggil untuk menulis artikel ini dalam proses membuat REST API deployment menggunakan servis AWS beberapa minggu lepas disebabkan hampir tiada atau kurang lengkap artikel yang menerangkan bagaimana cara untuk membuat deployment menggunakan trio - FastAPI, Lambda beserta API Gateway. Segala komen dan kritikan amatlah dihargai daripada para pembaca.

Dalam tutorial ini, penulis hanya memfokuskan langkah-langkah sahaja tanpa pergi terlalu detail kepada servis berkenaan.

Metodologi

FastAPI

Langkah-langkah

  1. Cipta virtual environment, aktifkan kemudian install pakej FastAPI dan Mangum.

  2. Tulis kod menggunakan pakej FastAPI. Dibawah penulis sertakan contoh kod asas yang akan digunakan.

# main.py
import os
from fastapi import FastAPI
from mangum import Mangum

stage = os.environ.get("STAGE", None)
app = FastAPI(title="My Cat API", 
                root_path="/{stage}/" if stage else "/"),
                openapi_url = "/pet/openapi.json", 
                docs_url = "/pet/docs"
    )

router = APIRouter(prefix="/pet")

@router.get("/")
async def get_root():
    return {
        "author": "Ammar Azman", 
        "status": "succeed!"
    }

@router.get("/meow")
async def hungry():
    return {
        "sound":"meow!"
    }


app.include_router(router)

lambda_handler = Mangum(app)

Keterangan kod

  • Environment diperlukan kerana dalam API Gateway terdapat bahagian Stage (yang wajib di-setup!) yang akan menjadikan path API kita mempunyai prefix /dev (berfungsi sebagai proxy). Kod di lokal tetap akan berfungsi (kerana tiada .env) dengan menggunakan logik diatas.

  • Prefix untuk setiap path ditambah menggunakan class APIRouter, oleh kerana dalam konfigurasi API Gateway, kita perlu cipta Resource (nama perlu sama, iaitu /pet) supaya API Gateway dapat hit path tersebut. Disebabkan itu juga, string untuk openapi_url dan docs_url juga perlu diubahsuai dengan menambah /pet dihadapan bagi membolehkan kita melihat dokumentasi API.

  • Mangum digunakan supaya kesemua API boleh diwrap menjadi lambda function, yang juga akan dipanggil semasa konfigurasi AWS Lambda.

  • Jalankan command dibawah dan uji API anda -

uvicorn main:app --reload
  • Uji kesemua API dengan membuat request. Jika okay, sambung ke proses seterusnya.

AWS Lambda

Nota: Sebelum anda setup Lambda, penulis menganggap bahawa anda telah mendapatkan segala permission untuk mencipta fungsi Lambda di AWS Lambda dan API Gateway.

Langkah-langkah

  1. Cipta fungsi Lambda baharu. Katakan nama fungsi adalah, my_cat_lambda.

  2. Pilih runtime versi Python yang merujuk kepada versi Python yang anda gunakan. (wajib sama!)

  3. Setelah selesai, pergi kepada Configuration tab >> Edit.

  4. Tambah Key - "STAGE" dan Value - "dev" dalam Environment Variable.

  5. Kemudian, pada Code tab, ubah handler kepada app.main.lambda_handler.

  6. Selesai ubah, muat naik fail zip yang mempunyai kod dan semua pakej ke S3, dan pass URL object tersebut. (pastikan kod berada dalam fail - bererti dalam format modul. Dalam tutorial ini, kod berada dalam direktori /app)

  7. Tekan pautan yang diberikan Lambda.

  8. Pastikan untuk tambah /pet diakhir URL (disebabkn prefix dalam router).

  9. Anda akan lihat output dibawah pada skrin

     {
             "author": "Ammar Azman", 
             "status": "succeed!"
         }
    
  10. Tambah lagi /docs pada hujung URL untuk melihat API docs. Pautan tersebut akan gagal. Akan tetapi, ini telah dijangka disebabkan terdapat "dev" dalam environment.

Nota: Anda boleh automate proses (CI/CD) muat naik setiap kali mengemaskini kod baru dengan menggunakan Git Action.

API Gateway

Langkah-langkah

  1. Pada muka AWS Lambda, tekan Add trigger.

  2. Pilih API Gateway dan new api.

  3. Pilih REST API.

  4. Tekan Add.

  5. Pada search bar, cari servis API Gateway dan klik.

  6. Cari nama fungsi Lambda anda (my_cat_lambda) dan klik. Anda akan dibawa ke muka dimana terdapat API Gateway untuk fungsi Lambda anda.

  7. Pada Resource tab, klik Create Resource.

  8. Setkan Resource path kepada / dan Resource name kepada nama prefix dalam kod (pet). Klik tanda pada CORS juga. Kemudian klik Create resource.

  9. Langkah 8 akan diulang semula dengan Resource path kepada /pet dan Resource name kepada {proxy+}.

  10. Setelah selesai, cipta Method untuk /pet dan {proxy+} dengan method ANY.

  11. Kemudian, klik Deploy API dan pilih stage dev jika sudah dicipta pada Stage, atau jika belum, cipta satu Stage bernama dev.

  12. Klik Deploy API.

  13. Pergi semula kepada muka AWS Lambda anda, dan klik Configuration >> Trigger.

  14. Klik URL yang diberikan API Gateway dan boleh cuba request.

  15. Jika berjaya, tahniah, anda telah berjaya deploy API anda!

Konklusi

Langkah diatas mungkin akan obsolete pada masa akan datang. Namun penulis berharap tutorial ini dapat memudahkan anda yang merancang untuk deploy API anda menggunakan servis AWS.

Sebarang komen penambah-baikan amatlah dialukan. Jika tutorial ini membantu, kongsikan pada rakan-rakan anda. Sampai jumpa lagi.