Serverless PHP: Membuat API Terbilang dengan Lambda

4 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Serverless PHP: Membuat API Terbilang dengan Lambda
Serverless PHP: Membuat API Terbilang (Logo Hak Cipta Masing-masing)

TeknoCerdas.com – Salam cerdas untuk kita semua. Melanjutkan tutorial sebelumnya tentang Serverless PHP. Pada tulisan ini TeknoCerdas akan membahas Serverless PHP: Membuat API terbilang dengan AWS Lambda. PHP Runtime Bref masih akan digunakan pada tutorial ini.

API yang dibuat adalah sebuah API yang akan mengembalikan teks terbilang dari suatu angka. API dapat diakses melalui protokol HTTP dengan metode GET. Pada API ini TeknoCerdas akan menggunakan pustaka Terbilang karya dari Rio Astamal.

Berikut contoh format pemanggilan API dan respon dari API yang dibuat.

curl -H "Content-Type: application/json" API_URL?angka=1521
{
  "angka": 1521,
  "terbilang": "Seribu lima ratus dua puluh satu"
}

Dalam membangun serverless API ini kita akan menggunakan layanan dari AWS yaitu Lambda dan API Gateway. AWS Lambda tidak menyediakan runtime khusus untuk PHP. Untuk itu akan digunakan Lambda Layer dari Bref PHP.

Daftar Isi

Persiapan Membuat API Terbilang

Sebelum mulai membuat API Terbilang menggunakan AWS Lambda terdapat beberapa prasyarat yang harus anda penuhi.

  • Memiliki akun AWS yang aktif
  • Memiliki pemahaman dasar tentang AWS Lambda
  • Memiliki pemahaman dasar tentang AWS IAM
  • Memiliki pemahaman dasar tentang HTTP dan JSON
  • Memiliki pemahaman dasar tentang Terraform
  • Memiliki pemahaman dasar tentang PHP dan Composer
  • Memiliki pemahaman dasar tentang Shell Script

Jika anda tidak memiliki prasyarat diatas silahkan lanjutkan membaca. Karena mungkin banyak informasi baru yang diperoleh meskipun tanpa mencoba langsung tutorial ini.

Struktur File dan Direktori API Terbilang

API Terbilang terdiri dari beberapa komponen seperti file Shell Script, PHP dan Terraform. Struktur file dan direktori API Terbilang terlihat seperti dibawah ini.

+ build/
  - function.zip
+ src/
  - App.php
  - event.json
+ terraform/
  - infra-demo.tf
+ vendor/
  + composer/
  + rioastamal/
- bootstrap
- build.sh
- composer.json
- composer.lock
- index.php
- README.md

Direktori build/ berisi file yang sudah dikompres menjadi file ZIP yang akan diupload ke AWS Lambda. Isi dari direktori ini dihasilkan dari menjalankan file build.sh.

Direktori src/ berisi fungsi-fungsi PHP yang akan dijalankan oleh AWS Lambda. Terdapat file event.json yang merupakan simulasi dari data yang akan dikirimkan API Gateway ke AWS Lambda ketika sebuah API request dijalankan.

Direktori terraform/ berisi file HashiCorp Configuration Language (HCL) yang akan dijalankan oleh Terraform untuk membuat infrastruktur AWS Lambda yang diperlukan.

Direktori vendor/ berisi file dan direktori yang dihasilkan ketika menjalankan composer install. Pustaka Terbilang ada pada direktori vendor ini.

File bootstrap adalah sebuah Bash script yang akan dipanggil oleh AWS Lambda ketika sebuah request datang. File ini berisi infinite loop yang akan memanggil index.php.

File build.sh adalah sebuah Bash script digunakan untuk memaket file-file yang diperlukan oleh AWS Lambda ke dalam direktori build/. File-file tersebut akan otomatis dikompress kedalam file bernama function.zip.

File index.php adalah file yang akan dijalankan oleh bootstrap secara terus-menerus agar siap menerima request. File ini akan memanggil handler yang ada pada App.php. Selain itu file ini juga bisa dijalankan lewat Command Line Interface (CLI).

Download Kode Sumber Tutorial menggunakan Git

