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
- Struktur File dan Direktori API Terbilang
- Download Kode Sumber Tutorial menggunakan Git
- Instalasi Ketergantungan Paket Lewat Composer
- Memaket API untuk Distribusi ke AWS Lambda
- Membuat Infrastruktur Lambda Menggunakan Terraform
- Uji Coba API Terbilang
- Kode Sumber
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.
RAM | Min. Duration (ms) | Avg. Duration (ms) | Max. Duration (ms) |
512 MB | 0.86 | 3.78 | 48.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.