

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

# 在 Amazon MWAA 上變更 DAG 的時區
<a name="samples-plugins-timezone"></a>

Apache Airflow 預設會以 UTC\$10 排程您的導向無環圖 (DAG)。下列步驟說明如何變更 Amazon MWAA 使用 [Pendulum](https://pypi.org/project/pendulum/) 執行 DAGs時區。或者，本主題示範如何建立自訂外掛程式，以變更您環境 Apache Airflow 日誌的時區。

**Topics**
+ [版本](#samples-plugins-timezone-version)
+ [先決條件](#samples-plugins-timezone-prerequisites)
+ [許可](#samples-plugins-timezone-permissions)
+ [建立外掛程式以變更 Airflow 日誌中的時區](#samples-plugins-timezone-custom-plugin)
+ [建立 `plugins.zip`](#samples-plugins-timezone-plugins-zip)
+ [範例程式碼](#samples-plugins-timezone-dag)
+ [後續步驟？](#samples-plugins-timezone-plugins-next-up)

## 版本
<a name="samples-plugins-timezone-version"></a>

您可以使用此頁面上的程式碼範例搭配 Python 3.10 中的 **Apache Airflow v2** 和 Python 3.11 中的 **Apache Airflow v**3。 [https://peps.python.org/pep-0619/](https://peps.python.org/pep-0619/) [https://peps.python.org/pep-0664/](https://peps.python.org/pep-0664/)

## 先決條件
<a name="samples-plugins-timezone-prerequisites"></a>

若要使用此頁面上的範例程式碼，您需要下列項目：
+ [Amazon MWAA 環境](get-started.md)。

## 許可
<a name="samples-plugins-timezone-permissions"></a>

使用此頁面上的程式碼範例不需要額外的許可。

## 建立外掛程式以變更 Airflow 日誌中的時區
<a name="samples-plugins-timezone-custom-plugin"></a>

Apache Airflow 會在啟動時在 `plugins`目錄中執行 Python 檔案。使用下列外掛程式，您可以覆寫執行器的時區，以修改 Apache Airflow 寫入日誌的時區。

1. `plugins` 為您的自訂外掛程式建立名為 的目錄，然後導覽至 目錄。例如：

   ```
   $ mkdir plugins
   $ cd plugins
   ```

1. 複製下列程式碼範例的內容，並在本機儲存為 `dag-timezone-plugin.py` 資料夾中的 `plugins`。

   ```
   import time
   import os
   
   os.environ['TZ'] = 'America/Los_Angeles'
   time.tzset()
   ```

1. 在 `plugins`目錄中，建立名為 的空白 Python 檔案`__init__.py`。您的`plugins`目錄應該類似於以下內容：

   ```
   plugins/
    |-- __init__.py
    |-- dag-timezone-plugin.py
   ```

## 建立 `plugins.zip`
<a name="samples-plugins-timezone-plugins-zip"></a>

下列步驟說明如何建立 `plugins.zip`。此範例的內容可以與其他外掛程式和二進位檔合併為單一`plugins.zip`檔案。

1. 在您的命令提示字元中，導覽至上一個步驟的 `plugins` 目錄。例如：

   ```
   cd plugins
   ```

1. 壓縮`plugins`目錄中的內容。

   ```
   zip -r ../plugins.zip ./
   ```

1. `plugins.zip` 上傳至您的 S3 儲存貯體

   ```
   aws s3 cp plugins.zip s3://your-mwaa-bucket/
   ```

## 範例程式碼
<a name="samples-plugins-timezone-dag"></a>

若要變更 DAG 執行的預設時區 (UTC\$10)，我們將使用名為 [Pendulum](https://pypi.org/project/pendulum/) 的程式庫，Python 程式庫可用來使用時區感知日期時間。

1. 在命令提示中，導覽至存放 DAGs目錄。例如：

   ```
   cd dags
   ```

1. 複製下列範例的內容並儲存為 `tz-aware-dag.py`。

   ```
   from airflow import DAG
   from airflow.operators.bash_operator import BashOperator
   from datetime import datetime, timedelta
   # Import the Pendulum library.
   import pendulum
   
   # Instantiate Pendulum and set your timezone.
   local_tz = pendulum.timezone("America/Los_Angeles")
   
   with DAG(
       dag_id = "tz_test",
       schedule_interval="0 12 * * *",
       catchup=False,
       start_date=datetime(2022, 1, 1, tzinfo=local_tz)
   ) as dag:
       bash_operator_task = BashOperator(
           task_id="tz_aware_task",
           dag=dag,
           bash_command="date"
       )
   ```

1.  執行下列 AWS CLI 命令，將 DAG 複製到您環境的儲存貯體，然後使用 Apache Airflow UI 觸發 DAG。

   ```
   aws s3 cp your-dag.py s3://your-environment-bucket/dags/
   ```

1. 如果成功，您將輸出類似 `tz_test` DAG 中 的任務日誌`tz_aware_task`中的以下內容：

   ```
   [2022-08-01, 12:00:00 PDT] {{subprocess.py:74}} INFO - Running command: ['bash', '-c', 'date']
   [2022-08-01, 12:00:00 PDT] {{subprocess.py:85}} INFO - Output:
   [2022-08-01, 12:00:00 PDT] {{subprocess.py:89}} INFO - Mon Aug  1 12:00:00 PDT 2022
   [2022-08-01, 12:00:00 PDT] {{subprocess.py:93}} INFO - Command exited with return code 0
   [2022-08-01, 12:00:00 PDT] {{taskinstance.py:1280}} INFO - Marking task as SUCCESS. dag_id=tz_test, task_id=tz_aware_task, execution_date=20220801T190033, start_date=20220801T190035, end_date=20220801T190035
   [2022-08-01, 12:00:00 PDT] {{local_task_job.py:154}} INFO - Task exited with return code 0
   [2022-08-01, 12:00:00 PDT] {{local_task_job.py:264}} INFO - 0 downstream tasks scheduled from follow-on schedule check
   ```

## 後續步驟？
<a name="samples-plugins-timezone-plugins-next-up"></a>
+ 進一步了解如何在此範例中將`plugins.zip`檔案上傳至 中的 Amazon S3 儲存貯體[安裝自訂外掛程式](configuring-dag-import-plugins.md)。