Sebelum mendownload kode sumber persiapkan dulu direktori yang akan digunakan. Asumsi bahwa direktori yang digunakan untuk tutorial ini adalah serverless-php-terbilang dan memiliki permission write ke direktori tersebut.

Lakukan clone repository dari tutorial ini dari GitHub.

$ git clone git@github.com/rioastamal-examples/serverless-php-terbilang
$ cd serverless-php-terbilang

Instalasi Ketergantungan Paket Lewat Composer

Instal semua paket yang diperlukan oleh project ini menggunakan Composer.

$ composer install -vvv

Perintah diatas akan menginstal pustaka Terbilang ke dalam direktori vendor/rioastamal/terbilang.

Setelah semua ketergantungan terinstal, coba jalankan fungsi yang dibuat lewat terminal.

$ php index.php
{
    "angka": "1521",
    "terbilang": "seribu lima ratus dua puluh satu"
}

Perintah diatas akan mensimulasikan sebuah pemanggilan fungsi Lambda yang dipanggil dari API Gateway. Data simulasi yang dikirimkan ada pada file src/event.json.

Memaket API untuk Distribusi ke AWS Lambda

Setelah ketergantungan diinstal maka file-file yang diperlukan akan dikompresi menjadi sebuah file zip dan diletakkan pada build/function.zip. Karena ukuran distribusi file ini hanya beberapa kilo bytes, maka tidak perlu menggunakan AWS S3 sebagai media penyimpanan. S3 diperlukan ketika ukuran distribusi cukup besar yaitu lebih dari 10MB.

Untuk mulai memaket file gunakan perintah berikut.

$ bash build.sh

Setelah selesai harusnya terdapat sebuah file build/function.zip. Untuk melakukan cek terhadap isinya dapat digunakan perintah berikut.

$ unzip -l build/function.zip
Archive:  build/function.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      278  07-06-2020 12:00   index.php
      243  07-03-2020 20:50   bootstrap
        0  07-06-2020 12:04   src/
     2494  07-06-2020 14:37   src/App.php
     3233  07-06-2020 14:33   src/event.json
        0  07-06-2020 11:29   vendor/
      178  07-06-2020 11:43   vendor/autoload.php
        0  07-06-2020 11:43   vendor/composer/
      149  07-06-2020 11:43   vendor/composer/autoload_namespaces.php
     1070  07-06-2020 11:43   vendor/composer/LICENSE
    13420  07-06-2020 11:43   vendor/composer/ClassLoader.php
      271  07-06-2020 11:43   vendor/composer/autoload_psr4.php
      147  07-06-2020 11:43   vendor/composer/autoload_classmap.php
     1159  07-06-2020 11:43   vendor/composer/autoload_static.php
     2414  07-06-2020 11:43   vendor/composer/autoload_real.php
     1359  07-06-2020 11:29   vendor/composer/installed.json
      213  07-06-2020 11:43   vendor/composer/autoload_files.php
        0  07-06-2020 11:29   vendor/rioastamal/
        0  07-06-2020 11:29   vendor/rioastamal/terbilang/
    52152  06-04-2018 03:52   vendor/rioastamal/terbilang/composer.lock
        0  06-04-2018 03:52   vendor/rioastamal/terbilang/tests/
    12878  06-04-2018 03:52   vendor/rioastamal/terbilang/tests/TerbilangTest.php
     7242  06-04-2018 03:52   vendor/rioastamal/terbilang/README.md
        7  06-04-2018 03:52   vendor/rioastamal/terbilang/.gitignore
      435  06-04-2018 03:52   vendor/rioastamal/terbilang/phpunit.xml.dist
      721  06-04-2018 03:52   vendor/rioastamal/terbilang/.travis.yml
      794  06-04-2018 03:52   vendor/rioastamal/terbilang/composer.json
        0  06-04-2018 03:52   vendor/rioastamal/terbilang/src/
    10318  06-04-2018 03:52   vendor/rioastamal/terbilang/src/Terbilang.php
---------                     -------
   111175                     29 files

Membuat Infrastruktur Lambda Menggunakan Terraform

