Memulai PHP Serverless di AWS dengan Bref dan Serverless Framework

Ridwan Fajar
Serverless Indonesia
5 min readApr 25, 2020

Pendahuluan

Amazon Web Service sudah sejak sekitar 2016 telah menyediakan layanan bernama AWS Lambda. Dimana developer dapat menulis kode bisnis inti dalam berupa function lalu berinteraksi dengan berbagai event yang dihasilkan oleh layanan AWS lainnya.

Namun hingga saat ini, secara resmi AWS Lambda hanya mendukung bahasa pemrograman Node.js, Python, Go, Java, Ruby dan DotNET Core. Untuk bahasa pemrograman selain yang disebutkan sebelumnya, harus menggunakan Lambda Layers dimana developer dapat membuat custom runtime sendiri sesuai dengan bahasa pemrograman pilihannya.

Misal di artikel ini, kita akan mencoba mendeploy Lambda Function dalam bahasa pemrograman PHP. Namun kita tidak akan membuat custom runtime sendiri, melainkan menggunakan tools yang bernama Bref. Tools tersebut dibuat diatas Serverless Framework.

A. Persiapan

Ada beberapa perangkat yang harus dipersiapkan untuk mendeploy function PHP kita ke AWS Lambda. Diantaranya:

  • AWS Secret Key dan Access Key
  • AWS CLI
  • NPM
  • Serverless Framework
  • Composer

B. Membuat Proyek PHP Lambda Function dengan Bref

Untuk membuat proyek baru PHP Lambda Function dengan Bref. Dapat menggunakan perintah berikut:

vendor/bin/bref init
Pilih opsi 0 untuk memulai proyek baru membuat PHP Function
Beberapa file akan terbuat setelah memilih template

Setelah berhasil maka akan terbuat dua buah file yaitu index.php dan serverless.yml. Berikut adalah contoh source code dari file index.php yang telah diubah:

<?php declare(strict_types=1);require __DIR__ . '/vendor/autoload.php';return function ($event) {
print_r($event);
return 'Halo ' . ($event['name'] ?? ' dari Serverless Indonesia!');
};

Dapat Anda lihat bahwa function PHP diatas menerima sebuah parameter $event yang nantinya bisa berasal darimana saja. Misal dari API Gateway. Kemudian salah satu key dari $event tersebut akan dicetak sebagai response yaitu $event[‘name’]. Sedangkan $event sendiri dapat dicetak seluruhnya tapi akan disimpan di AWS Cloudwatch sebagai log message.

Sedangkan berikut adalah isi dari file serverless.yml:

service: myfuncprovider:
name: aws
region: us-east-1
runtime: provided
plugins:
- ./vendor/bref/bref
functions:
function:
handler: index.php
description: ''
layers:
- ${bref:layer.php-73}
# Exclude files from deployment
package:
exclude:
- 'tests/**'

Karena aplikasi serverless kita bernama myfunc , maka pada saat akan terbentuk sebaga Lambda Function, nama tersebut akan disertakan sebagai nama Lambda Function tersebut.

Kemudian provider yang digunakan saat ini adalah AWS dan mendeploy aplikasi tersebut di us-east-1 atau North Virgina, USA. Plugin yang digunakan adalah Bref sendiri. Kemudian karena kita ingin membuat functions, maka dibawah tag tersebut harus ada sejumlah function. Kali ini kita hanya akan membuat satu function saja.

File yang akan dibaca oleh Lambda Function sebagai entrypoint adalah index.php. Lalu Lambda Layers yang digunakan adalah ${bref:layer.php-73}. Ingat karena PHP belum resmi didukung oleh AWS, maka kita menggunakan custom runtime yang didukung oleh Lambda Layers.

C. Deployment

Cukup sederhana bukan? contoh proyek yang dihasilkan Bref memang cukup sederhana namun memberikan gambaran yang tepat bagaimana membuat aplikasi serverless berupa function di AWS Lambda menggunakan Bref.

Sekarang kita akan mencoba melakukan deployment dengan menggunakan Serverless Framework. Sebagaimana yang telah dijelaskan bahwa Bref dikembangkan dengan bantuan Serverless Framework. Untuk itu silahkan jalankan perintah berikut di dalam direktori proyek kita melalui console untuk mengurangi jumlah file yang tidak diperlukan ketika deployment:

$ composer install --prefer-dist --optimize-autoloader --no-dev

Berikut adalah contoh output dari perintah diatas bila berhasil dieksekusi:

Contoh output dari perintah Composer yang digunakan untuk memangkas ukuran deployment

Kemudian untuk deployment-nya sendiri, kita gunakan perintah berikut:

$ serverless deploy

Maka bila berhasil, akan muncul output seperti berikut ini:

Contoh output apabila perinta deploy Bref berhasil

Mari kita coba periksa di halaman Lambda melalui AWS Console. Bila deployment berhasil, function dengan nama myfunc-dev-function seharusnya muncul di halaman Lambda seperti pada gambar berikut:

myfunc-dev-function berhasil dideploy

Berikut adalah halaman detail dari myfunc-dev-function yang dapat Anda telusuri setelah berhasil di-deploy:

Halaman detail myfunc-dev-function di halaman Lambda

Sedangkan gambar berikut menunjukkan Lambda Code Editor yang menampilkan kode PHP yang ada di dalam index.php yang telah kita buat sebelumnya dengan Bref:

Kode PHP myfunc-dev-function di Lambda Code Editor

Lalu apalagi selanjutnya? mari kita coba Lambda Function tersebut di bagian berikutnya.

D. Pengujian PHP Function

Untuk menguji function dapat kita lakukan dari Lambda Code Editor maupun dari laptop / komputer kita dengan remote invocation. Seperti pada dua perintah berikut ini:

$ serverless invoke --function function --data '{"name":"ridwanbejo", "message":"Hello world"}'
$ serverless invoke --function function --data '{"message":"Hello world"}'

Perintah pertama melewatkan payload dengan dua buah key yaitu name dan message . Karena di kode PHP kita akan terjadi pengecekan apabila key name tidak disediakan, maka yang ditampilkan adalah Halo dari Serverless Indonesia . Sedangkan bila key name dilewatkan, maka outputnya adalah Halo ridwanbejo . Seperti pada gambar berikut ini:

Contoh pengujian PHP Function di AWS Lambda dengan remote invocation

Sekarang setelah function tersebut diuji dengan remote invocation, kita dapat melihat log group baru muncul di AWS Cloudwatch yang menyimpan log eksekusi dari myfunc-dev-function :

Log group baru muncul di AWS Cloudwatch untuk myfunc-dev-function

Tanggal yang sesuai dengan waktunya pengujian akan muncul di dalam log group tersebut:

Log eksekusi PHP Function dikelompokkan berdasarkan waktu eksekusi

Sedangkan berikut adalah detail setiap log eksekusi yang ditampilkan melalui AWS Cloudwatch:

Detail setiap log eksekusi yang dihasilkan oleh PHP Function dengan Bref dan Serverless Framework

Kesimpulan

Kini mengembangkan Lambda Function dengan PHP dapat dilakukan dengan menggunakan Bref dan Serverless Framework untuk deplyment ke AWS Lambda.

Semoga tulisan ini dapat bermanfaat untuk Anda dan memulai PHP Serverless bersama Bref dan Serverless Framework.

Thanks to Fajri Abdillah yang telah meminjamkan akun AWS-nya :D.

--

--