tech.guitarrapc.cóm

Technical updates

Pulumi の設定を Config で保持する

この記事は、Pulumi dotnet Advent Calendar 2019の10日目です。

qiita.com

PulumiはWeb UIがあり、そこにはConfigが見えます。 実際にコードでもConfigが参照でき、機密情報はConfigに保持して参照することでGitから分離できてよさそうです。 早速見てみましょう。

TL;DR

  • Pulumiは、Config設定をProjectに紐づけて保持できる
  • Config値はローカルのpulumi.STACK.yamlにも保持される
  • Secretはログインしているユーザーでないと復号できないようになっている
  • 構造化コンフィグがサポートされたのでJSONではこっちを使うとよい

イメージ的には、terraform.tfvarsがStackに紐づけて保持され、Web UIやCLI、プログラムアクセスで担保された感じ。

基本的な想定環境

Pulumi CLIの動作は公式ドキュメントを頼りに見ていくことになる。 この公式ドキュメントの記載は動作環境にBashのようなUNIX Shell (原文ママ) を想定している。

Most of our command line snippets in the docs are for a Unix shell like bash https://github.com/pulumi/docs/issues/2062#issuecomment-560501274

そのため、Windows環境のコマンドプロンプトやPowerShellではコマンドがそのまま動かないこともあるので注意してください。

CLIでのConfig操作

Pulumi configは、 CLIでサクッと設定、取得ができる。

  • pulumi configコマンドに、setgetサブコマンドを組み合わせて、key-valueペアを管理していく

基本的なコマンドは次の通り

  • pulumi config set <key> [value] : keyにvalueの値を保持する
  • pulumi config get <key>: keyの値を取得する
  • pulumi config: コンフィグ全部取得。--jsonでJSONとして取得

Keyは、[namespace:]key-nameという組み合わせで構成されている。namespaceは任意で省略してkey-nameのみも可能。namespaceを省略した場合、Pulumiが自動的に現在のプロジェクト名をpulumi.yamlから取得して差し込んでくる。

簡単なkey-value操作を見てみる。現在のプロジェクトで使うconfig値を設定するなら、シンプルにnamespaceなしにキーを設定できる。

# foo というキーに bar という値を設定
$ pulumi config set foo bar
$ pulumi config get foo
bar

あるいはawsパッケージで使うaws環境のリージョンを仕込むときは、 aws: namespaceを付けて次のように定義する。

$ pulumi config set aws:region ap-northeast-1
$ pulumi config get aws:region
ap-northeast-1

標準入力をvalueとして受け取ることもできる。(この例はBash/PowerShell/CMDすべてで同じだが、コマンドによってはパイプラインの違いで結果が変わってくるので注意)

$ echo fuga | pulumi config set hoge
$ pulumi config get hoge

秘密文字は、--secretフラグを付ける。--secretはただbase64をした値ではなく、Stackごとの暗号鍵+VaultごとのSaltで暗号化する。 中を見ようとしても、config一覧では[secret]とマスクされている。 直接keyにアクセスすると値が取れる。

$ pulumi config set --secret dbPassword S3cr37
$ pulumi config
KEY                     VALUE
dbPassword              [secret]
$ pulumi config get dbPassword
S3cr37

秘密文字は、awskmsなど任意の鍵を使うこともできるので必要なら使ってもいい。

Initializing a Stack with Alternative Encryption - Configuration and Secrets

プログラムでのConfig操作

任意のプログラミング言語でPulumi configを取得できるようにAPIが用意されている。C#でConfig操作するときはAPIがいくつか生えているので使い分ける必要がある。

まずはnew Configでインスタンスを取得したら、ここからConfigにアクセスできる。

var config = new Pulumi.Config();

// foo はオプショナルに取得。なくてもエラーは出ない。
var optionalFoo = config.Get("foo");

// foo はあるものとして取得。なかったらthrow。
var config.Require("foo");

// Secretの取得。実行時はプレーンテキストになるので取扱いに注意
var config.RequireSecret("dbPassword");

Getは型ごとにも用意されているので、適当に使うといい。

動きの把握はコード見たほうが早い。

https://github.com/pulumi/pulumi/blob/eec14527b17584e9a09b786514d9ae164bdeae61/sdk/dotnet/Pulumi/Config.cs#L63

Secretは実行時に生の値になっているので注意、かつ型的にはOutput<T>となる。

Web UI での確認

StackごとにConfigは紐づけて保持される。

Web UIでもConfigは確認できる。 Stackを開くとすぐに表示されている。

またアクティビティでも一件ごとにConfigを確認できる。

ローカルでの Config値

値を設定すると、ローカルのPulumi.Stack名.yamlにも保持される。

Secretの場合、暗号化された状態で保持されている。

config:
  foo: bar
  aws-sandbox:dbPassword:
    secure: AAABADU0Y5WFz8kp4BGIsqACA+NTPvKBOA1VQQzartD+QBVyesk=

暗号化されているので、Gitにコミット自体は可能

構造化されたConfig

前はJSONで保持みたいな記述でしたが、新しくYAML方式な構造が提供された。

# JSON で構造化データの投入
$ pulumi config set data '{"active": true, "nums": [1,2,3]}'

# 新しい構造化方式でデータを投入
$ pulumi config set --path data.active true
$ pulumi config set --path data.nums[0] 1
$ pulumi config set --path data.nums[1] 2
$ pulumi config set --path data.nums[2] 3

最近のCLIでよくある、terraformでもよく見るやり方なので、標準的に使えるのはうれしいところ。

JSONでは投入時に、CMD/PowerShellでエスケープの追加対応が必要だったが、構造化データではその考慮は不要でどのシェルでもほぼ同じコマンドで動く。

Escape for `pulumi config set` on Windows CMD and PowerShell · Issue #2062 · pulumi/docs

構造化データを投入すると、 Pulumi.Stack名.yamlは次のようなYAML構造で保持されます。

config:
  aws-sandbox:data:
    active: true
    nums:
    - 1
    - 2
    - 3

C#的には、 System.Text.Jsonを使って構造化データにアクセスします。

GetProperty()時点ではJsonEelementなので、GetBoolean()などで型を明示しないと使いにくいので注意。

var config = new Pulumi.Config();
var data = config.RequireObject<JsonElement>("data");
var active = data.GetProperty("active").GetBoolean();
Console.WriteLine($"Active: {active}");

直近のデプロイ時のConfig にローカルのConfigを更新する

pulumi config refreshを行うと、現在のPulumi.Stack名.yamlがバックアップされ、直近のデプロイ (pulumi up` 時のconfigを持ってきます)

あまり使わないけど、知っておくと便利なのでオススメ。

REF

公式ドキュメントに沿ってるのでみてみるのおすすめ。

Configuration and Secrets - Pulumi