ぽこやかざん雑記

データエンジニア / 下町モルモット / 広島カープファン / 深夜の馬鹿力 / おくやま

ローカルDocker上のApache Airflowでgcloudコマンドを使う

GCPApache 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 が成功しました。

めでたし!