# Implementasi REST API dengan FastAPI, Lambda dan 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](https://fastapi.tiangolo.com/tutorial/#install-fastapi) dan [Mangum](https://mangum.io/).
    
2. Tulis kod menggunakan pakej FastAPI. Dibawah penulis sertakan contoh kod asas yang akan digunakan.
    

```python
# 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 di*wrap* menjadi *lambda function*, yang juga akan dipanggil semasa konfigurasi AWS Lambda.
    
* Jalankan *command* dibawah dan uji API anda -
    

```bash
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`.
    
    ![](https://lh7-us.googleusercontent.com/m5u14rijIG5Dr-lqcVRN4JZNSDnU2hB635F_dffgCGSej3liFpWbQVkSXIt46R64siw-hYBsi_3SE8DhwQ0FdJfAuzDYS9XCtrsGr2PkIkHCiT4QdgKc1pPGuV2Ls_hLxrT43a6sO6yvy0FV2qEEMPw align="left")
    
2. Pilih *runtime* versi Python yang merujuk kepada versi Python yang anda gunakan. (wajib sama!)
    
3. Setelah selesai, pergi kepada **Configuration tab** &gt;&gt; **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
    
    ```json
    {
    		"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**.
    
    ![](https://lh7-us.googleusercontent.com/hYk8ovrImOJvROJzf4_gJ6widabz3WlYoLiZhDFcX1j78UzhM8PqLC5m_PBpYE4baOOtZPhE-1CNnaFvQAeTy6sX7gitK6-aUKCxb3Rm19y5xzLPBD3QZWdaPZ_BBVm2UXfxOqdB7HFdDLGsy7qewYE align="left")
    
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** &gt;&gt; **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.
