Google Workflowsでユーザー定義の環境変数を使ってみる
はじめに
データアナリティクス事業本部のkobayashiです。
GoogleCloudのWorkflowsでデプロイ時に環境変数を指定することでデプロイ先の環境に応じてワークフローを柔軟に変更することができます。今回はその環境変数を使ってみたのでまとめます。
Workflowsの環境変数
Workflowsの環境変数は、デプロイ時に定義可能な文字列のキーと値のペアです。実行時にアクセスでき、環境に応じた動的な構成やyamlのテンプレートの再利用に活用できます。注意点としてはデプロイ時にバックエンドに保存され、実行時に変更するとこはできません。
デプロイ成功時のみ設定・変更が可能で、Google Cloud CLIで管理できます。
この機能を使うことで柔軟なワークフロー管理が実現します。
では早速試してみます。
Workflowsの環境変数を試してみる
workflowsのyamlファイルは次のものを使います。
main:
steps:
- init:
assign:
- app_env: ${sys.get_env("APP_ENV")}
- app_schema: ${sys.get_env("APP_SCHEMA")}
- app_table: ${sys.get_env("APP_TABLE")}
- the_end:
return: ${"[app_env]:" + app_env + " [app_schema]:" + app_schema + " [app_table]:" + app_table}
3つの環境変数app_env
,app_schema
,app_table
を受け取ってworkflowの最後にreturnするだけの単純なものになります。
ではこれをdeployして実行してみます。
$ gcloud workflows deploy wf-env-dev --source=wf-env.yml --location asia-northeast1 \
--set-env-vars APP_ENV=dev,APP_SCHEMA=schema_a,APP_TABLE=table_a
$ gcloud workflows run wf-env-dev --location asia-northeast1
argument: 'null'
createTime: '2024-09-18T19:14:23.133447433Z'
duration: 0.030699271s
endTime: '2024-09-18T19:14:23.164146704Z'
name: projects/1234567890/locations/asia-northeast1/workflows/wf-env-dev/executions/d8ee922f-ebe5-4d37-86dd-c2fbe1cdc295
result: '"[app_env]:dev [app_schema]:schema_a [app_table]:table_a"'
startTime: '2024-09-18T19:14:23.133447433Z'
state: SUCCEEDED
status:
currentSteps:
- routine: main
step: the_end
workflowRevisionId: 000010-0b1
このような形でdeploy時に設定した環境変数がworkflow実行時に使われています。
では別の環境変数を設定して実行してみます。
$ gcloud workflows deploy wf-env-stg --source=wf-env.yml --location asia-northeast1 \
--set-env-vars APP_ENV=stg,APP_SCHEMA=schema_b,APP_TABLE=table_b
$ gcloud workflows run wf-env-stg --location asia-northeast1
argument: 'null'
createTime: '2024-09-18T19:14:25.872211454Z'
duration: 0.023387071s
endTime: '2024-09-18T19:14:25.895598525Z'
name: projects/1234567890/locations/asia-northeast1/workflows/wf-env-stg/executions/a0c9787a-9bcd-40db-a330-48e30de148a2
result: '"[app_env]:stg [app_schema]:schema_b [app_table]:table_b"'
startTime: '2024-09-18T19:14:25.872211454Z'
state: SUCCEEDED
status:
currentSteps:
- routine: main
step: the_end
workflowRevisionId: 000008-031
deploy時に変更した環境変数が新しいworkflow中で使われていることがわかります。
Deploy時の環境変数のいろいろな指定方法
Deploy時の観葉変数の指定法はファイルに環境変数をまとめて指定することもできます。
初めに以下のファイルを作成します。
APP_ENV: prod
APP_SCHEMA: schema_c
APP_TABLE: table_c
このファイルをdeploy時に指定してから実行してみます。
$ gcloud workflows deploy wf-env-prod --source=wf-env.yml --location asia-northeast1 \
--env-vars-file env.yml
$ gcloud workflows run wf-env-prod --location asia-northeast1
argument: 'null'
createTime: '2024-09-18T19:14:27.046418417Z'
duration: 0.023010392s
endTime: '2024-09-18T19:14:27.069428809Z'
name: projects/1234567890/locations/asia-northeast1/workflows/wf-env-prod/executions/0a49fc37-68ff-4915-9a9f-9b4dbd57579a
result: '"[app_env]:prod [app_schema]:schema_c [app_table]:table_c"'
startTime: '2024-09-18T19:14:27.046418417Z'
state: SUCCEEDED
status:
currentSteps:
- routine: main
step: the_end
workflowRevisionId: 000009-c06
ymlファイルで指定した環境変数が実行時に使われていることがわかります。
環境変数の指定ですが複数指定する場合にはカンマ,
区切りで指定します。したがって環境変数として与えたい値にカンマの文字列を含めたい場合は以下のように別の区切り文字を指定してデプロイする必要があります。
$ gcloud workflows deploy wf-env-devstg --source=wf-env.yml --location asia-northeast1 \
--set-env-vars ^:^APP_ENV=dev,stg:APP_SCHEMA=schema_a:APP_TABLE=table_a
$ gcloud workflows run wf-env-devstg --location asia-northeast1
argument: 'null'
createTime: '2024-09-18T19:14:24.528990879Z'
duration: 0.024606231s
endTime: '2024-09-18T19:14:24.553597110Z'
name: projects/1234567890/locations/asia-northeast1/workflows/wf-env-devstg/executions/5782825a-f46a-4497-9479-06f1e96cad56
result: '"[app_env]:dev,stg [app_schema]:schema_a [app_table]:table_a"'
startTime: '2024-09-18T19:14:24.528990879Z'
state: SUCCEEDED
status:
currentSteps:
- routine: main
step: the_end
workflowRevisionId: 000006-02c
またデプロイ時に環境変数を与えない場合のデフォルト値を設定したworkflowを作成することもできます。
main:
steps:
- init:
assign:
- app_env: ${sys.get_env("APP_ENV","dev")}
- app_schema: ${sys.get_env("APP_SCHEMA","default_schema")}
- app_table: ${sys.get_env("APP_TABLE","default_table")}
- the_end:
return: ${"[app_env]:" + app_env + " [app_schema]:" + app_schema + " [app_table]:" + app_table}
環境変数を指定せずにdeployして実行するとあらかじめ設定してあったdefault値が使われていることがわかります。
$ gcloud workflows deploy wf-env-dev --source=wf-env.yml --location asia-northeast1
$ gcloud workflows run wf-env-dev --location asia-northeast1
argument: 'null'
createTime: '2024-09-18T19:30:34.486897828Z'
duration: 0.018996991s
endTime: '2024-09-18T19:30:34.505894819Z'
name: projects/1234567890/locations/asia-northeast1/workflows/wf-env-dev/executions/e4c27188-63ce-4f0e-b827-f096d093ee99
result: '"[app_env]:dev [app_schema]:default_schema [app_table]:default_table"'
startTime: '2024-09-18T19:30:34.486897828Z'
state: SUCCEEDED
status:
currentSteps:
- routine: main
step: the_end
workflowRevisionId: 000001-d24
注意点
Workflows に定義された組み込み環境変数は予約されているため設定することができません。また環境変数のキーとして以下は設定できません。
''
:空白GOOGLE_
で始まるキーWORKFLOWS_
で始まるキー
他には命名規則として大文字、数字、アンダースコア_
となっています。他の組み込みの環境変数と区別するためユーザー定義の環境変数にはAPP_
などの一意のプリフィックスを付けることが推奨されています。
ユーザー定義の環境変数として使えるのは20個となり各環境変数のサイズは4kbの制限があります。
まとめ
GoogleCloudのWorkflowsでデプロイ時に環境変数を指定してデプロイをしてworkflowを実行してみました。環境変数を使うことで1つのテンプレートファイルで処理を切り替えることができコードのメンテナンス性が上がります。
最後まで読んで頂いてありがとうございました。