

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Oracle을 이용한 사용자 지정 플러그인 생성
<a name="samples-oracle"></a>

다음 샘플은 Amazon MWAA를 위해 Oracle을 이용한 사용자 지정 플러그인을 생성하는 단계를 안내하며, 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용 Oracle Instant 클라이언트 다운로드(64비트)](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`을 생성하는 방법에 대해 설명합니다. 이 예제의 내용은 다른 플러그인 및 바이너리와 결합하여 단일 `plugins.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\_var\_plugin\_oracle.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를 사용하는 경우 Apache Airflow 구성 옵션으로 `core.lazy_load_plugins : False`을 추가합니다. 자세한 내용은 [2에서 구성 옵션을 사용하여 플러그인 로드](configuring-env-variables.md#configuring-2.0-airflow-override)를 참조하세요.

## 다음 단계
<a name="samples-oracle-next-up"></a>
+ 이 예제의 `requirements.txt` 파일을 [Python 종속성 설치](working-dags-dependencies.md)의 Amazon S3 버킷에 업로드하는 방법을 알아봅니다.
+ 이 예제의 DAG 코드를 [DAG 추가 또는 업데이트](configuring-dag-folder.md)에서 Amazon S3 버킷의 `dags` 폴더에 업로드하는 방법을 알아봅니다.
+ 이 예제의 `plugins.zip` 파일을 [사용자 지정 플러그인 설치](configuring-dag-import-plugins.md)의 Amazon S3 버킷에 업로드하는 방법에 대해 자세히 알아봅니다.