Amazon Managed Workflows for Apache Airflowを整理してみた

# 背景・目的
Amazon Managed Workflows for Apache Airflow（以降、MWAAという。）を試したときのメモ書きになります。
Airflowを本格的に利用したことがなかったので、このタイミングで基本的な知識を含めて簡単な動作確認を行います。

# まとめ
下記に特徴をまとめます。

|特徴|説明|
|:--|:--|
|概要|・MWAAはマネージドオーケストレーションサービス<BR>・データパイプラインを大規模に設定・運用する用途<BR>・AirflowとPythonを使用してワークフローを作成<BR>・MWAAはキャパシティを自動的にキャパシティを拡張<BR>・セキュリティサービスと統合<BR>・スケーラビリティ、可用性、セキュリティのための基盤の管理は不要|
|Airflowを自動的にセットアップ|素早くセットアップ可能|
|オートスケール|・最小数と最大数を設定し、Airflowワーカーを自動的にスケーリング<BR>・MWAAは環境内のワーカーを監視し、定義したワーカーの最大数に達するまで追加する|
|ビルトイン認証|・IAMと統合<BR>・ロールベースの認証と認可|
|ビルトインセキュリティ|・VPCで実行<BR>・KMSを使用して暗号化|
|パブリックアクセスモードまたはプライベートアクセスモード|・AWS SSOとIAMで制御<BR>・2つのアクセスモードがある|
|ワークフローモニタリング|CloudWatchで下記の確認ができる<BR>　・Airflowメトリクス<BR>　・Airflowログ|
|AWS 統合|下記と統合が可能。<BR>・Amazon Athena<BR>・AWS Batch<BR>・Amazon CloudWatch<BR>・Amazon DynamoDB<BR>・AWS DataSync<BR>・Amazon EMR<BR>・AWS Fargate<BR>・Amazon EKS<BR>・Amazon Kinesis Data Firehose<BR>・AWS Glue<BR>・AWS Lambda<BR>・Amazon Redshift<BR>・Amazon SQS<BR>・Amazon SNS<BR>・Amazon SageMaker<BR>・Amazon S3|


# 概要
[Amazon Managed Workflows for Apache Airflow とは何ですか？](https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/what-is-mwaa.html)を元に整理します。

> Amazon Managed Workflows for Apache Airflow は、「Apache Airflow」用のマネージドオーケストレーションサービスで、クラウド上でデータパイプラインを大規模に設定・運用するために使用できます。Apache Airflow は、「ワークフロー」と呼ばれる一連のプロセスとタスクをプログラムで作成、スケジュール、監視するために使用されるオープンソースのツールです。Amazon MWAA を使用すると、スケーラビリティ、可用性、セキュリティのための基盤を管理する必要なく、Apache Airflow と Python を使用してワークフローを作成できます。Amazon MWAA は自動的にワークフローの実行キャパシティを拡張してニーズに対応し、Amazon MWAA は AWS セキュリティサービスと統合して、データへの迅速で安全なアクセスを提供します。

- MWAAはマネージドオーケストレーションサービス
- データパイプラインを大規模に設定・運用する用途
- AirflowとPythonを使用してワークフローを作成
- MWAAはキャパシティを自動的にキャパシティを拡張
- セキュリティサービスと統合
- スケーラビリティ、可用性、セキュリティのための基盤の管理は不要

## 機能
> - 自動エアフローセットアップ — Amazon MWAA 環境を作成するときに「Apache Airflow バージョン」を選択することで、Apache Airflow をすばやくセットアップできます。Amazon MWAA は、インターネット上でダウンロードできる同じ Apache Airflow ユーザーインターフェイスとオープンソースコードを使用して、Apache Airflow を自動的にセットアップします。

- Airflowを自動的にセットアップ
- 素早くセットアップ可能


> - 自動スケーリング — 環境内で稼働するワーカーの最小数と最大数を設定して、Apache Airflow ワーカーを自動的にスケーリングします。Amazon MWAA は環境内のワーカーを監視し、「自動スケーリングコンポーネント」を使用して需要を満たすワーカーを、定義したワーカーの最大数に達するまで追加します。

- オートスケーリング
- 最小数と最大数を設定し、Airflowワーカーを自動的にスケーリング
- MWAAは環境内のワーカーを監視し、定義したワーカーの最大数に達するまで追加する

> - ビルトイン認証 — AWS Identity and Access Management (IAM) で「アクセスコントロールポリシー」を定義することで、Apache Airflow ウェブサーバーのロールベースの認証と承認を有効にします。Apache Airflow ワーカーは、AWS サービスへの安全なアクセスのためにこれらのポリシーを引き継ぎます。

- IAMと統合
- ロールベースの認証と認可

> - ビルトインセキュリティ — Apache Airflow ワーカーとスケジューラーは「Amazon MWAA の Amazon VPC」で実行されます。データも AWS Key Management Service を使用して自動的に暗号化されるため、環境はデフォルトで安全です。

- VPCで実行
- KMSを使用して暗号化

