Amazon MWAAのローカル環境を簡単構築!aws-mwaa-local-runnerのススメ

Amazon MWAA(Amazon Managed Workflows for Apache Airflow)を利用する場合のローカル開発環境として便利なaws-mwaa-local-runnerを紹介します。
2021.06.17

こんにちは。サービスグループの武田です。

AWSは多くのマネージドサービスを提供していますが、ではそれを利用する場合の開発環境をどうしようかという課題があります。動作確認は常にAWSで行えばよいという考え方もあります。一方で、たとえばDynamoDBであればDynamoDB Localを使うなどローカルで実行可能な環境を作れる場合もあります。

AWSではAmazon Managed Workflows for Apache Airflow(MWAA)という、Airflowのマネージドサービスを提供しています。今回はMWAAのローカル環境についてです。名前からも分かるとおり中身はApache Airflowですので、単にAirflowの環境をローカルに構築するだけのようにも思えます。ではMWAAのPythonバージョンはいくつでしょうか?依存ライブラリはどうでしょう?それらを一発で解決してくれるのが、今回紹介するaws-mwaa-local-runnerです。

aws-mwaa-local-runnerとは

aws-mwaa-local-runnerはいくつかのコマンドを使用することで、簡単にMWAAと同じ環境をローカルに構築できるユーティリティです。内部的にDockerを利用しているため、事前にDockerのインストールが必要です。今回はmacOSで動かしますが、Windowsなどでも利用可能です。

aws-mwaa-local-runnerの使い方

使い方はREADMEに書いてありますので、そちらも参考にしてください。基本的な使い方をなぞってみます。

$ git clone https://github.com/aws/aws-mwaa-local-runner.git
$ cd aws-mwaa-local-runner

$ ./mwaa-local-env build-image
$ ./mwaa-local-env start

なんとこれだけでAirflowの環境が立ち上がります。管理画面http://localhost:8080/homeにアクセスすると次のような画面が表示されます。認証はユーザー名admin、パスワードtestで可能です。

ちなみにMWAAのAirflowバージョンは、現在1.10.122.0.2を提供していますが、リポジトリのmastarは執筆時点では2.0.2に対応しています。任意のバージョンを指定したい場合、tagが振ってあるため切り替えることで対応可能です。

停止は、./mwaa-local-env startがフォアグラウンドで動いているため、Ctrl-Cでプロセスを停止します。

dags/がDAGを格納するディレクトとなっているため、ここに作成したDAGファイルを置くことでAirflowに認識されます。またdags/requirements.txtに追加したいライブラリを追記することで、コンテナ起動時に自動的にインストールしてくれます。

DAGを追加してみよう

それでは簡単なDAGを追加してみましょう。以前も使ったことのある次のようなDAGファイルを追加します。

dags/scraping_test.py

import urllib.request

import airflow
from airflow.models import DAG
from airflow.operators.python import task
from bs4 import BeautifulSoup

args = {
    "owner": "airflow",
    "start_date": airflow.utils.dates.days_ago(2),
    "provide_context": True,
}


@task
def get_devio_top_page(url):
    return urllib.request.urlopen(url).read().decode("utf-8")


@task
def print_title(html):
    soup = BeautifulSoup(html, "html.parser")
    print(soup.find("title"))


with DAG(
    dag_id="scraping_test",
    default_args=args,
    schedule_interval=None,
) as dag:
    page = get_devio_top_page(url="https://dev.classmethod.jp/")

    print_title(html=page)

追加のライブラリとしてBeautifulSoupを使用しているため、requirements.txtを修正します。

dags/requirements.txt

beautifulsoup4==4.9.3

ライブラリはコンテナ起動時にインストールされるため、一度local-runnerを停止して再起動します。再起動時のログを確認するとbeautifulsoup4をインストールしていることが確認できるはずです。

管理画面を更新するとDAGが追加されています。

有効にして実行してみます。

ログを確認すると結果が出力されています。問題なさそうですね。

[2021-06-17 04:52:41,800] {{logging_mixin.py:104}} INFO - <title>クラスメソッド発「やってみた」系技術メディア | DevelopersIO</title>

まとめ

MWAAを採用するにあたって、ローカルの環境をどうしようか考えていたところaws-mwaa-local-runnerを見つけました。簡単に使用開始できとても便利ですね。皆さんもぜひ使ってみてください!