

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

# 使用 Oracle 建立自訂外掛程式
<a name="samples-oracle"></a>

下列範例會逐步解說使用 Oracle for Amazon MWAA 建立自訂外掛程式的步驟，並可與您的 plugins.zip 檔案中的其他自訂外掛程式和二進位檔結合使用。

**Contents**
+ [版本](#samples-oracle-version)
+ [先決條件](#samples-oracle-prereqs)
+ [權限](#samples-oracle-permissions)
+ [要求](#samples-oracle-dependencies)
+ [範例程式碼](#samples-oracle-code)
+ [建立自訂外掛程式](#samples-oracle-create-pluginszip-steps)
  + [下載相依性](#samples-oracle-install)
  + [自訂外掛程式](#samples-oracle-plugins-code)
  + [Plugins.zip](#samples-oracle-pluginszip)
+ [Airflow 組態選項](#samples-oracle-airflow-config)
+ [後續步驟？](#samples-oracle-next-up)

## 版本
<a name="samples-oracle-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-oracle-prereqs"></a>

若要使用此頁面上的範例程式碼，您需要下列項目：
+ [Amazon MWAA 環境](get-started.md)。
+ 在任何日誌層級`CRITICAL`或環境的上一節中啟用工作者記錄。如需 Amazon MWAA 日誌類型以及如何管理日誌群組的詳細資訊，請參閱 [在 Amazon CloudWatch 中存取 Airflow 日誌](monitoring-airflow.md)

## 權限
<a name="samples-oracle-permissions"></a>

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

## 要求
<a name="samples-oracle-dependencies"></a>

若要使用此頁面上的範例程式碼，請將下列相依性新增至您的 `requirements.txt`。若要進一步了解，請參閱 [安裝 Python 相依性](working-dags-dependencies.md)。

```
-c https://raw.githubusercontent.com/apache/airflow/constraints-2.0.2/constraints-3.7.txt
cx_Oracle
apache-airflow-providers-oracle
```

## 範例程式碼
<a name="samples-oracle-code"></a>

下列步驟說明如何建立 DAG 程式碼來測試自訂外掛程式。

1. 在命令提示中，導覽至存放 DAG 程式碼的目錄。例如：

   ```
   cd dags
   ```

1. 複製下列程式碼範例的內容，並在本機儲存為 `oracle.py`。

   ```
   from airflow import DAG
   from airflow.operators.python_operator import PythonOperator
   from airflow.utils.dates import days_ago
   import os
   import cx_Oracle
   
   DAG_ID = os.path.basename(__file__).replace(".py", "")
   
   def testHook(**kwargs):
       cx_Oracle.init_oracle_client()
       version = cx_Oracle.clientversion()
       print("cx_Oracle.clientversion",version)
       return version
   
   with DAG(dag_id=DAG_ID, schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag:
       hook_test = PythonOperator(
           task_id="hook_test",
           python_callable=testHook,
           provide_context=True 
       )
   ```

## 建立自訂外掛程式
<a name="samples-oracle-create-pluginszip-steps"></a>

本節說明如何下載相依性、建立自訂外掛程式和 plugins.zip。

### 下載相依性
<a name="samples-oracle-install"></a>

Amazon MWAA 會在每個 Amazon MWAA 排程器和工作者容器`/usr/local/airflow/plugins`上，將 plugins.zip 的內容擷取至 。這是用來將二進位檔新增至您的環境。下列步驟說明如何組合自訂外掛程式所需的檔案。

**提取 Amazon Linux 容器映像**

1. 在您的命令提示字元中，提取 Amazon Linux 容器映像，並在本機執行容器。例如：

   ```
   docker pull amazonlinux
   						docker run -it amazonlinux:latest /bin/bash
   ```

   您的命令提示可以叫用 bash 命令列。例如：

   ```
   bash-4.2#
   ```

1. 安裝 Linux 原生非同步 I/O 設施 (libaio)。

   ```
   yum -y install libaio
   ```

1. 保持此視窗開啟以進行後續步驟。我們將在本機複製下列檔案：`lib64/libaio.so.1`、`lib64/libaio.so.1.0.0`、`lib64/libaio.so.1.0.1`。

**下載用戶端資料夾**

1. 在本機安裝 unzip 套件。例如：

   ```
   sudo yum install unzip
   ```

1. 建立 `oracle_plugin` 目錄。例如：

   ```
   mkdir oracle_plugin
   cd oracle_plugin
   ```

1. 使用以下 curl 命令從 Oracle Instant Client Downloads for Linux x8[6-64 (64 位元） 下載 instantclient-basic-linux.x64-18.5.0.0.0dbru.zip](https://download.oracle.com/otn_software/linux/instantclient/185000/instantclient-basic-linux.x64-18.5.0.0.0dbru.zip)。 [https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html](https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html)

   ```
   curl https://download.oracle.com/otn_software/linux/instantclient/185000/instantclient-basic-linux.x64-18.5.0.0.0dbru.zip > client.zip
   ```

1. 解壓縮 `client.zip` 檔案。例如：

   ```
   unzip *.zip
   ```

**從 Docker 擷取檔案**

1. 在新的命令提示字元中，顯示並寫下您的 Docker 容器 ID。例如：

   ```
   docker container ls
   ```

   您的命令提示可以傳回所有容器及其 IDs。例如：

   ```
   debc16fd6970
   ```

1. 在您的`oracle_plugin`目錄中，將 `lib64/libaio.so.1`、`lib64/libaio.so.1.0.0`、 `lib64/libaio.so.1.0.1` 檔案擷取至本機`instantclient_18_5`資料夾。例如：

   ```
   docker cp debc16fd6970:/lib64/libaio.so.1 instantclient_18_5/
   docker cp debc16fd6970:/lib64/libaio.so.1.0.0 instantclient_18_5/
   docker cp debc16fd6970:/lib64/libaio.so.1.0.1 instantclient_18_5/
   ```

### 自訂外掛程式
<a name="samples-oracle-plugins-code"></a>

Apache Airflow 會在啟動時執行外掛程式資料夾中 Python 檔案的內容。這用於設定和修改環境變數。下列步驟說明自訂外掛程式的範例程式碼。
+ 複製下列程式碼範例的內容，並在本機儲存為 `env_var_plugin_oracle.py`。

  ```
  from airflow.plugins_manager import AirflowPlugin
  import os
  
  os.environ["LD_LIBRARY_PATH"]='/usr/local/airflow/plugins/instantclient_18_5'
  os.environ["DPI_DEBUG_LEVEL"]="64"
  
  class EnvVarPlugin(AirflowPlugin):                
      name = 'env_var_plugin'
  ```

### Plugins.zip
<a name="samples-oracle-pluginszip"></a>

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

**壓縮外掛程式目錄的內容**

1. 在您的命令提示字元中，導覽至 `oracle_plugin`目錄。例如：

   ```
   cd oracle_plugin
   ```

1. 在 plugins.zip 中壓縮`instantclient_18_5`目錄。例如：

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

   您的命令提示字元會顯示：

   ```
   oracle_plugin$ ls
   client.zip		instantclient_18_5
   ```

1. 移除 `client.zip` 檔案。例如：

   ```
   rm client.zip
   ```

**壓縮 env\_var\_plugin\_oracle.py 檔案**

1. 將 `env_var_plugin_oracle.py` 檔案新增至 plugins.zip 的根目錄。例如：

   ```
   zip plugins.zip env_var_plugin_oracle.py
   ```

1. 您的 plugins.zip 現在包含下列項目：

   ```
   env_var_plugin_oracle.py
   instantclient_18_5/
   ```

## Airflow 組態選項
<a name="samples-oracle-airflow-config"></a>

如果您使用的是 Apache Airflow v2，請將 新增`core.lazy_load_plugins : False`為 Apache Airflow 組態選項。若要進一步了解，請參閱[使用組態選項載入 2 中的外掛程式](configuring-env-variables.md#configuring-2.0-airflow-override)。

## 後續步驟？
<a name="samples-oracle-next-up"></a>
+ 了解如何在此範例中將 `requirements.txt` 檔案上傳至 中的 Amazon S3 儲存貯體[安裝 Python 相依性](working-dags-dependencies.md)。
+ 了解如何在此範例中將 DAG 程式碼上傳至 Amazon S3 儲存貯體中的 `dags` 資料夾[新增或更新 DAGs](configuring-dag-folder.md)。
+ 進一步了解如何在此範例中將`plugins.zip`檔案上傳至 中的 Amazon S3 儲存貯體[安裝自訂外掛程式](configuring-dag-import-plugins.md)。