> - パブリックアクセスモードまたはプライベートアクセスモード — プライベートまたはパブリック「アクセスモード」を使用して Apache Airflow ウェブサーバーにアクセスします。[パブリックネットワーク] アクセスモードは、インターネット経由でアクセス可能な Apache Airflow ウェブサーバーの VPC エンドポイントを使用します。プライベートネットワークアクセスモードは、VPC からアクセス可能な Apache Airflow ウェブサーバーの VPC エンドポイントを使用します。いずれの場合も、Apache Airflow ユーザーのアクセスは、AWS Identity and Access Management (IAM) で定義したアクセスコントロールポリシーと AWS SSO によって制御されます。

- AWS SSOとIAMで制御
- パブリックNWアクセスモート
- プライベートNWアクセスモード


> - アップグレードとパッチの効率化 — Amazon MWAA は Apache Airflow の新しいバージョンを定期的に提供しています。Amazon MWAA チームはこれらのバージョンに合わせてイメージを更新し、パッチを適用します。

- パッチ適用

> - ワークフローモニタリング — Amazon CloudWatch で Apache Airflow ログと「Apache Airflow メトリクス」を表示して、Apache Airflow タスクの遅延やワークフローエラーを特定できます。追加のサードパーティツールは必要ありません。Amazon MWAA は、環境メトリクスを自動的にCloudWatch に送信します。有効になっている場合は、Apache Airflow ログも送信します。

- CloudWatchで下記の確認ができる
    - Airflowメトリクス
    - Airflowログ

> - AWS 統合 — Amazon MWAA は、Amazon Athena、AWS Batch、Amazon CloudWatch、Amazon DynamoDB、AWS DataSync、Amazon EMR、AWS Fargate、Amazon EKS、Amazon Kinesis Data Firehose、AWS Glue、AWS Lambda、Amazon Redshift、Amazon SQS、Amazon SNS、Amazon SageMaker、およびAmazon S3 といったオープンソースの統合をサポートしており、さらに数百の組み込みおよびコミュニティ作成のオペレータとセンサーが利用可能です。

- AWSと統合
    -  Amazon Athena
    -  AWS Batch
    -  Amazon CloudWatch
    -  Amazon DynamoDB
    -  AWS DataSync
    -  Amazon EMR
    -  AWS Fargate
    -  Amazon EKS
    -  Amazon Kinesis Data Firehose
    -  AWS Glue
    -  AWS Lambda
    -  Amazon Redshift
    -  Amazon SQS
    -  Amazon SNS
    -  Amazon SageMaker
    -  Amazon S3
- 数百の組み込み、コミュニティ作成のオペレータが利用可能

> - ワーカーフリート — Amazon MWAA は、コンテナを使用してワーカーフリートをオンデマンドでスケーリングし、「AWS Fargate のAmazon ECS」を使用してでスケジューラーの停止を減らすことをサポートしています。Amazon ECS コンテナでタスクを呼び出すオペレーターと、Kubernetes クラスターでポッドを作成して実行する Kubernetes オペレーターがサポートされています。

- コンテナを使用してワーカーフリートをオンデマンドでスケーリング
    - Fargateを使用

## アーキテクチャ
> 外側のボックス (下の画像) に含まれるすべてのコンポーネントは、アカウント内では単一の Amazon MWAA 環境として表示されます。Apache Airflow スケジューラーとワーカーは、AWS Fargate (Fargate) コンテナであり、環境の Amazon VPC のプライベートサブネットに接続されています。各環境には、AWS によって管理される独自の Apache Airflow メタデータベースがあり、このメタデータベースはスケジューラとワーカーの Fargate コンテナがプライベートでセキュアな VPC エンドポイントを介してアクセスできます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d3f94892-d344-e96c-6d5a-7b264eda6b14.png)


- Airflowのスケジューラーとワーカーは、Fargateコンテナ
- VPCプライベートサブネットに接続されている

> Amazon CloudWatch、Amazon S3、Amazon SQS、Amazon ECR、および AWS KMS は Amazon MWAA とは別であり、Fargate コンテナ内のApache Airflow Scheduler およびワーカーからアクセスできる必要があります。

- 下記からアクセス可能な状態にする
    - Amazon CloudWatch
    - Amazon S3
    - Amazon SQS
    - Amazon ECR
    - AWS KMS

> Apache Airflow ウェブサーバーには、[パブリックネットワーク] の Apache Airflow アクセスモードを選択してインターネット経由でアクセスすることも、[プライベートネットワーク] の Apache Airflow アクセスモードを選択して VPC 内からアクセスすることもできます。いずれの場合も、Apache Airflow ユーザーのアクセスは、AWS Identity and Access Management (IAM) で定義したアクセス制御ポリシーによって制御されます。

- インターネット経由でアクセスとVPC内からアクセスモードを選択


