Serverless PHP: Hosting Normal PHP Website 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.)
Hosting Normal PHP Website dengan Lambda
Hosting Normal PHP Website dengan Lambda

TeknoCerdas.com – Salam cerdas untuk kita semua. Masih melanjutkan  tutorial tentang Serverless PHP. Kali ini TeknoCerdas membahas bagaimana melakukan hosting normal PHP website dengan Lambda.

Apakah bisa? Jawaban singkatnya, Ya tentu bisa. Kondisi eksekusi dari file PHP sama seperti ketika melakukan hosting normal dengan Nginx dan PHP-FPM. Hanya saja disini yang bertindak sebagai web server adalah API Gateway.

Jika belum mengikuti tutorial Serverless PHP yang sudah ditulis sebelumnya ikuti tautan berikut.

Website yang dibuat adalah sebuah website sederhana yang memiliki dua halaman yaitu halaman utama dengan URL / dan halaman kedua dengan URL /info. Halaman pertama adalah HTML yang berisi tanggal dan waktu yang digenerate server. Sedangkan halaman kedua adalah output dari fungsi phpinfo().

Dalam membangun serverless API ini kita akan menggunakan layanan dari AWS yaitu Lambda dan API Gateway. Untuk Lambda layer kita akan gunakan Bref PHP Runtime dengan yang berisi PHP-FPM.

Daftar Isi

Persiapan Membuat Website dengan PHP dan Lambda

Sebelum mulai membuat Website dengan menggunakan PHP dan 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 Website

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

+ build/
  - function.zip
+ public/
  - index.php
+ src/
  - index.php
  - info.php
+ terraform/
  - infra-demo.tf
+ vendor/
  + composer/
  + ... [banyak direktori dan file]
- bootstrap
- build.sh
- composer.json
- composer.lock
- 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 public/ berisi sebuah file index.php. File ini berfungsi sebagai router sederhana yang akan memanggil file dalam direktori src/.

Direktori src/ berisi file yang akan ditampilkan kepada pengguna ketika mengakses URL tertentu. Misal jika membuka URL /info maka router akan otomatis memanggil file src/info.php.

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. Library Bref yang berfungsi untuk menjalankan PHP-FPM dan melakukan komunikasi dengan FPM ada pada direktori ini.

File bootstrap adalah sebuah file PHP yang akan dipanggil oleh AWS Lambda ketika sebuah request datang. File ini berisi infinite loop yang akan terus melakukan cek terhadap request yang datang dan memprosesnya ke PHP-FPM.

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.

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-hosting dan memiliki permission write ke direktori tersebut.

Lakukan clone repository dari tutorial ini dari GitHub.

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

Instalasi Ketergantungan Paket Lewat Composer

Instal semua paket yang diperlukan oleh project ini menggunakan Composer.

$ composer install -vvv

Perintah diatas akan menginstal pustaka Bref PHP dan komponen yang dibutuhkan ke dalam direktori vendor/.

Setelah semua ketergantungan terinstal, coba jalankan PHP built-in web server untuk mencoba website yang dibuat.

$ php -S 0.0.0.0:8080 -t public/ public/index.php

Coba buka web browser lalu arahkan ke alamat localhost:8080/ dan localhost:8080/info. Harusnya kedua URL tersebut menampilkan masing-masing tanggal server dan PHP info.

Memaket Website 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 kurang dari 1MB, 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
---------  ---------- -----   ----
      900  07-11-2020 22:11   bootstrap
        0  07-11-2020 23:12   src/
      181  07-11-2020 23:12   src/index.php
       17  07-11-2020 22:44   src/phpinfo.php
        0  07-11-2020 21:31   vendor/
        0  07-11-2020 21:30   vendor/async-aws/
        0  07-11-2020 21:30   vendor/async-aws/core/
     1099  05-21-2020 23:57   vendor/async-aws/core/LICENSE
     5753  05-21-2020 23:57   vendor/async-aws/core/CHANGELOG.md
      529  05-21-2020 23:57   vendor/async-aws/core/README.md
      126  05-21-2020 23:57   vendor/async-aws/core/.gitattributes
     1036  05-21-2020 23:57   vendor/async-aws/core/composer.json
...[CUT]...

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 website PHP yang dibuat terlihat pada potongan kode berikut.

resource "aws_lambda_function" "php_normal_web" {
  function_name = "PHPNormalWeb"
  handler       = "public/index.php"
  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")
}

Diatas 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:

urls = {
  "main" = "https://22ye14vzsk.execute-api.us-east-1.amazonaws.com/"
  "phpinfo" = "https://22ye14vzsk.execute-api.us-east-1.amazonaws.com/info"
}

Jika tidak ada kesalahan maka akan muncul output berupa dua alamat URL dari website yang dibuat.

Uji Coba Website

Untuk melakukan test kita cukup menggunakan utilitas CLI HTTP client seperti curl atau web browser. Kita cukup melakukan request ke endpoint dari URL yang didapatkan sebelumnya.

Berikut hasil tangkapan layar ketika mencoba membuka URL utama /.

Hosting PHP Website di AWS Lambda
Uji coba URL utama pada website

Berikut hasil tangkapan layar ketika mencoba membuka URL /info. Halaman ini menampilkan informasi seputar PHP pada server.

Hosting PHP Website di AWS Lambda
Uji coba URL info pada website

Hasil pengujian TeknoCerdas pada lebih dari 200+ request ke masing-masing halaman dengan ukuran memory 512MB adalah sebagai berikut.

RAMMin. Duration (ms)Avg. Duration (ms)Max. Duration (ms)
512 MB1.052.2537.95

Dari hasil pengujian diatas TeknoCerdas berkesimpulan bahwa hasilnya cukup memuaskan. Durasi rerata atau waktu eksekusi Lambda (tidak termasuk API Gateway) rendah yaitu 2.25ms. Dengan demikian dapat disimpulkan menjalankan normal PHP website pada Lambda adalah hal yang sangat bisa dilakukan dan membebaskan developer dari mengurusi infrastruktur.

Catatan Hosting PHP Website dengan Lambda

Tidak semua PHP Website dapat dihosting di Lambda tanpa modifikasi. Terutama website-website lama yang tidak memiliki HTTP router.

Ketika melakukan hosting normal PHP website dengan AWS maka ada beberapa hal yang harus diperhatikan.

  • Website tersebut harus memiliki file routing. Hampir semua framework memilikinya. Hal ini karena runtime Bref PHP belum mendukung penggunaan wildcard file handler. Sehingga hanya satu file yang bertindak sebagai handler.
  • Semua static assets seperti CSS, Javascript dan sebaiknya harus diletakkan pada CDN. Karena melakukan hosting static assets pada Lambda akan memakan biaya.
  • Website lama yang tidak memiliki file routing harus dimodifikasi guna dapat dihost pada Lambda karena limitasi yang disebutkan pada poin pertama.

Kode Sumber

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

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

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