Berikutnya adalah melakukan deployment Lambda menggunakan Terraform. Semua keperluan seperti permission, pembuatan fungsi Lambda, upload kode sampai integrasi dengan API Gateway akan dilakukan oleh Terraform.

Definisi AWS Lambda untuk fungsi API Terbilang seperti terlihat pada potongan kode berikut.

resource "aws_lambda_function" "php_terbilang" {
  function_name = "PHPTerbilangAPI"
  handler       = "index.handler"
  role          = aws_iam_role.lambda_exec.arn
  memory_size   = 512
  runtime       = "provided"
  tags          = var.default_tags
  timeout       = 5
  layers        = [var.bref_layer_arn]

  filename = "${path.module}/../build/function.zip"
  source_code_hash = filebase64sha256("${path.module}/../build/function.zip")
}

Disitu terlihat digunakan AWS Lambda dengan memory 512MB. Jika ingin mengganti misal 128, 256, 1024 dan sebagainya dapat mengacu pada memory_size.

Pastikan sudah menjalankan perintah bash build.sh terlebih dulu untuk memaket distribusi sebelum mulai menjalankan Terraform.

Semua script yang berhubungan dengan terraform ada pada direktori terraform/. Masuk ke direktori tersebut untuk mulai menggunakan.

$ cd terraform

Lakukan inisialisasi terlebih dahulu sebelum Terraform dapat digunakan.

$ terraform init

Lihat apa saja yang akan dideploy menggunakan perintah plan.

$ terraform plan

Jika semua dirasa sesuai maka lakukan deployment dengan apply.

$ terraform apply
...
Outputs:

api = {
  "end_point" = "GET https://3rj954v9wd.execute-api.us-east-1.amazonaws.com/terbilang"
}

Jika semua sukses maka akan muncul output berupa end_point dari URL API terbilang.

Uji Coba API Terbilang

Untuk melakukan test kita cukup menggunakan utilitas CLI HTTP client seperti curl atau POSTman jika lebih suka menggunakan GUI. Kita cukup melakukan request ke endpoint dari API Gateway yang telah dibuat sebelumnya.

Argumen berupa angka yang diterjemahkan disuplai lewat query string angka.

$ curl -H "Content-Type: application/json" \
https://3rj954v9wd.execute-api.us-east-1.amazonaws.com/terbilang?angka=7200
{"angka":"7200","terbilang":"tujuh ribu dua ratus"}

Jika ingin JSON yang dihasilkan dalam format yang mudah dibaca tidak hanya dalam satu baris maka tambahkan argumen pretty pada query string.

$ curl -H "Content-Type: application/json" \
https://3rj954v9wd.execute-api.us-east-1.amazonaws.com/terbilang?angka=7200&pretty
{
    "angka": "7200",
    "terbilang": "tujuh ribu dua ratus"
}

Pustaka Terbilang juga mendukung penggunaan pemisah ribuan dengan tanda koma secara default. Sedangkan untuk pemisah bilangan pecahan digunakan tanda titik.

$ curl -H "Content-Type: application/json" \
https://3rj954v9wd.execute-api.us-east-1.amazonaws.com/terbilang?angka=1,000,000,200.89&pretty
{
    "angka": "1,000,000,200.89",
    "terbilang": "satu milyar dua ratus koma delapan sembilan"
}

Lakukan otomasi untuk melakukan 200 hit melalui looping sederhana pada Shell.

for i in {1..200}
do
  echo "Request -> ${i}..."
  curl -s -H "Content-Type: application/json" "https://3rj954v9wd.execute-api.us-east-1.amazonaws.com/terbilang?angka=$RANDOM&pretty"
  echo
done

Hasil pengujian TeknoCerdas pada lebih dari 200+ request ke API terbilang dengan ukuran memory 512MB adalah sebagai berikut.

RAMMin. Duration (ms)Avg. Duration (ms)Max. Duration (ms)
512 MB0.863.7848.92

Kode Sumber

Kode sumber untuk tutorial ini dapat anda lihat pada tautan github berikut:

https://github.com/rioastamal-examples/serverless-php-terbilang

Repository tersebut berisi file-file yang disebutkan dalam tulisan ini seperti PHP, Bash dan Terraform.