Cloud Workflowsで簡単なワークフローを開発する機会があったので振り返りかねて仕様や開発したワークフローについて書きます。
Cloud Workflows概要
Cloud Workflowsはサーバレスなワークフローを開発できるサービスです。YAMLかJSONで記述をします。公式ドキュメントを読むとGoogleのAPI、Cloud FunctionsやCloud Runを実行させるワークフローに最適に感じましたが、HTTPリクエストができればそれ以外でも大丈夫だと思います。
リソース
リージョン
現在は以下3リージョンです。
- us-central1(lowa)
- europa-west4(Netherlands)
- asia-southeast1(Singapore)
料金
Cloud Workflowsのジョブ単位である"ステップ"の実行数(1000単位)で課金されます。課金額は内部ステップと外部ステップで異なり、内部ステップは$0.01/1000ステップ、外部ステップは$0.025/1000ステップです。内部ステップと外部ステップの違いはこちらから。
料金 | Workflows | Google Cloud
Cloud FunctionsとCloud Runの.run.app ドメイン名の呼び出しは内部ステップ扱いですが、Google App Engine(以下、GAE)についての記載がないのでGAEのデフォルトドメイン(~r.appspot.com)は外部ステップ扱いなのか気になったところです。
定義方法
エディタ画面のワークフロー可視化機能が便利だったので、全てGCPコンソールでの説明です。
初めてアクセスしたときはこのような画面が表示されます。「作成」をクリック。
ワークフローの名前、リージョンとサービスアカウントを設定します。サービスアカウントにはデフォルトだとGCEの開発サービスアカウントが設定されます。各GCPサービスの認証認可にはこのサービスアカウントが使われるようです。設定したら「次へ」をクリック。
ワークフローの定義画面になります。ここでYAMLかJSONでワークフローを記述します。右側には編集中の内容に応じて動的にワークフローを可視化してくれます。初めて使うときに意図した通りにワークフローができているかすぐに確認できて便利です。定義が終わったら「デプロイ」をクリック。
デプロイが正常終了すると、定義したワークフローのトップ画面が表示されます。さっそく実行するには「実行」をクリック。
実行画面では、引数が必要であれば設定できます。準備が終われば「実行」をクリック。
ワークフローの実行が終了すると、実行時間など出力結果が表示されます。
また、ワークフローのログタブをクリックすると、デプロイのログやログ出力をワークフローに定義していればそのログも確認できます。
ここからCloud Workflowsを使って開発したワークフローの話に入ります。
こちらが構築したアーキテクチャ図です。
選定の背景
サーバーレス前提で開発しているシステムで、GAE上に開発した3ジョブ(それぞれジョブA、ジョブB、ジョブCと呼びます)をスケジューリング起動し、A→B→Cと順次実行するワークフローを開発することになったため、こちらのブログを参考にどのサービスを利用するかまず検討しました(ブログ当時にはCloud Workflowsはまだありません)。
GAEでスケジューリングするのでGoogle App Engine cron サービスが第一候補に挙がりましたが、順次実行ができないのでNG。Cloud Composerも候補に挙がりましたが、やりたいことに対してサービスが過剰かつコスト面でNG*1。GCE上で何かスケジューリングソフトウェアを使うのはサーバーレス前提に沿わないのでNGとなりました。
結果、ちょうど良いのがないとなったのですが、今年の夏にサーバーレスなワークフローサービスがローンチされたことを思い出したので調査したところ、Cloud Schedulerでスケジューリング可能、ジョブの順次実行制御が可能、HTTPリクエストでGAEのジョブが実行できそうだと見込めたのでCloud Workflowsを選定しました。
設定
設定内容について説明していきます。GAEはこちらの公式ドキュメントにあるHellow Worldをデプロイ済み前提としています。
Cloud Schedulerを設定する
こちらの設定に入る前に、前述のCloud Workflowsの定義方法で呼び出すワークフローを先に作成しておきます。
・Cloud Workflowsの実行ロールを持つサービスアカウントを作成する。
Cloud SchedulerからCloud Workflowsのワークフローを実行するためのロールを持ったサービスアカウントを作成します。Cloud IAMのサービスアカウント作成画面で「ワークフロー起動元」のロールを割り当てます。
・Cloud Schedulerで設定を行う。
Cloud Schedulerはcron形式のスケジューリングの設定を行えるサービスです。「頻度」の項目にcron形式で設定(スクショでは3分毎に実行)、「ターゲット」は"HTTP"、「URL」はCloudWorkflowsのエンドポイント、「HTTPメソッド」には"POST"を設定します。
CloudWorkflowsのエンドポイント
https://workflowexecutions.googleapis.com/v1beta/projects/<PROJECT_NAME>/locations/<REGION_NAME>/workflows/<WORKFLOW_NAME>/executions
エンドポイントは呼び出すワークフローに応じて、以下3点を編集します。
<PROJECT_NAME>:GCPプロジェクトID
<REGION_NAME>:呼び出すワークフローに定義したリージョン名
<WORKFLOW_NAME>:呼び出すワークフロー名
「SHOW MORE」をクリックすると認証設定項目が表れます。
「Authヘッダー」に"OAuthトークンを追加"、「サービスアカウント」にCloud Workflowsの実行ロールを持つサービスアカウントを設定します。
「更新」をクリックし設定を完了させます。Cloud Schedulerのジョブ一覧に遷移しますが、動作をすぐ確認する場合、「今すぐ実行」をクリックし「結果」に”成功”と出力されるのを確認しましょう。
ワークフローをYAMLで定義する
Cloud Workflowsの定義画面でYAMLでワークフローを定義します。
こちらがYAMLです。細かめにコメントいれてます。
main:
#メインワークフローのステップを定義
steps:
- startlog:
call: sys.log
args:
text: "hello-workflowを開始します"
severity: INFO
- runHello1:
try:
call: http.get
args:
url: <GAEジョブAのエンドポイント>
result: Hello1
except:
as: e
call: CloudloggingErrorLog
args:
errorlog: ${e}
- logStep:
call: sys.log
args:
text: "runHello1は正常終了しました"
severity: INFO
- runHello2:
try:
call: http.get
args:
url:<GAEジョブBのエンドポイント>
result: Hello2
except:
as: e
call: CloudloggingErrorLog
args:
errorlog: ${e}
- logStep2:
call: sys.log
args:
text: "runHello2は正常終了しました"
severity: INFO
- runHello3:
try:
call: http.get
args:
url: <GAEジョブCのエンドポイント>
result: Hello3
except:
as: e
call: CloudloggingErrorLog
args:
errorlog: ${e}
- endlogStep:
call: sys.log
args:
text: "runHello3は正常終了しました。hello-workflowは正常終了しました"
severity: INFO
- returnResult:
return: ${ Hello1.body + "," + Hello2.body + "," + Hello3.body}
CloudloggingErrorLog:
params: [errorlog]
steps:
- sendErrorLog:
call: sys.log
args:
text: ${errorlog}
severity: CRITICAL
正常処理となるメインワークフローとエラーメッセージを出力する処理をサブワークフローに共通処理として定義しています。
また、監視・運用と検証を兼ねてジョブ実行ごとにログメッセージを出力するステップを設定しましたが、ステップ単位で課金されるため安易にステップは追加しない方がよいように思えます。そのため、ログ出力はCloud Workflowsではなく、ジョブ側に任せるなども検討したほうがよさそうです。
今回は使っていませんが、ループ処理やリトライ処理なども定義できます。 本文末尾にリファレンスのリンクも貼っておきます。
ワークフロー図
YAMLをCloud Workflowsの機能で可視化した図です。
所感
GCPでジョブスケジューリングを開発するときに、やっとちょうど良いサービスが出てきたと思えました。Cloud Composerと比較すると機能不足かもしれませんが、簡単なワークフローや個人開発で使うには充分なのかなと思います。またサーバーレスなので運用が楽で未稼働のときに課金されないのも良いです。
参考
Cloud Schedulerのスケジューラ設定
Scheduling a workflow using Cloud Scheduler | Workflows | Google Cloud
Cloud Loggingへのログ送信設定
Sending logs to Cloud Logging | Workflows | Google Cloud
Syntax reference | Workflows | Google Cloud
最後までお読みいただきありがとうございます。