Cloud ComposerでSecret変数を使うには?
Cloud Composerと外部接続
9月ということで暑さも少しだけピークを過ぎつつあるかなと感じる昨今ですが、皆さんCloud Composerは使っていますか?
Apache Airflow をベースに構築された、フルマネージドのワークフロー オーケストレーション サービスでおなじみの、Cloud Composerです。
自前でAirflow環境を構築するだけの元気とリソースと勇気があれば良いですが、 スモール な組織で ビッグ な データウェアハウス を ドライブ させるには フルマネージド の ワーフクローオーケストレーションサービス がやはり欠かせませんよね。
今回はそんなCloud ComposerでSecret変数を活用するための方法をまとめています。
Secret変数の必要性
データの取り込み・吐き出し両方がワークフロー内で実行され得るところですので、Cloud Composerのようなデータ周りでのワークフローオーケストレーションサービスでどうしても必須になるのは、やはり外部との連携です。
Cloud Composerにおける外部サービスとの連携方法は大きく分けて2つです。
Connectionとして接続情報を登録する
AirflowのWeb GUI画面における「Admin → Connections」にアクセスすると、
下の画像のように、様々な接続情報のリスト画面に進みます。
この画面から実際に接続情報を作成できます。
例えば、 apache-airflow-providers-slack
のようなPyPIパッケージをインストールした上で、Slack APIなら下記のような画面から接続情報の登録が出来ます。
これが一番簡単な方法であり、もちろんGUIでなくCLIからもAirflowであれば airflow connections
コマンドで、Cloud Composerであれば gcloud composer environments
コマンドで登録できます。
Cloud Composerの場合は、Airflow 接続を管理する の公式マニュアル が参考になります。
接続情報をDAG内に取り込んでワークフロー内で繋ぎにいく
Connectionが必ずしも登録できなかったり、複雑な処理を実施するためにオリジナルのカスタムオペレータでの対応が必要だったりする場合には、接続情報をDAG内に取り込み、通常のPythonスクリプトのような感覚で接続しに行って対応することもできます。
そのためには当然ながら接続情報をDAG内で取得する必要があります。
接続情報は基本的に秘匿すべき情報なので、Secret変数のようなセキュアな扱いを行う必要があります。今回はその対応方法についてまとめます。
公式マニュアルとしては、「環境にSecret Managerを登録する」の内容になります。そこをよりかみ砕いて説明しますね。
Secret ManagerとCloud Composerの接続
まず、Secret Manager APIを有効にします。
そのうえで、Secret ManagerとCloud Composerを繋ぎます。
Airflow構成オプション
Secret Managerとの接続のためには、Airflow構成オプションを変更する必要があります。SecretManagerを使うための設定値は
-
セクション:
secrets
-
キー:
backend
に、値として airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend
を登録します。
また、それに加えて
-
セクション:
secrets
-
キー:
backend_kwargs
に、各種設定を書き込めますが、基本的には特に変更する必要がないので、先ほどの「環境にSecret Managerを登録する」の公式マニュアルのほうを参照してください。
私は基本的にプロジェクトIDは {"project_id": "[プロジェクトID]"}
として指定していてこの値を設定しています。
Secret Managerへの値の登録
上記設定により、Cloud ComposerがSecret Managerの値を参照するようになったので、Secret Managerに値を登録する必要があります。
特に先ほどの backend_kwargs
で設定を変更していない場合は、airflow-variables-[変数名]
という名前で登録していく必要があります。
登録はGUIベースでも行えます。
DAGからの参照
このように変数名を設定し終えたら、DAGから
from airflow.models.variable import Variable secret_var = Variable.get('[変数名]')
のようにしてSecret Managerに登録したSecret変数を secret_var
に読み出すことが出来ます。
非常に簡単ですね。
まとめ
今回はCloud ComposerでのSecret Managerとの連携方法についてまとめていきました。
公式ドキュメントは長いのですが、手順としてはすごくシンプルなので一度やり方を覚えてしまえばたいしたことない作業となると思います。
なので、 Secret Managerを使うのを面倒くさがったりせずに適切に情報を管理される ことをオススメします。
Cloud Composerの強いところはPythonで記述できるところで、いざとなったら自前のオペレータを立ち上げて柔軟な処理を出来るところだと実感している昨今です。そういったときには欠かせない知識となる気がします。
なお、管理対象を減らすという意味ではConnectionに頼っていくのも良いと思いますが、オペレータが乱立して繁雑になるくらいなら新しく自前でオペレータを作った方が良いのではないか…と思うことも多く、どちらが良いのか…については試行錯誤する日々です。