## Integration
> 活発で成長を続けている Apache Airflow オープンソースコミュニティでは、Apache Airflow を AWS サービスと統合するためのオペレーター (サービスへの接続を簡素化するプラグイン) が提供されています。これには、Amazon S3、Amazon Redshift、Amazon EMR、AWS Batch、および Amazon SageMaker などのサービスのほか、他のクラウドプラットフォーム上のサービスも含まれます。

- OSSコミュニティでは、AirflowをAWSサービスと統合するためのオペレーターが提供されてる
- オペレータとは、サービスへの接続を簡素化するためのプラグイン

## サポートされるバージョン
> Amazon MWAA は複数のバージョンの Apache Airflow をサポートしています。サポートされている Apache Airflow のバージョンと、各バージョンに含まれている Apache Airflow コンポーネントの詳細については、Apache Airflow 用 Amazon マネージドワークフロー上の Apache Airflow のバージョン を参照してください。

- MWAAは、複数バージョンのAirflowをサポートしている

# 実践
[Amazon Managed Workflows for Apache Airflowを使い始める](https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/get-started.html)を元に試します。

## 前提
### Amazon MWAA 用の Amazon S3 バケットの作成
1. AWSにサインインし、S3バケットを作成します
1. バケットの「プロパティ」でバケットのバージョニングで「編集」をクリックします
1. バケットのバージョニングを「有効にする」を選択し、「変更を保存」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1efa571f-cc23-7891-6d4e-f819577c8c1a.png)


### VPCネットワークを作成する
[インターネット経由のパブリックルーティング](https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/networking-about.html#networking-about-overview-public)を元に試します。

下記のVPCのセットアップが必要です。

- 1つのVPCセキュリティグループ
- 2つのパブリックサブネット
- 2つのプライベートサブネット
- NACL
- 2つのNATGW
- 1つのIGW

1. VPCに移動します
1. 「VPCを作成」をクリックします
1. 作成するリソースで「VPCなど」を選択します
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9f5c6586-bba9-349c-b56a-97c5f77ef513.png" width=400 />

1. 下記を選択し、「VPCを作成」をクリックします
    - AZ：2つ
    - パブリックサブネット：2つ
    - プライベートサブネット：2つ
    - NATGW：AZごとに1
    - VPCe:S3のGW型
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/afcd9460-f6b5-bab0-e30f-712f9af5baf3.png" width=300/>

### KMSを作成
1. KMSに移動します
1. 「キーの作成」をクリックします
1. 下記を選択し、「次へ」をクリックします
    - キーのタイプ：対象
    - キーの使用法：暗号化および復号化
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/93f73ddd-4d41-d210-daa2-1eee39f4e1db.png)
1. ラベルを追加では、エイリアスを入力し「次へ」をクリックします
1. キーの管理アクセス許可を定義で「次へ」をクリックします
1. キーの使用法アクセス許可を定義で「次へ」をクリックします
1. 確認画面で「完了」をクリックします


## Amazon MWAA 環境を作成する
[Amazon MWAA 環境を作成する](https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/create-environment.html)を元に試します。

1. MWAAコンソールを開きます
1. 「環境を作成」をクリックします
1. 環境の詳細で下記を指定します
    - 名前：任意
    - Aifflowバージョン：最新を選択
    - メンテナンスウィンドウ：任意
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e095dc31-3674-c978-ee00-4e3096215dde.png)

1. AmazonのS3のDAGコードで、用意したS3バケットを指定し、「次へ」をクリックします
    - S3バケット
    - DAGフォルダ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d2107f93-634b-5e78-5c85-9f95191078cb.png)

1. 作成したVPCとサブネットを選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/41ae2f5d-d68f-fd87-200f-3ebeb3478765.png)

1. 下記を選択します
    - Webサーバのアクセス：公開ネットワーク
    - セキュリティグループ：新しいSG
    - エンドポイント管理：サービスマネージドエンドポイント
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a61859e1-f699-7bdc-8efc-b4c0297f1b64.png)

1. 環境クラスで下記を選択します
    - mw1.small
    - 最大ワーカー数：1
    - 最小ワーカー数：1
    - スケジューラー数:2
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/defcbb0a-89b6-b7b3-431e-5a1c7e790139.png)

1. 暗号化は、指定せずに、MWAAが所有するキーを使用します

1. モニタリングで全てチェックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/37236659-0f90-fa86-465c-6df21e95d249.png)

1. アクセス許可で実行ロールを「新しいロールを作成」を選択し、「次へ」をクリックします
1. 確認して作成の画面で、「環境を作成」をクリックします
1. しばらくすると（20分程度）、利用可能になります
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fa4a88eb-b003-53fb-28af-8449a27ecd9a.png)


## Airflow UIの確認
1. 下記の画面から、「Airflow UIを開く」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fa4a88eb-b003-53fb-28af-8449a27ecd9a.png)

1. 画面が表示されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/24da990c-9090-ceac-f9c3-28f1cf312672.png)

# 考察
今回は、MWAAを整理し、構築まで試しました。次回以降は実際にDAGを作成し動かしてみます。

# 参考

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/what-is-mwaa.html

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/get-started.html