Managed Workflows for Apache Airflow (MWAA) のユーザー作成（デフォルトロール/カスタムロール）

# はじめに
MWAAでは、Airflowのインフラに関することをAWS側が実施してくれるため、管理が楽になります。しかしその反面、こちら側で制御できないことがいくつかあります。
そのうちの一つが、Airflowのユーザー作成です。自分で建てたAirflowサーバーであれば、自由にユーザーを作成することが出来ますが、MWAAではIAMを利用する必要があります。今回はそのユーザー作成を「1.Airflow デフォルトロール」「2.Airflow カスタムロール」の2つで試したので、記事にしておきます。

# 先にまとめ
- MWAAでは、**Airflowユーザーを独自に作成することはできず**、IAMを使って認証する必要がある
- IAMに付与するポリシーで**airflow:CreateWebLoginTokenを許可する**ことで認証する（自己プロビジョニング的な方法）
- airflow:CreateWebLoginTokenで許可する際のResource句は**Airflowのデフォルトの5つのロールしか指定できない**
- カスタムロールを付与したい場合は、**まずはPublicロールをResource句で指定して、ユーザーにAirflow UIへログインしてもらう**。その後、作成されたAirflow Userにカスタムロールを付与する

# 前提条件
- MWAAのv2.8.1の環境をバージニア北部リージョン（us-east-1）に作成済み
    - パブリックアクセスモードで作成
    - 環境名`MyAirflowEnvironment-282`
- MWAAで利用するバケットやVPCなどは作成済み
- 管理者として、AdministratorAccessをつけたIAMロール作成済み
    - このIAMロールで管理者操作をします
    - ユーザーは、これからIAMユーザーとして作成します

# 1. Airflow デフォルトロール（user）でログイン
まずは、Airflow のデフォルトロールのうちの1つであるuserを使ってログインしてみます。
Airflow のデフォルトロールは、以下の公式ドキュメントに記載の通り、`Admin, Public, Viewer, User, Op` の5種類がいます。

https://airflow.apache.org/docs/apache-airflow/stable/security/access-control.html

デフォルトロールなので細かい権限のカスタマイズはできませんが、比較的楽に準備ができます。

### IAMユーザー作成（管理者）
IAMユーザー `mwaa_test_user1` を作成しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/e725f649-3077-4e75-6bfb-76b321657763.png)

### IAMポリシー作成、付与（管理者）
以下の内容のIAMポリシー`MWAA-User-Policy`を作成し、IAMユーザーに付与します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "airflow:CreateWebLoginToken",
            "Resource": [
                "arn:aws:airflow:us-east-1:999999999999:role/MyAirflowEnvironment-282/User"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "airflow:ListEnvironments",
                "airflow:GetEnvironment",
                "airflow:ListTagsForResource"
            ],
            "Resource": "*"
        }
    ]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/d35e2e71-b912-54dc-df1e-b687ffc5dfbd.png)


以下のドキュメントを参考にしています。

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/access-policies.html#web-ui-access

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/access-policies.html#mwaa-read-only

:::note warn
`"airflow:CreateWebLoginToken"`のResourceで指定するarnのAWSアカウントの後は`role`であることに注意してください。環境名をそのままコピーすると`arn:aws:airflow:us-east-1:999999999999:environment/MyAirflowEnvironment-282`のようにAWSアカウントの後が`environment`となっています。
:::

### Airflow UI にアクセス（ユーザー）
IAMユーザー `mwaa_test_user1`にログインしなおして、MWAAのコンソールから「Airflow UI を開く」をクリックします。
ログインできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/befb9fae-a1e3-ddd9-e4de-bebd8628c701.png)

Profileを見ると、Userロールでログインできていることが分かります。User Nameは、IAMユーザー名になっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/e79a123b-dacd-b274-2e86-bb893a232511.png)

ちなみに、UserロールではConnectionを参照する権限がついていないため、以下のようにメニューのAdminの中に**Connections**がありません。次のカスタムロールでは、これを見られるようにしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/c4c31711-2a86-9c6b-1042-ca18542b1ef6.png)


