

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

# Amazon MWAA에서 DAG 작업
<a name="working-dags"></a>

Amazon Managed Workflows for Apache Airflow 환경에서 DAG(방향성 비순환 그래프)를 실행하려면 환경에 연결된 Amazon S3 스토리지 버킷에 파일을 복사한 다음, DAG 및 지원 파일이 Amazon MWAA 콘솔에서 어디에 있는지 Amazon MWAA에 알려 줍니다. Amazon MWAA는 작업자, 스케줄러 및 웹 서버 간의 DAG 동기화를 처리합니다. 이 가이드에서는 DAG를 추가 또는 업데이트하고 Amazon MWAA 환경에 사용자 지정 플러그인 및 Python 종속성을 설치하는 방법을 설명합니다.

**Topics**
+ [Amazon S3 버킷 개요](#working-dags-s3-about)
+ [DAG 추가 또는 업데이트](configuring-dag-folder.md)
+ [사용자 지정 플러그인 설치](configuring-dag-import-plugins.md)
+ [Python 종속성 설치](working-dags-dependencies.md)
+ [Amazon S3에서 파일 삭제](working-dags-delete.md)

## Amazon S3 버킷 개요
<a name="working-dags-s3-about"></a>

Amazon MWAA 환경용 Amazon S3 버킷에는 *퍼블릭 액세스 차단*이 있어야 합니다. 기본적으로 버킷, 객체 및 관련 하위 리소스(예: 수명 주기 구성)를 비롯한 모든 Amazon S3 리소스는 비공개입니다.
+ 즉, 버킷을 만든 AWS 계정인 리소스 소유자만 해당 리소스에 액세스할 수 있습니다. 리소스 소유자(예: 관리자)는 액세스 제어 정책을 작성하여 다른 사람에게 액세스 권한을 부여할 수도 있습니다.
+ 설정한 액세스 정책에는 Amazon S3 버킷에 DAG, `plugins.zip`의 사용자 지정 플러그인 및 `requirements.txt`의 Python 종속성을 추가할 수 있는 권한이 있어야 합니다. 필요한 권한이 포함된 정책의 예제는 [AmazonMWAAFullConsoleAccess](access-policies.md#console-full-access)를 참조하세요.

Amazon MWAA 환경용 Amazon S3 버킷에는 *버전 관리가 활성화*되어 있어야 합니다. Amazon S3 버킷 버전 관리가 활성화하면 새 버전이 생성될 때마다 새 사본이 생성됩니다.
+ Amazon S3 버킷에서 `plugins.zip`의 사용자 지정 플러그인 및 `requirements.txt`의 Python 종속성에 대해 버전 관리가 활성화됩니다. 
+ Amazon S3 버킷에서 이러한 파일이 업데이트될 때마다 Amazon MWAA 콘솔에서 `plugins.zip` 및 `requirements.txt`의 버전을 지정해야 합니다.

# DAG 추가 또는 업데이트
<a name="configuring-dag-folder"></a>

방향성 비순환 그래프(DAG)는 DAG 구조를 코드로 정의하는 Python 파일 내에 정의됩니다. AWS CLI 또는 Amazon S3 콘솔을 사용하여 DAG를 사용자 환경에 업로드할 수 있습니다. 이 주제에서는 Amazon S3 버킷의 `dags` 폴더를 사용하여 Amazon Managed Workflows for Apache Airflow 환경에서 Apache Airflow DAG를 추가하거나 업데이트하는 단계를 설명합니다.

**Topics**
+ [사전 조건](#configuring-dag-folder-prereqs)
+ [작동 방법](#configuring-dag-folder-how)
+ [무엇이 변경되었나요?](#configuring-dag-folder-changed)
+ [Amazon MWAA CLI 유틸리티를 사용한 DAG 테스트](#working-dag-folder-cli-utility)
+ [Amazon S3에 DAG 코드 업로드](#configuring-dag-folder-uploading)
+ [Amazon MWAA 콘솔에서 DAG 폴더의 경로 지정(처음)](#configuring-dag-folder-mwaaconsole)
+ [Apache Airflow UI 변경 사항 액세스](#configuring-dag-folder-mwaaconsole-view)
+ [다음 단계](#configuring-dag-folder-next-up)

## 사전 조건
<a name="configuring-dag-folder-prereqs"></a>

이 페이지의 단계를 완료하려면 먼저 다음이 필요합니다.
+ **권한** — 관리자가 사용자 환경의 [AmazonMWAAFullConsoleAccess](access-policies.md#console-full-access) 액세스 제어 정책에 대한 액세스 권한을 AWS 계정에 부여했어야 합니다. 또한 [실행 역할](mwaa-create-role.md)이 Amazon MWAA 환경에서 사용자 환경에서 사용하는 AWS 리소스에 액세스할 수 있도록 허용해야 합니다.
+ **액세스** — 종속성을 웹 서버에 직접 설치하기 위해 퍼블릭 리포지토리에 액세스해야 하는 경우 **퍼블릭 네트워크** 웹 서버 액세스로 환경을 구성해야 합니다. 자세한 정보는 [Apache Airflow 액세스 모드](configuring-networking.md) 섹션을 참조하세요.
+ **Amazon S3 구성** — DAG, `plugins.zip`의 사용자 지정 플러그인 및 `requirements.txt`의 Python 종속성을 저장하는 데 사용되는 [Amazon S3 버킷](mwaa-s3-bucket.md)은 *퍼블릭 액세스가 차단*되고 *버전 관리가 활성화*된 상태로 구성되어야 합니다.

## 작동 방법
<a name="configuring-dag-folder-how"></a>

방향비순환 그래프(DAG)는 DAG의 구조를 코드로 정의하는 단일 Python 파일 내에 정의됩니다. 다음 항목으로 구성됩니다.
+ [DAG](https://airflow.apache.org/docs/stable/concepts.html#dags) 정의.
+ DAG 실행 방법과 실행할 [작업](https://airflow.apache.org/docs/stable/concepts.html#tasks)을 설명하는 [연산자](https://airflow.apache.org/concepts.html#operators).
+ 작업 실행 순서를 설명하는 [연산자 관계](https://airflow.apache.org/concepts.html#bitshift-composition).

Amazon MWAA 환경에서 Apache Airflow 플랫폼을 실행하려면 DAG 정의를 스토리지 버킷의 `dags` 폴더에 복사해야 합니다. 예를 들어 스토리지 버킷의 DAG 폴더는 다음과 유사해야 합니다.

**Example DAG 폴더**  

```
dags/
└ dag_def.py
```

Amazon MWAA는 Amazon S3 버킷의 새 객체 및 변경된 객체를 Amazon MWAA 스케줄러 및 작업자 컨테이너의 `/usr/local/airflow/dags` 폴더로 30초마다 자동으로 동기화하여 파일 유형에 상관없이 Amazon S3 소스의 파일 계층 구조를 유지합니다. 새 DAG가 Apache Airflow UI에 나열되는 데 걸리는 시간은 `scheduler.dag\$1dir\$1list\$1interval`에 의해 제어됩니다. 기존 DAG에 대한 변경 사항은 다음 [DAG 처리 루프](best-practices-tuning.md#best-practices-tuning-scheduler)에서 적용됩니다.

**참고**  
DAG 폴더에 `airflow.cfg` 구성 파일을 포함할 필요는 없습니다. Amazon MWAA 콘솔에서 기본 Apache Airflow 구성을 재정의할 수 있습니다. 자세한 정보는 [Amazon MWAA에서 Apache Airflow 구성 옵션 사용](configuring-env-variables.md) 섹션을 참조하세요.

## 무엇이 변경되었나요?
<a name="configuring-dag-folder-changed"></a>

특정 Apache Airflow 릴리스의 변경 사항을 검토하려면 [릴리스 정보](https://airflow.apache.org/docs/apache-airflow/stable/release_notes.html#release-notes) 페이지를 참조하세요.
+ Apache Airflow v3 구성: [구성 참조](https://airflow.apache.org/docs/apache-airflow/3.0.6/configurations-ref.html)
+ Apache Airflow v2 퍼블릭 인터페이스 정보: [Airflow의 퍼블릭 인터페이스](https://airflow.apache.org/docs/apache-airflow/2.10.3/public-airflow-interface.html)

## Amazon MWAA CLI 유틸리티를 사용한 DAG 테스트
<a name="working-dag-folder-cli-utility"></a>
+ 명령줄 인터페이스(CLI) 유틸리티는 Amazon Managed Workflows for Apache Airflow 환경을 로컬로 복제합니다.
+ CLI는 Amazon MWAA 프로덕션 이미지와 유사한 Docker 컨테이너 이미지를 로컬로 구축합니다. 이를 사용해 Amazon MWAA에 배포하기 전에 로컬 Apache Airflow 환경을 실행하여 DAG, 사용자 지정 플러그인 및 종속성을 개발하고 테스트할 수 있습니다.
+ CLI를 실행하려면 GitHub의 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)를 참조하세요.

## Amazon S3에 DAG 코드 업로드
<a name="configuring-dag-folder-uploading"></a>

Amazon S3 콘솔 또는 AWS Command Line Interface (AWS CLI)를 사용하여 Amazon S3 버킷에 DAG 코드를 업로드할 수 있습니다. 다음 단계에서는 Amazon S3 버킷의 이름이 지정된 `dags` 폴더에 코드(`.py`)를 업로드한다고 가정합니다.

### AWS CLI 사용
<a name="configuring-dag-folder-cli"></a>

AWS Command Line Interface(AWS CLI)는 명령줄 쉘의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다. 이 페이지에서 단계를 완료하려면 다음이 필요합니다.
+ [AWS CLI - 버전 2 설치](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)
+ [AWS CLI - 을 통한 빠른 구성.`aws configure`](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)

**AWS CLI를 사용하여 업로드하려면**

1. 다음 명령을 사용하여 Amazon S3 버킷을 모두 나열합니다.

   ```
   aws s3 ls
   ```

1. 다음 명령을 사용하여 사용자 환경의 Amazon S3 버킷에 있는 파일과 폴더를 나열합니다.

   ```
   aws s3 ls s3://YOUR_S3_BUCKET_NAME
   ```

1. 다음 명령은 `dag_def.py` 파일을 `dags` 폴더에 업로드합니다.

   ```
   aws s3 cp dag_def.py s3://amzn-s3-demo-bucket/dags/
   ```

   이름이 지정된 `dags` 폴더가 Amazon S3 버킷에 아직 없는 경우 이 명령은 `dags` 폴더를 생성하고 이름이 지정된 `dag_def.py` 파일을 새 폴더에 업로드합니다.

### Amazon S3 콘솔 사용
<a name="configuring-dag-folder-console"></a>

Amazon S3 콘솔은 Amazon S3 버킷의 리소스를 생성 및 관리할 수 있는 웹 기반 사용자 인터페이스입니다. 다음 단계에서는 이름이 지정된 `dags` DAG 폴더가 있다고 가정합니다.

**Amazon S3 콘솔을 사용하여 업로드하려면**

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

1. 환경을 선택합니다.

1. **S3의 DAG 코드** 창에서 **S3 버킷** 링크를 선택하여 콘솔에서 스토리지 버킷을 엽니다.

1. `dags` 폴더를 선택합니다.

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

1. **파일 추가**를 선택합니다.

1. `dag_def.py`의 로컬 사본을 선택하고 **업로드**를 선택합니다.

## Amazon MWAA 콘솔에서 DAG 폴더의 경로 지정(처음)
<a name="configuring-dag-folder-mwaaconsole"></a>

다음 단계에서는 이름이 지정된 `dags` Amazon S3 버킷의 폴더에 대한 경로를 지정한다고 가정합니다.

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

1. DAG를 실행할 환경을 선택합니다.

1. **편집**을 선택합니다.

1. **Amazon S3의 DAG 코드** 창에서 **DAG 폴더** 필드 옆에 있는 **S3 찾아보기**를 선택합니다.

1. `dags` 폴더를 선택합니다.

1. **선택**을 선택합니다.

1. **다음**, **환경 업데이트**를 선택합니다.

## Apache Airflow UI 변경 사항 액세스
<a name="configuring-dag-folder-mwaaconsole-view"></a>

Apache Airflow UI에 액세스하려면 AWS Identity and Access Management(IAM)의 AWS 계정 계정에 대한 [Apache Airflow UI 액세스 정책: AmazonMWAAWebServerAccess](access-policies.md#web-ui-access) 권한이 필요합니다.

**Apache Airflow UI에 액세스하려면**

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

1. 환경을 선택합니다.

1. **Airflow UI 열기**를 선택합니다.

## 다음 단계
<a name="configuring-dag-folder-next-up"></a>

GitHub의 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)를 사용하여 DAG, 사용자 지정 플러그인, Python 종속성을 로컬에서 테스트합니다.

# 사용자 지정 플러그인 설치
<a name="configuring-dag-import-plugins"></a>

Amazon Managed Workflows for Apache Airflow는 Apache Airflow의 내장 플러그인 관리자를 지원하므로 사용자는 사용자 지정 Apache Airflow 운영자, 후크, 센서 또는 인터페이스를 사용할 수 있습니다. 이 페이지에서는 `plugins.zip` 파일을 사용하여 Amazon MWAA 환경에 [Apache Airflow 사용자 지정 플러그인](https://airflow.incubator.apache.org/plugins.html)을 설치하는 단계를 설명합니다.

**Contents**
+ [사전 조건](#configuring-dag-plugins-prereqs)
+ [작동 방법](#configuring-dag-plugins-how)
+ [플러그인 사용 시기](#configuring-dag-plugins-changed)
+ [사용자 지정 플러그인 개요](#configuring-dag-plugins-overview)
  + [사용자 지정 플러그인 디렉터리 및 크기 제한](#configuring-dag-plugins-quota)
+ [사용자 지정 플러그인의 예제](#configuring-dag-plugins-airflow-ex)
  + [plugins.zip 내 플랫 디렉터리 구조 사용 예제](#configuring-dag-plugins-overview-simple)
  + [plugins.zip 내 중첩 디렉터리 구조 사용 예제](#configuring-dag-plugins-overview-complex)
+ [plugins.zip 파일 생성](#configuring-dag-plugins-test-create)
  + [1단계: Amazon MWAA CLI 유틸리티를 사용하여 사용자 지정 플러그인 테스트](#configuring-dag-plugins-cli-utility)
  + [2단계: plugins.zip 파일 생성](#configuring-dag-plugins-zip)
+ [Amazon S3에 `plugins.zip` 업로드](#configuring-dag-plugins-upload)
  + [AWS CLI 사용](#configuring-dag-plugins-upload-cli)
  + [Amazon S3 콘솔 사용](#configuring-dag-plugins-upload-console)
+ [사용자 환경에 사용자 지정 플러그인 설치](#configuring-dag-plugins-mwaa-installing)
  + [Amazon MWAA 콘솔에서 `plugins.zip`의 경로 지정(처음)](#configuring-dag-plugins-mwaa-first)
  + [Amazon MWAA 콘솔에서 `plugins.zip` 버전 지정](#configuring-dag-plugins-s3-mwaaconsole)
+ [plugins.zip 사용 사례 예제](#configuring-dag-plugins-examples)
+ [다음 단계](#configuring-dag-plugins-next-up)

## 사전 조건
<a name="configuring-dag-plugins-prereqs"></a>

이 페이지의 단계를 완료하려면 먼저 다음이 필요합니다.
+ **권한** — 관리자가 사용자 환경의 [AmazonMWAAFullConsoleAccess](access-policies.md#console-full-access) 액세스 제어 정책에 대한 액세스 권한을 AWS 계정에 부여했어야 합니다. 또한 [실행 역할](mwaa-create-role.md)이 Amazon MWAA 환경에서 사용자 환경에서 사용하는 AWS 리소스에 액세스할 수 있도록 허용해야 합니다.
+ **액세스** — 종속성을 웹 서버에 직접 설치하기 위해 퍼블릭 리포지토리에 액세스해야 하는 경우 **퍼블릭 네트워크** 웹 서버 액세스로 환경을 구성해야 합니다. 자세한 정보는 [Apache Airflow 액세스 모드](configuring-networking.md) 섹션을 참조하세요.
+ **Amazon S3 구성** — DAG, `plugins.zip`의 사용자 지정 플러그인 및 `requirements.txt`의 Python 종속성을 저장하는 데 사용되는 [Amazon S3 버킷](mwaa-s3-bucket.md)은 *퍼블릭 액세스가 차단*되고 *버전 관리가 활성화*된 상태로 구성되어야 합니다.

## 작동 방법
<a name="configuring-dag-plugins-how"></a>

사용자 환경에서 사용자 지정 플러그인을 실행하려면 다음 세 가지 작업을 수행해야 합니다.

1. 로컬에서 `plugins.zip` 파일을 생성합니다.

1. Amazon S3 버킷에 로컬 `plugins.zip` 파일을 업로드합니다.

1. Amazon MWAA 콘솔의 **플러그인 파일** 필드에 이 파일의 버전을 지정합니다.

**참고**  
`plugins.zip`을 처음으로 Amazon S3 버킷에 업로드하는 경우 Amazon MWAA 콘솔에 파일 경로도 지정해야 합니다. 이 단계는 한 번만 완료하면 됩니다.

## 플러그인 사용 시기
<a name="configuring-dag-plugins-changed"></a>

플러그인은 [Apache Airflow 설명서](https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/plugins.html#plugins)에 설명된 대로 Apache Airflow 사용자 인터페이스를 확장하는 데만 필요합니다. 사용자 지정 연산자는 `DAG` 코드와 함께 `/dags` 폴더에 직접 배치할 수 있습니다.

외부 시스템과 자체 통합을 생성해야 하는 경우 /`dags` 폴더 또는 그 안에 있는 하위 폴더에 배치하되 `plugins.zip` 폴더에는 배치하지 않습니다. Apache Airflow 2.x에서 플러그인은 주로 UI를 확장하는 데 사용됩니다.

마찬가지로 다른 종속성을 `plugins.zip`에 배치해서는 안 됩니다. 대신 Amazon S3 `/dags` 폴더의 위치에 저장할 수 있으며, Apache Airflow가 시작되기 전에 각 Amazon MWAA 컨테이너에 동기화됩니다.

**참고**  
Apache Airflow DAG 객체를 명시적으로 정의하지 않은 `plugins.zip` 폴더 또는 `/dags`의 모든 파일은 `.airflowignore` 파일에 나열되어야 합니다.

## 사용자 지정 플러그인 개요
<a name="configuring-dag-plugins-overview"></a>

Apache Airflow의 내장 플러그인 관리자는 파일을 `$AIRFLOW_HOME/plugins` 폴더에 놓기만 하면 외부 기능을 코어에 통합할 수 있습니다. 이를 사용해 사용자 지정 Apache Airflow 운영자, 후크, 센서 또는 인터페이스를 사용할 수 있습니다. 다음 섹션에는 로컬 개발 환경의 플랫 및 중첩 디렉터리 구조의 예제 및 plugins.zip 내의 디렉터리 구조를 결정하는 결과 가져오기 문이 나와 있습니다.

### 사용자 지정 플러그인 디렉터리 및 크기 제한
<a name="configuring-dag-plugins-quota"></a>

Apache Airflow 스케줄러와 작업자는 사용자 환경의 AWS 관리형 Fargate 컨테이너에서 시작하는 동안 `/usr/local/airflow/plugins/*`에서 사용자 지정 플러그인을 검색합니다.
+ **디렉터리 구조**. (`/*`의) 디렉터리 구조는 `plugins.zip` 파일 내용을 기반으로 합니다. 예를 들어, 사용자의 `plugins.zip`에 기본 디렉터리로 `operators` 디렉터리가 포함되어 있는 경우 해당 디렉터리는 사용자 환경의 `/usr/local/airflow/plugins/operators`로 추출됩니다.
+ **크기 제한**. 1GB 미만의 `plugins.zip` 파일을 사용하는 것이 좋습니다. `plugins.zip` 파일 크기가 클수록 환경의 시작 시간이 길어집니다. Amazon MWAA가 `plugins.zip` 파일의 크기를 명시적으로 제한하지 않지만, 종속성을 10분 이내에 설치할 수 없는 경우 Fargate 서비스는 시간을 초과하여 환경을 안정적인 상태로 롤백하려고 시도합니다.

**참고**  
Apache Airflow v2.0.2를 사용하는 환경의 경우 Amazon MWAA는 Apache Airflow 웹 서버에서 아웃바운드 트래픽을 제한하며, 웹 서버에 직접 플러그인이나 Python 종속성을 설치하는 것을 허용하지 않습니다. Apache Airflow v2.2.2부터 Amazon MWAA는 플러그인 및 종속 항목을 웹 서버에 직접 설치할 수 있습니다.

## 사용자 지정 플러그인의 예제
<a name="configuring-dag-plugins-airflow-ex"></a>

다음 섹션에서는 *Apache Airflow 참조 가이드*의 샘플 코드를 사용하여 로컬 개발 환경을 구성하는 방법을 설명합니다.

### plugins.zip 내 플랫 디렉터리 구조 사용 예제
<a name="configuring-dag-plugins-overview-simple"></a>

------
#### [ Apache Airflow v3 ]

다음 예제에서는 Apache Airflow v3에 플랫 디렉터리 구조가 있는 `plugins.zip` 파일을 보여줍니다.

**Example `PythonVirtualenvOperator` plugins.zip이 있는 플랫 디렉터리**  
다음 예제는 [Apache Airflow PythonVirtualenvOperator용 사용자 지정 플러그인 생성](samples-virtualenv.md)의 `PythonVirtualenvOperator` 사용자 지정 플러그인에 대한 plugins.zip 파일의 기본 수준 트리를 보여줍니다.  

```
├── virtual_python_plugin.py
```

**Example plugins/virtual\$1python\$1plugin.py**  
다음 예제는 `PythonVirtualenvOperator` 사용자 지정 플러그인을 보여줍니다.  

```
"""
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"""
from airflow.plugins_manager import AirflowPlugin
import airflow.utils.python_virtualenv 
from typing import List

def _generate_virtualenv_cmd(tmp_dir: str, python_bin: str, system_site_packages: bool) -> List[str]:
    cmd = ['python3','/usr/local/airflow/.local/lib/python3.7/site-packages/virtualenv', tmp_dir]
    if system_site_packages:
        cmd.append('--system-site-packages')
    if python_bin is not None:
        cmd.append(f'--python={python_bin}')
    return cmd

airflow.utils.python_virtualenv._generate_virtualenv_cmd=_generate_virtualenv_cmd

class VirtualPythonPlugin(AirflowPlugin):                
    name = 'virtual_python_plugin'
```

------
#### [ Apache Airflow v2 ]

다음 예제에서는 Apache Airflow v2에 플랫 디렉터리 구조가 있는 `plugins.zip` 파일을 보여줍니다.

**Example `PythonVirtualenvOperator` plugins.zip이 있는 플랫 디렉터리**  
다음 예제는 [Apache Airflow PythonVirtualenvOperator용 사용자 지정 플러그인 생성](samples-virtualenv.md)의 `PythonVirtualenvOperator` 사용자 지정 플러그인에 대한 plugins.zip 파일의 기본 수준 트리를 보여줍니다.  

```
├── virtual_python_plugin.py
```

**Example plugins/virtual\$1python\$1plugin.py**  
다음 예제는 `PythonVirtualenvOperator` 사용자 지정 플러그인을 보여줍니다.  

```
"""
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so.
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"""
from airflow.plugins_manager import AirflowPlugin
import airflow.utils.python_virtualenv 
from typing import List

def _generate_virtualenv_cmd(tmp_dir: str, python_bin: str, system_site_packages: bool) -> List[str]:
    cmd = ['python3','/usr/local/airflow/.local/lib/python3.7/site-packages/virtualenv', tmp_dir]
    if system_site_packages:
        cmd.append('--system-site-packages')
    if python_bin is not None:
        cmd.append(f'--python={python_bin}')
    return cmd

airflow.utils.python_virtualenv._generate_virtualenv_cmd=_generate_virtualenv_cmd

class VirtualPythonPlugin(AirflowPlugin):                
    name = 'virtual_python_plugin'
```

------

### plugins.zip 내 중첩 디렉터리 구조 사용 예제
<a name="configuring-dag-plugins-overview-complex"></a>

------
#### [ Apache Airflow v3 ]

다음 예제는 `hooks`, `operators` 및 `sensors` 디렉터리에 별도의 디렉터리가 있는 `plugins.zip` 파일을 나타냅니다.

**Example plugins.zip**  

```
__init__.py
my_airflow_plugin.py
 hooks/
  |-- __init__.py
  |-- my_airflow_hook.py
 operators/
  |-- __init__.py
  |-- my_airflow_operator.py
  |-- hello_operator.py
 sensors/
  |-- __init__.py
  |-- my_airflow_sensor.py
```

다음 예제는 사용자 지정 플러그인을 사용하는 DAG([DAG 폴더](https://docs.aws.amazon.com/mwaa/latest/userguide/configuring-dag-folder.html#configuring-dag-folder-how))의 가져오기 문을 보여줍니다.

**Example dags/your\$1dag.py**  

```
from airflow import DAG
from datetime import datetime, timedelta
from operators.my_airflow_operator import MyOperator
from sensors.my_airflow_sensor import MySensor
from operators.hello_operator import HelloOperator

default_args = {
	'owner': 'airflow',
	'depends_on_past': False,
	'start_date': datetime(2018, 1, 1),
	'email_on_failure': False,
	'email_on_retry': False,
	'retries': 1,
	'retry_delay': timedelta(minutes=5),
}


with DAG('customdag',
		 max_active_runs=3,
		 schedule_interval='@once',
		 default_args=default_args) as dag:

	sens = MySensor(
		task_id='taskA'
	)

	op = MyOperator(
		task_id='taskB',
		my_field='some text'
	)

	hello_task = HelloOperator(task_id='sample-task', name='foo_bar')



	sens >> op >> hello_task
```

**Example plugins/my\$1airflow\$1plugin.py**  

```
from airflow.plugins_manager import AirflowPlugin
from hooks.my_airflow_hook import *
from operators.my_airflow_operator import *
                    
class PluginName(AirflowPlugin):
                    
    name = 'my_airflow_plugin'
                    
    hooks = [MyHook]
    operators = [MyOperator]
    sensors = [MySensor]
```

다음 예제는 사용자 지정 플러그인 파일에 필요한 각 가져오기 문을 나타냅니다.

**Example hooks/my\$1airflow\$1hook.py**  

```
from airflow.hooks.base import BaseHook


class MyHook(BaseHook):

    def my_method(self):
        print("Hello World")
```

**Example sensors/my\$1airflow\$1sensor.py**  

```
from airflow.sensors.base import BaseSensorOperator
from airflow.utils.decorators import apply_defaults


class MySensor(BaseSensorOperator):

    @apply_defaults
    def __init__(self,
                 *args,
                 **kwargs):
        super(MySensor, self).__init__(*args, **kwargs)

    def poke(self, context):
        return True
```

**Example operators/my\$1airflow\$1operator.py**  

```
from airflow.operators.bash import BaseOperator
from airflow.utils.decorators import apply_defaults
from hooks.my_airflow_hook import MyHook


class MyOperator(BaseOperator):

    @apply_defaults
    def __init__(self,
                 my_field,
                 *args,
                 **kwargs):
        super(MyOperator, self).__init__(*args, **kwargs)
        self.my_field = my_field

    def execute(self, context):
        hook = MyHook('my_conn')
        hook.my_method()
```

**Example operators/hello\$1operator.py**  

```
from airflow.models.baseoperator import BaseOperator
from airflow.utils.decorators import apply_defaults

class HelloOperator(BaseOperator):

    @apply_defaults
    def __init__(
            self,
            name: str,
            **kwargs) -> None:
        super().__init__(**kwargs)
        self.name = name

    def execute(self, context):
        message = "Hello {}".format(self.name)
        print(message)
        return message
```

[Amazon MWAA CLI 유틸리티를 사용하여 사용자 지정 플러그인 테스트](#configuring-dag-plugins-cli-utility)를 하고 `plugins` 디렉터리 **내의** 내용을 압축하는 [plugins.zip 파일을 생성](#configuring-dag-plugins-zip)하는 단계를 따릅니다. 예를 들어 `cd plugins`입니다.

------
#### [ Apache Airflow v2 ]

다음 예제는 `hooks`, `operators` 및 `sensors` 디렉터리에 별도의 디렉터리가 있는 `plugins.zip` 파일을 나타냅니다.

**Example plugins.zip**  

```
__init__.py
 my_airflow_plugin.py
 hooks/
  |-- __init__.py
  |-- my_airflow_hook.py
 operators/
  |-- __init__.py
  |-- my_airflow_operator.py
  |-- hello_operator.py
 sensors/
  |-- __init__.py
  |-- my_airflow_sensor.py
```

다음 예제는 사용자 지정 플러그인을 사용하는 DAG([DAG 폴더](https://docs.aws.amazon.com/mwaa/latest/userguide/configuring-dag-folder.html#configuring-dag-folder-how))의 가져오기 문을 보여줍니다.

**Example dags/your\$1dag.py**  

```
from airflow import DAG
from datetime import datetime, timedelta
from operators.my_airflow_operator import MyOperator
from sensors.my_airflow_sensor import MySensor
from operators.hello_operator import HelloOperator

default_args = {
	'owner': 'airflow',
	'depends_on_past': False,
	'start_date': datetime(2018, 1, 1),
	'email_on_failure': False,
	'email_on_retry': False,
	'retries': 1,
	'retry_delay': timedelta(minutes=5),
}


with DAG('customdag',
		 max_active_runs=3,
		 schedule_interval='@once',
		 default_args=default_args) as dag:

	sens = MySensor(
		task_id='taskA'
	)

	op = MyOperator(
		task_id='taskB',
		my_field='some text'
	)

	hello_task = HelloOperator(task_id='sample-task', name='foo_bar')



	sens >> op >> hello_task
```

**Example plugins/my\$1airflow\$1plugin.py**  

```
from airflow.plugins_manager import AirflowPlugin
from hooks.my_airflow_hook import *
from operators.my_airflow_operator import *
                    
class PluginName(AirflowPlugin):
                    
    name = 'my_airflow_plugin'
                    
    hooks = [MyHook]
    operators = [MyOperator]
    sensors = [MySensor]
```

다음 예제는 사용자 지정 플러그인 파일에 필요한 각 가져오기 문을 나타냅니다.

**Example hooks/my\$1airflow\$1hook.py**  

```
from airflow.hooks.base import BaseHook


class MyHook(BaseHook):

    def my_method(self):
        print("Hello World")
```

**Example sensors/my\$1airflow\$1sensor.py**  

```
from airflow.sensors.base import BaseSensorOperator
from airflow.utils.decorators import apply_defaults


class MySensor(BaseSensorOperator):

    @apply_defaults
    def __init__(self,
                 *args,
                 **kwargs):
        super(MySensor, self).__init__(*args, **kwargs)

    def poke(self, context):
        return True
```

**Example operators/my\$1airflow\$1operator.py**  

```
from airflow.operators.bash import BaseOperator
from airflow.utils.decorators import apply_defaults
from hooks.my_airflow_hook import MyHook


class MyOperator(BaseOperator):

    @apply_defaults
    def __init__(self,
                 my_field,
                 *args,
                 **kwargs):
        super(MyOperator, self).__init__(*args, **kwargs)
        self.my_field = my_field

    def execute(self, context):
        hook = MyHook('my_conn')
        hook.my_method()
```

**Example operators/hello\$1operator.py**  

```
from airflow.models.baseoperator import BaseOperator
from airflow.utils.decorators import apply_defaults

class HelloOperator(BaseOperator):

    @apply_defaults
    def __init__(
            self,
            name: str,
            **kwargs) -> None:
        super().__init__(**kwargs)
        self.name = name

    def execute(self, context):
        message = "Hello {}".format(self.name)
        print(message)
        return message
```

[Amazon MWAA CLI 유틸리티를 사용하여 사용자 지정 플러그인 테스트](#configuring-dag-plugins-cli-utility)를 하고 `plugins` 디렉터리 **내의** 내용을 압축하는 [plugins.zip 파일을 생성](#configuring-dag-plugins-zip)하는 단계를 따릅니다. 예를 들어 `cd plugins`입니다.

------

## plugins.zip 파일 생성
<a name="configuring-dag-plugins-test-create"></a>

다음 단계에서는 로컬에서 plugins.zip 파일을 생성할 때 권장하는 단계를 설명합니다.

### 1단계: Amazon MWAA CLI 유틸리티를 사용하여 사용자 지정 플러그인 테스트
<a name="configuring-dag-plugins-cli-utility"></a>
+ 명령줄 인터페이스(CLI) 유틸리티는 Amazon Managed Workflows for Apache Airflow 환경을 로컬로 복제합니다.
+ CLI는 Amazon MWAA 프로덕션 이미지와 유사한 Docker 컨테이너 이미지를 로컬로 구축합니다. 이를 사용해 Amazon MWAA에 배포하기 전에 로컬 Apache Airflow 환경을 실행하여 DAG, 사용자 지정 플러그인 및 종속성을 개발하고 테스트할 수 있습니다.
+ CLI를 실행하려면 GitHub의 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)를 참조하세요.

### 2단계: plugins.zip 파일 생성
<a name="configuring-dag-plugins-zip"></a>

내장된 ZIP 아카이브 유틸리티 또는 기타 ZIP 유틸리티(예: [7zip](https://www.7-zip.org/download.html))를 사용하여.zip 파일을 생성할 수 있습니다.

**참고**  
Windows OS용 내장 zip 유틸리티는 .zip 파일을 생성할 때 하위 폴더를 추가할 수 있습니다. Amazon S3 버킷에 업로드하기 전에 plugins.zip 파일의 내용을 확인하여 추가 디렉터리가 추가되지 않도록 하는 것이 좋습니다.

1. 디렉터리를 로컬 Airflow 플러그인 디렉터리로 변경합니다. 예:

   ```
   myproject$ cd plugins
   ```

1. 다음 명령을 실행하여 내용에 실행 권한이 있는지 확인합니다(macOS 및 Linux만 해당).

   ```
   plugins$ chmod -R 755 .
   ```

1. `plugins` 폴더 **내** 내용을 압축합니다.

   ```
   plugins$ zip -r plugins.zip .
   ```

## Amazon S3에 `plugins.zip` 업로드
<a name="configuring-dag-plugins-upload"></a>

Amazon S3 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 Amazon S3 버킷에 `plugins.zip` 파일을 업로드할 수 있습니다.

### AWS CLI 사용
<a name="configuring-dag-plugins-upload-cli"></a>

AWS Command Line Interface(AWS CLI)는 명령줄 쉘의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다. 이 페이지에서 단계를 완료하려면 다음이 필요합니다.
+ [AWS CLI - 버전 2 설치](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)
+ [AWS CLI - 을 통한 빠른 구성.`aws configure`](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)

**AWS CLI를 사용하여 업로드하려면**

1. 명령 프롬프트에서 `plugins.zip` 파일이 저장된 디렉터리로 이동합니다. 예:

   ```
   cd plugins
   ```

1. 다음 명령을 사용하여 Amazon S3 버킷을 모두 나열합니다.

   ```
   aws s3 ls
   ```

1. 다음 명령을 사용하여 사용자 환경의 Amazon S3 버킷에 있는 파일과 폴더를 나열합니다.

   ```
   aws s3 ls s3://YOUR_S3_BUCKET_NAME
   ```

1. 다음 명령을 사용해서 사용자 환경의 Amazon S3 버킷에 `plugins.zip` 파일을 업로드합니다.

   ```
   aws s3 cp plugins.zip s3://amzn-s3-demo-bucket/plugins.zip
   ```

### Amazon S3 콘솔 사용
<a name="configuring-dag-plugins-upload-console"></a>

Amazon S3 콘솔은 Amazon S3 버킷의 리소스를 생성 및 관리할 수 있는 웹 기반 사용자 인터페이스입니다.

**Amazon S3 콘솔을 사용하여 업로드하려면**

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

1. 환경을 선택합니다.

1. **S3의 DAG 코드** 창에서 **S3 버킷** 링크를 선택하여 콘솔에서 스토리지 버킷을 엽니다.

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

1. **파일 추가**를 선택합니다.

1. `plugins.zip`의 로컬 사본을 선택하고 **업로드**를 선택합니다. 

## 사용자 환경에 사용자 지정 플러그인 설치
<a name="configuring-dag-plugins-mwaa-installing"></a>

이 섹션에서는 plugins.zip 파일의 경로를 지정하고 zip 파일이 업데이트될 때마다 plugins.zip 파일의 버전을 지정하여 Amazon S3 버킷에 업로드한 사용자 지정 플러그인을 설치하는 방법을 설명합니다.

### Amazon MWAA 콘솔에서 `plugins.zip`의 경로 지정(처음)
<a name="configuring-dag-plugins-mwaa-first"></a>

`plugins.zip`을 처음으로 Amazon S3 버킷에 업로드하는 경우 Amazon MWAA 콘솔에 파일 경로도 지정해야 합니다. 이 단계는 한 번만 완료하면 됩니다.

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

1. 환경을 선택합니다.

1. **편집**을 선택합니다.

1. **Amazon S3의 DAG 코드** 창에서 **플러그인 파일 - 옵션** 필드 옆의 **S3 찾아보기**를 선택합니다.

1. Amazon S3 버킷에 있는 `plugins.zip` 파일을 선택합니다.

1. **선택**을 선택합니다.

1. **다음**, **환경 업데이트**를 선택합니다.

### Amazon MWAA 콘솔에서 `plugins.zip` 버전 지정
<a name="configuring-dag-plugins-s3-mwaaconsole"></a>

Amazon S3 버킷에 사용자 `plugins.zip`의 새 버전을 업로드할 때마다 Amazon MWAA 콘솔에서 `plugins.zip` 파일의 버전을 지정해야 합니다.

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

1. 환경을 선택합니다.

1. **편집**을 선택합니다.

1. **Amazon S3의 DAG 코드** 창의 드롭다운 목록에서 `plugins.zip` 버전을 선택합니다.

1. **다음**을 선택합니다.

## plugins.zip 사용 사례 예제
<a name="configuring-dag-plugins-examples"></a>
+ [Apache Hive 및 Hadoop을 사용한 사용자 지정 플러그인](samples-hive.md)에서 사용자 지정 플러그인을 생성하는 방법을 알아봅니다.
+ [PythonVirtualenvOperator를 패치하는 사용자 지정 플러그인 ](samples-virtualenv.md)에서 사용자 지정 플러그인을 생성하는 방법을 알아봅니다.
+ [Oracle을 이용한 사용자 지정 플러그인](samples-oracle.md)에서 사용자 지정 플러그인을 생성하는 방법을 알아봅니다.
+ [Amazon MWAA에서 DAG 시간대 변경](samples-plugins-timezone.md)에서 사용자 지정 플러그인을 생성하는 방법을 알아봅니다.

## 다음 단계
<a name="configuring-dag-plugins-next-up"></a>

GitHub의 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)를 사용하여 DAG, 사용자 지정 플러그인, Python 종속성을 로컬에서 테스트합니다.

# Python 종속성 설치
<a name="working-dags-dependencies"></a>

Python 종속성이란 Amazon Managed Workflows for Apache Airflow 환경에서 Apache Airflow 버전의 Apache Airflow 기본 설치에 포함되지 않은 모든 패키지 또는 배포를 말합니다. 이 주제에서는 Amazon S3 버킷의 `requirements.txt` 파일을 사용하여 Amazon MWAA 환경에서 Apache Airflow Python 종속성을 설치하는 단계를 설명합니다.

**Contents**
+ [사전 조건](#working-dags-dependencies-prereqs)
+ [작동 방식](#working-dags-dependencies-how)
+ [Python 종속성 개요](#working-dags-dependencies-overview)
  + [Python 종속성 위치와 크기 제한](#working-dags-dependencies-quota)
+ [requirements.txt 파일 생성](#working-dags-dependencies-test-create)
  + [1단계: Amazon MWAA CLI 유틸리티를 사용하여 Python 종속성 테스트](#working-dags-dependencies-cli-utility)
  + [2단계: `requirements.txt` 생성](#working-dags-dependencies-syntax-create)
+ [Amazon S3에 `requirements.txt` 업로드](#configuring-dag-dependencies-upload)
  + [사용 AWS CLI](#configuring-dag-dependencies-upload-cli)
  + [Amazon S3 콘솔 사용](#configuring-dag-dependencies-upload-console)
+ [사용자 환경에 Python 종속성 설치](#configuring-dag-dependencies-installing)
  + [Amazon MWAA 콘솔에서 `requirements.txt`의 경로 지정(처음)](#configuring-dag-dependencies-first)
  + [Amazon MWAA 콘솔에서 `requirements.txt` 버전 지정](#working-dags-dependencies-mwaaconsole-version)
+ [`requirements.txt`에 대한 로그 액세스](#working-dags-dependencies-logs)
+ [다음 단계](#working-dags-dependencies-next-up)

## 사전 조건
<a name="working-dags-dependencies-prereqs"></a>

이 페이지의 단계를 완료하려면 먼저 다음이 필요합니다.
+ **권한 **- 관리자가 환경에 대한 [AmazonMWAAFullConsoleAccess](access-policies.md#console-full-access) 액세스 제어 정책에 대한 액세스 권한을 부여해야 AWS 계정 합니다. 또한 Amazon MWAA 환경은 [실행 역할](mwaa-create-role.md)이 환경에서 사용하는 AWS 리소스에 액세스할 수 있도록 허용해야 합니다.
+ **액세스** — 종속성을 웹 서버에 직접 설치하기 위해 퍼블릭 리포지토리에 액세스해야 하는 경우 **퍼블릭 네트워크** 웹 서버 액세스로 환경을 구성해야 합니다. 자세한 정보는 [Apache Airflow 액세스 모드](configuring-networking.md) 섹션을 참조하세요.
+ **Amazon S3 구성** — DAG, `plugins.zip`의 사용자 지정 플러그인 및 `requirements.txt`의 Python 종속성을 저장하는 데 사용되는 [Amazon S3 버킷](mwaa-s3-bucket.md)은 *퍼블릭 액세스가 차단*되고 *버전 관리가 활성화*된 상태로 구성되어야 합니다.

## 작동 방식
<a name="working-dags-dependencies-how"></a>

Amazon S3 버킷에 `requirements.txt` 파일을 업로드한 다음 파일을 업데이트할 때마다 Amazon MWAA 콘솔에서 파일 버전을 지정하여 모든 Python 종속성을 Amazon MWAA에 설치합니다. Apache Airflow 스케줄러와 각 작업자에 Python 종속성을 `pip3 install -r requirements.txt` 설치하기 위해 Amazon MWAA를 실행합니다.

사용자 환경에서 Python 종속성을 실행하려면 다음 세 가지 작업을 수행해야 합니다.

1. 로컬에서 `requirements.txt` 파일을 생성합니다.

1. Amazon S3 버킷에 로컬 `requirements.txt`을 업로드합니다.

1. Amazon MWAA 콘솔의 **요구 사항 파일** 필드에 이 파일의 버전을 지정합니다.

**참고**  
`requirements.txt`을 처음으로 생성하여 Amazon S3 버킷에 업로드하는 경우 Amazon MWAA 콘솔에 파일 경로도 지정해야 합니다. 이 단계는 한 번만 완료하면 됩니다.

## Python 종속성 개요
<a name="working-dags-dependencies-overview"></a>

사용자 환경에 프라이빗 Pypi/PEP-503 호환 리포지토리에서 호스팅되는 Python 패키지 인덱스(PyPI.org), Python wheel(`.whl`) 또는 Python 종속 항목으로부터 Apache Airflow 추가 내용과 기타 Python 종속성을 설치할 수 있습니다. 

### Python 종속성 위치와 크기 제한
<a name="working-dags-dependencies-quota"></a>

Apache Airflow `requirements.txt`스케줄러와 작업자는 파일에서 패키지를 검색하고 이 패키지는 `/usr/local/airflow/.local/bin`의 환경에 설치됩니다.
+ **크기 제한**. 전체 크기가 1GB 미만인 라이브러리를 참조하는 `requirements.txt` 파일을 사용하는 것이 좋습니다. Amazon MWAA에 설치해야 하는 라이브러리가 많을수록 환경에서 *시작* 시간이 길어집니다. Amazon MWAA가 설치된 라이브러리의 크기를 명시적으로 제한하지 않지만, 종속성을 10분 이내에 설치할 수 없는 경우 Fargate 서비스는 시간을 초과하여 환경을 안정적인 상태로 롤백하려고 시도합니다.

## requirements.txt 파일 생성
<a name="working-dags-dependencies-test-create"></a>

다음 단계에서는 로컬에서 requirements.txt 파일을 생성할 때 권장하는 단계를 설명합니다.

### 1단계: Amazon MWAA CLI 유틸리티를 사용하여 Python 종속성 테스트
<a name="working-dags-dependencies-cli-utility"></a>
+ 명령줄 인터페이스(CLI) 유틸리티는 Amazon Managed Workflows for Apache Airflow 환경을 로컬로 복제합니다.
+ CLI는 Amazon MWAA 프로덕션 이미지와 유사한 Docker 컨테이너 이미지를 로컬로 구축합니다. 이를 사용해 Amazon MWAA에 배포하기 전에 로컬 Apache Airflow 환경을 실행하여 DAG, 사용자 지정 플러그인 및 종속성을 개발하고 테스트할 수 있습니다.
+ CLI를 실행하려면 GitHub의 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)를 참조하세요.

### 2단계: `requirements.txt` 생성
<a name="working-dags-dependencies-syntax-create"></a>

다음 섹션에서는 `requirements.txt` 파일의 [Python 패키지 인덱스](https://pypi.org/)에서 Python 종속성을 지정하는 방법을 설명합니다.

------
#### [ Apache Airflow v3 ]

1. **로컬 테스트**. `requirements.txt` 파일을 생성하기 전에 라이브러리를 반복적으로 추가하여 패키지와 버전의 적절한 조합을 찾습니다. Amazon MWAA CLI 유틸리티를 실행하려면 GitHub의 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)를 참조하세요.

1. **Apache Airflow 패키지 엑스트라를 검토합니다.** Amazon MWAA의 Apache Airflow v3에 설치된 패키지 목록에 액세스하려면 GitHub 웹 사이트의 [aws-mwaa-docker-images`requirements.txt`](https://github.com/aws/amazon-mwaa-docker-images/blob/main/requirements.txt)를 참조하세요.

1. **제약 조건 문을 추가합니다**. 파일 상단에 Apache Airflow v3 환경의 제약 조건 `requirements.txt` 파일을 추가합니다. Apache Airflow 제약 조건 파일은 Apache Airflow 릴리스 당시 사용할 수 있는 공급자 버전을 지정합니다.

    다음 예제에서는 *\$1environment-version\$1*을 사용자 환경의 버전 번호로 바꾸고 *\$1Python-version\$1*을 사용자 환경과 호환되는 Python의 버전으로 바꿉니다.

   Apache Airflow 환경과 호환되는 Python 버전에 대한 자세한 내용은 [Apache Airflow 버전](airflow-versions.md#airflow-versions-official)을 참조하세요.

   ```
   --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-{Airflow-version}/constraints-{Python-version}.txt"
   ```

    제약 조건 파일에서 `xyz==1.0` 패키지가 사용자 환경의 다른 패키지와 호환되지 않는 것으로 확인되면 `pip3 install`은 호환되지 않는 라이브러리가 환경에 설치되는 것을 막을 수 없습니다. 패키지 설치에 실패하는 경우, CloudWatch Logs의 해당 로그 스트림에서 각 Apache Airflow 구성 요소(스케줄러, 작업자, 웹 서버)에 대한 오류 로그에 액세스할 수 있습니다. 로그 유형에 대한 자세한 내용은 [Amazon CloudWatch에서 Airflow 로그 액세스](monitoring-airflow.md) 섹션을 참조하세요.

1. **Apache Airflow 패키지** [패키지 엑스트라](http://airflow.apache.org/docs/apache-airflow/2.5.1/extra-packages-ref.html) 및 버전(`==`)을 추가합니다. 이렇게 하면 이름은 같지만 버전이 다른 패키지가 사용자 환경에 설치되는 것을 방지할 수 있습니다.

   ```
   apache-airflow[package-extra]==2.5.1
   ```

1. **Python 라이브러리**. `requirements.txt` 파일에 패키지 이름과 버전(`==`)을 추가합니다. 이렇게 하면 [Pypi.org](https://pypi.org)의 향후 주요 업데이트가 자동으로 적용되는 것을 방지하는 데 도움이 됩니다.

   ```
   library == version
   ```  
**Example Boto3 및 psycopg2-binary**  

   이 예제는 데모용으로 제공됩니다. boto 및 psycopg2-binary 라이브러리는 Apache Airflow v3 기본 설치에 포함되어 있으며 `requirements.txt` 파일에서 지정할 필요가 없습니다.

   ```
   boto3==1.17.54
   boto==2.49.0
   botocore==1.20.54
   psycopg2-binary==2.8.6
   ```

   버전 정보 없이 패키지를 지정한 경우 Amazon MWAA는 [PyPI.org](https://pypi.org)의 최신 버전의 패키지를 설치합니다. 이 버전은 `requirements.txt`에 있는 다른 패키지와 충돌할 수 있습니다.

------
#### [ Apache Airflow v2 ]

1. **로컬 테스트**. `requirements.txt` 파일을 생성하기 전에 라이브러리를 반복적으로 추가하여 패키지와 버전의 적절한 조합을 찾습니다. Amazon MWAA CLI 유틸리티를 실행하려면 GitHub의 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)를 참조하세요.

1. **Apache Airflow 패키지 엑스트라를 검토합니다.** Amazon MWAA의 Apache Airflow v2에 설치된 패키지 목록에 액세스하려면 GitHub 웹 사이트에서 [aws-mwaa-docker-images`requirements.txt`](https://github.com/aws/amazon-mwaa-docker-images/blob/main/requirements.txt)에 액세스합니다.

1. **제약 조건 문을 추가합니다**. `requirements.txt` 파일 상단에 Apache Airflow v2 환경에 대한 제약 조건 파일을 추가합니다. Apache Airflow 제약 조건 파일은 Apache Airflow 릴리스 당시 사용할 수 있는 공급자 버전을 지정합니다.

    Apache Airflow v2.7.2부터 요구 사항 파일에 `--constraint` 문이 포함되어야 합니다. 제약 조건을 제공하지 않으면 Amazon MWAA에서 요구 사항에 나열된 패키지가 사용 중인 Apache Airway 버전과 호환되도록 제약 조건을 지정합니다.

   다음 예제에서는 *\$1environment-version\$1*을 사용자 환경의 버전 번호로 바꾸고 *\$1Python-version\$1*을 사용자 환경과 호환되는 Python의 버전으로 바꿉니다.

   Apache Airflow 환경과 호환되는 Python 버전에 대한 자세한 내용은 [Apache Airflow 버전](airflow-versions.md#airflow-versions-official)을 참조하세요.

   ```
   --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-{Airflow-version}/constraints-{Python-version}.txt"
   ```

   제약 조건 파일에서 `xyz==1.0` 패키지가 사용자 환경의 다른 패키지와 호환되지 않는 것으로 확인되면 `pip3 install`은 호환되지 않는 라이브러리가 환경에 설치되는 것을 막을 수 없습니다. 패키지 설치에 실패하는 경우, CloudWatch Logs의 해당 로그 스트림에서 각 Apache Airflow 구성 요소(스케줄러, 작업자, 웹 서버)에 대한 오류 로그에 액세스할 수 있습니다. 로그 유형에 대한 자세한 내용은 [Amazon CloudWatch에서 Airflow 로그 액세스](monitoring-airflow.md) 섹션을 참조하세요.

1. **Apache Airflow 패키지** [패키지 엑스트라](http://airflow.apache.org/docs/apache-airflow/2.5.1/extra-packages-ref.html) 및 버전(`==`)을 추가합니다. 이렇게 하면 이름은 같지만 버전이 다른 패키지가 사용자 환경에 설치되는 것을 방지할 수 있습니다.

   ```
   apache-airflow[package-extra]==2.5.1
   ```

1. **Python 라이브러리**. `requirements.txt` 파일에 패키지 이름과 버전(`==`)을 추가합니다. 이렇게 하면 [Pypi.org](https://pypi.org)의 향후 주요 업데이트가 자동으로 적용되는 것을 방지하는 데 도움이 됩니다.

   ```
   library == version
   ```  
**Example Boto3 및 psycopg2-binary**  

   이 예제는 데모용으로 제공됩니다. boto 및 psycopg2-binary 라이브러리는 Apache Airflow v2 기본 설치에 포함되어 있으며 `requirements.txt` 파일에서 지정할 필요가 없습니다.

   ```
   boto3==1.17.54
   boto==2.49.0
   botocore==1.20.54
   psycopg2-binary==2.8.6
   ```

   버전 정보 없이 패키지를 지정한 경우 Amazon MWAA는 [PyPI.org](https://pypi.org)의 최신 버전의 패키지를 설치합니다. 이 버전은 `requirements.txt`에 있는 다른 패키지와 충돌할 수 있습니다.

------

## Amazon S3에 `requirements.txt` 업로드
<a name="configuring-dag-dependencies-upload"></a>

Amazon S3 콘솔 또는 AWS Command Line Interface (AWS CLI)를 사용하여 Amazon S3 버킷에 `requirements.txt` 파일을 업로드할 수 있습니다.

### 사용 AWS CLI
<a name="configuring-dag-dependencies-upload-cli"></a>

 AWS Command Line Interface (AWS CLI)는 명령줄 셸에서 명령을 사용하여 AWS 서비스와 상호 작용하는 데 사용할 수 있는 오픈 소스 도구입니다. 이 페이지에서 단계를 완료하려면 다음이 필요합니다.
+ [AWS CLI - 버전 2를 설치합니다](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html).
+ [AWS CLI -를 사용한 빠른 구성`aws configure`](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html).

**를 사용하여 업로드하려면 AWS CLI**

1. 다음 명령을 사용하여 Amazon S3 버킷을 모두 나열합니다.

   ```
   aws s3 ls
   ```

1. 다음 명령을 사용하여 사용자 환경의 Amazon S3 버킷에 있는 파일과 폴더를 나열합니다.

   ```
   aws s3 ls s3://YOUR_S3_BUCKET_NAME
   ```

1. 다음 명령은 Amazon S3 버킷에 `requirements.txt` 파일을 업로드합니다.

   ```
   aws s3 cp requirements.txt s3://amzn-s3-demo-bucket/requirements.txt
   ```

### Amazon S3 콘솔 사용
<a name="configuring-dag-dependencies-upload-console"></a>

Amazon S3 콘솔은 Amazon S3 버킷의 리소스를 생성 및 관리할 수 있는 웹 기반 사용자 인터페이스입니다.

**Amazon S3 콘솔을 사용하여 업로드하려면**

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

1. 환경을 선택합니다.

1. **S3의 DAG 코드** 창에서 **S3 버킷** 링크를 선택하여 콘솔에서 스토리지 버킷을 엽니다.

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

1. **파일 추가**를 선택합니다.

1. `requirements.txt`의 로컬 사본을 선택하고 **업로드**를 선택합니다. 

## 사용자 환경에 Python 종속성 설치
<a name="configuring-dag-dependencies-installing"></a>

이 섹션에서는 requirements.txt 파일의 경로를 지정하고 업데이트될 때마다 requirements.txt 파일의 버전을 지정하여 Amazon S3 버킷에 업로드한 종속성을 설치하는 방법을 설명합니다.

### Amazon MWAA 콘솔에서 `requirements.txt`의 경로 지정(처음)
<a name="configuring-dag-dependencies-first"></a>

`requirements.txt`을 처음으로 생성하여 Amazon S3 버킷에 업로드하는 경우 Amazon MWAA 콘솔에 파일 경로도 지정해야 합니다. 이 단계는 한 번만 완료하면 됩니다.

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

1. 환경을 선택합니다.

1. **편집**을 선택합니다.

1. **Amazon S3의 DAG 코드** 창에서 **요구 사항 파일 - 옵션** 필드 옆의 **S3 찾아보기**를 선택합니다.

1. Amazon S3 버킷에 있는 `requirements.txt` 파일을 선택합니다.

1. **선택**을 선택합니다.

1. **다음**, **환경 업데이트**를 선택합니다.

환경 업데이트가 완료된 후 즉시 새 패키지 사용을 시작할 수 있습니다.

### Amazon MWAA 콘솔에서 `requirements.txt` 버전 지정
<a name="working-dags-dependencies-mwaaconsole-version"></a>

Amazon S3 버킷에 사용자 `requirements.txt`의 새 버전을 업로드할 때마다 Amazon MWAA 콘솔에서 `requirements.txt` 파일의 버전을 지정해야 합니다.

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

1. 환경을 선택합니다.

1. **편집**을 선택합니다.

1. **Amazon S3의 DAG 코드** 창의 드롭다운 목록에서 `requirements.txt` 버전을 선택합니다.

1. **다음**, **환경 업데이트**를 선택합니다.

환경 업데이트가 완료된 후 즉시 새 패키지 사용을 시작할 수 있습니다.

## `requirements.txt`에 대한 로그 액세스
<a name="working-dags-dependencies-logs"></a>

워크플로우를 예약하고 `dags` 폴더를 구문 분석하는 스케줄러에 대한 Apache Airflow 로그를 볼 수 있습니다. 다음 단계에서는 Amazon MWAA 콘솔에서 스케줄러에 대한 로그 그룹을 여는 방법과 CloudWatch Logs 콘솔에서 Apache Airflow 로그를 액세스하는 방법을 설명합니다.

**`requirements.txt`에 대한 로그에 액세스하려면**

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

1. 환경을 선택합니다.

1. **모니터링** 창에서 **Airflow 스케줄러 로그 그룹**을 선택합니다.

1. **로그 스트림**에서 `requirements_install_ip` 로그를 선택합니다.

1. `/usr/local/airflow/.local/bin`에서 환경에 설치된 패키지 목록을 참조하세요. 예제:

   ```
   Collecting appdirs==1.4.4 (from -r /usr/local/airflow/.local/bin (line 1))
   Downloading https://files.pythonhosted.org/packages/3b/00/2344469e2084fb28kjdsfiuyweb47389789vxbmnbjhsdgf5463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl  
   Collecting astroid==2.4.2 (from -r /usr/local/airflow/.local/bin (line 2))
   ```

1. 패키지 목록을 검토하고 설치 중에 오류가 발생했는지 여부를 검토합니다. 문제가 발생한 경우, 다음과 비슷한 오류가 표시됩니다.

   ```
   2021-03-05T14:34:42.731-07:00
   No matching distribution found for LibraryName==1.0.0 (from -r /usr/local/airflow/.local/bin (line 4))
   No matching distribution found for LibraryName==1.0.0 (from -r /usr/local/airflow/.local/bin (line 4))
   ```

## 다음 단계
<a name="working-dags-dependencies-next-up"></a>

GitHub의 [aws-mwaa-docker-images](https://github.com/aws/amazon-mwaa-docker-images)를 사용하여 DAG, 사용자 지정 플러그인, Python 종속성을 로컬에서 테스트합니다.

# Amazon S3에서 파일 삭제
<a name="working-dags-delete"></a>

이 페이지에서는 Amazon Managed Workflows for Apache Airflow 환경의 Amazon S3 버킷에서 버전 관리가 작동하는 방식과 DAG, `plugins.zip` 또는 `requirements.txt` 파일을 삭제하는 단계를 설명합니다.

**Contents**
+ [사전 조건](#working-dags-delete-prereqs)
+ [버전 관리 개요](#working-dags-delete-overview)
+ [작동 방법](#working-dags-delete-how)
+ [Amazon S3에서 DAG 삭제](#working-dags-s3-dag-delete)
+ [환경에서 “현재” requirements.txt 또는 plugins.zip 제거](#working-dags-s3-delete-version-c)
+ [“최신이 아닌" (이전) requirements.txt 또는 plugins.zip 버전 삭제](#working-dags-s3-delete-version-p)
+ [수명 주기를 사용하여 “최신이 아닌" (이전) 버전을 삭제하고 마커를 자동으로 삭제합니다.](#working-dags-s3-delete-lifecycle)
+ [requirements.txt “최신이 아닌” 버전을 삭제하고 마커를 자동으로 삭제하는 수명 주기 정책 예시](#working-dags-s3-delete-lifecycle-ex)
+ [다음 단계](#working-dags-s3-delete-next-up)

## 사전 조건
<a name="working-dags-delete-prereqs"></a>

이 페이지의 단계를 완료하려면 먼저 다음이 필요합니다.
+ **권한** — 관리자가 사용자 환경의 [AmazonMWAAFullConsoleAccess](access-policies.md#console-full-access) 액세스 제어 정책에 대한 액세스 권한을 AWS 계정에 부여했어야 합니다. 또한 [실행 역할](mwaa-create-role.md)이 Amazon MWAA 환경에서 사용자 환경에서 사용하는 AWS 리소스에 액세스할 수 있도록 허용해야 합니다.
+ **액세스** — 종속성을 웹 서버에 직접 설치하기 위해 퍼블릭 리포지토리에 액세스해야 하는 경우 **퍼블릭 네트워크** 웹 서버 액세스로 환경을 구성해야 합니다. 자세한 정보는 [Apache Airflow 액세스 모드](configuring-networking.md) 섹션을 참조하세요.
+ **Amazon S3 구성** — DAG, `plugins.zip`의 사용자 지정 플러그인 및 `requirements.txt`의 Python 종속성을 저장하는 데 사용되는 [Amazon S3 버킷](mwaa-s3-bucket.md)은 *퍼블릭 액세스가 차단*되고 *버전 관리가 활성화*된 상태로 구성되어야 합니다.

## 버전 관리 개요
<a name="working-dags-delete-overview"></a>

Amazon S3 버킷의 `requirements.txt` 및 `plugins.zip`에는 버전이 지정되어 있습니다. 객체에 대해 Amazon S3 버킷 버전 관리를 활성화하고 Amazon S3 버킷에서 아티팩트(예: plugins.zip)를 삭제해도 파일이 완전히 삭제되지는 않습니다. Amazon S3에서 아티팩트가 삭제될 때마다 `I'm not here`라는 404(객체를 찾을 수 없음) 오류/0k 파일인 새 파일 사본이 생성됩니다. Amazon S3에서는 이를 *삭제 마커*라고 합니다. 삭제 마커는 다른 객체들과 마찬가지로 키 이름(또는 키)과 버전 ID를 가진 파일의 "null" 버전입니다.

Amazon S3 버킷의 스토리지 비용을 줄이려면 파일 버전과 삭제 마커를 주기적으로 삭제하는 것이 좋습니다. “최신 버전이 아닌" (이전) 파일 버전을 완전히 삭제하려면 파일 버전을 삭제한 다음 해당 버전의 *삭제 마커*를 삭제해야 합니다.

## 작동 방법
<a name="working-dags-delete-how"></a>

Amazon MWAA는 30초마다 Amazon S3 버킷에서 동기화 작업을 실행합니다. 그러면 Amazon S3 버킷의 모든 DAG 삭제가 Fargate 컨테이너의 에어플로 이미지에 동기화됩니다.

`plugins.zip` 및 `requirements.txt` 파일의 경우 Amazon MWAA가 사용자 지정 플러그인 및 Python 종속성을 사용하여 Fargate 컨테이너의 새 Airflow 이미지를 빌드할 때 환경 업데이트 이후에만 변경이 발생합니다. `requirements.txt` 또는 `plugins.zip` 파일의 *현재* 버전을 삭제한 다음 삭제된 파일에 대한 새 버전을 제공하지 않고 환경을 업데이트하면 업데이트가 실패하고 `Unable to read version {version number} of file {file name}`와 같은 오류 메시지가 표시됩니다.

## Amazon S3에서 DAG 삭제
<a name="working-dags-s3-dag-delete"></a>

DAG 파일(`.py`)은 버전이 지정되지 않으며 Amazon S3 콘솔에서 직접 삭제할 수 있습니다. 다음 단계는 Amazon S3 버킷에서 DAG를 삭제하는 방법을 설명합니다.

**DAG를 삭제하려면**

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

1. 환경을 선택합니다.

1. **S3의 DAG 코드** 창에서 **S3 버킷** 링크를 선택하여 콘솔에서 스토리지 버킷을 엽니다.

1. `dags` 폴더를 선택합니다.

1. DAG를 선택하고 **삭제**를 선택합니다.

1. **객체를 삭제하시겠습니까?**에서 `delete`를 입력합니다.

1. **객체 삭제**를 선택합니다.

**참고**  
Apache Airflow는 과거 DAG 실행을 보존합니다. Apache Airflow에서 DAG를 실행한 후에는 Apache Airflow에서 DAG를 삭제할 때까지 파일 상태에 관계없이 Airflow DAG 목록에 남아 있습니다. Apache Airflow에서 DAG를 삭제하려면 **링크** 열에서 빨간색 “삭제” 버튼을 선택합니다.

## 환경에서 “현재” requirements.txt 또는 plugins.zip 제거
<a name="working-dags-s3-delete-version-c"></a>

현재 plugins.zip 또는 requirements.txt 를 추가한 후 해당 환경에서 제거할 수 있는 방법은 없지만, 현재 해결 중입니다. 그 동안 해결 방법은 빈 텍스트 또는 zip 파일을 각각 가리키는 것입니다.

## “최신이 아닌" (이전) requirements.txt 또는 plugins.zip 버전 삭제
<a name="working-dags-s3-delete-version-p"></a>

Amazon S3 버킷의 `requirements.txt` 및 `plugins.zip` 파일은 Amazon MWAA에서 버전이 관리됩니다. Amazon S3 버킷에서 이러한 파일을 완전히 삭제하려면 객체의 현재 버전(121212)(예: plugins.zip)을 검색하고 버전을 삭제한 다음 파일 버전의 *삭제 마커*를 제거해야 합니다.

Amazon S3 콘솔에서 “최신이 아닌” (이전) 파일 버전을 삭제할 수도 있지만, 그래도 다음 옵션 중 하나를 사용하여 *삭제 마커*를 삭제해야 합니다.
+ 객체 버전을 검색하려면 *Amazon S3 가이드*의 [버전 관리를 사용하는 버킷에서 객체 버전 검색](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RetrievingObjectVersions.html)을 참조하세요.
+ 객체 버전을 삭제하려면 *Amazon S3 가이드*의 [버전 관리를 사용하는 버킷에서 객체 버전 삭제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjectVersions.html)를 참조하세요.
+ 삭제 마커를 제거하려면 *Amazon S3 가이드*의 [삭제 마커 관리](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManagingDelMarkers.html)를 참조하세요.

## 수명 주기를 사용하여 “최신이 아닌" (이전) 버전을 삭제하고 마커를 자동으로 삭제합니다.
<a name="working-dags-s3-delete-lifecycle"></a>

특정 일수가 지나면 Amazon S3 버킷에서 plugins.zip 및 requirements.txt 파일의 “최신이 아닌” (이전) 버전을 삭제하거나 만료된 객체의 삭제 마커를 제거하도록 Amazon S3 버킷에 대한 수명 주기 정책을 구성할 수 있습니다.

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

1. 환경을 선택합니다.

1. **Amazon S3의 DAG 코드**에서 Amazon S3 버킷을 선택합니다.

1. **수명 주기 규칙 생성**을 선택합니다.

## requirements.txt “최신이 아닌” 버전을 삭제하고 마커를 자동으로 삭제하는 수명 주기 정책 예시
<a name="working-dags-s3-delete-lifecycle-ex"></a>

다음 예제를 사용하여 requirements.txt 파일의 “최신이 아닌” 버전과 30일 후 삭제 마커를 영구 삭제하는 수명 주기 규칙을 생성합니다.

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

1. 환경을 선택합니다.

1. **Amazon S3의 DAG 코드**에서 Amazon S3 버킷을 선택합니다.

1. **수명 주기 규칙 생성**을 선택합니다.

1. **수명 주기 규칙 이름**에 `Delete previous requirements.txt versions and delete markers after thirty days`를 입력합니다.

1. **접두사**, **요구 사항**에서.

1. **수명 주기 규칙 작업**에서 **이전 버전의 객체 영구 삭제** 및 **만료된 삭제 마커 또는 미완료 멀티파트 업로드 삭제**를 선택합니다.

1. **객체가 이전 버전이 된 후 경과한 일수**에 `30`을 입력합니다.

1. **만료된 객체 삭제 마커**에서 **만료된 객체 삭제 마커 삭제를 선택하면 30일 후에 객체가 영구적으로 삭제됩니다**.

## 다음 단계
<a name="working-dags-s3-delete-next-up"></a>
+ [삭제 마커 관리](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)에서 Amazon S3 삭제 마커에 대해 자세히 알아봅니다.
+ Amazon S3 수명 주기에 대해 자세히 알아보려면 [객체 만료](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-expire-general-considerations.html)를 참조하세요.