新卒エンジニアがDigdagの学習環境を作った話

この記事は MicroAd Advent Calendar 2024の18日目の記事です。

https://qiita.com/advent-calendar/2024/microad

# はじめに

　はじめまして！新卒エンジニアのホンマです。本記事が初投稿になります！新人ゆえ間違いがあるかもしれませんが優しくご指摘いただけると幸いです。

　さて、私が所属するバッチ開発チームではワークフローエンジンとしてDigdagを使用しています。配属以降なんとなくで使っていた状態が続いていたためこの機会に色々研究してみようと思います。とはいえ、いきなり全て勉強するのは難しいので今回は環境構築のみやってみようと思います。またDockerを使用するため新しくバッチ開発チームに入った方の学習環境としても利用できるのではという狙いもあります。

## **この記事のゴール**

- Digdagを触れる環境をdockerで作る
- ワークフローを１つ実行する

## 検証環境

- Macbook Air M1 2020
- Docker Engine v27.3.1
- Docker Compose v2.29.7

## リポジトリ

今回作成したリポジトリはこちらです。

https://github.com/sho-honma/digdag-prayground

## 使い方

コマンド一つで起動・削除できます。

起動：`docker compose up -d`

削除：`docker compose down` (-vオプションでデータを削除できます)

## 解説

とりあえずdocker-compose.yml見ていきます。

```dockerfile
version: "3"

services:
  #digdagサーバー
  digdag_server:
    container_name: digdag_server
    build:
      context: .
      dockerfile: ./docker/digdag_server/dockerfile
    depends_on:
      - digdag_postgres
    volumes:
      - ./docker/digdag_server:/opt/etc/digdag
      - /var/run/docker.sock:/var/run/docker.sock
      - /tmp:/tmp
    command: ["server", "-c", "/opt/etc/digdag/server.properties"]
    ports:
      - 8080:65432
    networks:
      - digdag_network

  #digdagクライアント(このコンテナでdigdagコマンドを使う)
  digdag_client:
    container_name: digdag_client
    build:
      context: .
      dockerfile: ./docker/digdag_client/dockerfile
    volumes:
      - .:/workspace
    ports:
      - 8081:65432
    tty: true
    depends_on:
      - digdag_server
    networks:
      - digdag_network
    develop:
      watch:
        - action: sync
          path: ./
          target: /workspace

  #digdagのデータ保存用PostgreSQL
  digdag_postgres:
    image: postgres:14-alpine
    container_name: digdag_postgres
    ports:
      - 8082:5432
    volumes:
      - db-store:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: digdag_db
    networks:
      - digdag_network

  #dozzleサーバー(digdagサーバーのログ確認用)
  dozzle_server:
    container_name: dozzle_server
    image: amir20/dozzle:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8083:8080
    depends_on:
      - digdag_server
    networks:
      - digdag_network

networks:
  digdag_network:
    driver: bridge

volumes:
  db-store:
```

今回はコンテナを４つ立てています。簡単に説明します。

### 1. digdagサーバー

今回のメインターゲットのdigdagサーバーです。http://localhost:8080/ でUIが確認できます。
![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672662/3b458c3a-169f-16f6-5b49-585aac2646bc.png)



### 2. digdagクライアント

このコンテナからdigdagサーバに対してリクエストを送ります。

### 3. PostgreSQL

PostgreSQLは用意しなくてもDigdag自体は動作するのですが、実務では使用することが多いと思うので用意しました。今回は特に触れませんが入っているテーブルを確認してみると面白いです。
(ちなみにPostgeSQLとDigdag接続するのにめちゃくちゃ苦労しました笑)

### 4. dozzle

こちらも必須ではありませんがログの確認用に設置しました。http://localhost:8083/ で確認できます。Docker DesktopのUIからログを見ても問題ないです。
![スクリーンショット 2024-12-17 23.08.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672662/78cf75d9-046c-f714-9474-3cbe3d427e46.png)


## ワークフロー実行

以下digファイルに書かれたワークフローを実行します。今回はPythonのコードを実行してみようと思います。



```digdag:wf_sample.dig
timezone: UTC

_export:
  docker:
    image: "python:3.11.0-alpine"
    docker: "/usr/local/bin/docker"
    run_options: [ "-m", "1G" ]
    pull_always: true
    selinux: true
    
+step1:
  py>: src.sample.hello
```

Pythonのコード

```python:src/sample.py
def hello():
    print("Hello World!")
```

PythonのコードはDigdagサーバーが別途コンテナを立てて実行します。今回はDigdagサーバー自体がコンテナであり、「コンテナからコンテナを起動する」という構図になっているため動作させるのに一苦労しました。解説は割愛しますがdoodという方式をとることで解決しました。
<br/>

ではワークフローを実行していきます。
まずはdigdag_clientコンテナに入ります。

```bash
docker exec -it digdag_client bash
```

digdag_serverに向けてプロジェクトをプッシュします。

```bash
digdag push my-project -e http://digdag_server:65432
```
<br/>

UIを確認するとプロジェクトがプッシュされていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672662/d0786dfe-c309-465e-8d73-cea7cadda854.png)
<br/>

ワークフローを実行します。今回はUIからRUNボタンを押して実行します。
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672662/68c06893-2ae9-9f7d-8736-d9eae79a88bd.png)
<br/>

ワークフローが成功しました。
![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672662/c5db8c81-0c35-9cbc-73c2-75c14e9eccc6.png)
<br/>

dozzleにも期待通りにログが出ています。
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2672662/476da131-0ae9-1559-49e9-0eaf456efb78.png)


## まとめ
今回は単純な実行のみでしたがスケジュール実行やサーバーの細かい設定などまだまだ検証できそうな部分もあるので引き続き遊んで行こうと思います。