

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將 Laravel 應用程式部署至 Elastic Beanstalk
<a name="php-laravel-tutorial"></a>

Laravel 為 PHP 適用的開放原始碼、模型-檢視-控制器 (MVC) 架構。本教學課程會逐步引導您產生 Laravel 應用程式、將其部署至 AWS Elastic Beanstalk 環境，以及將其設定為連線至 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體。

**Topics**
+ [先決條件](#php-laravel-tutorial-prereqs)
+ [啟動 Elastic Beanstalk 環境](#php-laravel-tutorial-launch)
+ [安裝 Laravel 並產生網站](#php-laravel-tutorial-generate)
+ [部署您的應用程式](#php-laravel-tutorial-deploy)
+ [設定 Composer 設定值](#php-laravel-tutorial-configure)
+ [新增資料庫至您的環境](#php-laravel-tutorial-database)
+ [清除](#php-laravel-tutorial-cleanup)
+ [後續步驟](#php-laravel-tutorial-nextsteps)

## 先決條件
<a name="php-laravel-tutorial-prereqs"></a>

本教學假設您具備基本的 Elastic Beanstalk 操作及 Elastic Beanstalk 主控台知識。若您尚不了解，請依照 [了解如何開始使用 Elastic Beanstalk](GettingStarted.md) 中的說明來啟動您的第一個 Elastic Beanstalk 環境。

為了遵循本指南的程序，您需要命令列終端機或 shell 來執行命令。命令清單前會出現提示字元 ($) 及目前的目錄名稱 (如有)。

```
~/eb-project$ this is a command
this is output
```

在 Linux 和 macOS 上，您可以使用偏好的 Shell 和套件軟體管理工具。在 Windows [上，您可以安裝適用於 Linux 的 Windows 子系統](https://docs.microsoft.com/en-us/windows/wsl/install-win10)，以取得與 Windows 整合的 Ubuntu 和 Bash 版本。

Laravel 6 需要 PHP 7.2 或更新版本。它還需要在官方 Laravel 文件中[伺服器要求](https://laravel.com/docs/6.x/installation#server-requirements)主題中列出的 PHP 擴充功能。依照指示安裝 PHP 和 Composer。

對於 Laravel 支援和維護資訊，請參閱關於 Laravel 官方文件中的[支援政策](https://laravel.com/docs/master/releases#support-policy)主題。

## 啟動 Elastic Beanstalk 環境
<a name="php-laravel-tutorial-launch"></a>

使用 Elastic Beanstalk 主控台建立 Elastic Beanstalk 環境。選擇 **PHP (PHP)** 平台，並接受預設的設定和範本程式碼。

**啟動環境 (主控台)**

1. 使用此一預設連結來開啟 Elastic Beanstalk 主控台：[console.aws.amazon.com/elasticbeanstalk/home\#/newApplication?applicationName=tutorials&environmentType=LoadBalanced](https://console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced)

1. 在 **Platform (平台)**，選取符合您應用程式所使用語言的平台和平台分支。

1. 針對 **Application code (應用程式程式碼)**，選擇 **Sample application (範例應用程式)**。

1. 選擇 **Review and launch (檢閱和啟動)**。

1. 檢視可用選項。選擇您要使用的可用選項，當您準備就緒時，請選擇 **Creat app (建立應用程式)**。

使用大約需要五分鐘時間建立環境，並且建立下列資源：
+ **EC2 執行個體** ‒ Amazon Elastic Compute Cloud (Amazon EC2) 虛擬機器，已設為在您選擇的平台上執行 Web 應用程式。

  每個平台會執行特定的一套軟體、設定檔和指令碼，來支援特定的語言版本、架構、Web 容器或其組合。大多數的平台使用會 Apache 或 NGINX 做為反向代理，此反向代理會在您 Web 應用程式的前景執行、轉傳遞交給此 Web 應用程式的請求、提供靜態資產，並產生存取和錯誤日誌。
+ **執行個體安全群組** - Amazon EC2 安全群組，已設為允許從連接埠 80 傳入的流量。此資源可讓負載平衡器傳來的 HTTP 傳輸資料，到達執行您 Web 應用程式的 EC2 執行個體。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
+ **負載平衡器** - Elastic Load Balancing 負載平衡器，可設定將請求分配到執行您應用程式的執行個體。負載平衡器也讓您的執行個體不需直接連接到網際網路。
+ **負載平衡器安全群組** - Amazon EC2 安全群組，設為允許從連接埠 80 傳入的流量。此資源可讓來自網際網路的 HTTP 傳輸資料到達負載平衡器。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
+ **Auto Scaling 群組** - Auto Scaling 群組，設為在執行個體終止或無法使用時，取代該執行個體。
+ **Amazon S3 儲存貯體** - 儲存位置，用來儲存當您使用 Elastic Beanstalk 時所建立的原始程式碼、日誌和其他成品。
+ **Amazon CloudWatch 警示** - 兩種 CloudWatch 警示，用來監控您環境中執行個體上的負載，會在負載過高或過低時觸發。當警示觸發時，您的 Auto Scaling 群組會擴展或縮減以進行回應。
+ **CloudFormation 堆疊** – Elastic Beanstalk 使用 CloudFormation 啟動環境中的資源並傳播組態變更。資源定義於範本中，您可在 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation)中檢視此範本。
+ **網域名稱** – 會路由到您 Web 應用程式的網域名稱，其格式為 *{{subdomain}}.{{region}}.elasticbeanstalk.com*。
**網域安全**  
為了增強 Elastic Beanstalk 應用程式的安全性，我們會在[公共后缀列表 (PSL)](https://publicsuffix.org/) 中註冊網域 *elasticbeanstalk.com*。  
如果您需要在 Elastic Beanstalk 應用程式的預設網域名稱中設定敏感 Cookie，建議您使用字`__Host-`首為 的 Cookie 以提高安全性。此實務可保護您的網域免於跨網站請求偽造嘗試 (CSRF)。如需更多資訊，請參閱 Mozilla 開發人員網路中的[設定 Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 頁面。

這些資源全都由 Elastic Beanstalk 管理。當您終止環境時，Elastic Beanstalk 會終止其中的所有資源。

**注意**  
Elastic Beanstalk 建立的 Amazon S3 儲存貯體會在環境間共享，且不會在環境終止時刪除。如需詳細資訊，請參閱[將 Elastic Beanstalk 與 Amazon S3 搭配使用](AWSHowTo.S3.md)。

## 安裝 Laravel 並產生網站
<a name="php-laravel-tutorial-generate"></a>

Composer 可透過一個命令安裝 Laravel 並建立工作專案：

```
~$ composer create-project --prefer-dist laravel/laravel eb-laravel
```

Composer 會安裝 Laravel 及其依存項目，並產生預設專案。

若您安裝 Laravel 出現任何問題，請造訪官方文件的安裝主題：[https://laravel.com/docs/6.x](https://laravel.com/docs/6.x) 

## 部署您的應用程式
<a name="php-laravel-tutorial-deploy"></a>

建立[原始碼套件](applications-sourcebundle.md)，其中包含 Composer 所建立的檔案。以下命令建立一個名為 `laravel-default.zip` 的原始碼套件。它不含 `vendor` 資料夾中的檔案，其不僅佔用許多空間，在部署應用程式到 Elastic Beanstalk 時也派不上用場。

```
~/eb-laravel$ zip ../laravel-default.zip -r * .[^.]* -x "vendor/*"
```

將來源套件上傳至 Elastic Beanstalk，以將 Laravel 部署至您的環境。

**若要部署原始碼套件**

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在環境概觀頁面上，選擇 **Upload and deploy** (上傳和部署)。

1. 使用畫面顯示對話方塊來上傳原始碼套件。

1. 選擇 **Deploy** (部署)。

1. 部署完成後，您可選擇網站的 URL 以在新分頁中開啟您的網站。

**注意**  
若要進一步最佳化原始碼套件，可將 Git 儲存庫初始化，並使用 [`git archive` 命令](applications-sourcebundle.md#using-features.deployment.source.git)建立原始碼套件。預設的 Laravel 專案包含了 `.gitignore` 檔案，它告訴 Git 排除 `vendor` 資料夾和其他不需用於部署的檔案。

## 設定 Composer 設定值
<a name="php-laravel-tutorial-configure"></a>

完成部署時按一下 URL，即可在瀏覽器中開啟 Laravel 應用程式：

![403 禁止錯誤頁面，指出使用者沒有存取所請求資源的許可。](http://docs.aws.amazon.com/zh_tw/elasticbeanstalk/latest/dg/images/php-laravel-403.png)


這是什麼？ 根據預設，Elastic Beanstalk 會將專案根目錄做為網站的根路徑。然而，在此情況中，預設頁面 (`index.php`) 位於 `public` 資料夾的下一層。您可將 `/public` 新增至 URL，藉此加以驗證。例如 `http://{{laravel}}.{{us-east-2}}.elasticbeanstalk.com/public`。

若要在根路徑提供 Laravel 應用程式，請使用 Elastic Beanstalk 主控台來設定網站的*文件根*。

**設定網站的文件根目錄**

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在導覽窗格中，選擇**組態**。

1. 在**更新、監控和日誌記錄**組態類別中，選擇**編輯**。

1. 在 **Document Root (文件根目錄) 部分**，輸入 **/public**。

1. 若要儲存變更，請選擇頁面底部的**儲存變更**。

1. 更新完成時按一下 URL，即可在瀏覽器中重新開啟您的網站。

![Laravel 標誌與導覽功能表項目：文件、Laracasts、新聞、Forge、GitHub。](http://docs.aws.amazon.com/zh_tw/elasticbeanstalk/latest/dg/images/php-laravel-defaultnodb.png)


目前為止一切正常。接著，您要將資料庫新增至您的環境，並將 Laravel 設定為連接至該資料庫。

## 新增資料庫至您的環境
<a name="php-laravel-tutorial-database"></a>

在您的 Elastic Beanstalk 環境啟動 RDS 資料庫執行個體。您可在 Elastic Beanstalk 上使用 MySQL、SQLServer 或 PostgreSQL 資料庫來搭配 Laravel。在此範例中，我們使用 MySQL。

**將 RDS 資料庫執行個體新增至 Elastic Beanstalk 環境**

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在導覽窗格中，選擇 **Configuration (組態)**。

1. 在 **Database (資料庫)** 組態類別中，選擇 **Edit (編輯)**。

1. 針對 **Engine (引擎)** 部分，選擇 **mysql (mysql)**。

1. 輸入主要**使用者名稱**及**密碼**。Elastic Beanstalk 會使用環境屬性，將這些值提供給您的應用程式。

1. 若要儲存變更，請選擇頁面底部的**儲存變更**。

建立資料庫執行個體約需要 10 分鐘。如需有關耦合至 Elastic Beanstalk 環境之資料庫的詳細資訊，請參閱 [將資料庫新增至您的 Elastic Beanstalk 環境](using-features.managing.db.md)。

在此同時，您可更新原始碼以讀取環境的連線資訊。Elastic Beanstalk 使用環境變數 (如 `RDS_HOSTNAME`) 提供連線詳細資訊，您可自應用程式存取這些變數。

Laravel 的資料庫組態存放於專案程式碼內 `database.php` 資料夾名為 `config` 的檔案中。尋找 `mysql` 項目並修改 `host`、`database`、`username`、`and password` 變數以讀取與 Elastic Beanstalk 對應的值：

**Example \~/Eb-laravel/config/database.php**  

```
...
    'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
        ],

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('RDS_HOSTNAME', '127.0.0.1'),
            'port' => env('RDS_PORT', '3306'),
            'database' => env('RDS_DB_NAME', 'forge'),
            'username' => env('RDS_USERNAME', 'forge'),
            'password' => env('RDS_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
...
```

為了確認資料庫連線是否設定正確，請於 `index.php` 新增程式碼來連接至資料庫，並於預設回應新增一些程式碼：

**Example \~/Eb-laravel/public/index.php**  

```
...
if(DB::connection()->getDatabaseName())
{
   echo "Connected to database ".DB::connection()->getDatabaseName();
}
$response->send();
...
```

資料庫執行個體啟動完成時，請封裝更新後的應用程式，並將其部署至您的環境。

**更新您的 Elastic Beanstalk 環境**

1. 建立新的原始碼套件：

   ```
   ~/eb-laravel$ zip ../laravel-v2-rds.zip -r * .[^.]* -x "vendor/*"
   ```

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 選擇 **Upload and Deploy** (上傳並部署)。

1. 選擇 **Browse (瀏覽)**，然後上傳 `laravel-v2-rds.zip`。

1. 選擇**部署**。

部署應用程式的新版本不會超過一分鐘。部署完成時，請重新整理網頁，確認資料庫連線成功：

![Laravel 應用程式首頁顯示與 ebdb 的資料庫連線成功。](http://docs.aws.amazon.com/zh_tw/elasticbeanstalk/latest/dg/images/php-laravel-defaultwdb.png)


## 清除
<a name="php-laravel-tutorial-cleanup"></a>

完成使用示範程式碼後，您可以終止您的環境。Elastic Beanstalk 會刪除所有相關 AWS 資源，例如 [Amazon EC2 執行個體](using-features.managing.ec2.md)、[資料庫執行個體](using-features.managing.db.md)、[負載平衡器](using-features.managing.elb.md)、安全群組和[警示](using-features.alarms.md#using-features.alarms.title)。

移除資源不會刪除 Elastic Beanstalk 應用程式，因此您可以隨時為您的應用程式建立新環境。

**從主控台終止您的 Elastic Beanstalk 環境**

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 選擇 **Actions** (動作)，然後選擇 **Terminate Environment** (終止環境)。

1. 使用畫面顯示對話方塊來確認環境終止。

此外，您可終止於 Elastic Beanstalk 環境外建立的資料庫資源。終止 Amazon RDS 資料庫執行個體時，您可擷取快照，稍後再將資料還原至另一個執行個體。

**終止 RDS 資料庫執行個體**

1. 開啟 [Amazon RDS 主控台](https://console.aws.amazon.com/rds)。

1. 選擇 **Databases** (資料庫)。

1. 選擇資料庫執行個體。

1. 選擇**動作**，然後選擇**刪除**。

1. 選擇是否建立快照，然後選擇 **Delete (刪除)**。

## 後續步驟
<a name="php-laravel-tutorial-nextsteps"></a>

有關 Laravel 的詳細資訊，請訪問 Laravel 官方網站，[laravel.com](https://laravel.com/)。

隨著您繼續開發應用程式，您可能會希望無須手動建立 .zip 檔案並將其上傳至 Elastic Beanstalk 主控台，即可管理環境和部署應用程式。[Elastic Beanstalk 命令列界面](eb-cli3.md) (EB CLI) 提供了簡單易用的命令，讓您可從命令列界面建立、設定和部署應用程式至 Elastic Beanstalk 環境。

在本教學中，您使用 Elastic Beanstalk 主控台來設定 Composer 選項。為了讓此組態成為應用程式原始碼的一部分，您的，您可以使用組態檔，如下所示。

**Example .ebextensions/composer.config**  

```
option_settings:
  aws:elasticbeanstalk:container:php:phpini:
    document_root: /public
```

如需詳細資訊，請參閱 [使用組態檔案 (`.ebextensions`) 來進行進階的環境自訂](ebextensions.md)。

在 Elastic Beanstalk 環境中執行 Amazon RDS 資料庫執行個體對於開發和測試非常實用，但會將資料庫的生命週期連結至您的環境。如需連接至在環境外執行的資料庫的說明，請參閱 [將 Amazon RDS 資料庫執行個體新增至您的 PHP Elastic Beanstalk 環境](create_deploy_PHP.rds.md)。

最後，若您打算於生產環境中使用您的應用程式，建議您[設定您環境的自訂網域名稱](customdomains.md)，並[啟用 HTTPS](configuring-https.md) 安全連線。