Trong bài viết này, tôi sẽ giải thích các bước để triển khai ứng dụng để validate email MX record bằng PHP đơn giản trên AWS Lambda Function thông qua việc sử dụng Bref layers. Tính đến thời điểm hiện tại, AWS Lambda hỗ trợ Java, Go, PowerShell, Node. js, C#, Python và Ruby, tuy nhiên vẫn chưa hỗ trợ PHP. Ngoài ra AWS Lamdba vẫn hỗ trợ Custom runtime
nên bạn hoàn toàn có thể triển khai lite weight PHP function để cải thiện hiệu suất ứng dụng và sẽ giảm chi phí so với phiên bản EC2.
Giới thiệu về Bref
Bref (có nghĩa là "ngắn gọn" trong tiếng Pháp) là một open source Composer package, nó giúp bạn triển khai các ứng dụng PHP lên AWS và chạy chúng trên AWS Lambda.
Bref cung cấp:
- documentation
- PHP runtimes cho AWS Lambda
- deployment tooling
- PHP frameworks integration
Bref sử dụng Serverless framework để định cấu hình và triển khai các ứng dụng serverless.
Bref kết hợp với AWS Lambda có thể được sử dụng để chạy nhiều loại ứng dụng PHP, ví dụ:
- APIs
- websites
- workers
- batch processes/scripts
- event-driven microservices
Bref hỗ trợ bất kỳ PHP framework nào. Nó đặc biệt tích hợp chuyên sâu với Laravel và Symfony.
Prerequisites
- AWS Account
- Composer (có thể sử dụng docker https://hub.docker.com/r/composer/composer)
- PHP
- VS Code IDE
Tạo thư mục làm việc
Tạo một thư mục có tên là phpLambdaFunction
(bạn có thể sử dụng tên khác) và duy chuyển đến thư mục này.
$ mkdir phpLambdaFunction
$ cd phpLambdaFunction
composer.json
Hãy đảm bảo rằng bạn đã cài đặt sẵn composer (hoặc docker). Tiếp theo, chúng ta sẽ tiến hành cài đặt bref.
{
"name": "lambda/php-lambda-function",
"description": "PHP lambda function",
"require": {
"bref/bref": "^2.0"
}
}
Cài đặt package sử dụng 1 trong 2 command sau:
- Sử dụng docker:
$ docker run --rm --interactive --tty \
--volume $PWD:/app \
composer/composer install
- Sử dụng composer:
$ composer install
Bạn sẽ thấy kết quả như sau trên terminal:
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 10 installs, 0 updates, 0 removals
- Locking bref/bref (2.1.10)
- Locking crwlr/query-string (v1.0.3)
- Locking hollodotme/fast-cgi-client (v3.1.7)
- Locking nyholm/psr7 (1.8.1)
- Locking psr/container (2.0.2)
- Locking psr/http-factory (1.0.2)
- Locking psr/http-message (2.0)
- Locking psr/http-server-handler (1.0.2)
- Locking riverline/multipart-parser (2.1.1)
- Locking symfony/process (v7.0.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 10 installs, 0 updates, 0 removals
- Downloading symfony/process (v7.0.0)
- Downloading riverline/multipart-parser (2.1.1)
- Downloading psr/http-message (2.0)
- Downloading psr/http-server-handler (1.0.2)
- Downloading psr/container (2.0.2)
- Downloading psr/http-factory (1.0.2)
- Downloading nyholm/psr7 (1.8.1)
- Downloading hollodotme/fast-cgi-client (v3.1.7)
- Downloading crwlr/query-string (v1.0.3)
- Downloading bref/bref (2.1.10)
- Installing symfony/process (v7.0.0): Extracting archive
- Installing riverline/multipart-parser (2.1.1): Extracting archive
- Installing psr/http-message (2.0): Extracting archive
- Installing psr/http-server-handler (1.0.2): Extracting archive
- Installing psr/container (2.0.2): Extracting archive
- Installing psr/http-factory (1.0.2): Extracting archive
- Installing nyholm/psr7 (1.8.1): Extracting archive
- Installing hollodotme/fast-cgi-client (v3.1.7): Extracting archive
- Installing crwlr/query-string (v1.0.3): Extracting archive
- Installing bref/bref (2.1.10): Extracting archive
Generating autoload files
3 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
validateEmail.php
Dưới đây là function có nhiệm vụ validate email MX domain records .
<?php
function validateEmail($email)
{
// Step 1: Check the email address format
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
// Step 2: Extract the domain from the email address
$domain = substr(strrchr($email, "@"), 1);
// Step 3: Check the MX records of the domain
$mxRecords = [];
if (getmxrr($domain, $mxRecords) === false) {
return false;
}
return true;
}
Output
validateEmail('test.test@gmail.com'); // TRUE
validateEmail('test.test'); // FALSE
index.php
Khởi tạo file index.php, include validateEmail.php và autoload.php. Hàm bên dưới sẽ có vai trò đón nhận các event, đọc và xử lý dữ liệu từ các post request và trả về dữ liệu kết quả với định dạng json.
<?php
require __DIR__ . '/vendor/autoload.php';
require 'validateEmail.php';
return function ($event) {
// Receive post body data from the request object
$postData = json_decode($event['body'], true);
// Default values for negative status
$response = [
'status' => false,
];
$statusCode = 500;
// Getting the email value from the post data
// Calling validateEmail method to validate mx email
if ($postData && isset($postData['email']) && validateEmail($postData['email'])) {
$response['status'] = true;
$statusCode = 200;
}
return [
'statusCode' => $statusCode,
'headers' => [
'Content-Type' => 'application/json',
],
'body' => json_encode($response),
];
};
Cấu trúc của thư mục làm việc hiện tại sẽ như thế này:
Các bước setup Lambda Function
Bước 1: Tạo Lambda Function
Khởi tạo 1 function và chọn runtime như sau
Bước 2: Advance Settings
Recommended khi setting cho việc Enable function URL
là chọn option AWS_IAM
đối với Auth type
.
Tuy nhiên, để thuận tiện cho việc testing thì bạn có thể chọn option NONE
và nhấn Create function
. Chúng ta có thể thay đổi sau.
Bước 3: Function Overview
Sau khi tạo, chúng ta sẽ có function và funcion url như bên dưới. Tiếp theo chúng ta sẽ thực hiện tạo layer.
Bước 4: Layers
Việc tạo layer sẽ giúp thêm những thành phần hỗ trợ cho AWS Lambda Function.
Bước 5: Tạo Layer
Ở bước này, bạn cần phải cung cấp ARN (Amazon Resource Name). Chọn option Specify an ARN
.
Bước 6: Chọn Bref Runtimes
Truy cập https://runtimes.bref.sh/ và lựa chọn phiên bản PHP layer phù hợp với bạn.
Bước 7: Update Layer ARN
Nhập vào layer mà bạn đã chọn ở bước 6 và nhấn add
để hoàn tất việc thêm layer.
Bước 8: Layer Update
Bây giờ bạn sẽ thấy số layer là 1
Bước 9: Nén Source Code thành file .zip
Vào đường dẫn thư mục làm việc có tên là phpLambdaFunction
đã tạo của bạn và thực hiện lệnh sau để thực hiện zip source code.
[ phpLambdaFunction]$ zip -r9q index.zip .
Bạn sẽ thấy file zip ở đây.
Bước 10: Upload file index.zip
Ở mục Code
, bạn nhấn Upload from
và chọn .zip file
để upload file zip của source code.
Upload file index.zip đã tạo và nhấn Save
để hoàn tất.
Bước 11: PHP Source Code
Nếu bạn làm đúng như những bước trên, bạn sẽ có thể thấy source code PHP đã tạo cho việc validate email được upload thành công.
Bước 12: Runtime Setting
Bạn kéo xuống dưới tìm mục Runtime settings và thay đổi Handler mặc định hello.handler
thành index.php
.
Ok, giờ function của bạn đã sẵn sàn để sử dụng cho việc test.
Bước 13: Testing
Chúng ta sẽ test sử dụng Function URL. Việc testing có thể thực hiện bằng cách sử dụng Postman hoặc Thunder Client.
- True
- False
Sau khi thực hiện việc test thì chúng ta nên xóa function đã tạo để đảm bảo an toàn.
Lời kết
Thông qua bài viết này, bạn có thể thấy việc triển khai một ứng dụng PHP với AWS Lambda bằng cách sử dụng Bref cũng khá đơn giản và nhanh chóng. Hy vọng bài viết hữu ích với các bạn.