

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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](https://peps.python.org/pep-0619/) の **Apache Airflow v2** および [Python 3.11](https://peps.python.org/pep-0664/) の **Apache Airflow v3** で使用可能です。

## 前提条件
<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 は plugins.zip のコンテンツを各 Amazon MWAA スケジューラーとワーカーコンテナの `/usr/local/airflow/plugins` に抽出します。これはバイナリを環境に追加するために使用されます。次のステップでは、カスタムプラグインに必要なファイルを組み立てる方法について説明します。

**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 コマンドを使用して、[Linux x86-64 (64 ビット) 用 Oracle インスタントクライアントダウンロード](https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html)から [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) をダウンロードします。

   ```
   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
   ```

   コマンドプロンプトでは、すべてのコンテナとその ID を返すことができます。例:

   ```
   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` を作成する方法について説明します。この例の内容は、他のプラグインやバイナリと組み合わせて 1 つの `plugins.zip` ファイルにすることができます。

**プラグインディレクトリの中身を Zip 圧縮する**

1. コマンドプロンプトで、`oracle_plugin` ディレクトリに移動します。例:

   ```
   cd oracle_plugin
   ```

1. `instantclient_18_5` ディレクトリを plugins.zip に圧縮します。例:

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

   コマンドプロンプトに次のように表示されます。

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

1. `client.zip` ファイルを削除します。例:

   ```
   rm client.zip
   ```

**env\$1var\$1plugin\$1oracle.py ファイルを圧縮します。**

1. plugins.zip のルートに `env_var_plugin_oracle.py` ファイルを追加します。例:

   ```
   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` フォルダにアップロードする方法については、[DAG の追加と更新](configuring-dag-folder.md) を参照してください。
+ この例の `plugins.zip` ファイルを Amazon S3 バケットにアップロードする方法について詳しくは、[カスタムプラグインのインストール](configuring-dag-import-plugins.md) をご覧ください。