概要
TerraformでRDSを立てる時にPasswordに入れる値ってどうしてますか?
方法
主にはterraform/variablesに書いてある方法
- 環境変数で渡す方法
- export TF_VAR_secret_key=bar
- -var 'secret_key=bar'
- 標準入力で渡す方法
- variableをnullで定義しておく :
variable "secret_key" {}
(対話形式で入力が出来る)
- variableをnullで定義しておく :
- 自動生成する方法
- 固定で書いてしまう方法
課題
(1) の方法の場合、envファイルかコマンド実行時に毎回パラメーターを渡すかしないといけなくてめんどくさい。envファイルをいろんなひとに配るのもめんどくさい。けどenvを持ってる人じゃないと実行できない。
(2) の方法の場合、実行時に毎回聞かれる。(嘘の値を入れてもPasswordの更新は走らないわけだけどとてもめんどくさい)
(3) は(1)と(2)に比べればまともに運用しやすい。tfファイルにはコードは残らないので良い。
(4) はtfファイルにパスワード平文残していまう。
どの手法を使ってもtfstateファイルに平文が残ってしまう。tfstateファイルの管理方法によるが、ひと目に見えるrootパスワードというのはいかがなものだろう
解決方法
(3) で作って、その後手動でrootパスワードを更新してあげるのが安全に運用できそうだと思う。本当のrootパスワードはパスワードマネージャーで管理かな。
実装
(3)の実装は以下の感じです。
terraform version : 0.8.8
resource "random_id" "db_pswd" {
byte_length = 8
prefix = "w)2v_r"
}
~~
resource "aws_rds_cluster" "aurora-cluster" {
~~
master_password = "${random_id.db_pswd.b64}"
~~
}
- prefixは
0.8.8
からのattributeです。base64だと記号が含まれないので、ちょっとしたお気持ちでつけてみました。(作成後に手動変更もするので気持ちの問題だと思います…)
おまけ
random_idは以下の様な値がとれます
random_id.db_pswd:
id = DRbsI2S5vck
b64 = w)2v_rDRbsI2S5vck
b64_std = w)2v_rDRbsI2S5vck=
b64_url = w)2v_rDRbsI2S5vck
dec = w)2v_r942218400924646857
hex = w)2v_r0d26fc2364b9bdc9