如何快速地將 Laravel 專案部署至 AWS Lambda

sharkHead 程式技術 6個月前 • 0

小弟這次在因緣際會之下,報名了 AWS 官方開設的講座

「PHP 開發者工作坊 - 深入淺出 AWS 無伺服器 LAMP 架構」

講者是在 AWS 任職的 Pahud

Pahud.png

整個課程給人感覺非常專業與 Nice 的 Pahud 大,在講座前還有特別錄製影片介紹 AWS LAMP

沒有錯,講師其實是一位 Youtuber

聽完講座後,對 Serverless 有了更深的一層認識,為了避免忘記
決定寫一篇文章重新 run 一遍上課時將 Laravel 專案部署至 Lambda 的流程

一般的 LAMP,相信每個 PHPer 都朗朗上口,指的是 Linux、Apache、MySQL(MariaDB) 與 PHP
算是很經典的組合

而 AWS 的 LAMP,指的是以下這些

  • Lambda
  • API Gateway HTTP API
  • MySQL 的更強版本,他們自家的 Aurora
  • PHP
AWS-Lambda.png
AWS 版本的 LAMP 架構

AWS 是第一個提供 Serverless 服務的雲供應商
Serverless(無伺服器計算)又被稱為功能即服務(Function-as-a-Service,縮寫為 FaaS),有以下特點

  • 與一般 Web Server 不同,沒有 Nginx 或是 Apache
  • 運行程式碼的所需要的其他服務,都由雲端平台提供
  • 最小單位是 function,只會執行請求需要的程式碼

Serverless 的意思,並不是說 No Server
而是讓開發者只需要專注在程式碼有沒有辦法執行就好
其他的如伺服器環境建置,後續的營運管理,通通都是交給雲服務商
聽起來根本就超讚 der

本次小弟參與的講座「PHP 開發者工作坊 - 深入淺出 AWS 無伺服器 LAMP 架構」
講師 Pahud 大示範了如何使用他寫的Library,搭配 AWS CLI 與 CDK 還有 Bref
快速地將 Laravel 專案部署至 Lambda

步驟如下

  1. AWS 的帳號,設置 IAM,取得 access_key_id 與 secret_access_key
  2. 安裝 AWS CLI(AWS 命令列界面),設定 default profile
  3. 安裝 AWS CDK(AWS 雲端開發套件),安裝
  4. 創建一個 Laravel 專案
  5. 使用 CDK 搭配講師寫的 Library,將 Laravel 部署至 Lambda

 

設置 IAM,取得 key


既然要上 AWS 的 Lambda,當然要先辦一個 AWS 的帳號,申辦過程這裡不多贅述
有了 AWS 帳號之後,我們要先新建一個 IAM 使用者,並取得存取金鑰 ID 私密存取金鑰

IAM 是什麼?可以參照官網的說法

AWS Identity and Access Management (IAM) 可讓您安全地管理對 AWS 服務與資源的存取。您可以使用 IAM 建立和管理 AWS 使用者和群組,並使用各種許可來允許和拒絕他們存取 AWS 資源。

首先先到 IAM 的頁面

image.png
在服務搜尋打上 iam,第一個搜尋結果就是我們要找的服務

來到 IAM 的服務頁面後,開始來新增一個 IAM 使用者

%E6%88%AA%E5%9C%96%202020-08-23%20%E4%B8%8B%E5%8D%888_38_59.png
先點選左方的「使用者」,然後「新增使用者」

輸入 IAM 使用者的名稱後,下方存取類型記得勾選「程式設計方式存取」

%E6%88%AA%E5%9C%96%202020-08-23%20%E4%B8%8B%E5%8D%888_50_43.png
存取類型記得點選「程式設計方式存取」

再來設定 IAM 使用者的權限
這裡直接套用 AWS 提供的現有政策,這裡選擇最高權限「AdministratorAccess」

%E6%88%AA%E5%9C%96%202020-08-23%20%E4%B8%8B%E5%8D%8811_17_47.png
直接給最高權限,當然實際情況還是依照服務給權限

接下來的步驟都可以不用設置,直接瘋狂下一步,並拿到存取金鑰 ID私密存取金鑰
金鑰記得寫下來,待會會用到

%E6%88%AA%E5%9C%96%202020-08-23%20%E4%B8%8B%E5%8D%889_05_03%281%29.png
記得寫下存取金鑰 ID 與私密存取金鑰

 

