5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Helmチャートで環境変数を取り扱う工夫

Posted at

環境

Helm 3.7.1

Helmチャートでよくある悩み

Helmで実際のアプリをデプロイしていると、次のようなことが悩みどころになってくる。

  • values.yamlに機密性の高い環境変数(APIキーなど)を直接書き込んでしまっているので、gitやhelmリポジトリに上げると機密情報が漏れてしまう
  • デプロイ環境が複数あるときに、いちいち環境変数を書き換えてデプロイするのが面倒

Helmはあくまでもkubernetesのパッケージ管理ツールだからということもあってか、これらの悩みを解決する機能が明確に用意されているわけではない。そのため、ひと工夫が必要になる。

この記事を読んでできること

  • 機密性の高い変数(APIキーなど)をgitなどの管理から除外する
  • 環境変数は、
    • 環境毎で共通のものは、values.yamlに書く
    • 環境毎の差分はenv/以下のファイルに分けて記述する

Helmチャートを書き換えてみる

以下のvalues.yamlを例にとって説明する。

values.yaml
app:
  port: 3000 #開発環境で3000、本番環境で3010
  someLimit: 100
secret:
  SOME_API_KEY: "apikey-dev" #開発環境で"apikey-dev"、本番環境で"apikey-prod"

このvalues.yamlをそのまま使うと、上述のようにデプロイ環境毎に環境変数を書き換えてからデプロイするひと手間がかかる。
Helmチャートをgit管理している場合、これらの値の更新がコミットされてしまうのも面倒になる上、APIキーをgit管理対象に含めてしまう危険性がある。

values.yamlのテンプレートを作成する

そこでまず、values.yamlのテンプレートを作る。

values.template.yaml
app:
  port: <port>
  someLimit: <limit>
secret:
  SOME_API_KEY: <apikey>

gitではvalues.template.yamlを管理し、values.yamlはgit管理対象から外しておく。

env/フォルダ内にマニフェストファイルを作成し、デプロイ環境毎の環境変数を書く

さらに、環境毎の値を記述するマニフェストファイルを作成する。
envディレクトリの下に作成すると整理がしやすい。
APIキーを含んでいるので、これらもgit管理対象から外しておく。

env/develop.yaml
app:
  #開発環境では、portはvalues.yamlのものを使用
secret:
  SOME_API_KEY: "apikey-dev"
env/product.yaml
app:
  port: 3010 #本番だけポートを変える
secret:
  SOME_API_KEY: "apikey-prod"

app.someLimitは環境毎で共通の値なので、values.yamlにのみ書いておく。
逆に、環境毎に必ず分けておきたい変数は、無効な値を書いておくとよい。

values.yaml
app:
  port: 3000 #デフォルト値
  someLimit: 100
secret:
  SOME_API_KEY: null #無効な値を設定し、env/xxx.yamlで指定させる

簡単にまとめると、

  • デフォルト値や、環境毎で共通の値はvalues.yamlに記述する
  • 環境毎に固有の値はenv/xxx.yamlに記述する

とすればよい。

デプロイ時

これらのファイルを用いてHelmチャートをデプロイ・アップデートするときは、以下のように-fオプションを利用する。
-fオプションで複数のファイルを指定したとき、各yamlファイルに重複した値がある場合にはより右(後)で指定したファイルのものが優先される(参考)。

$ helm install -f values.yaml -f product.yaml fuga-app-prod .

例えば、上記のコマンドでは以下のvalues.yamlを使用したのと同等になる。

values.yaml
app:
  port: 3010
  someLimit: 100
secret:
  SOME_API_KEY: "apikey-prod"

ファイルの指定順を間違えると、誤った環境変数が適用されてしまうので注意。
例として、上記のコマンドでvalues.yamlより先にenv/product.yamlを書いてしまうと。以下のvalues.yamlを使用したことになってしまう。

values.yaml
app:
  port: 3000
  someLimit: 100
secret:
  SOME_API_KEY: null

おわりに

Helmはあまり環境変数の取り扱いに便利な機能が無く、苦労したことがこの記事を執筆したきっかけです。
この記事がどなたかの助けになれば幸いです。

参考

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?