Google Cloud Platformでサーバーレス・フルマネージドDigdag（環境構築編）

# Google Cloud Platformのワークフロー
Google Cloud Platform（GCP）では、ワークフローサービスが２つあります。[Cloud Composer](https://cloud.google.com/composer?hl=ja)と[Cloud Workflow](https://cloud.google.com/workflows?hl=ja)です。しかしこの２つのサービスですが、Cloud ComposerはPythonゴリゴリ感、Cloud Workflowはyaml地獄感がすごい。（個人の感想です。）
小中規模のワークフローをサクッと作りたいときってないですか？　そういう時は、OSSのワークフローエンジンであるDigdagを使うことをオススメします。

# Digdagとは
OSSのワークフローエンジンDigdagとは、公式ドキュメントを引用すると次の通りです。

>Digdag is a simple tool that helps you to build, run, schedule, and monitor complex pipelines of tasks. It handles dependency resolution so that tasks run in series or in parallel.
Digdagは、複雑なタスクのパイプラインを構築、実行、スケジューリング、監視するためのシンプルなツールです。Digdagは、タスクが直列または並列に実行されるように依存関係を解決します。

[Treasure Data](https://www.treasuredata.com/)が開発したシンプルでわかりやすく使いやすいワークフローツールです。マルチクラウドと謳っていて、AWS(S3、Redshiftなど）にも対応、GCPではBigQuery, Cloud Storage(GCS)に対応しています。SaaSであるTreasure DataのWorkflow機能は、このDigdagがベースとなっています。（Digdagは当然Treasure Dataにも対応しています。）
Cloud Composerなんか裏でGoogle Kubernetes Engine(GKE)とGoogle App Engine(GAE)とGCSを使って仰々しくてお金かかりそうですし、PythonでDagファイルをゴリゴリ書かないとならないし（テンプレありますが）、フルマネージドですが敷居が高いし、めんどくさいです。（個人の感想です。）


# サーバーレス・フルマネージド環境
本記事では環境構築編でDigdagの環境をGCPで作り、次の実践編で実際にワークフローを実行しようと思います。
環境構築編では、Digdagを以下のGCPサービスを使って構築します。

| GCPサービス | コメント |
|:-:|:-|
|[Cloud Run](https://cloud.google.com/run/?hl=ja)|コンテナサーバーレスフルマネージドサービス|
|[Cloud SQL for PostgreSQL](https://cloud.google.com/sql?hl=ja)|フルマネージドRDBサービス|
|[サーバーレスVPCアクセス](https://cloud.google.com/vpc/docs/serverless-vpc-access?hl=ja)|CloudRunなどサーバーレスサービスとCloud SQLをプライベート接続するサービス|
|[Cloud Build](https://cloud.google.com/build?hl=ja)|サーバーレスCI/CDプラットフォーム|
|[Cloud Container Registry](https://cloud.google.com/container-registry)|Dockerコンテナのレポジトリ|

また、構築には超便利な（最近AWSも真似した）Cloud Shellを使います。ちなみに、AWSは**CloudShell**でGCPは**Cloud Shell**です、どうでもいいけど。

# 環境構築
ここからは実際に環境を構築していく手順です。

## バージョン
今回のDigdagバージョンは、0.10.0を使用しました。（最新は0.10.1ですが色々あって）

## 設定ファイルの準備
設定ファイルとしては、DockerfileとDigdag設定ファイル(ここではdigdag.config)の２つを準備します。

### Dockerfile
Dockerfileは、以下の感じにしてみました。

```dockerfile
ENV DIGDAG_VERSION 0.10.0
WORKDIR /src

RUN apk update --no-cash && \
    apk add --no-cache \
      bash \
      curl && \
    curl -o /usr/local/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-${DIGDAG_VERSION}" && \
    chmod +x /usr/local/bin/digdag

COPY ./digdag.config /etc/digdag/digdag.config

ENTRYPOINT ["java", "-jar", "/usr/local/bin/digdag","server","--config","/etc/digdag/digdag.config"]```
```

### Digdag設定ファイル

Digdagサーバの設定は、ポイントとしてbindを0.0.0.0に設定すること、それとDigdagのデフォルトポートは65432なので65432とadminポートとして65433を設定しました。（ポートは変更も可能です。）
database.hostは、Cloud SQLを作成後にIPアドレスが割り振られてから埋めます。PostgreSQLのデータベース名は"digdag_db"、Digdagの実行ユーザー名を"digdag"とします。

```
server.bind = 0.0.0.0
server.port = 65432
server.admin.bind = 0.0.0.0
server.admin.port = 65433
database.type = postgresql
database.user = digdag
database.password= ********
database.host = <Cloud SQLのIPアドレス>
database.port = 5432
database.database = digdag_db
database.maximumPoolSize = 32
digdag.secret-encryption-key = *********************
```
digdag.secret-encryption-keyについては、digdag secretsコマンドで必要になりますので設定します。設定値は[Digdagドキュメントの「Secret Encryption Key」](https://docs.digdag.io/command_reference.html?highlight=digdag%20secret%20encryption%20key#secret-encryption-key)に記載があります。
また、本記事では最低限の設定しかしていません(ログ出力とかしてない)が、他にも設定がありますので[Digdagドキュメント](https://docs.digdag.io/command_reference.html?highlight=digdag%20secret%20encryption%20key#server-mode-commands)を確認して、もし必要な設定があれば追加しましょう。


### Cloud Shellに保存
Cloud Shellを起動してフォルダを作成し、そのフォルダの中に上記2ファイルを保存します。

#### Cloud Shellを起動する
Google Cloudコンソールの右上のCloud Shellのボタンをクリックします。
![2021-06-24_20h22_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/d6992186-1083-04ac-5268-e6cd13c333bb.png)

#### フォルダを作成する
ここではdigdag-gcpフォルダを作成します。好きな名前で良いです。
![shusei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/f24c6381-5d17-b96f-8fde-6fdbff02825a.png)




#### フォルダにファイルを保存する
先程の2ファイルをフォルダに保存します。ローカルファイルをCloud Shellにアップロードします。
![2021-06-24_20h57_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/308a1147-2729-88c6-5801-99b5619e49e1.png)

## Cloud SQL for PostgreSQLの作成
[公式ドキュメントのInternal architecture-Database](http://docs.digdag.io/internal.html#database)によると、DIgdagでは、すべてのデータをデータベース（PostgreSQLまたはH2データベース）に保存します。
このPostgreSQLをGCPのフルマネージドサービスであるCloud SQLで作成します。

### Cloud SQL for PostgreSQLの作成
Google CloudコンソールからCloud SQLインスタンスを作成します。
インスタンスIDは"digdag-db"にしました。好きなID名でいいです。
データベースのバージョンは最新13を選択します。
リージョンは、この記事ではus-central1にしました。（基本USは安いので）
お金が掛かるので、この記事ではシングルゾーンを選択しています。
![2021-06-24_23h36_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/5528a185-5086-0b60-8f09-ed4fb704e3e5.png)

マシンタイプですが、ここでは1コアを指定します。（お金が掛かるので）
![2021-06-24_23h19_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/f9741e34-af73-dc34-a85c-ffb31918ac25.png)

ストレージは、ここでは最小にします。（お金が掛かるので）
![2021-06-24_23h19_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/325fa87b-a520-5930-f97c-6746226fa680.png)

接続はパブリックIPをチェック、プライベートIPにチェックします。本記事ではネットワークはdefaultを選択しますが、ご自分に合わせたVPCネットワークを選択してください。
![2021-07-28_22h16_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/8d261eab-fd57-cdc2-87b8-b38462648e45.png)

バックアップはここでは外します。（お金が掛かるので）
![2021-06-24_23h20_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/9d6323ca-a0ba-d3ac-919c-7f6f8bfcd01c.png)

最後に「インスタンスを作成」をクリックします。
![2021-06-24_23h33_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/7606becb-abd4-0e4d-56f8-e05314e4fe12.png)

### ロール（ユーザー）とデータベースの作成
ロール（ユーザー）データベースの作成は、Cloud SQLのPostgreSQLにログインして作成します。gcloud sqlコマンドを使い、PostgreSQLにログインします。
![2021-06-25_13h51_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/65b0f204-386b-518c-6ba9-5b414738c4a8.png)

#### ロール（ユーザー）の作成
ロール"digdag"を作成します。
![2021-06-25_20h19_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/43ab018d-e888-cb58-f31d-21ae946e0ae5.png)

### データベースの作成
ロールをオーナーとしてデータベース"digdag_db"を作成します。
![2021-06-25_20h25_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/9b979953-acbe-b924-fc62-a00a1a76d3ae.png)

### Extensionの作成
Digdagで使用するPostgreSQLのExtensionであるuuid-osspを作成します。これはUUIDを生成する関数を使えるようにするExtensionです。
![2021-06-25_20h26_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/df8ed3c0-7ab0-3c1f-e18c-ef1db7fd23df.png)

### digdag.configにプライベートIPアドレスを保存
Cloud Runの設定の前に、digdag.configにCloud SQLに割り振られたプライベートIPアドレスを保存します。
![2021-06-25_22h02_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/3c1124bb-bc75-0900-6a45-8514a7c28d2a.png)

![2021-06-26_02h29_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/3daaaaa6-ce3b-6048-df2c-10a7210f5c47.png)

## サーバーレスVPCアクセスの設定
Cloud RunとCloud SQLを接続するために、サーバーレスVPCアクセスを使います。
![2021-06-25_23h23_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/4dea0173-0df2-3b00-23ba-a572681109e4.png)

「コネクタを作成」をクリックして、コネクタを作成します。
コネクタ名を"digdag-connector"として、VPCネットワークにCloud SQLと同じ"default"を選択し登録します。
![2021-06-25_23h25_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/038ec276-dccb-4819-a2e0-d4517e4e7e3f.png)

### Cloud Runにデプロイ
やっとCloud Runにデプロイします。Cloud Runですが、昔は一度Cloud Buildでビルドするコマンドを実行していましたが、少し前にできたらしい魔法の--sourceを使って一気にデプロイします。Dockerfileとdigdag.configがあるフォルダで、以下のコマンドを実行します。

```shell
gcloud beta run deploy digdag-run --region us-central1 \
                                  --platform managed \
                                  --port 65432 \
                                  --allow-unauthenticated \
                                  --vpc-connector digdag-connector \
                                  --source .
```
このコマンドでは、リージョンをus-central1、ポートをdigdag.configのserver.portに設定したポートを指定します。--vpc-connectorには、先ほど作成したサーバレスVPCアクセスのサービス名を指定します。--sourceはカレントフォルダということで、「.」を指定しています。
実行後、APIが有効になっていない場合は有効にするか聞かれたりしますので、"y"で進んでください。デプロイが完了すると、Service URLが出力されます。(Google Cloudコンソールでも確認できます。)
![2021-06-26_02h45_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/eb37c5c4-8096-70d4-515e-fb2acffb1904.png)

Google CloudコンソールのCloud Runの画面にも表示されました。 
![2021-06-26_18h28_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/0e1984eb-a035-6dc6-f6bb-2ac5a1da12d0.png)

## Digdag WEB画面の表示
成功した時に出力されたURLをWEBブラウザで表示します。Cloud Shell上のURLをクリックすると表示されます。
![2021-06-26_02h49_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/dd3aaf74-0a0f-ce72-5c9d-a691666d26f8.png)


## DigdagコマンドラインツールをCloud Shellにインストール
Digdagの操作のためのdigdagコマンドをインストールします。この記事では、便利なのでCloud Shellを使いますが、Cloud Shellを使わずローカルPCでも問題ないです。
Cloud Shellはgcloud, bq, gs, git, docker, kubectlコマンドなど既にインストール済みで最高なのですが、さすがにdigdagコマンドは入っていないので、インストールする必要があります。[ドキュメントのGetting startedの1. Downloading the latest version](http://docs.digdag.io/getting_started.html#downloading-the-latest-version)の通り進めます。
インストールしたら、念のため`digdag --version`で確かめて、バージョンが出力されたら正常にインストールできていることが確認できます。
![2021-06-26_15h46_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237667/6aa75df0-609c-558c-8877-f3ce00ea8175.png)


# サーバーレス・フルマネージドDigdag環境完成
Google推し推しのサーバレスCloud RunとフルマネージドRDBであるCloud SQLでDigdag環境を作ることができました。
実用を考えると、セキュリティ面ではこの記事では触れませんが、Identity-Aware Proxy（IAP）を使ってログインするようにしたいところです。また、Cloud RunでアクセスできるIPアドレスを制限したい場合、現時点ではGAEのようにFirewallがありませんし、実現するにはロードバランサーが必要のようです。（ロードバランサーはお金掛かりますし、GAEと同じくFirewall機能を作って欲しいところです。）
Cloud SQLとはプライベート接続できて、Cloud SQLをグローバルに晒す必要はなく安全と言えます。
実際に実用するとなると、上記のようにセキュリティについて、そしてスペックは考える必要があります。
（マネージドDigdagであるWorkflowを利用できるTreasure Dataは、セキュリティもしっかりしてます|дﾟ)ﾁﾗｯ）

次の実践編では、実際にサーバーレス・フルマネージドDigdagを実行してみます。（しかし、実際動かすと問題が・・・続く）