# 2. Airflow カスタムロールでログイン
次に、カスタムロールでログインする場合です。DAGレベルでの参照や実行権限の制御もできます。ただし、準備が少し面倒です。デフォルトロールと同じくIAMポリシーにカスタムロール名を記載してログインできれば良いのですが、それができません。代わりに、一度デフォルトロールである`Public`でユーザーにログインしてもらうことでAirflow上にユーザーを作成し、Airflow UIで管理者がそのユーザーにカスタムロールを付与します。

以下の公式ドキュメントを参考にしています。

https://docs.aws.amazon.com/ja_jp/mwaa/latest/userguide/limit-access-to-dags.html

### IAMユーザー作成（管理者）
IAMユーザー `mwaa_test_user2` を作成しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/3ea757b8-a90a-2520-c7b3-f41ba6cf0f74.png)

### IAMポリシー作成、付与（管理者）
以下の内容のIAMポリシー`MWAA-Public-Policy`を作成し、IAMユーザーに付与します。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "airflow:CreateWebLoginToken",
            "Resource": [
                "arn:aws:airflow:us-east-1:999999999999:role/MyAirflowEnvironment-282/Public"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "airflow:ListEnvironments",
                "airflow:GetEnvironment",
                "airflow:ListTagsForResource"
            ],
            "Resource": "*"
        }
    ]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/a5a59d4d-4902-b489-1840-e3a668721be5.png)

今度は、Airflowのデフォルトロールである`Public`を指定しています。
この`Public`ですが、実は何も許可されていないロールです。以下はAirflow UIで見たときの`Op`と`Public`の許可されているアクションですが、`Public`には何も許可されていないことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/d0180166-e1dc-f3f7-e748-bdf3b5e874b1.png)

なぜこんなロールを付与するかというと、**一度Airflow UIにユーザーがログインすることで、Airflow上のユーザーとして登録されるから**です。本当に付与したいロールはカスタムロールなので、権限はそちらで操作します。

### Airflow カスタムロール作成（管理者）
管理者でAirflow UIにログインして、新しくロールを作成します。今回は、既存のUserロールを一度コピーして、そこに`menu access on Connections`と`can read on Connections`の権限を足しました。こうすることで、既存のUserロールでは見えなかったConnectionsが見られるようになります（作成や修正権限は与えないので、参照のみです）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/e885f4ff-bac4-fcd0-6649-401802f2e125.png)

### Airflow UI にアクセス（ユーザー）
IAMユーザー`mwaa_test_user2`にログインしなおして、MWAAのコンソールから「Airflow UI を開く」をクリックします。
ただし、`Public`はAirflow UIの参照権限すら何もついていないため、以下のような画面が出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/8575d7b4-796b-1217-83eb-2503f09dd22b.png)

しかし、管理者でAirflow UIにログインしてUser一覧を見てみると、以下のようにAirflow Userとして作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/473d4fc8-620c-8eb9-41ab-8241872086e8.png)

### Airflow カスタムロールをユーザーに割り当て（管理者）
管理者でAirflow UIにログインして、`mwaa_test_user2`のRoleに先ほど作成したカスタムロールを付与します。また、Last Nameが必須になっているので、半角スペースなどをいれてSaveをクリックします（なんでも大丈夫です）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/c6478cc3-1d45-c91c-50b7-5e7fc23e9ca9.png)

### Airflow UI にアクセス（ユーザー）
ユーザーでAirflow UIにログインすると、今度はログインが成功しました。
また、UserロールではなかったAdmin > Connectionsが見られるようになっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/e30b9952-ab2b-dc34-82d6-29e9e2f49ea8.png)

Connectionの一覧も以下のように参照できました。また、修正や作成権限は付与していないので、作成する+マークや修正するペンのアイコンは見えていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/1badd9d6-fda4-9255-e596-7d2f7cb77c51.png)

# おわりに
今回は、MWAAのユーザー作成方法を2つ実施しました。実際の運用の際はカスタムロールを使っていきたくなると思いますが、一度ユーザーに操作してもらってAirflow上でユーザーを作成してもらわないといけないのが少し面倒ですね。そのあたりもう少し楽になるようなアップデートが来ることを祈ります。