GCP の Apache Airflow のマネージドサービスである、Cloud Composer を運用していると、手元の Dag をわざわざ Composer 環境に Deploy することなく、ローカル環境でサクッと検証したいケースが度々あります。
その中でも、Composer 環境では、Dag の中で BashOperator を使用して gcloud cli コマンド(以下 gcloud コマンド)をデフォルトで利用できますが、ローカルの Docker 上で構築した Airflow 環境で gcloud コマンドを使用するには少し工夫が必要なため、その方法について記載します。
gcloud コマンドを利用する方法を知りたいだけの場合、「Airflow 環境内で gcloud コマンドを実行する」から読んでいただいて構いません。
Docker を使用した Airflow 環境の構築を1から知りたい場合は、最初の「ローカル Docker 上で Airflow 環境を構築」から読んでいただければと思います。
動作環境
MacBook Pro: Apple M1 Pro
ローカル Docker 上で Airflow 環境を構築
環境構築
まずは、ローカルの Docker 上に Airflow 環境を構築します。
(Airflow のバージョンは 2.2.5 とします)
これは、Airflow 公式ドキュメントの Quick Start > Running Airflow in Docker に従って行えば問題ないです。
$ curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.2.5/docker-compose.yaml' $ mkdir -p ./dags ./logs ./plugins $ docker-compose up airflow-init # Airflow環境起動 $ docker-compose up
全コンテナが正常に立ち上がったことを確認した後に localhost:8080 にアクセスすると、Airflow の Web UI に繋がります。
最初にログイン画面に遷移しますが、認証情報はデフォルトで Username, Password 共に airflow
です。
ログインに成功すると、以下のような Dag 一覧画面になるかと思います。
すでに example というタグがついた Dag が複数用意されていますが、これらの Dag をロードしたくない場合は、
docker-compose.yaml 内の AIRFLOW__CORE__LOAD_EXAMPLES
を 'false'
にすればロードされなくなります。
Dag 作成
BashOperator を使って「Hello」と出力するタスク、「World」と出力するタスクの2つで構成されたシンプルな Dag (echo_hello_world.py) を作成します。
import pendulum from airflow import DAG from airflow.operators.bash import BashOperator with DAG( dag_id='echo_hello_world', start_date=pendulum.datetime(2022, 1, 1, tz='Asia/Tokyo'), schedule_interval=None, catchup=False, ) as dag: echo_hello = BashOperator( task_id='echo_hello', bash_command='echo "Hello"', ) echo_world = BashOperator( task_id='echo_world', bash_command='echo "World"', ) echo_hello >> echo_world
作成後に Web UI にアクセスすると、echo_hello_world
という Dag が表示されています。
あとは、Dag 名のところをクリックし、右上の再生ボタンを押せば Dag が実行されます。
Airflow 環境内で gcloud コマンドを実行する
Dag 作成
新たに gcloud
コマンドを実行する exec_gcloud
Dag を作成してみます。
import pendulum from airflow import DAG from airflow.operators.bash import BashOperator with DAG( dag_id='exec_gcloud', start_date=pendulum.datetime(2022, 1, 1, tz='Asia/Tokyo'), schedule_interval=None, catchup=False, ) as dag: check_gcloud_version = BashOperator( task_id='check_gcloud_version', bash_command='gcloud version', )
これを Web UI から実行するとエラーとなります。
gcloud コマンド自体が Airflow 環境にないので当然ですね。
gcloud コマンドをコンテナにインストール
gcloud コマンドを Airflow 環境上の各 Docker コンテナ上に apt-get コマンドでインストールする必要があるのですが、
そのためには、Airflow の公式ドキュメントにも書いてある通り、Apache Airflow の Docker イメージをベースに独自に Dockerfile を作成しビルドする必要があります。
When you want to run Airflow locally, you might want to use an extended image, containing some additional dependencies - for example you might add new python packages, or upgrade airflow providers to a later version. This can be done very easily by placing a custom Dockerfile alongside your docker-compose.yaml. Then you can use docker-compose build command to build your image (you need to do it only once). You can also add the --build flag to your docker-compose commands to rebuild the images on-the-fly when you run other docker-compose commands.
Dockefile作成
Apache Airflow の Docker イメージをベースに、追加で gcloud コマンドをインストールする Dockerfile を作成します。
FROM apache/airflow:2.2.5 USER root RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list \ && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - \ && apt-get update -y \ && apt-get install google-cloud-cli -y USER airflow
最後にユーザをairflow
ユーザに戻すのを忘れないように注意してください。
- 諸々の Dag は
airflow
ユーザが実行するため
docker-compose.yaml の書き換え
docker-compose.yaml の以下の部分を、
image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.2.5} # build: .
以下のように書き換えます。
# image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.2.5} build: .
こうすることで、同じディレクトリにある Dockerfile をビルドして出来上がったイメージを使ってコンテナを立ち上げるようになります。
Airflow 環境の再構築
再度 Airflow 環境を構築します。イメージのビルドも一緒にやってしまいます。
$ docker-compose up --build
再度 Airflow の Web UI にアクセスし、exec_gcloud
Dag を実行してみます。
無事、Dag が成功しました。
めでたし!