

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

# 使用 Elastic Beanstalk Python 平台
<a name="create-deploy-python-container"></a>

本主題說明如何在 Elastic Beanstalk 上設定、建置和執行 Python 應用程式。

AWS Elastic Beanstalk 支援多種不同版本的 Python 程式設計語言平台分支。如需完整清單，請參閱 *AWS Elastic Beanstalk 平台文件中的* [Python](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)。

Python Web 應用程式可以使用 WSGI 在代理伺服器後方執行。Elastic Beanstalk 提供 [Gunicorn](https://gunicorn.org/) 作為預設 WSGI 伺服器。

您可以新增 `Procfile` 到原始碼套件中，為您的應用程式指定和設定 WSGI 伺服器。如需詳細資訊，請參閱[在 Elastic Beanstalk 上使用 Procfile 設定 WSGI 伺服器](python-configuration-procfile.md)。

您可以使用由 Pipenv 建立的 `Pipfile` 和 `Pipfile.lock` 檔案來指定 Python 套件相依性和其他要求。如需有關指定相依性的詳細資訊，請參閱[使用 Elastic Beanstalk 上的需求檔案指定相依性](python-configuration-requirements.md)。

Elastic Beanstalk 提供[組態選項](command-options.md)，您可用其於 Elastic Beanstalk 環境中自訂 EC2 執行個體上執行的軟體。您可以設定應用程式所需的環境變數，啟用至 Amazon S3 的日誌輪換，並在應用程式來源中，將包含靜態檔案的資料夾映射到代理伺服器提供的路徑。

Elastic Beanstalk 主控台中提供了[修改正在執行環境組態](environment-configuration-methods-after.md)的組態選項。要避免在終止環境的組態時遺失組態，您可以使用[已儲存組態](environment-configuration-savedconfig.md)來儲存您的設定，並在之後套用至另一個環境。

若要將設定儲存於原始程式碼，您可以包含[組態檔案](ebextensions.md)。每次您建立環境或部署應用程式，組態檔案裡的設定就會套用。您也可以使用組態檔案來安裝套件、執行指令碼，並在部署期間執行其他執行個體自訂操作。

在 Elastic Beanstalk 主控台中套用的設定會覆寫組態檔案中相同的設定 (如存在)。這可讓您在組態檔案中擁有預設設定，並以主控台的環境專屬設定覆寫之。如需優先順序以及其他變更設定方法的詳細資訊，請參閱[組態選項](command-options.md)。

若要透過 `pip` 提供 Python 套件，您可以在應用程式原始碼的根目錄納入要求檔案。Elastic Beanstalk 會於部署期間安裝要求檔案指定的任何套件。如需詳細資訊，請參閱[使用 Elastic Beanstalk 上的需求檔案指定相依性](python-configuration-requirements.md)。

如需各種擴充 Elastic Beanstalk Linux 類型平台方式的詳細資訊，請參閱 [擴充 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。

## 設定您的 Python 環境
<a name="create-deploy-python-container-console"></a>

Python 平台設定可讓您微調 Amazon EC2 執行個體的行為。您可以使用 Elastic Beanstalk 主控台編輯 Elastic Beanstalk 環境的 Amazon EC2 執行個體組態。

使用 Elastic Beanstalk 主控台來設定 Python 程序設定、啟用 AWS X-Ray、啟用 Amazon S3 的日誌輪換，以及設定應用程式可以從環境讀取的變數。

**在 Elastic Beanstalk 主控台中設定 Python 環境**

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

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

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

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

### Python 設定
<a name="python-console-settings"></a>
+ **代理伺服器** – 要在您的環境執行個體上使用的代理伺服器。預設使用 nginx。
+ **WSGI Path (WSGI 路徑)** – 主要應用程式檔案的名稱或路徑，例如 `application.py` 或 `django/wsgi.py`。
+ **NumProcesses (NumProcesses)** – 每個應用程式執行個體上執行的程序數目。
+ **NumThreads (NumThreads)** – 每個程序中執行的執行緒數目。

### AWS X-Ray 設定
<a name="python-console-xray"></a>
+ **X-Ray 協助程式** – AWS X-Ray 執行協助程式以處理來自 的追蹤資料[適用於 Python 的 AWS X-Ray SDK](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-python.html)。

### 日誌選項
<a name="create-deploy-python-container.console.logoptions"></a>

Log Options (日誌選項) 區段有兩個設定：
+ **Instance profile (執行個體描述檔)** – 指定執行個體描述檔，此描述檔具備存取和您應用程式相關聯 Amazon S3 儲存貯體的許可。
+ **Enable log file rotation to Amazon S3** (啟用 Amazon S3 的日誌檔案輪換) – 指定是否將應用程式 Amazon EC2 執行個體的日誌檔案複製到與應用程式關聯的 Amazon S3 儲存貯體。

### 靜態檔案
<a name="python-platform-staticfiles"></a>

為改善效能，您可以使用 **Static files** (靜態檔案) 區段來設定代理伺服器，以為來自 Web 應用程式一組目錄中的靜態檔案 (例如 HTML 或影像) 提供服務。對於每個目錄，您可以設定目錄映射的虛擬路徑。代理伺服器收到位於指定路徑下的檔案請求時，會直接提供檔案而非將請求路由至您的應用程式。

如需使用組態檔案或 Elastic Beanstalk 主控台設定靜態檔案的詳細資訊，請參閱[提供靜態檔案](environment-cfg-staticfiles.md)。

根據預設，Python 環境中的代理伺服器會從 `static` 路徑上名為 `/static` 的資料夾中提供任何檔案。例如，若您的應用程式原始碼在名為 `logo.png` 的資料夾中有一個名為 `static` 的檔案，則代理伺服器會以 `subdomain.elasticbeanstalk.com/static/logo.png` 將此檔案提供給使用者。您可以如本節所述來設定其他對應。

### 環境屬性
<a name="create-deploy-python-custom-container-envprop"></a>

您可以使用環境屬性，為您的應用程式提供資訊，並設定環境變數。例如，您可以建立名為 `CONNECTION_STRING` 的環境屬性，藉此指定連線字串，供您的應用程式使用以連接至資料庫。

在執行於 Elastic Beanstalk 的 Python 環境內，可透過 Python 的 `os.environ` 字典取得這些數值。如需詳細資訊，請參閱 [http://docs.python.org/library/os.html](http://docs.python.org/library/os.html)。

您可以使用類似下列的程式碼，存取金鑰和參數：

```
import os
endpoint = os.environ['API_ENDPOINT']
```

環境屬性亦可為架構提供資訊。例如，您可以建立一個名為 `DJANGO_SETTINGS_MODULE` 的屬性，將 Django 設定為使用特定設定模組。依據環境而異，此值可能是 `development.settings`、`production.settings` 等。

如需詳細資訊，請參閱[環境變數和其他軟體設定](environments-cfg-softwaresettings.md)。

## Python 組態命名空間
<a name="python-namespaces"></a>

您可以使用[組態檔案](ebextensions.md)來設定組態選項，並在部署期間執行其他的執行個體設定工作。組態選項可以是[平台特定](command-options-specific.md)選項，也可以套用至 Elastic Beanstalk 服務整體中的所有[平台](command-options-general.md)。組態選項會組織成*命名空間*。

Python 平台於 `aws:elasticbeanstalk:environment:proxy`、`aws:elasticbeanstalk:environment:proxy:staticfiles` 和 `aws:elasticbeanstalk:container:python` 命名空間定義的選項。

下列範例組態檔案指定組態選項設定，以建立名為 `DJANGO_SETTINGS_MODULE` 的環境屬性、選擇 Apache 代理伺服器、將名為 `statichtml` 的目錄對應至路徑 `/html` 的兩個靜態檔案選項，以及將名為 `staticimages` 的目錄對應至路徑 `/images`，以及指定 `[aws:elasticbeanstalk:container:python](command-options-specific.md#command-options-python)` 命名空間的其他設定。此命名空間內含的選項，可讓您指定原始碼內 WSGI 指令碼的位置，以及以 WSGI 執行所需的執行緒數量和程序。

```
option_settings:
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: production.settings
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: apache
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /html: statichtml
    /images: staticimages
  aws:elasticbeanstalk:container:python:
    WSGIPath: ebdjango.wsgi:application
    NumProcesses: 3
    NumThreads: 20
```

**備註**  
如果您使用的是 Amazon Linux AMI Python 平台版本 (Amazon Linux 2 之前的版本)，請將 `WSGIPath` 的數值替換為 `ebdjango/wsgi.py`。此範例中的數值適用於 Gunicorn WSGI 伺服器，Amazon Linux AMI 平台版本不支援此伺服器。
此外，這些較舊的平台版本會使用不同的命名空間來設定靜態檔案 — `aws:elasticbeanstalk:container:python:staticfiles`。它具有與標準靜態文件命名空間相同的選項名稱和語義。

組態檔案亦支援多個金鑰，可進一步[修改您環境執行個體上的軟體](customize-containers-ec2.md)。本範例使用[套件](customize-containers-ec2.md#linux-packages)金鑰來安裝具備 `yum` 的 Memcached，同時透過[容器指令](customize-containers-ec2.md#linux-container-commands)於部署期間執行可設定伺服器的命令：

```
packages:
  yum:
    libmemcached-devel: '0.31'

container_commands:
  collectstatic:
    command: "django-admin.py collectstatic --noinput"
  01syncdb:
    command: "django-admin.py syncdb --noinput"
    leader_only: true
  02migrate:
    command: "django-admin.py migrate"
    leader_only: true
  03wsgipass:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
  99customize:
    command: "scripts/customize.sh"
```

Elastic Beanstalk 可提供許多組態選項讓您自訂環境。除了組態檔案，您也可以使用主控台、已儲存組態、EB CLI 或 AWS CLI來設定組態選項。如需詳細資訊，請參閱[組態選項](command-options.md)。

## `python3` 可執行檔
<a name="python3-executable"></a>

Elastic Beanstalk Python 環境中 EC2 `python3` 執行個體上可用的可執行檔版本，不一定會對應至平台所使用的相同 Python 版本。例如，在 Python 3.12 AL2023 平台上， `/usr/bin/python3` 指向 Python 3.9。這是因為 Python 3.9 是 AL2023 上的*系統 Python*。如需詳細資訊，請參閱《Amazon Linux [AL2023 使用者指南》中的 AL2023 中的 Python](https://docs.aws.amazon.com/linux/al2023/ug/python.html)。 **您可以存取與平台在版本控制位置 （例如 `/usr/bin/python3.12`) 或應用程式虛擬環境`bin`目錄 （例如 ) 中使用的 Python 版本對應的可執行檔`/var/app/venv/staging-LQM1lest/bin/python3`。平台使用與平台分支對應的正確 Python 可執行檔。

# 在 Elastic Beanstalk 上使用 Procfile 設定 WSGI 伺服器
<a name="python-configuration-procfile"></a>

您可以新增 [`Procfile`](platforms-linux-extend.build-proc.md#platforms-linux-extend.proc) 到原始碼套件中，為您的應用程式指定和設定 WSGI 伺服器。您可以在 中指定自訂啟動和執行命令`Procfile`。

當您使用 `Procfile` 時，它會覆寫您使用組態檔設定的 `aws:elasticbeanstalk:container:python` 命名空間選項。

下列範例使用 `Procfile` 將 uWSGI 指定為伺服器並進行設定。

**Example Procfile**  

```
web: uwsgi --http :8000 --wsgi-file application.py --master --processes 4 --threads 2
```

下列範例使用 `Procfile` 來設定 Gunicorn (預設 WSGI 伺服器)。

**Example Procfile**  

```
web: gunicorn --bind :8000 --workers 3 --threads 2 project.wsgi:application
```

**備註**  
如果您設定 Gunicorn 以外的任何 WSGI 伺服器，請務必也將其指定為應用程式的相依性，以便將它安裝在您的環境執行個體上。如需有關相依性規格的詳細資訊，請參閱 [使用 Elastic Beanstalk 上的需求檔案指定相依性](python-configuration-requirements.md)。
WSGI 伺服器的預設連接埠是 8000。如果您在 `Procfile` 命令中指定不同的連接埠號碼，請將 `PORT` [環境屬性](environments-cfg-softwaresettings.md)設定為此連接埠號碼。

# 使用 Elastic Beanstalk 上的需求檔案指定相依性
<a name="python-configuration-requirements"></a>

本主題說明如何設定應用程式以安裝其所需的其他 Python 套件。Python 應用程式通常與其他第三方 Python 套件具有相依性。使用 Elastic Beanstalk Python 平台，您可以透過多種方式指定應用程式依賴的 Python 套件。

## 使用 `pip` 和 `requirements.txt`
<a name="python-configuration-requirements.txt"></a>

安裝 Python 套件的標準工具是 `pip`。它有一項功能可讓您於單一要求檔案內，指定所需的所有套件 (及其版本)。如需有關要求檔案的詳細資訊，請參閱 pip 文件網站上的[要求檔案格式](https://pip.pypa.io/en/latest/reference/requirements-file-format/#requirements-file-format)。

建立名為 `requirements.txt` 的檔案並將其置於原始碼套件的最上層目錄。以下是 Django 的範例 `requirements.txt` 檔案。

```
Django==2.2
mysqlclient==2.0.3
```

在您的開發環境中，您可以使用 `pip freeze` 命令來產生您的要求檔案。

```
~/my-app$ pip freeze > requirements.txt
```

為了確保您的要求檔案僅包含您應用程式實際使用的套件，請使用[虛擬環境](python-development-environment.md#python-common-setup-venv)來安裝這些套件。在虛擬環境外，`pip freeze` 輸出將包含安裝於開發機器的所有 `pip` 套件，包括您的作業系統隨附的套件。

**注意**  
在 Amazon Linux AMI Python 平台版本上，Elastic Beanstalk 本身不支援 Pipenv 或 Pipenv。如果您使用 Pipenv 管理應用程式相依性，請執行下列命令來產生 `requirements.txt` 檔案。  

```
~/my-app$ pipenv lock -r > requirements.txt
```
若要進一步了解，請參閱 Pipenv 文件中的[產生 requirements.txt](https://pipenv.readthedocs.io/en/latest/advanced/#generating-a-requirements-txt)。

## 使用 Pipenv 和 `Pipfile`
<a name="python-configuration-requirements.pipenv"></a>

Pipenv 是一個現代化的 Python 套件工具。它將套件安裝與建立和管理相依性檔案以及應用程式的 virtualenv 結合在一起。如需詳細資訊，請參閱 [Pipenv：適用於人類的 Python 開發工作流程](https://pipenv.readthedocs.io/en/latest/)。

Pipenv 會維護兩個檔案：
+ `Pipfile` — 此檔案包含各種類型的相依性和要求。
+ `Pipfile.lock` — 此檔案包含可啟用決定性組建的版本快照。

您可在開發環境中建立此類檔案，並將它們包含在您部署到 Elastic Beanstalk 之原始碼套件的最上層目錄中。如需有關這兩個檔案的詳細資訊，請參閱[範例 Pipfile 和 Pipfile.lock](https://pipenv.pypa.io/en/latest/basics/#)。



下列範例使用 Pipenv 安裝 Django 和 Django REST 框架。這些命令會建立檔案 `Pipfile` 和 `Pipfile.lock`。

```
~/my-app$ pipenv install django
~/my-app$ pipenv install djangorestframework
```

 

## 優先順序
<a name="python-configuration-requirements.precedence"></a>

如果您包含本主題中描述的多個要求檔案，Elastic Beanstalk 只會使用其中一個。下列清單以遞減順序顯示優先順序。

1. `requirements.txt`

1. `Pipfile.lock`

1. `Pipfile`

**注意**  
從 2023 年 3 月 7 日 Amazon Linux 2 平台版本開始，如果您提供一個以上的此類檔案，Elastic Beanstalk 將發出主控台訊息，說明部署期間所使用的相依性檔案。

下列步驟說明了 Elastic Beanstalk 在部署執行個體時安裝相依性所遵循的邏輯。
+ 如果有 `requirements.txt` 檔案，我們將使用命令 `pip install -r requirements.txt`。
+ 從 2023 年 3 月 7 日 Amazon Linux 2 平台版本開始，如果沒有 `requirements.txt` 檔案，但有 `Pipfile.lock` 檔案，我們將使用命令 `pipenv sync`。在該版本之前，我們使用的是 `pipenv install --ignore-pipfile`。
+ 如果既沒有 `requirements.txt` 檔案，也沒有 `Pipfile.lock` 檔案，但有 `Pipfile` 檔案，我們將使用命令 `pipenv install --skip-lock`。
+ 如果找不到這三個要求檔案，我們不會安裝任何應用程式相依性。