これまでのやり方
以前の記事(上記)でAzure Database for PostgreSQLをでBicepででデプロイしました。その際の内容の抜粋が以下のものです。
@description('Administrator user name') @secure() param adminUser string @description('Administrator user password') @secure() param adminPassword string resource pgsql 'Microsoft.DBForPostgreSQL/servers@2017-12-01' = { name: name location: location sku: { ... } properties: { createMode: 'Default' administratorLogin: adminUser // ユーザー名 administratorLoginPassword: adminPassword // パスワード } }
入力値のパラメータとしてadminUserやadminPasswordをコマンド実行時に指定する必要があります。これらのパラメータには @secure Annotationが指定されているため、Portalの実行ログなどでは見ることはできないようになっています。
しかし繰り返しこのコマンドを実行するような場合、パスワード等の値を何らかの方法でパスワードを管理しておく必要があります。ではそれはどこで、どういった方法で行うべきしょうか? パラメーターJSONファイルに直接記載しそれをGitで管理しましょうか?(そうするとパスワードをPlain Textで保存することになりますね)。毎回ユーザーが手で入力しますか?(忘れたら困ります)。 以前の記事を書いた時点では、簡易的な方法として各ユーザーに環境変数にこのパスワードを保存しておいてもらい、コマンド実行時にはその環境変数を指定するような方式を想定していました。
今回はこの部分を改善したいと思います。
Azure Key Vaultと連携する
Azure Bicep v0.4からgetSecret()という機能が追加されています。この機能はAzure Key Vaultに格納されている秘匿情報をBicep上で利用することができるようになるものです。
まずは上記のMicrosoft Docsを参考にKey VaultにPostgresql用のユーザー名とパスワードを格納したものとします。 するともうあとは簡単です。Key Vaultで保管している内容を参照するようさきほどの例を変更してみましょう。
8行目~10行目にKey Vaultの参照を取得するresource指定を追加しました。ここで作成したkeyvault名称を指定してください。 すると20行目のユーザー名参照やパスワード参照は kv.getSecret('Key Vaultのシークレット名') と変更するだけでOKです。 あとはもうパスワード等の秘匿情報を保管する場所に悩む必要はありません。Key Vault側で安全に保管できます。簡単ですね。
ますます簡単に
Azure ARMだとなかなか理解することが難しかったAzureのリソース定義の方法がBicepを利用することでどんどん簡単になっています。今回紹介した秘匿情報の扱いもその一つ。こうした情報はできる限りファイルには残したくないものですが、新しい機能でそれも改善されました。Microsoft自身が対応していることが様々な問題の解決を早められる要素になっているようにも思います。 Bicepは近日中にさらに機能アップするという話ですので、継続的にフォローしてもっとリソースデプロイが楽になるようにしていきたいと思います。