

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

# Amazon MWAA에서 시작 스크립트 사용
<a name="using-startup-script"></a>

시작 스크립트는 DAG, 요구 사항 및 플러그인과 유사하게 환경의 Amazon S3 버킷에서 호스팅하는 쉘(`.sh`) 스크립트입니다. Amazon MWAA는 모든 개별 Apache Airflow 구성 요소(작업자, 스케줄러, 웹 서버)에서 시작 중에 요구 사항을 설치하고 Apache Airflow 프로세스를 초기화하기 전에 이 스크립트를 실행합니다. 시작 스크립트를 사용하여 다음을 수행합니다.
+ **런타임 설치** – 워크플로우와 연결에 필요한 Linux 런타임을 설치합니다.
+ **환경 변수 구성** – 각 Apache Airflow 구성 요소에 대한 환경 변수를 설정합니다. 일반 변수를 덮어씁니다(예: `PATH`, `PYTHONPATH` 및 `LD_LIBRARY_PATH`).
+ **키 및 토큰 관리** – 사용자 지정 리포지토리의 액세스 토큰을 `requirements.txt`에 전달하고 보안 키를 구성합니다.

다음 항목에서는 Linux 런타임을 설치하도록 시작 스크립트를 구성하고, 환경 변수를 설정하며, CloudWatch Logs를 사용하여 관련 문제를 해결하는 방법을 설명합니다.

