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

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.

Tham khảo