Memulai PHP Serverless di AWS dengan Bref dan Serverless Framework
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
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: providedplugins:
- ./vendor/bref/breffunctions:
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:
Kemudian untuk deployment-nya sendiri, kita gunakan perintah berikut:
$ serverless deploy
Maka bila berhasil, akan muncul output seperti berikut ini:
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:
Berikut adalah halaman detail dari myfunc-dev-function
yang dapat Anda telusuri setelah berhasil di-deploy:
Sedangkan gambar berikut menunjukkan Lambda Code Editor yang menampilkan kode PHP yang ada di dalam index.php yang telah kita buat sebelumnya dengan Bref:
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:
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
:
Tanggal yang sesuai dengan waktunya pengujian akan muncul di dalam log group tersebut:
Sedangkan berikut adalah detail setiap log eksekusi yang ditampilkan melalui AWS Cloudwatch:
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.