**Topics**
+ [시작 스크립트 구성](#create-startup-script)
+ [시작 스크립트를 사용하여 Linux 런타임을 설치합니다.](#install-dependencies-using-startup-script)
+ [시작 스크립트를 사용하여 환경 변수를 설정합니다.](#set-variables-using-startup-script)

## 시작 스크립트 구성
<a name="create-startup-script"></a>

기존 Amazon MWAA 환경에서 시작 스크립트를 사용하려면 사용자 환경의 Amazon S3 버킷에 `.sh` 파일을 업로드합니다. 그런 다음 스크립트를 환경에 연결하려면 환경 세부 정보에 다음을 지정합니다.
+ **스크립트에 대한 Amazon S3 URL 경로** – 버킷에 호스팅된 스크립트의 상대 경로입니다. 예를 들어, `s3://mwaa-environment/startup.sh` 
+ **스크립트의 Amazon S3 버전 ID** – Amazon S3 버킷에 있는 시작 쉘 스크립트의 버전입니다. 스크립트를 업데이트할 때마다 Amazon S3가 파일에 할당하는 [버전 ID](https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html)를 지정해야 합니다. 버전 ID는 유니코드, UTF-8 인코딩, URL 지원, 불투명 문자열이며 길이가 1,024바이트를 넘지 않습니다(예: `3sL4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo`).

이 섹션의 단계를 완료하려면 다음 샘플 스크립트를 사용합니다. 스크립트는 할당된 값을 `MWAA_AIRFLOW_COMPONENT`에 출력합니다. 이 환경 변수는 스크립트가 실행되는 각 Apache Airflow 구성 요소를 식별합니다.

코드를 복사하고 로컬에 `startup.sh`로 저장합니다.

```
#!/bin/sh
			​
echo "Printing Apache Airflow component"
echo $MWAA_AIRFLOW_COMPONENT
```

다음으로 Amazon S3 버킷에 스크립트를 업로드합니다.

------
#### [ AWS Management Console ]

**쉘 스크립트를 업로드하려면(콘솔)**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. **버킷** 목록에서 환경에 연결된 버킷의 이름을 선택합니다.

1. **객체** 탭에서 **업로드**를 선택합니다.

1. **업로드** 페이지에서 생성한 쉘 스크립트를 드래그 앤 드롭합니다.

1. **업로드**를 선택합니다.

스크립트는 **객체** 목록에 나열됩니다. Amazon S3는 파일에 대한 새 버전 ID를 만듭니다. 스크립트를 업데이트하고 동일한 파일 이름을 사용하여 다시 업로드하면 새 버전 ID가 파일에 할당됩니다.

------
#### [ AWS CLI ]

**쉘 스크립트(CLI)를 생성하고 업로드하려면**

1. 새 명령 프롬프트를 열고 Amazon S3 `ls` 명령을 실행하여 환경과 관련된 버킷을 나열하고 식별합니다.

   ```
   aws s3 ls
   ```

1. 쉘 스크립트를 저장한 폴더로 이동합니다. 새 프롬프트 창에서 `cp`를 사용하여 스크립트를 버킷에 업로드합니다. *amzn-s3-demo-bucket*을 자신의 정보로 바꿉니다.

   ```
   aws s3 cp startup.sh s3://amzn-s3-demo-bucket/startup.sh
   ```

   성공하면 Amazon S3가 객체에 대한 URL 경로를 출력합니다.

   ```
   upload: ./startup.sh to s3://amzn-s3-demo-bucket/startup.sh
   ```

1. 다음 명령을 사용하여 스크립트의 최신 버전 ID를 검색합니다.

   ```
   aws s3api list-object-versions --bucket amzn-s3-demo-bucket --prefix startup --query 'Versions[?IsLatest].[VersionId]' --output text
   ```

   ```
   BbdVMmBRjtestta1EsVnbybZp1Wqh1J4
   ```

스크립트를 환경에 연결할 때 이 버전 ID를 지정합니다.

------

이제 스크립트를 환경에 연결합니다.

------
#### [ AWS Management Console ]

**스크립트를 환경과 연결하려면(콘솔)**

1. Amazon MWAA 콘솔에서 [환경 페이지](https://console.aws.amazon.com/mwaa/home#/environments)를 엽니다.

1. 업데이트하려는 환경의 행을 선택한 다음 **편집**을 선택합니다.

1. **세부 정보 지정** 페이지에서 **시작 스크립트 파일*(선택 사항)***에 스크립트의 Amazon S3 URL을 입력합니다(예: `s3://amzn-s3-demo-bucket/startup-sh.`).

1. 드롭다운 목록에서 최신 버전을 선택하거나 **S3 찾아보기**를 사용하여 스크립트를 찾습니다.

1. **다음**을 선택하여 **검토 후 저장** 페이지로 이동합니다.

1. 변경 사항을 검토한 다음 **저장**을 선택합니다.

환경 업데이트는 10\$130분 정도 걸릴 수 있습니다. Amazon MWAA는 사용자 환경의 각 구성 요소가 재시작될 때 시작 스크립트를 실행합니다.

------
#### [ AWS CLI ]

**스크립트를 환경과 연결하려면(CLI)**
+ 명령 프롬프트를 열고 `update-environment`를 사용하여 스크립트의 Amazon S3 URL과 버전 ID를 지정합니다.

  ```
  aws mwaa update-environment \
  --name your-mwaa-environment \
  --startup-script-s3-path startup.sh \
  --startup-script-s3-object-version BbdVMmBRjtestta1EsVnbybZp1Wqh1J4
  ```

  성공할 경우 Amazon MWAA는 환경에 대한 Amazon 리소스 이름(ARN) 을 반환합니다.

  ```
  arn:aws:airflow:us-west-2:123456789012:environment/your-mwaa-environment 
  ```

환경 업데이트는 10\$130분 정도 걸릴 수 있습니다. Amazon MWAA는 사용자 환경의 각 구성 요소가 재시작될 때 시작 스크립트를 실행합니다.

------

마지막으로 로그 이벤트를 검색하여 스크립트가 예상대로 작동하는지 확인합니다. 각 Apache Airflow 구성 요소에 대한 로깅을 활성화하면 Amazon MWAA가 새 로그 그룹과 로그 스트림을 생성합니다. 자세한 내용은 [Apache Airflow 로그 유형](monitoring-airflow.md#monitoring-airflow-log-groups)을 참조하세요.

------
#### [ AWS Management Console ]

**Apache Airflow 로그 스트림을 생성하려면(콘솔)**

1. Amazon MWAA 콘솔에서 [환경 페이지](https://console.aws.amazon.com/mwaa/home#/environments)를 엽니다.

1. 환경을 선택합니다.

1. **모니터링** 창에서 로그에 액세스할 로그 그룹을 선택합니다(예: **Airflow 스케줄러 로그 그룹**).

1. CloudWatch 콘솔의 **로그 스트림** 목록에서 접두사가 다음과 같은 스트림을 선택합니다: `startup_script_execution_ip`.

1. **로그 이벤트** 창에는 `MWAA_AIRFLOW_COMPONENT` 값을 인쇄하는 명령의 출력이 표시됩니다. 예를 들어 스케줄러 로그의 경우 다음과 같은 결과를 얻을 수 있습니다.

   ```
   Printing Apache Airflow component
   								scheduler
   								Finished running startup script. Execution time: 0.004s.
   								Running verification
   								Verification completed
   ```

이전 단계를 반복하여 작업자 및 웹 서버 로그에 액세스할 수 있습니다.

------

## 시작 스크립트를 사용하여 Linux 런타임을 설치합니다.
<a name="install-dependencies-using-startup-script"></a>

시작 스크립트를 사용하여 Apache Airflow 구성 요소의 운영 체제를 업데이트하고 워크플로우에 사용할 추가 런타임 라이브러리를 설치합니다. 예를 들어, 다음 스크립트는 `yum update`를 실행하여 운영 체제를 업데이트합니다.

시작 스크립트에서 `yum update`를 실행할 때는 예제에 나열돤 바와 같이 `--exclude=python*`을 사용하여 Python을 제외해야 합니다. 실행 환경을 위해 Amazon MWAA는 사용자 환경과 호환되는 특정 버전의 Python을 설치합니다. 따라서 시작 스크립트를 사용하여 환경의 Python 버전을 업데이트할 수 없습니다.

```
#!/bin/sh
			
echo "Updating operating system"
sudo yum update -y --exclude=python*
```

특정 Apache Airflow 구성 요소에 런타임을 설치하려면 `MWAA_AIRFLOW_COMPONENT`, `if` 및 `fi` 조건문을 사용합니다. 이 예제에서는 단일 명령을 실행하여 웹 서버가 아닌 스케줄러와 작업자에는 `libaio` 라이브러리를 설치합니다.

**중요**  
[프라이빗 웹 서버](configuring-networking.md#access-overview-private)를 구성한 경우 설치 시간 초과를 방지하려면 다음 조건을 사용하거나 모든 설치 파일을 로컬로 제공해야 합니다.
`sudo`를 사용하여 관리자 권한이 필요한 작업을 실행합니다.

```
#!/bin/sh
			
if [[ "${MWAA_AIRFLOW_COMPONENT}" != "webserver" ]]
  then
    sudo yum -y install libaio
			
fi
```

시작 스크립트를 사용하여 Python 버전을 확인할 수 있습니다.

```
#!/bin/sh
			
export PYTHON_VERSION_CHECK=`python -c 'import sys; version=sys.version_info[:3]; print("{0}.{1}.{2}".format(*version))'`
echo "Python version is $PYTHON_VERSION_CHECK"
```

Amazon MWAA는 기본 Python 버전 재정의를 지원하지 않습니다. 이렇게 하면 설치된 Apache Airflow 라이브러리와 호환되지 않을 수 있기 때문입니다.

## 시작 스크립트를 사용하여 환경 변수를 설정합니다.
<a name="set-variables-using-startup-script"></a>

시작 스크립트를 사용하여 환경 변수를 설정하고 Apache Airflow 구성을 수정할 수 있습니다. 다음에서는 새 변수 `ENVIRONMENT_STAGE`을 정의합니다. DAG 또는 사용자 지정 모듈에서 이 변수를 참조할 수 있습니다.

```
#!/bin/sh
			
export ENVIRONMENT_STAGE="development"
echo "$ENVIRONMENT_STAGE"
```

시작 스크립트를 사용하여 일반적인 Apache Airflow 또는 시스템 변수를 덮어씁니다. 예를 들어, 지정한 경로에서 바이너리를 검색하도록 Python에 지시하도록 `LD_LIBRARY_PATH`를 설정합니다. 이렇게 하면 [플러그인](https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/plugins.html)을 사용하여 워크플로우에 사용자 지정 바이너리를 제공할 수 있습니다.

```
#!/bin/sh
			
export LD_LIBRARY_PATH=/usr/local/airflow/plugins/your-custom-binary
```

### 예약된 환경 변수
<a name="reserved-environment-variables"></a>

Amazon MWAA는 중요한 환경 변수 세트를 예약합니다. *예약된* 변수를 덮어쓰면 Amazon MWAA가 해당 변수를 기본값으로 복원합니다. 예약된 변수의 목록은 다음과 같습니다.
+ `MWAA__AIRFLOW__COMPONENT` – : `scheduler`, `worker` 또는 `webserver` 값 중 하나로 Apache Airflow 구성 요소를 식별하는 데 사용됩니다.
+ `AIRFLOW__WEBSERVER__SECRET_KEY` – Apache Airflow 웹 서버에서 세션 쿠키에 안전하게 서명하는 데 사용되는 암호 키입니다.
+ `AIRFLOW__CORE__FERNET_KEY` – 메타데이터 데이터베이스에 저장된 민감한 데이터(예: 연결 암호)를 암호화하고 해독하는 데 사용되는 키입니다.
+ `AIRFLOW_HOME` – 구성 파일 및 DAG 파일이 로컬로 저장되는 Apache Airflow 홈 디렉터리의 경로입니다.
+ `AIRFLOW__CELERY__BROKER_URL` – Apache Airflow 스케줄러와 Cellery 작업자 노드 간의 통신에 사용되는 메시지 브로커의 URL입니다.
+ `AIRFLOW__CELERY__RESULT_BACKEND` – Celery 작업의 결과를 저장하는 데 사용되는 데이터베이스의 URL입니다.
+ `AIRFLOW__CORE__EXECUTOR` – Apache Airflow가 사용해야 하는 실행자 클래스입니다. Amazon MWAA에서는 이것은 `CeleryExecutor`
+ `AIRFLOW__CORE__LOAD_EXAMPLES` – 예제 DAG 로드를 활성화하거나 비활성화하는 데 사용됩니다.
+ `AIRFLOW__METRICS__METRICS_BLOCK_LIST` – CloudWatch에서 Amazon MWAA가 내보내고 캡처하는 Apache Airflow 지표를 관리하는 데 사용됩니다.
+ `SQL_ALCHEMY_CONN` – Amazon MWAA에 Apache Airflow 메타데이터를 저장하는 데 사용되는 PostgreSQL용 RDS 데이터베이스의 연결 문자열입니다.
+ `AIRFLOW__CORE__SQL_ALCHEMY_CONN` – `SQL_ALCHEMY_CONN`와 동일한 용도로 사용되지만 새 Apache Airflow 이름 지정 규칙을 따릅니다.
+ `AIRFLOW__CELERY__DEFAULT_QUEUE` – Apache Airflow의 Celery 작업에 대한 기본 대기열입니다.
+ `AIRFLOW__OPERATORS__DEFAULT_QUEUE` – 특정 Apache Airflow 연산자를 사용하는 작업의 기본 대기열입니다.
+ `AIRFLOW_VERSION` – Amazon MWAA 환경에 설치된 Apache Airflow 버전.
+ `AIRFLOW_CONN_AWS_DEFAULT` – 다른 AWS 서비스와 통합하는 데 사용되는 기본 AWS 보안 인증입니다.
+ `AWS_DEFAULT_REGION` – 다른 AWS 서비스와 통합하기 위해 기본 보안 인증과 함께 사용할 기본 AWS 리전을 설정합니다.
+ `AWS_REGION` – 정의된 경우 이 환경 변수는 환경 변수 `AWS_DEFAULT_REGION` 및 프로파일 설정의 값을 재정의합니다.
+ `PYTHONUNBUFFERED` – `stdout` 및 `stderr` 스트림을 컨테이너 로그로 전송하는 데 사용됩니다.
+ `AIRFLOW__METRICS__STATSD_ALLOW_LIST` – 목록의 요소로 시작하는 지표를 전송하기 위해 쉼표로 구분된 접두사의 허용 목록을 구성하는 데 사용됩니다.
+ `AIRFLOW__METRICS__STATSD_ON` – `StatsD`로 지표 전송을 활성화합니다.
+ `AIRFLOW__METRICS__STATSD_HOST` – `StatSD` 대몬(daemon)에 연결하는 데 사용됩니다.
+ `AIRFLOW__METRICS__STATSD_PORT` – `StatSD` 대몬(daemon)에 연결하는 데 사용됩니다.
+ `AIRFLOW__METRICS__STATSD_PREFIX` – `StatSD` 대몬(daemon)에 연결하는 데 사용됩니다.
+ `AIRFLOW__CELERY__WORKER_AUTOSCALE` – 최대 및 최소 동시성을 설정합니다.
+ `AIRFLOW__CORE__DAG_CONCURRENCY` – 한 DAG에서 스케줄러가 동시에 실행할 수 있는 작업 인스턴스 수를 설정합니다.
+ `AIRFLOW__CORE__MAX_ACTIVE_TASKS_PER_DAG` – DAG당 최대 활성 작업 수를 설정합니다.
+ `AIRFLOW__CORE__PARALLELISM` – 동시에 실행할 수 있는 최대 작업 인스턴스 수를 정의합니다.
+ `AIRFLOW__SCHEDULER__PARSING_PROCESSES` – DAG를 스케줄링하기 위해 스케줄러가 파싱하는 최대 프로세스 수를 설정합니다.
+ `AIRFLOW__CELERY_BROKER_TRANSPORT_OPTIONS__VISIBILITY_TIMEOUT` – 메시지가 다른 작업자에게 다시 전달되기 전에 작업자가 작업을 승인하기 위해 대기하는 시간(초)을 정의합니다.
+ `AIRFLOW__CELERY_BROKER_TRANSPORT_OPTIONS__REGION` – 기본 셀러리 전송의 AWS 리전을 설정합니다.
+ `AIRFLOW__CELERY_BROKER_TRANSPORT_OPTIONS__PREDEFINED_QUEUES` – 기본 셀러리 전송의 큐를 설정합니다.
+ `AIRFLOW_SCHEDULER_ALLOWED_RUN_ID_PATTERN` – DAG를 트리거할 때 `run_id` 파라미터에 대한 입력의 유효성을 확인하는 데 사용됩니다.
+ `AIRFLOW__WEBSERVER__BASE_URL` – Apache Airflow UI를 호스팅하는 데 사용되는 웹 서버의 URL입니다.
+ `PYTHONPATH`(Apache Airflow v2.9 이상에만 해당) - 모든 기본 환경 기능이 올바르게 작동하도록 Amazon MWAA에서 예약합니다.
**참고**  
v2.9 이전 버전의 Apache Airflow의 경우 `PYTHONPATH`는 *예약되지 않은* 환경 변수입니다.

### 예약되지 않은 환경 변수
<a name="unreserved-environment-variables"></a>

시작 스크립트를 사용하여 *예약되지 않은* 환경 변수를 덮어쓸 수 있습니다. 다음은 이러한 일반적인 변수의 일부를 나열한 것입니다.
+ `PATH` – 운영 체제가 실행 파일 및 스크립트를 검색하는 디렉터리 목록을 지정합니다. 명령줄에서 명령을 실행하면 시스템은 명령을 찾아 실행하기 위해 `PATH`의 디렉터리를 확인합니다. Apache Airflow에서 사용자 지정 연산자 또는 작업을 생성할 때는 외부 스크립트나 실행 파일을 사용해야 할 수 있습니다. 이러한 파일을 포함한 디렉터리가 `PATH` 변수에 지정된 디렉터리에 없는 경우, 시스템이 해당 디렉터리를 찾을 수 없으면 작업이 실행되지 않습니다. `PATH`에 적절한 디렉터리를 추가하면 Apache Airflow 작업에서 필요한 실행 파일을 찾아 실행할 수 있습니다.
+ `PYTHONPATH` – Python 인터프리터가 가져온 모듈과 패키지를 검색할 디렉터리를 결정하는 데 사용됩니다. 기본 검색 경로에 추가할 수 있는 디렉터리 목록입니다. 이를 통해 인터프리터는 표준 라이브러리에 포함되어 있지 않거나 시스템 디렉터리에 설치되어 있지 않은 Python 라이브러리를 찾아 로드할 수 있습니다. 이 변수를 사용하여 모듈과 사용자 지정 Python 패키지를 추가하고 DAG와 함께 사용할 수 있습니다.
**참고**  
Apache Airflow v2.9 이상의 경우, `PYTHONPATH`는 *예약된* 환경 변수입니다.
+ `LD_LIBRARY_PATH` – Linux의 동적 링커 및 로더가 공유 라이브러리를 찾고 로드하는 데 사용하는 환경 변수입니다. 기본 시스템 라이브러리 디렉터리보다 먼저 검색되는 공유 라이브러리가 포함된 디렉터리 목록을 지정합니다. 이 변수를 사용하여 사용자 지정 바이너리를 지정할 수 있습니다.
+ `CLASSPATH` – Java 런타임 환경(JRE) 및 Java 개발 키트(JDK) 에서 런타임 시 Java 클래스, 라이브러리 및 리소스를 찾고 로드하는 데 사용됩니다. 컴파일된 Java 코드가 포함된 디렉터리, JAR 파일 및 ZIP 아카이브의 목록입니다.