安裝 AWS CLI,設定 default profile


什麼是 AWS 的 CLI,一樣有請官網的說法

AWS Command Line Interface (AWS CLI) 是開放原始碼工具,可讓您在命令列 shell 中使用命令來與 AWS 服務互動

安裝方式我們簡單帶過

MacOS:安裝 homebrew,然後一句即可搞定

brew install awscli

Windows OS:可以去官方網站下載檔案來安裝。或是安裝 chocolatey,然後一句即可搞定

choco install awscli

接下來要來設定 default profile,輸入

aws configure --profile default

填入剛剛設定好的存取金鑰 ID 的私密存取金鑰,地區請填申請金鑰時的地區
可參考官方網站的地區表

AWS Access Key ID : 存取金鑰 ID 
AWS Secret Access Key : 私密存取金鑰
Default region name : ap-northeast-2
Default output format :

設定好之後,可以輸入指令確認,沒有出現錯誤代表設定成功

aws sts get-caller-identity

 

安裝 AWS CDK


需先安裝 npm(node package manager),npm 是 Node.js 的軟體套件管理工具
裝好 npm 之後,接下來安裝 AWS CDK,什麼是 AWS CDK?再度有請官網說法

AWS 雲端開發套件 (AWS CDK) 是開放原始碼軟體開發架構,使用現代程式設計語言將雲端基礎設施定義為程式碼,並透過 AWS CloudFormation 進行部署。

老樣子,一句指令搞定

npm install -g aws-cdk

 

將 Laravel 上架至 Lambda


此步驟需要新建 Laravel 專案
在此之前我們要先安裝 PHP 與 Composer,Composer 是 PHP 的套件管理工具

首先新建一個 lamp 資料夾,然後在 lamp 資料夾內,新建一個名為 codebase 的 laravel 專案

composer create-project laravel/laravel codebase --prefer-dist "7.*"

然後在 codebase 的 laravel 專案資料夾內,安裝 bref 的相關套件

composer require bref/bref bref/laravel-bridge

回到 lamp 資料夾內,新建一個 cdk 資料夾,然後在 cdk 資料夾內,輸入下面的指令,使用 typescript 初始化 CDK 的專案

cdk init -l typescript

然後下一句,使用 yarn 安裝講師寫的套件

yarn add cdk-serverless-lamp

這時候就會發現 cdk 資料夾底下多了很多檔案,打開 lib/cdk-stack.ts 這個檔案,並更新裡面的內容如下

import * as cdk from '@aws-cdk/core';
import * as path from 'path';
import { ServerlessLaravel } from 'cdk-serverless-lamp';

export class CdkStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new ServerlessLaravel(this, 'ServerlessLaravel', {
      brefLayerVersion:
        'arn:aws:lambda:ap-northeast-2:209497400698:layer:php-74-fpm:11',
      laravelPath: path.join(__dirname, '../../codebase'),
    });
  }
}

注意這邊 brefLayerVersion 設定的值,可以去 bref runtime 根據 AWS 地區選擇取得你想要設定的值

%E6%88%AA%E5%9C%96%202020-08-23%20%E4%B8%8B%E5%8D%8810_20_23.png
PHP 8 這時候剛出,我們選擇 PHP 7 就好

至於什麼是 bref 呢?從官方網站的說明可以得知

bref 是一個開源的 Composer 套件,用途在將 PHP 的應用部署至 AWS Lambda

一切就緒之後,在一行指令就可以將 Laravel 專案部署至 Lambda 了

cdk deploy

跑完之後,CDK 會產生一組網址,訪問之後,就會看到熟悉的 Laravel 大字了

部署時如果出現以下錯誤,代表 CDK 找不到地區設定
…This stack uses assets, so the toolkit stack must be deployed to the environment…

這時可以輸入 cdk bootstrap,重新設定地區

 

參考資料
Introducing the new Serverless LAMP stack
Introducing the CDK construct library for the serverless LAMP stack
天天都在說,無伺服器計算到底是什麼?
aws-samples/cdk-serverless-lamp
Bref - Everything you need to easily deploy and run serverless PHP applications


sharkHead

PHP 與 Python 菜雞工程師
最近在努力學習 TypeScript,希望可以突破慧根的限制