

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

# Apache Airflow에 액세스


Amazon MWAA를 사용하면 Apache Airflow 사용자 인터페이스(UI) 콘솔, Apache Airflow CLI, Apache Airflow REST API 등 여러 방법으로 Apache Airflow 환경에 액세스할 수 있습니다. Amazon MWAA 콘솔을 사용하여 Apache Airflow UI에서 DAG에 액세스하고 호출하거나, Amazon MWAA API를 사용하여 토큰을 얻고 DAG를 호출할 수 있습니다. 이 섹션에서는 Apache Airflow UI에 액세스하는 데 필요한 권한, 명령 쉘에서 직접 Amazon MWAA API를 호출하기 위한 토큰을 생성하는 방법, Apache Airflow CLI에서 지원되는 명령에 대해 설명합니다.

**Topics**
+ [

## 사전 조건
](#access-airflow-ui-prereqs)
+ [

## Apache Airflow UI 열기
](#access-airflow-ui-onconsole)
+ [

## Apache Airflow에 로그인
](#airflow-access-and-login)
+ [

# Apache Airflow 웹 서버 액세스 토큰 생성
](call-mwaa-apis-web.md)
+ [

# Apache Airflow 웹 서버에 대한 사용자 지정 도메인 설정
](configuring-custom-domain.md)
+ [

# Apache Airflow CLI 토큰 생성
](call-mwaa-apis-cli.md)
+ [

# Apache Airflow REST API 사용
](access-mwaa-apache-airflow-rest-api.md)
+ [

# Apache Airflow CLI 명령 참조
](airflow-cli-command-reference.md)

## 사전 조건


다음 섹션에서는 이 섹션의 명령과 스크립트를 사용하는 데 필요한 예비 단계를 설명합니다.

### 액세스

+ AWS 계정 AWS Identity and Access Management (IAM)에서의 Amazon MWAA 권한 정책에 액세스합니다[Apache Airflow UI 액세스 정책: AmazonMWAAWebServerAccess](access-policies.md#web-ui-access).
+ AWS 계정 AWS Identity and Access Management (IAM)에서 Amazon MWAA 권한 정책에 액세스합니다[전체 API 및 콘솔 액세스 정책: AmazonMWAFullaPiAccess](access-policies.md#full-access-policy).

### AWS CLI


 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).

## Apache Airflow UI 열기


다음 이미지는 Amazon MWAA 콘솔의 Apache Airflow UI에 대한 링크를 보여줍니다.

![\[이 이미지는 Amazon MWAA 콘솔의 Apache Airflow UI에 대한 링크를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/mwaa/latest/userguide/images/mwaa-console-aa-ui.png)


## Apache Airflow에 로그인


Apache Airflow UI에 액세스하려면 AWS 계정 in AWS Identity and Access Management (IAM)에 대한 [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 열기**를 선택합니다.

# Apache Airflow 웹 서버 액세스 토큰 생성
웹 서버 액세스 토큰 생성

이 페이지의 명령을 사용하여 웹 서버 액세스 토큰을 생성할 수 있습니다. 액세스 토큰은 Amazon MWAA 환경에 대한 액세스 권한을 제공합니다. 예를 들어, 토큰을 얻은 다음 Amazon MWAA API를 사용하여 프로그래밍 방식으로 DAG를 배포할 수 있습니다. 다음 섹션에는 AWS CLI, bash 스크립트, POST API 요청 또는 Python 스크립트를 사용하여 Apache Airflow 웹 로그인 토큰을 생성하는 단계가 포함되어 있습니다. 응답에 반환되는 토큰은 60초 동안 유효합니다.

**중요**  
2025년 8월 19일부로 Amazon MWAA는 IPv6 엔드포인트에 대한 지원을 추가했으며 이제 IPv4 및 IPv6 엔드포인트를 지원합니다. 이 날짜부터 새로 생성된 모든 환경은 Airflow 사용자 인터페이스(UI)에 `.on.aws` 도메인을 사용합니다. 고객은 새로 생성된 환경의 Airflow UI를 `.amazonaws.com` 도메인에서 `.on.aws` 도메인으로 마이그레이션해야 합니다. 웹 서버 및 데이터베이스에 대한 Virtual Private Cloud(VPC) 엔드포인트 서비스는 별도의 변경 없이 현재 `.amazonaws.com` 도메인을 유지합니다.

**Contents**
+ [

## 사전 조건
](#call-mwaa-apis-web-prereqs)
  + [

### 액세스
](#access-airflow-ui-prereqs-access)
  + [

### AWS CLI
](#access-airflow-ui-prereqs-cli)
+ [

## AWS CLI 사용
](#create-web-login-token-cli)
+ [

## bash 스크립트 사용
](#create-web-login-token-bash)
+ [

## Python 스크립트 사용
](#create-web-login-token-python)
+ [

## 다음 단계
](#mwaa-webcli-next-up)

## 사전 조건


다음 섹션에서는 이 페이지의 명령과 스크립트를 사용하는 데 필요한 예비 단계를 설명합니다.

### 액세스

+ Amazon MWAA 권한 정책 [Apache Airflow UI 액세스 정책: AmazonMWAAWebServerAccess](access-policies.md#web-ui-access)에 대한 AWS Identity and Access Management(IAM)의 AWS 계정 계정 액세스
+ Amazon MWAA 권한 정책 [전체 API 및 콘솔 액세스 정책: AmazonMWAFullaPiAccess](access-policies.md#full-access-policy)에 대한 AWS Identity and Access Management(IAM)의 AWS 계정 계정 액세스

### AWS CLI


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 사용


다음 예제에서는 AWS CLI에서 [create-web-login-token](https://docs.aws.amazon.com/cli/latest/reference/mwaa/create-web-login-token.html) 명령을 사용하여 Apache Airflow 웹 로그인 토큰을 생성합니다.

```
aws mwaa create-web-login-token --name YOUR_ENVIRONMENT_NAME
```

## bash 스크립트 사용


다음 예제에서는 bash 스크립트를 사용하여 AWS CLI에서 [create-web-login-token](https://docs.aws.amazon.com/cli/latest/reference/mwaa/create-web-login-token.html) 명령을 호출하여 Apache Airflow 웹 로그인 토큰을 생성합니다.

1. 다음 코드 샘플의 내용을 복사하고 로컬에서 `get-web-token.sh`로 저장합니다.

   ```
   #!/bin/bash
   HOST=YOUR_HOST_NAME
   YOUR_URL=https://$HOST/aws_mwaa/aws-console-sso?login=true#
   WEB_TOKEN=$(aws mwaa create-web-login-token --name YOUR_ENVIRONMENT_NAME --query WebToken --output text)
   echo $YOUR_URL$WEB_TOKEN
   ```

1. `YOUR_HOST_NAME` 및 `YOUR_ENVIRONMENT_NAME`에 대해 *빨간색*으로 표시된 자리 표시자를 대체합니다. 예를 들어, 퍼블릭 네트워크의 호스트 이름은 *https://*를 제외하고 다음과 같을 수 있습니다.

   ```
   123456a0-0101-2020-9e11-1b159eec9000.c2.us-east-1.airflow.amazonaws.com
   ```

1. (선택 사항) macOS 및 Linux 사용자는 스크립트가 실행 가능한지 확인하기 위해 다음 명령을 실행해야 할 수 있습니다.

   ```
   chmod +x get-web-token.sh
   ```

1. 다음 스크립트를 실행하여 웹 로그인 토큰을 얻습니다.

   ```
   ./get-web-token.sh
   ```

   명령 프롬프트에 다음이 표시됩니다.

   ```
   https://123456a0-0101-2020-9e11-1b159eec9000.c2.us-east-1.airflow.amazonaws.com/aws_mwaa/aws-console-sso?login=true#{your-web-login-token}
   ```

## Python 스크립트 사용


다음 예제에서는 Python 스크립트의 [boto3 create\$1web\$1login\$1token](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/mwaa.html#MWAA.Client.create_web_login_token) 메서드를 사용하여 Apache Airflow 웹 로그인 토큰을 생성합니다. 이 스크립트는 Amazon MWAA 외부에서 실행할 수 있습니다. boto3 라이브러리를 설치하기만 하면 됩니다. 가상 환경을 만들어 라이브러리를 설치할 수도 있습니다. 계정에 대한 [AWS 인증 보안 인증을 구성했다고](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#configuration) 가정합니다.

1. 다음 코드 샘플의 내용을 복사하고 로컬에서 `create-web-login-token.py`로 저장합니다.

   ```
   import boto3
     mwaa = boto3.client('mwaa')
     response = mwaa.create_web_login_token(
       Name="YOUR_ENVIRONMENT_NAME"
     )
     webServerHostName = response["WebServerHostname"]
     webToken = response["WebToken"]
     airflowUIUrl = 'https://{0}/aws_mwaa/aws-console-sso?login=true#{1}'.format(webServerHostName, webToken)
     print("Here is your Airflow UI URL: ")
     print(airflowUIUrl)
   ```

1. `YOUR_ENVIRONMENT_NAME`을 *빨간색*으로 표시된 자리 표시자로 대체합니다.

1. 다음 스크립트를 실행하여 웹 로그인 토큰을 얻습니다.

   ```
   python3 create-web-login-token.py
   ```

## 다음 단계

+ [CreateWebLoginToken](https://docs.aws.amazon.com/mwaa/latest/API/API_CreateWebLoginToken.html)에서 웹 로그인 토큰을 생성하는 데 사용되는 Amazon MWAA API 작업을 살펴봅니다.

# Apache Airflow 웹 서버에 대한 사용자 지정 도메인 설정
사용자 지정 도메인 설정

Amazon Managed Workflows for Apache Airflow(Amazon MWAA)를 사용하면 관리형 Apache Airflow 웹 서버에 대한 사용자 지정 도메인을 설정할 수 있습니다. 사용자 지정 도메인을 사용하면 Apache Airflow UI, Apache Airflow CLI 또는 Apache Airflow 웹 서버를 사용하여 환경의 Amazon MWAA 관리형 Apache Airflow 웹 서버에 액세스할 수 있습니다.

**참고**  
인터넷 액세스 없이 프라이빗 웹 서버에서만 사용자 지정 도메인을 사용할 수 있습니다.

**Amazon MWAA의 사용자 지정 도메인 사용 사례**

1. AWS에서 클라우드 애플리케이션 간에 웹 서버 도메인 공유 - 사용자 지정 도메인을 사용하면 생성된 서비스 도메인 이름 대신 웹 서버에 액세스할 수 있는 사용자 친화적 URL을 정의할 수 있습니다. 이 사용자 지정 도메인을 저장하고 애플리케이션에서 환경 변수로 공유할 수 있습니다.

1. 프라이빗 웹 서버 액세스 - 인터넷 액세스 없이 VPC의 웹 서버에 대한 액세스를 구성하려는 경우 사용자 지정 도메인을 사용하면 URL 리디렉션 워크플로가 간소화됩니다.

**Topics**
+ [

## 사용자 지정 도메인 구성
](#create-environment-with-custom-domain)
+ [

## 네트워킹 인프라 설정
](#set-up-networking-for-custom-domain)

## 사용자 지정 도메인 구성


사용자 지정 도메인 기능을 구성하려면 Amazon MWAA 환경을 생성하거나 업데이트할 때 `webserver.base_url` Apache Airflow 구성을 통해 사용자 지정 도메인 값을 제공해야 합니다. 사용자 지정 도메인 이름에는 다음 제약 조건이 적용됩니다.
+ 값은 프로토콜 또는 경로가 없는 정규화된 도메인 이름(FQDN)이어야 합니다. 예를 들어 `your-custom-domain.com`입니다.
+ Amazon MWAA는 URL의 경로를 허용하지 않습니다. 예를 들어 `your-custom-domain.com/dags/`는 유효한 사용자 지정 도메인 이름이 아닙니다.
+ URL 길이는 ASCII 문자 255자로 제한됩니다.
+ 빈 문자열을 제공하는 경우 기본적으로 환경은 Amazon MWAA에서 생성된 웹 서버 URL로 생성됩니다.

다음 예제를 사용하여 AWS CLI를 사용하여 사용자 지정 웹 서버 도메인 이름으로 환경을 생성합니다.

```
aws mwaa create-environment \
--name my-mwaa-env \
--source-bucket-arn arn:aws:s3:::amzn-s3-demo-bucket \
--airflow-configuration-options '{"webserver.base_url":"my-custom-domain.com"}' \
--network-configuration '{"SubnetIds":["subnet-0123456789abcdef","subnet-fedcba9876543210"]}' \
--execution-role-arn arn:aws:iam::123456789012:role/my-execution-role
```

환경을 생성하거나 업데이트한 후에는 사용자 지정 도메인을 통해 프라이빗 웹 서버에 액세스하려면 AWS 계정에 네트워킹 인프라를 설정해야 합니다.

기본 서비스 생성 URL로 되돌리려면 프라이빗 환경을 업데이트하고 `webserver.base_url` 구성 옵션을 제거합니다.

## 네트워킹 인프라 설정


다음 단계에 따라 AWS 계정의 사용자 지정 도메인과 함께 사용하는 데 필요한 네트워킹 인프라를 설정합니다.

1. Amazon VPC 엔드포인트 네트워크 인터페이스(ENI)의 IP 주소를 가져옵니다. 이렇게 하려면 먼저 [https://awscli.amazonaws.com/v2/documentation/api/2.9.6/reference/mwaa/get-environment.html](https://awscli.amazonaws.com/v2/documentation/api/2.9.6/reference/mwaa/get-environment.html)를 사용하여 환경의 `WebserverVpcEndpointService`를 찾습니다.

   ```
   aws mwaa get-environment --name your-environment-name
   ```

   성공한 경우 다음과 유사한 출력 화면이 표시됩니다.

   ```
   {
     "Environment": {
       "AirflowConfigurationOptions": {},
       "AirflowVersion": "latest-version",
       "Arn": "environment-arn",
       "CreatedAt": "2024-06-01T01:00:00-00:00",
       "DagS3Path": "dags",
       .
       .
       .
       "WebserverVpcEndpointService": "web-server-vpc-endpoint-service",
       "WeeklyMaintenanceWindowStart": "TUE:21:30"
     }
   }
   ```

   `WebserverVpcEndpointService` 값을 기록하고 다음 Amazon EC2 `describe-vpc-endpoints` 명령의 `web-server-vpc-endpoint-service`에 사용합니다. 다음 명령에서 `--filters Name=service-name,Values=web-server-vpc-endpoint-service-id`입니다.

1. Amazon VPC 엔드포인트 세부 정보를 검색합니다. 이 명령은 특정 서비스 이름과 일치하는 Amazon VPC 엔드포인트에 대한 세부 정보를 가져와 엔드포인트 ID 및 연결된 네트워크 인터페이스 ID를 텍스트 형식으로 반환합니다.

   ```
   aws ec2 describe-vpc-endpoints \
    --filters Name=service-name,Values=web-server-vpc-endpoint-service \
    --query 'VpcEndpoints[*].{EndpointId:VpcEndpointId,NetworkInterfaceIds:NetworkInterfaceIds}' \
    --output text
   ```

1. 네트워크 인터페이스 세부 정보를 가져옵니다. 이 명령은 이전 단계에서 식별된 Amazon VPC 엔드포인트와 연결된 각 네트워크 인터페이스의 프라이빗 IP 주소를 검색합니다.

   ```
   for eni_id in $(
     aws ec2 describe-vpc-endpoints \
      --filters Name=service-name,Values=service-id \
      --query 'VpcEndpoints[*].NetworkInterfaceIds' \
      --output text
    ); do
    aws ec2 describe-network-interfaces \
     --network-interface-ids $eni_id \
     --query 'NetworkInterfaces[*].PrivateIpAddresses[*].PrivateIpAddress' \
     --output text
   						done
   ```

1. `create-target-group`을 사용하여 새로운 대상 그룹을 생성합니다. 이 대상 그룹을 사용하여 웹 서버 Amazon VPC 엔드포인트의 IP 주소를 등록합니다.

   ```
   aws elbv2 create-target-group \
   --name new-target-group-namne \
   --protocol HTTPS \
   --port 443 \
   --vpc-id web-server-vpc-id \
   --target-type ip \
   --health-check-protocol HTTPS \
   --health-check-port 443 \
   --health-check-path / \
   --health-check-enabled \
   --matcher 'HttpCode="200,302"'
   ```

   `register-targets` 명령을 사용하여 IP 주소를 등록합니다.

   ```
   aws elbv2 register-targets \
   --target-group-arn target-group-arn \
   --targets Id=ip-address-1 Id=ip-address-2
   ```

1. ACM; 인증서를 요청합니다. 기존 인증서를 사용하는 경우 이 단계를 건너뜁니다.

   ```
   aws acm request-certificate \
   --domain-name my-custom-domain.com \
   --validation-method DNS
   ```

1. Application Load Balancer를 구성합니다. 먼저 로드 밸런서를 생성한 다음, 로드 밸런서에 대한 리스너를 생성합니다. 이전 단계에서 생성한 ACM 인증서를 지정합니다.

   ```
   aws elbv2 create-load-balancer \
   --name my-mwaa-lb \
   --type application \
   --subnets subnet-id-1 subnet-id-2
   ```

   ```
   aws elbv2 create-listener \
   --load-balancer-arn load-balancer-arn \
   --protocol HTTPS \
   --port 443 \
   --ssl-policy ELBSecurityPolicy-2016-08 \
   --certificates CertificateArn=acm-certificate-arn \
   --default-actions Type=forward,TargetGroupArn=target-group-arn
   ```

   프라이빗 서브넷에서 Network Load Balancer를 사용하는 경우 웹 서버에 액세스하도록 [Bastion 호스트](tutorials-private-network-bastion.md) 또는 [Site-to-Site VPN 터널](tutorials-private-network-vpn-client.md)을 설정합니다.

1. 도메인에 대한 Route 53를 사용하여 호스팅 영역을 생성합니다.

   ```
   aws route53 create-hosted-zone --name my-custom-domain.com \
   --caller-reference 1
   ```

   도메인에 대한 A 레코드를 생성합니다. AWS CLI를 사용하여 이렇게 하려면 `list-hosted-zones-by-name`을 사용하여 호스팅 영역 ID를 가져온 다음, `change-resource-record-sets`를 사용하여 레코드를 적용합니다.

   ```
   HOSTED_ZONE_ID=$(aws route53 list-hosted-zones-by-name \
   --dns-name my-custom-domain.com \
   --query 'HostedZones[0].Id' --output text)
   ```

   ```
   aws route53 change-resource-record-sets \
   --hosted-zone-id $HOSTED_ZONE_ID \
   --change-batch '{
     "Changes": [
       {
         "Action": "CREATE",
         "ResourceRecordSet": {
           "Name": "my-custom-domain.com",
           "Type": "A",
           "AliasTarget": {
             "HostedZoneId": "load-balancer-hosted-zone-id>",
             "DNSName": "load-balancer-dns-name",
             "EvaluateTargetHealth": true
           }
         }
       }
     ]
   }'
   ```

1. Application Load Balancer가 있는 퍼블릭 서브넷으로부터의 HTTPS 트래픽만 허용함으로써 웹 서버 Amazon VPC 엔드포인트의 보안 그룹 규칙을 업데이트하여 최소 권한 원칙을 따릅니다. 다음 JSON을 로컬에 저장합니다. 예를 들어 `sg-ingress-ip-permissions.json`으로 저장합니다.

   ```
   [
     {
       "IpProtocol": "tcp",
       "FromPort": 443,
       "ToPort": 443,
       "UserIdGroupPairs": [
         {
           "GroupId": "load-balancer-security-group-id"
         }
       ],
       "IpRanges": [
         {
           "CidrIp": "public-subnet-1-cidr"
         },
         {
           "CidrIp": "public-subnet-2-cidr"
         }
       ]
     }
   ]
   ```

   다음 Amazon EC2 명령을 실행하여 수신 보안 그룹 규칙을 업데이트합니다. `--ip-permissions`에 대한 JSON 파일을 지정합니다.

   ```
   aws ec2 authorize-security-group-ingress \
   --group-id <security-group-id> \
   --ip-permissions file://sg-ingress-ip-permissions.json
   ```

   다음 Amazon EC2 명령을 실행하여 송신 규칙을 업데이트합니다.

   ```
   aws ec2 authorize-security-group-egress \
   --group-id webserver-vpc-endpoint-security-group-id \
   --protocol tcp \
   --port 443 \
   --source-group load-balancer-security-group-id
   ```

Amazon MWAA 콘솔을 열고 Apache Airflow UI로 이동합니다. 여기에 사용되는 Application Load Balancer 대신 프라이빗 서브넷에서 Network Load Balancer를 설정하는 경우 다음 옵션 중 하나를 사용하여 웹 서버에 액세스해야 합니다.
+ [튜토리얼: Linux Bastion Host를 사용한 프라이빗 네트워크 액세스 구성](tutorials-private-network-bastion.md)
+ [튜토리얼: AWS Client VPN을(를) 사용한 프라이빗 네트워크 액세스 구성](tutorials-private-network-vpn-client.md)

# Apache Airflow CLI 토큰 생성
Apache Airflow CLI 토큰

**작은 정보**  
REST API는 CLI보다 최신이며 외부 시스템과 프로그래밍 방식으로 통합하도록 설계되었습니다. REST는 Apache Airflow와의 상호 작용에 선호되는 방법입니다.

이 페이지의 명령을 사용하여 CLI 토큰을 생성한 명령 셸에서 직접 Amazon Managed Workflows for Apache Airflow API를 호출할 수 있습니다. 예를 들어, 토큰을 얻은 다음 Amazon MWAA API를 사용하여 프로그래밍 방식으로 DAG를 배포할 수 있습니다. 다음 섹션에는 AWS CLI, curl 스크립트, Python 스크립트 또는 bash 스크립트를 사용하여 Apache Airflow CLI 토큰을 생성하는 단계가 포함되어 있습니다. 응답에 반환되는 토큰은 60초 동안 유효합니다.

AWS CLI 토큰은 비동기 API 명령이 아닌 동기 셸 작업을 대체하기 위한 것입니다. 따라서 사용 가능한 동시성은 제한됩니다. 웹 서버가 사용자에게 응답 상태를 유지하려면 이전 요청이 성공적으로 완료될 때까지 새 AWS CLI 요청을 열지 않는 것이 좋습니다.

**Contents**
+ [

## 사전 조건
](#call-mwaa-apis-cli-prereqs)
  + [

### 액세스
](#access-airflow-ui-prereqs-access)
  + [

### AWS CLI
](#access-airflow-ui-prereqs-cli)
+ [

## AWS CLI 사용
](#create-cli-token-cli)
+ [

## curl 스크립트 사용
](#create-cli-token-curl)
+ [

## bash 스크립트 사용
](#create-cli-token-bash)
+ [

## Python 스크립트 사용
](#create-cli-token-python)
+ [

## 다음 단계
](#mwaa-cli-next-up)

## 사전 조건


다음 섹션에서는 이 페이지의 명령과 스크립트를 사용하는 데 필요한 예비 단계를 설명합니다.

### 액세스

+ Amazon MWAA 권한 정책 [Apache Airflow UI 액세스 정책: AmazonMWAAWebServerAccess](access-policies.md#web-ui-access)에 대한 AWS Identity and Access Management(IAM)의 AWS 계정 계정 액세스
+ Amazon MWAA 권한 정책 [전체 API 및 콘솔 액세스 정책: AmazonMWAFullaPiAccess](access-policies.md#full-access-policy)에 대한 AWS Identity and Access Management(IAM)의 AWS 계정 계정 액세스

### AWS CLI


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 사용


다음 예제에서는 AWS CLI에서 [create-cli-token](https://docs.aws.amazon.com/cli/latest/reference/mwaa/create-cli-token.html) 명령을 사용하여 Apache Airflow CLI 토큰을 생성합니다.

```
aws mwaa create-cli-token --name YOUR_ENVIRONMENT_NAME
```

## curl 스크립트 사용


다음 예제에서는 curl 스크립트를 사용하여 AWS CLI에서 [create-web-login-token](https://docs.aws.amazon.com/cli/latest/reference/mwaa/create-cli-token.html) 명령을 호출하여 Apache Airflow 웹 서버의 엔드포인트를 통해 Apache Airflow CLI를 호출합니다.

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

1. 텍스트 파일에서 curl 문을 복사하여 명령 셸에 붙여넣습니다.
**참고**  
이를 클립보드에 복사한 후에는 셸 메뉴에서 **편집 > 붙여넣기**를 사용해야 할 수 있습니다.

   ```
   CLI_JSON=$(aws mwaa --region us-east-1 create-cli-token --name YOUR_ENVIRONMENT_NAME) \
   && CLI_TOKEN=$(echo $CLI_JSON | jq -r '.CliToken') \
   && WEB_SERVER_HOSTNAME=$(echo $CLI_JSON | jq -r '.WebServerHostname') \
   && CLI_RESULTS=$(curl -L --request POST "https://$WEB_SERVER_HOSTNAME/aws_mwaa/cli" \
   --header "Authorization: Bearer $CLI_TOKEN" \
   --header "Content-Type: text/plain" \
   --data-raw "dags trigger YOUR_DAG_NAME --logical-date $(date -u +"%Y-%m-%dT%H:%M:%SZ")") \
   && echo "Output:" \
   && echo $CLI_RESULTS | jq -r '.stdout' | base64 --decode \
   && echo "Errors:" \
   && echo $CLI_RESULTS | jq -r '.stderr' | base64 --decode
   ```

1. 해당 환경의 AWS 리전, `YOUR_DAG_NAME` 및 `YOUR_ENVIRONMENT_NAME`에 대한 *빨간색* 자리표시자를 대체합니다. 예를 들어, 퍼블릭 네트워크의 호스트 이름은 *https://*를 제외하고 다음과 같을 수 있습니다.

   ```
   123456a0-0101-2020-9e11-1b159eec9000.c2.us-east-1.airflow.amazonaws.com
   ```

   명령 프롬프트에 다음이 표시됩니다.

   ```
   {
     "stderr":"<STDERR of the CLI execution (if any), base64 encoded>",
     "stdout":"<STDOUT of the CLI execution, base64 encoded>"
   }
   ```

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

1. 텍스트 파일에서 curl 문을 복사하여 명령 셸에 붙여넣습니다.
**참고**  
이를 클립보드에 복사한 후에는 셸 메뉴에서 **편집 > 붙여넣기**를 사용해야 할 수 있습니다.

   ```
   CLI_JSON=$(aws mwaa --region us-east-1 create-cli-token --name YOUR_ENVIRONMENT_NAME) \
   && CLI_TOKEN=$(echo $CLI_JSON | jq -r '.CliToken') \
   && WEB_SERVER_HOSTNAME=$(echo $CLI_JSON | jq -r '.WebServerHostname') \
   && CLI_RESULTS=$(curl --request POST "https://$WEB_SERVER_HOSTNAME/aws_mwaa/cli" \
   --header "Authorization: Bearer $CLI_TOKEN" \
   --header "Content-Type: text/plain" \
   --data-raw "dags trigger YOUR_DAG_NAME") \
   && echo "Output:" \
   && echo $CLI_RESULTS | jq -r '.stdout' | base64 --decode \
   && echo "Errors:" \
   && echo $CLI_RESULTS | jq -r '.stderr' | base64 --decode
   ```

1. 해당 환경의 AWS 리전, `YOUR_DAG_NAME` 및 `YOUR_ENVIRONMENT_NAME`에 대한 *빨간색* 자리표시자를 대체합니다. 예를 들어, 퍼블릭 네트워크의 호스트 이름은 *https://*를 제외하고 다음과 같을 수 있습니다.

   ```
   123456a0-0101-2020-9e11-1b159eec9000.c2.us-east-1.airflow.amazonaws.com
   ```

   명령 프롬프트에 다음이 표시됩니다.

   ```
   {
     "stderr":"<STDERR of the CLI execution (if any), base64 encoded>",
     "stdout":"<STDOUT of the CLI execution, base64 encoded>"
   }
   ```

------

## bash 스크립트 사용


다음 예제에서는 bash 스크립트를 사용하여 AWS CLI에서 [create-cli-token](https://docs.aws.amazon.com/cli/latest/reference/mwaa/create-cli-token.html) 명령을 호출하여 Apache Airflow CLI 토큰을 생성합니다.

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

1. 다음 코드 샘플의 내용을 복사하고 로컬에서 `get-cli-token.sh`로 저장합니다.

   ```
   # brew install jq
   								aws mwaa create-cli-token --name YOUR_ENVIRONMENT_NAME | export CLI_TOKEN=$(jq -r .CliToken) && curl -L --request POST "https://YOUR_HOST_NAME/aws_mwaa/cli" \
   								--header "Authorization: Bearer $CLI_TOKEN" \
   								--header "Content-Type: text/plain" \
   								--data-raw "dags trigger YOUR_DAG_NAME --logical-date $(date -u +"%Y-%m-%dT%H:%M:%SZ")"
   ```

1. *빨간색*에서 `YOUR_ENVIRONMENT_NAME`, `YOUR_HOST_NAME` 및 `YOUR_DAG_NAME`에 대한 자리 표시자를 대체합니다. 예를 들어, 퍼블릭 네트워크의 호스트 이름은 *https://*를 제외하고 다음과 같을 수 있습니다.

   ```
   123456a0-0101-2020-9e11-1b159eec9000.c2.us-east-1.airflow.amazonaws.com
   ```

1. (선택 사항) macOS 및 Linux 사용자는 스크립트가 실행 가능한지 확인하기 위해 다음 명령을 실행해야 할 수 있습니다.

   ```
   chmod +x get-cli-token.sh
   ```

1. 다음 스크립트를 실행하여 Apache Airflow CLI 토큰을 생성합니다.

   ```
   ./get-cli-token.sh
   ```

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

1. 다음 코드 샘플의 내용을 복사하고 로컬에서 `get-cli-token.sh`로 저장합니다.

   ```
   # brew install jq
   aws mwaa create-cli-token --name YOUR_ENVIRONMENT_NAME | export CLI_TOKEN=$(jq -r .CliToken) && curl --request POST "https://YOUR_HOST_NAME/aws_mwaa/cli" \
   --header "Authorization: Bearer $CLI_TOKEN" \
   --header "Content-Type: text/plain" \
   --data-raw "dags trigger YOUR_DAG_NAME"
   ```

1. *빨간색*에서 `YOUR_ENVIRONMENT_NAME`, `YOUR_HOST_NAME` 및 `YOUR_DAG_NAME`에 대한 자리 표시자를 대체합니다. 예를 들어, 퍼블릭 네트워크의 호스트 이름은 *https://*를 제외하고 다음과 같을 수 있습니다.

   ```
   123456a0-0101-2020-9e11-1b159eec9000.c2.us-east-1.airflow.amazonaws.com
   ```

1. (선택 사항) macOS 및 Linux 사용자는 스크립트가 실행 가능한지 확인하기 위해 다음 명령을 실행할 수 있습니다.

   ```
   chmod +x get-cli-token.sh
   ```

1. 다음 스크립트를 실행하여 Apache Airflow CLI 토큰을 생성합니다.

   ```
   ./get-cli-token.sh
   ```

------

## Python 스크립트 사용


다음 예제에서는 Python 스크립트의 [boto3 create\$1cli\$1token](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/mwaa.html#MWAA.Client.create_cli_token) 메서드를 사용하여 Apache Airflow CLI 토큰을 생성하고 DAG를 트리거합니다. 이 스크립트는 Amazon MWAA 외부에서 실행할 수 있습니다. boto3 라이브러리를 설치하기만 하면 됩니다. 가상 환경을 만들어 라이브러리를 설치할 수도 있습니다. 계정에 대한 [AWS 인증 보안 인증을 구성했다고](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#configuration) 가정합니다.

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

1. 다음 코드 샘플의 내용을 복사하고 로컬에서 `create-cli-token.py`로 저장합니다.

   ```
   """
   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.
   """
   import boto3
   import json
   import requests 
   import base64
   
   mwaa_env_name = 'YOUR_ENVIRONMENT_NAME'
   dag_name = 'YOUR_DAG_NAME'
   mwaa_cli_command = 'dags trigger'
   
   client = boto3.client('mwaa')
   
   mwaa_cli_token = client.create_cli_token(
       Name=mwaa_env_name
   )
   
   mwaa_auth_token = 'Bearer ' + mwaa_cli_token['CliToken']
   mwaa_webserver_hostname = 'https://{0}/aws_mwaa/cli'.format(mwaa_cli_token['WebServerHostname'])
   raw_data = '{0} {1}'.format(mwaa_cli_command, dag_name)
   
   mwaa_response = requests.post(
           mwaa_webserver_hostname,
           headers={
               'Authorization': mwaa_auth_token,
               'Content-Type': 'text/plain'
               },
           data=raw_data
           )
           
   mwaa_std_err_message = base64.b64decode(mwaa_response.json()['stderr']).decode('utf8')
   mwaa_std_out_message = base64.b64decode(mwaa_response.json()['stdout']).decode('utf8')
   
   print(mwaa_response.status_code)
   print(mwaa_std_err_message)
   print(mwaa_std_out_message)
   ```

1. `YOUR_ENVIRONMENT_NAME` 및 `YOUR_DAG_NAME`에 대한 자리 표시자를 대체합니다.

1. 다음 스크립트를 실행하여 Apache Airflow CLI 토큰을 생성합니다.

   ```
   python3 create-cli-token.py
   ```

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

1. 다음 코드 샘플의 내용을 복사하고 로컬에서 `create-cli-token.py`로 저장합니다.

   ```
   """
   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.
   """
   import boto3
   import json
   import requests 
   import base64
   
   mwaa_env_name = 'YOUR_ENVIRONMENT_NAME'
   dag_name = 'YOUR_DAG_NAME'
   mwaa_cli_command = 'dags trigger'
   
   client = boto3.client('mwaa')
   
   mwaa_cli_token = client.create_cli_token(
       Name=mwaa_env_name
   )
   
   mwaa_auth_token = 'Bearer ' + mwaa_cli_token['CliToken']
   mwaa_webserver_hostname = 'https://{0}/aws_mwaa/cli'.format(mwaa_cli_token['WebServerHostname'])
   raw_data = '{0} {1}'.format(mwaa_cli_command, dag_name)
   
   mwaa_response = requests.post(
           mwaa_webserver_hostname,
           headers={
               'Authorization': mwaa_auth_token,
               'Content-Type': 'text/plain'
               },
           data=raw_data
           )
           
   mwaa_std_err_message = base64.b64decode(mwaa_response.json()['stderr']).decode('utf8')
   mwaa_std_out_message = base64.b64decode(mwaa_response.json()['stdout']).decode('utf8')
   
   print(mwaa_response.status_code)
   print(mwaa_std_err_message)
   print(mwaa_std_out_message)
   ```

1. `YOUR_ENVIRONMENT_NAME` 및 `YOUR_DAG_NAME`에 대한 자리 표시자를 대체합니다.

1. 다음 스크립트를 실행하여 Apache Airflow CLI 토큰을 생성합니다.

   ```
   python3 create-cli-token.py
   ```

------

## 다음 단계

+ [CreateClitoken](https://docs.aws.amazon.com/mwaa/latest/API/API_CreateCliToken.html)에서 CLI 토큰을 생성하는 데 사용되는 Amazon MWAA API 작업을 살펴보세요.

# Apache Airflow REST API 사용


Amazon Managed Workflows for Apache Airflow(Amazon MWAA)는 Apache Airflow v2.4.3 이상을 실행하는 환경에 Apache Airflow REST API를 사용하여 Apache Airflow 환경과 직접 상호 작용할 수 있도록 지원합니다. 이를 통해 Amazon MWAA 환경에 프로그래밍 방식으로 액세스하고 이 환경을 관리할 수 있으며, 데이터 오케스트레이션 워크플로를 간접적으로 호출하고, DAG를 관리하고, 메타데이터 데이터베이스, 트리거러, 스케줄러 등의 다양한 Apache Airflow 구성 요소의 상태를 모니터링하는 표준화된 방법도 확보할 수 있습니다.

Apache Airflow REST API를 사용하는 동안 확장성을 지원하기 위해 Amazon MWAA는 REST API 요청, 명령줄 인터페이스(CLI) 사용 또는 더 많은 동시 Apache Airflow 사용자 인터페이스(UI) 사용자 등 수요 증가를 처리하도록 웹 서버 용량의 수평적 스케일링 옵션을 제공합니다. Amazon MWAA가 웹 서버 규모를 조정하는 방법에 대한 자세한 내용은 [Amazon MWAA 웹 서버 오토 스케일링 구성](mwaa-web-server-autoscaling.md) 섹션을 참조하세요.

Apache Airflow REST API를 사용하여 환경에 다음과 같은 사용 사례를 구현할 수 있습니다.
+ **프로그래밍 방식 액세스** - 이제 Apache Airflow UI 또는 CLI에 의존하지 않고도 Apache Airflow DAG 실행을 시작하고, 데이터세트를 관리하고, 메타데이터 데이터베이스, 트리거러, 스케줄러 등 다양한 구성 요소의 상태를 검색할 수 있습니다.
+ **외부 애플리케이션 및 마이크로서비스와 통합** - Amazon MWAA 환경을 다른 시스템과 통합하는 사용자 지정 솔루션을 구축하는 데 사용할 수 있는 REST API 지원. 예를 들어 완료된 데이터베이스 작업 또는 새 사용자 등록과 같은 외부 시스템의 이벤트에 대한 응답으로 워크플로를 시작할 수 있습니다.
+ **중앙 집중식 모니터링** - 여러 Amazon MWAA 환경에서 DAG의 상태를 집계하는 모니터링 대시보드를 빌드하여 중앙 집중식 모니터링 및 관리를 활성화할 수 있습니다.

Apache Airflow REST API에 대한 자세한 내용은 [Apache Airflow REST API 참조](https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html)를 참조하세요.

를 사용하면 AWS 자격 증명을 사용하여 Apache Airflow REST API에 액세스할 `InvokeRestApi`수 있습니다. 또는 웹 서버 액세스 토큰을 얻은 다음, 이 토큰을 사용해서 직접적으로 호출하여 액세스할 수도 있습니다.

`InvokeRestApi` 작업을 사용하는 동안 `Update your environment to use InvokeRestApi` 메시지의 오류가 발생하는 것은 Amazon MWAA 환경을 업데이트해야 함을 나타냅니다. 이 오류는 Amazon MWAA 환경이 `InvokeRestApi` 기능과 관련된 최신 변경 사항과 호환되지 않을 때 발생합니다. 이 문제를 해결하려면 `InvokeRestApi` 기능에 필요한 변경 사항을 통합하도록 Amazon MWAA 환경을 업데이트하세요.

`InvokeRestApi` 작업의 기본 제한 시간은 10초입니다. 작업이 이 10초 기간 내에 완료되지 않으면 작업이 자동 종료되고 오류가 발생합니다. 오류가 발생하지 않도록 REST API 호출이 이 제한 시간 내에 완료되도록 설계되었는지 확인합니다.

Apache Airflow REST API를 사용하는 동안 확장성을 지원하기 위해 Amazon MWAA는 REST API 요청, 명령줄 인터페이스(CLI) 사용 또는 더 많은 동시 Apache Airflow 사용자 인터페이스(UI) 사용자 등 수요 증가를 처리하도록 웹 서버 용량의 수평적 스케일링 옵션을 제공합니다. Amazon MWAA가 웹 서버 규모를 조정하는 방법에 대한 자세한 내용은 [Amazon MWAA 웹 서버 오토 스케일링 구성](mwaa-web-server-autoscaling.md) 섹션을 참조하세요.

Apache Airflow REST API를 사용하여 환경에 다음과 같은 사용 사례를 구현할 수 있습니다.
+ **프로그래밍 방식 액세스** - 이제 Apache Airflow UI 또는 CLI에 의존하지 않고도 Apache Airflow DAG 실행을 시작하고, 데이터세트를 관리하고, 메타데이터 데이터베이스, 트리거러, 스케줄러 등 다양한 구성 요소의 상태를 검색할 수 있습니다.
+ **외부 애플리케이션 및 마이크로서비스와 통합** - Amazon MWAA 환경을 다른 시스템과 통합하는 사용자 지정 솔루션을 구축하는 데 사용할 수 있는 REST API 지원. 예를 들어 완료된 데이터베이스 작업 또는 새 사용자 등록과 같은 외부 시스템의 이벤트에 대한 응답으로 워크플로를 시작할 수 있습니다.
+ **중앙 집중식 모니터링** - 여러 Amazon MWAA 환경에서 DAG의 상태를 집계하는 모니터링 대시보드를 빌드하여 중앙 집중식 모니터링 및 관리를 활성화할 수 있습니다.

Apache Airflow REST API에 대한 자세한 내용은 [Apache Airflow REST API 참조](https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html)를 참조하세요.

를 사용하면 AWS 자격 증명을 사용하여 Apache Airflow REST API에 액세스할 `InvokeRestApi`수 있습니다. 또는 웹 서버 액세스 토큰을 얻은 다음, 이 토큰을 사용해서 직접적으로 호출하여 액세스할 수도 있습니다.
+ `InvokeRestApi` 작업을 사용하는 동안 `Update your environment to use InvokeRestApi` 메시지의 오류가 발생하는 것은 Amazon MWAA 환경을 업데이트해야 함을 나타냅니다. 이 오류는 Amazon MWAA 환경이 `InvokeRestApi` 기능과 관련된 최신 변경 사항과 호환되지 않을 때 발생합니다. 이 문제를 해결하려면 `InvokeRestApi` 기능에 필요한 변경 사항을 통합하도록 Amazon MWAA 환경을 업데이트하세요.
+ `InvokeRestApi` 작업의 기본 제한 시간은 10초입니다. 작업이 이 10초 기간 내에 완료되지 않으면 작업이 자동 종료되고 오류가 발생합니다. 오류가 발생하지 않도록 REST API 호출이 이 제한 시간 내에 완료되도록 설계되었는지 확인합니다.

**중요**  
응답 페이로드 크기는 6MB 이하여야 합니다. 이 제한을 초과하면 `RestApi`가 실패합니다.

다음 예제를 사용하여 Apache Airflow REST API에 대한 API 직접 호출을 수행하고 새로운 DAG 실행을 시작합니다.

**Topics**
+ [

## Apache Airflow REST API에 대한 액세스 권한 부여: `airflow:InvokeRestApi`
](#granting-access-MWAA-Enhanced-REST-API)
+ [

## Apache Airflow REST API 직접 호출
](#listing-DAGs-creating-variables-using-restapi-script)
+ [

## 웹 서버 세션 토큰 생성 및 Apache Airflow REST API 직접 호출
](#create-web-server-session-token)

## Apache Airflow REST API에 대한 액세스 권한 부여: `airflow:InvokeRestApi`


 AWS 자격 증명을 사용하여 Apache Airflow REST API에 액세스하려면 IAM 정책에서 `airflow:InvokeRestApi` 권한을 부여해야 합니다. 다음 정책 샘플에서, `{airflow-role}`에서 `Admin`, `Op`, `User`, `Viewer` 또는 `Public` 역할을 지정하여 사용자 액세스 수준을 지정합니다. 자세한 내용은 *Apache Airflow 참조 가이드*의 [기본 역할](https://airflow.apache.org/docs/apache-airflow/1.10.6/security.html?highlight=ldap#default-roles)을 참조하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowMwaaRestApiAccess",
            "Effect": "Allow",
            "Action": "airflow:InvokeRestApi",
            "Resource": [
            "arn:aws:airflow:us-east-1:111122223333:role/{your-environment-name}/{airflow-role}"
            ]
        }
    ]
}
```

------

**참고**  
프라이빗 웹 서버를 구성하는 동안에는 가상 프라이빗 클라우드(VPC) 외부에서 `InvokeRestApi` 작업을 간접적으로 호출할 수 없습니다. `aws:SourceVpc` 키를 사용하여 이 작업에 대해 더 세분화된 액세스 제어를 적용할 수 있습니다. 자세한 내용은 [aws:SourceVpc](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcevpc)를 참조하세요.

## Apache Airflow REST API 직접 호출


다음 샘플 스크립트에서는 Apache Airflow REST API를 사용하여 환경에서 사용 가능한 DAG를 나열하는 방법과 Apache Airflow 변수를 생성하는 방법을 다룹니다.

```
import boto3
			
  env_name = "MyAirflowEnvironment"
			
  def list_dags(client):
    request_params = {
      "Name": env_name,
      "Path": "/dags",
      "Method": "GET",
      "QueryParameters": {
        "paused": False
      }
    }
  response = client.invoke_rest_api(
    **request_params
  )
			
  print("Airflow REST API response: ", response['RestApiResponse'])
			
  def create_variable(client):
    request_params = {
      "Name": env_name,
      "Path": "/variables",
      "Method": "POST",
      "Body": {
        "key": "test-restapi-key",
        "value": "test-restapi-value",
        "description": "Test variable created by MWAA InvokeRestApi API",
      }
    }
  response = client.invoke_rest_api(
    **request_params
  )
			
  print("Airflow REST API response: ", response['RestApiResponse'])
			
  if __name__ == "__main__":
    client = boto3.client("mwaa")
    list_dags(client)
    create_variable(client)
```

## 웹 서버 세션 토큰 생성 및 Apache Airflow REST API 직접 호출


웹 서버 액세스 토큰을 생성하려면 다음 Python 함수를 사용합니다. 이 함수는 먼저 Amazon MWAA API를 직접 호출하여 웹 로그인 토큰을 가져옵니다. 60초 후에 만료되는 웹 로그인 토큰은 웹 *세션* 토큰으로 교환되며, 이를 통해 웹 서버에 액세스하고 Apache Airflow REST API를 사용할 수 있습니다. 초당 10개가 넘는 트랜잭션(TPS) 스로틀링 용량이 필요한 경우 이 방법을 사용하여 Apache Airflow REST API에 액세스할 수 있습니다.

세션 토큰은 12시간 후에 만료됩니다.

**작은 정보**  
다음 코드 샘플에서 Apache Airflow v2에서 v3로의 주요 변경 사항은 다음과 같습니다.  
REST API 경로가 `/api/v1`에서 `/api/v2`로 변경됨
로그인 경로가 `/aws_maa/login`에서 `/pluginsv2/aws_mwaa/login`으로 변경됨
로그인 `response.cookies["_token"]`의 응답에는 후속 API 호출에 사용해야 하는 토큰 정보가 포함됩니다.
REST API 호출의 경우 헤더의 `jwt_token` 정보를 다음과 같이 전달해야 합니다.  

  ```
  headers = {
    "Authorization": f"Bearer {jwt_token}",
    "Content-Type": "application/json"
  }
  ```

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

```
def get_token_info(region, env_name):
  logging.basicConfig(level=logging.INFO)
						
  try:
    # Initialize MWAA client and request a web login token
    mwaa = boto3.client('mwaa', region_name=region)
    response = mwaa.create_web_login_token(Name=env_name)
						
    # Extract the web server hostname and login token
    web_server_host_name = response["WebServerHostname"]
    web_token = response["WebToken"]
						
    # Construct the URL needed for authentication 
    login_url = f"https://{web_server_host_name}/pluginsv2/aws_mwaa/login"
    login_payload = {"token": web_token}
						
    # Make a POST request to the MWAA login url using the login payload
    response = requests.post(
      login_url,
      data=login_payload,
      timeout=10
    )
						
    # Check if login was successful
    if response.status_code == 200:
						
    # Return the hostname and the session cookie 
    return (
      web_server_host_name,
      response.cookies['_token']
    )
    else:
      # Log an error
      logging.error("Failed to log in: HTTP %d", response.status_code)
      return None
      except requests.RequestException as e:
      
      # Log any exceptions raised during the request to the MWAA login endpoint
      logging.error("Request failed: %s", str(e))
      return None
      except Exception as e:
      
      # Log any other unexpected exceptions
      logging.error("An unexpected error occurred: %s", str(e))
      return None
```

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

```
def get_session_info(region, env_name):
  logging.basicConfig(level=logging.INFO)

  try:
      # Initialize MWAA client and request a web login token
      mwaa = boto3.client('mwaa', region_name=region)
      response = mwaa.create_web_login_token(Name=env_name)
      
      # Extract the web server hostname and login token
      web_server_host_name = response["WebServerHostname"]
      web_token = response["WebToken"]
      
      # Construct the URL needed for authentication 
      login_url = f"https://{web_server_host_name}/aws_mwaa/login"
      login_payload = {"token": web_token}

      # Make a POST request to the MWAA login url using the login payload
      response = requests.post(
          login_url,
          data=login_payload,
          timeout=10
      )

      # Check if login was succesfull 
      if response.status_code == 200:
      
          # Return the hostname and the session cookie 
          return (
              web_server_host_name,
              response.cookies["session"]
          )
      else:
          # Log an error
          logging.error("Failed to log in: HTTP %d", response.status_code)
          return None
  except requests.RequestException as e:
       # Log any exceptions raised during the request to the MWAA login endpoint
      logging.error("Request failed: %s", str(e))
      return None
  except Exception as e:
      # Log any other unexpected exceptions
      logging.error("An unexpected error occurred: %s", str(e))
      return None
```

------

인증이 완료된 후 제공되는 자격 증명으로 API 엔드포인트로 요청을 전송하기 시작할 수 있습니다. 다음 섹션의 예제에서는 엔드포인트 `dags/{dag_name}/dagRuns`를 사용합니다.

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

```
def trigger_dag(region, env_name, dag_id):
						"""
						Triggers a DAG in a specified MWAA environment using the Airflow REST API.
						
						Args:
						region (str): AWS region where the MWAA environment is hosted.
						env_name (str): Name of the MWAA environment.
						dag_id (str): ID of the DAG to trigger.
						"""
						
						logging.info(f"Attempting to trigger DAG {dag_id} in environment {env_name} at region {region}")
						
						# Retrieve the web server hostname and token for authentication
						try:
						web_server_host_name, jwt_token = get_token_info(region, env_name)
						if not jwt_token:
						logging.error("Authentication failed, no jwt token retrieved.")
						return
						except Exception as e:
						logging.error(f"Error retrieving token info: {str(e)}")
						return
						
						# Prepare headers and payload for the request
						request_headers = {
						"Authorization": f"Bearer {jwt_token}",
						"Content-Type": "application/json" # Good practice to include, even for GET
						}
						
						# sample request body input
						json_body = {"logical_date": "2025-09-17T14:15:00Z"}
						
						# Construct the URL for triggering the DAG
						url = f"https://{web_server_host_name}/api/v2/dags/{dag_id}/dagRuns"
						
						# Send the POST request to trigger the DAG
						try:
						response = requests.post(url, headers=request_headers, json=json_body)
						# Check the response status code to determine if the DAG was triggered successfully
						if response.status_code == 200:
						logging.info("DAG triggered successfully.")
						else:
						logging.error(f"Failed to trigger DAG: HTTP {response.status_code} - {response.text}")
						except requests.RequestException as e:
						logging.error(f"Request to trigger DAG failed: {str(e)}")
						
						if __name__ == "__main__":
						logging.basicConfig(level=logging.INFO)
						
						# Check if the correct number of arguments is provided
						if len(sys.argv) != 4:
						logging.error("Incorrect usage. Proper format: python script_name.py {region} {env_name} {dag_id}")
						sys.exit(1)
						
						region = sys.argv[1]
						env_name = sys.argv[2]
						dag_id = sys.argv[3]
						
						# Trigger the DAG with the provided arguments
						trigger_dag(region, env_name, dag_id)
```

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

```
def trigger_dag(region, env_name, dag_name):
						"""
						Triggers a DAG in a specified MWAA environment using the Airflow REST API.
						
						Args:
						region (str): AWS region where the MWAA environment is hosted.
						env_name (str): Name of the MWAA environment.
						dag_name (str): Name of the DAG to trigger.
						"""
						
						logging.info(f"Attempting to trigger DAG {dag_name} in environment {env_name} at region {region}")
						
						# Retrieve the web server hostname and session cookie for authentication
						try:
						web_server_host_name, session_cookie = get_session_info(region, env_name)
						if not session_cookie:
						logging.error("Authentication failed, no session cookie retrieved.")
						return
						except Exception as e:
						logging.error(f"Error retrieving session info: {str(e)}")
						return
						
						# Prepare headers and payload for the request
						cookies = {"session": session_cookie}
						json_body = {"conf": {}}
						
						# Construct the URL for triggering the DAG
						url = f"https://{web_server_host_name}/api/v1/dags/{dag_id}/dagRuns"
						
						# Send the POST request to trigger the DAG
						try:
						response = requests.post(url, cookies=cookies, json=json_body)
						# Check the response status code to determine if the DAG was triggered successfully
						if response.status_code == 200:
						logging.info("DAG triggered successfully.")
						else:
						logging.error(f"Failed to trigger DAG: HTTP {response.status_code} - {response.text}")
						except requests.RequestException as e:
						logging.error(f"Request to trigger DAG failed: {str(e)}")
						
						if __name__ == "__main__":
						logging.basicConfig(level=logging.INFO)
						
						# Check if the correct number of arguments is provided
						if len(sys.argv) != 4:
						logging.error("Incorrect usage. Proper format: python script_name.py {region} {env_name} {dag_name}")
						sys.exit(1)
						
						region = sys.argv[1]
						env_name = sys.argv[2]
						dag_name = sys.argv[3]
						
						# Trigger the DAG with the provided arguments
						trigger_dag(region, env_name, dag_name)
```

------

# Apache Airflow CLI 명령 참조
Apache Airflow CLI 명령 참조

이 주제에서는 Amazon Managed Workflows for Apache Airflow에서 지원되는 Apache Airflow CLI 명령과 지원되지 않는 Apache Airflow CLI 명령을 설명합니다.

**작은 정보**  
REST API는 CLI보다 최신이며 외부 시스템과 프로그래밍 방식으로 통합하도록 설계되었습니다. REST는 Apache Airflow와의 상호 작용에 선호되는 방법입니다.

**Contents**
+ [

## 사전 조건
](#airflow-cli-command-prereqs)
  + [

### 액세스
](#access-airflow-ui-prereqs-access)
  + [

### AWS CLI
](#access-airflow-ui-prereqs-cli)
+ [

## 무엇이 변경되었나요?
](#airflow-cli-command-changed)
+ [

## 지원되는 CLI 명령
](#airflow-cli-commands)
  + [

### 지원되는 명령
](#airflow-cli-commands-supported)
  + [

### DAG를 구문 분석하는 명령 사용
](#parsing-support)
+ [

## 샘플 코드
](#airflow-cli-command-examples)
  + [

### Apache Airflow v2 변수 설정, 가져오기 또는 삭제
](#example-airflow-cli-commands-bash)
  + [

### DAG를 트리거할 때 구성 추가
](#example-airflow-cli-commands-trigger)
  + [

### Bastion Host에 대한 SSH 터널에서 CLI 명령 실행
](#example-airflow-cli-commands-private)

## 사전 조건


다음 섹션에서는 이 페이지의 명령과 스크립트를 사용하는 데 필요한 예비 단계를 설명합니다.

### 액세스

+ Amazon MWAA 권한 정책 [Apache Airflow UI 액세스 정책: AmazonMWAAWebServerAccess](access-policies.md#web-ui-access)에 대한 AWS Identity and Access Management(IAM)의 AWS 계정 계정 액세스
+ Amazon MWAA 권한 정책 [전체 API 및 콘솔 액세스 정책: AmazonMWAFullaPiAccess](access-policies.md#full-access-policy)에 대한 AWS Identity and Access Management(IAM)의 AWS 계정 계정 액세스

### AWS CLI


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).

## 무엇이 변경되었나요?

+ **v3: Airflow 아키텍처**. Apache Airflow v3는 보안 및 확장성을 개선하고 유지 관리를 더 쉽게 만들기 위해 주요 아키텍처 변경을 도입합니다. 자세한 내용은 [Airflow 3로 업그레이드](https://airflow.apache.org/docs/apache-airflow/stable/installation/upgrading_to_airflow3.html)를 참조하세요.
+ **v2: Airflow CLI 명령 구조**. Apache Airflow v2 CLI는 관련 명령이 하위 명령으로 그룹화되도록 구성되어 있습니다. 이는 Apache Airflow v2로 업그레이드하려면 Apache Airflow v1 스크립트를 업데이트해야 한다는 의미입니다. 예를 들어, Apache Airflow v1의 `unpause`는 Apache Airflow v2의 `dags unpause`입니다. 자세한 내용은 [2.0의 Airflow CLI 변경 사항](http://airflow.apache.org/docs/apache-airflow/2.0.2/upgrading-to-2.html#airflow-cli-changes-in-2-0)을 참조하세요.

## 지원되는 CLI 명령


다음 섹션에는 Amazon MWAA에서 사용할 수 있는 Apache Airflow CLI 명령이 나와 있습니다.

### 지원되는 명령


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


| 마이너 버전 | Command | 
| --- | --- | 
|  v3.0.6  |  [assets details](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#details)  | 
|  v3.0.6  |  [assets list](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#list)  | 
|  v3.0.6  |  [assets materialize](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#materialize)  | 
|  v3.0.6  |  [backfill create](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#create)  | 
|  v3.0.6  |  [cheat-sheet](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#cheat-sheet)  | 
|  v3.0.6  |  [connections add](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#add)  | 
|  v3.0.6  |  [connections delete](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#delete)  | 
|  v3.0.6  |  [dags delete](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#delete_repeat1)  | 
|  v3.0.6  |  [dags list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat2)  | 
|  v3.0.6  |  [dags list-jobs](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list-jobs)  | 
|  v3.0.6  |  [dags list-import-errors](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#list-import-errors)  | 
|  v3.0.6  |  [dags list-runs](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list-runs)  | 
|  v3.0.6  |  [dags next-execution](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#next-execution)  | 
|  v3.0.6  |  [dags pause](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#pause)  | 
|  v3.0.6  |  [dags report](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#report)  | 
|  v3.0.6  |  [dags reserialize](https://airflow.apache.org/docs/apache-airflow/2.4.3/cli-and-env-variables-ref.html#reserialize)  | 
|  v3.0.6  |  [dags show](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#show)  | 
|  v3.0.6  |  [dags state](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#state)  | 
|  v3.0.6  |  [dags test](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#test)  | 
|  v3.0.6  |  [dags trigger](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#trigger)  | 
|  v3.0.6  |  [dags unpause](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#unpause)  | 
|  v3.0.6  |  [db clean](https://airflow.apache.org/docs/apache-airflow/2.4.3/cli-and-env-variables-ref.html#clean)  | 
|  v3.0.6  |  [providers behaviours](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#behaviours)  | 
|  v3.0.6  |  [providers get](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#get_repeat2)  | 
|  v3.0.6  |  [providers hooks](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#hooks)  | 
|  v3.0.6  |  [providers links](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#links)  | 
|  v3.0.6  |  [providers list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat4)  | 
|  v3.0.6  |  [providers notifications](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#notifications)  | 
|  v3.0.6  |  [providers secrets](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#secrets)  | 
|  v3.0.6  |  [providers triggerer](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#triggerer)  | 
|  v3.0.6  |  [providers widgets](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#widgets)  | 
|  v3.0.6  |  [roles add-perms](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#add-perms)  | 
|  v3.0.6  |  [roles del-perms](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#del-perms)  | 
|  v3.0.6  |  [roles create](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#create)  | 
|  v3.0.6  |  [roles list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat5)  | 
|  v3.0.6  |  [tasks clear](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#clear)  | 
|  v3.0.6  |  [tasks failed-deps](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#failed-deps)  | 
|  v3.0.6  |  [tasks list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat6)  | 
|  v3.0.6  |  [tasks render](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#render)  | 
|  v3.0.6  |  [tasks state](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#state_repeat1)  | 
|  v3.0.6  |  [tasks states-for-dag-run](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#states-for-dag-run)  | 
|  v3.0.6  |  [tasks test](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#test_repeat1)  | 
|  v3.0.6  |  [variables delete](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#delete_repeat4)  | 
|  v3.0.6  |  [variables get](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#get_repeat3)  | 
|  v3.0.6  |  [variables set](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#set_repeat1)  | 
|  v3.0.6  |  [variables list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat8)  | 
|  v3.0.6  |  [version](http://airflow.apache.org/docs/apache-airflow/1.10.12/cli-ref.html#version)  | 

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


| 마이너 버전 | Command | 
| --- | --- | 
|  v2.0\$1  |  [cheat-sheet](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#cheat-sheet)  | 
|  v2.0\$1  |  [connections add](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#add)  | 
|  v2.0\$1  |  [connections delete](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#delete)  | 
|  v2.2\$1([참고](#parsing-support))  |  [dags backfill](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#backfill)  | 
|  v2.0\$1  |  [dags delete](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#delete_repeat1)  | 
|  v2.2\$1([참고](#parsing-support))  |  [dags list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat2)  | 
|  v2.0\$1  |  [dags list-jobs](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list-jobs)  | 
|  v2.6\$1  |  [dags list-import-errors](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#list-import-errors)  | 
|  v2.2\$1([참고](#parsing-support))  |  [dags list-runs](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list-runs)  | 
|  v2.2\$1([참고](#parsing-support))  |  [dags next-execution](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#next-execution)  | 
|  v2.0\$1  |  [dags pause](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#pause)  | 
|  v2.0\$1  |  [dags report](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#report)  | 
|  v2.4\$1  |  [dags reserialize](https://airflow.apache.org/docs/apache-airflow/2.4.3/cli-and-env-variables-ref.html#reserialize)  | 
|  v2.0\$1  |  [dags show](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#show)  | 
|  v2.0\$1  |  [dags state](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#state)  | 
|  v2.0\$1  |  [dags test](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#test)  | 
|  v2.0\$1  |  [dags trigger](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#trigger)  | 
|  v2.0\$1  |  [dags unpause](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#unpause)  | 
|  v2.4\$1  |  [db clean](https://airflow.apache.org/docs/apache-airflow/2.4.3/cli-and-env-variables-ref.html#clean)  | 
|  v2.0\$1  |  [providers behaviours](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#behaviours)  | 
|  v2.0\$1  |  [providers get](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#get_repeat2)  | 
|  v2.0\$1  |  [providers hooks](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#hooks)  | 
|  v2.0\$1  |  [providers links](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#links)  | 
|  v2.0\$1  |  [providers list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat4)  | 
|  v2.8 이상  |  [providers notifications](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#notifications)  | 
|  v2.6\$1  |  [providers secrets](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#secrets)  | 
|  v2.7\$1  |  [providers triggerer](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#triggerer)  | 
|  v2.0\$1  |  [providers widgets](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#widgets)  | 
|  v2.6\$1  |  [roles add-perms](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#add-perms)  | 
|  v2.6\$1  |  [roles del-perms](https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html#del-perms)  | 
|  v2.6\$1  |  [roles create](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#create)  | 
|  v2.0\$1  |  [roles list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat5)  | 
|  v2.0\$1  |  [tasks clear](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#clear)  | 
|  v2.0\$1  |  [tasks failed-deps](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#failed-deps)  | 
|  v2.0\$1  |  [tasks list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat6)  | 
|  v2.0\$1  |  [tasks render](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#render)  | 
|  v2.0\$1  |  [tasks run](https://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#run)  | 
|  v2.0\$1  |  [tasks state](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#state_repeat1)  | 
|  v2.0\$1  |  [tasks states-for-dag-run](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#states-for-dag-run)  | 
|  v2.0\$1  |  [tasks test](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#test_repeat1)  | 
|  v2.0\$1  |  [variables delete](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#delete_repeat4)  | 
|  v2.0\$1  |  [variables get](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#get_repeat3)  | 
|  v2.0\$1  |  [variables set](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#set_repeat1)  | 
|  v2.0\$1  |  [variables list](http://airflow.apache.org/docs/apache-airflow/2.2.2/cli-and-env-variables-ref.html#list_repeat8)  | 
|  v2.0\$1  |  [version](http://airflow.apache.org/docs/apache-airflow/1.10.12/cli-ref.html#version)  | 

------

### DAG를 구문 분석하는 명령 사용


환경에서 Apache Airflow v2.0.2를 실행하는 경우 DAG가 `requirements.txt`를 통해 설치된 패키지에 의존하는 플러그인을 사용한다면 DAG를 구문 분석하는 CLI 명령이 실패합니다.

**Apache Airflow v2.0.2**
+ `dags backfill`
+ `dags list`
+ `dags list-runs`
+ `dags next-execution`

DAG가 `requirements.txt`를 통해 설치된 패키지에 의존하는 플러그인을 사용하지 않으면 이러한 CLI 명령을 사용할 수 있습니다.

## 샘플 코드


다음 섹션에는 Apache Airflow CLI를 사용하는 여러 방법의 예제가 나와 있습니다.

### Apache Airflow v2 변수 설정, 가져오기 또는 삭제


다음 샘플 코드를 사용하여 `<script> <mwaa env name> get | set | delete <variable> <variable value> </variable> </variable>`의 형식으로 변수를 설정, 가져오기 또는 삭제할 수 있습니다.

```
[ $# -eq 0 ] && echo "Usage: $0 MWAA environment name " && exit

if [[ $2 == "" ]]; then
    dag="variables list"

elif  [ $2 == "get" ] ||  [ $2 == "delete" ] ||  [ $2 == "set" ]; then
    dag="variables $2 $3 $4 $5"

else
    echo "Not a valid command"
    exit 1
fi

CLI_JSON=$(aws mwaa --region $AWS_REGION create-cli-token --name $1) \
    && CLI_TOKEN=$(echo $CLI_JSON | jq -r '.CliToken') \
    && WEB_SERVER_HOSTNAME=$(echo $CLI_JSON | jq -r '.WebServerHostname') \
    && CLI_RESULTS=$(curl --request POST "https://$WEB_SERVER_HOSTNAME/aws_mwaa/cli" \
    --header "Authorization: Bearer $CLI_TOKEN" \
    --header "Content-Type: text/plain" \
    --data-raw "$dag" ) \
    && echo "Output:" \
    && echo $CLI_RESULTS | jq -r '.stdout' | base64 --decode \
    && echo "Errors:" \
    && echo $CLI_RESULTS | jq -r '.stderr' | base64 --decode
```

### DAG를 트리거할 때 구성 추가


Apache Airflow v2에서 다음 샘플 코드를 사용하여 DAG를 트리거할 때 `airflow trigger_dag 'dag_name' —conf '{"key":"value"}'`과 같이 구성을 추가할 수 있습니다.

```
import boto3
import json
import requests 
import base64
				
  mwaa_env_name = 'YOUR_ENVIRONMENT_NAME'
  dag_name = 'YOUR_DAG_NAME'
  key = "YOUR_KEY"
  value = "YOUR_VALUE"
  conf = "{\"" + key + "\":\"" + value + "\"}"
				
  client = boto3.client('mwaa')
				
  mwaa_cli_token = client.create_cli_token(
    Name=mwaa_env_name
  )
				
  mwaa_auth_token = 'Bearer ' + mwaa_cli_token['CliToken']
  mwaa_webserver_hostname = 'https://{0}/aws_mwaa/cli'.format(mwaa_cli_token['WebServerHostname'])
  raw_data = "trigger_dag {0} -c '{1}'".format(dag_name, conf)
				
  mwaa_response = requests.post(
    mwaa_webserver_hostname,
    headers={
      'Authorization': mwaa_auth_token,
      'Content-Type': 'text/plain'
    },
    data=raw_data
  )
				
  mwaa_std_err_message = base64.b64decode(mwaa_response.json()['stderr']).decode('utf8')
  mwaa_std_out_message = base64.b64decode(mwaa_response.json()['stdout']).decode('utf8')
				
  print(mwaa_response.status_code)
  print(mwaa_std_err_message)
  print(mwaa_std_out_message)
```

### Bastion Host에 대한 SSH 터널에서 CLI 명령 실행


다음 예제를 사용하여 Linux Bastion Host에 대한 SSH 터널 프록시를 사용하여 Airflow CLI 명령을 실행합니다.

**curl 사용**

1. 

   ```
   ssh -D 8080 -f -C -q -N YOUR_USER@YOUR_BASTION_HOST
   ```

1. 

   ```
   curl -x socks5h://0:8080 --request POST https://YOUR_HOST_NAME/aws_mwaa/cli --header YOUR_HEADERS --data-raw YOUR_CLI_COMMAND
   ```