【Terraform】Terraform ~ 機密情報の扱いを考える ~

■ はじめに

今回は、パスワードなどの機密情報を
Terraform でどう扱うかを考えて
ここにちょこちょこまとめていく。

できれば、実践したい。

目次

【0】今回学べたこと
【1】機密情報の扱いを考える
 案1:tfvars ファイルで変数で切り出す
 案1の例
 案2:環境変数「TF_VAR_」を使う
 案2の例
【2】DBのパスワードについて考える
 補足:random_password について

【0】今回学べたこと

[1] tfvars ファイル
[2] Terraform の 環境変数「TF_VAR_」
[3] resource "random_password" によるパスワード生成
などなど...

【1】機密情報の扱いを考える

案1:tfvars ファイルで変数で切り出す

* TFファイルは、Gitで管理
* tfvars ファイルは、除外する
って運用。

tfvars ファイルについて

* 「terraform.tfvars」又は「*.auto.tfvars」については、
 自然に読み込まれる

https://developer.hashicorp.com/terraform/cloud-docs/workspaces/variables#7-auto-tfvars-variable-files

案1の例

info.tf

variable password {
  type = string
  default = ""
}

terraform.tfvars

password = "hello_world12345"

コマンド例

# 「terraform console」でコンソールモードにして変数を確認
$ terraform console
> var.password
"hello_world12345"

案2:環境変数「TF_VAR_」を使う

* 「TF_VAR_[変数名]」で環境変数を使用することができる

https://developer.hashicorp.com/terraform/cloud-docs/workspaces/variables#2-local-environment-variables-prefixed-with-

案2の例

ex1: コンソールによる確認

$ set TF_VAR_password="used_TFVAR123_hello"

# 「terraform console」でコンソールモードにして変数を確認
$ terraform console
> var.password
"\"used_TFVAR123_hello\"" << 「"」まで変数として扱われてしまうので注意
> ^C

# Linux(bash)なら、「export TF_VAR_password=used_TFVAR123_hello」
$ set TF_VAR_password=used_TFVAR123_hello  

$ terraform console
> var.password
"used_TFVAR123_hello"
> ^C

ex2: TFコードで環境変数を使う

# 環境変数を受ける変数を定義する
variable "input" {
  type = string
}

output "result" {
  value = "Hello, ${var.input}!!"
}

コマンド例

set TF_VAR_input=World

terraform init

terraform apply
...
Outputs:

result = "Hello, World!!" << ★

【2】DBのパスワードについて考える

# Step1: random_password でパスワード生成
# https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password  
resource "random_password" "password" {
  length           = 20
  special          = true
  override_special = "!#$%&*()-_=+[]{}<>:?"
}

# Step2: Step1 のパスワードをDBに設定
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance  
resource "aws_db_instance" "example" {
  instance_class    = "db.t3.micro"
  allocated_storage = 64
  engine            = "mysql"
  username          = "root"
  password          = random_password.password.result
}

# Step3: AWS SSM(Systems Manager パラメータストア)などに保持
#  => 後は、システム側では、SSM経由でパスワードを取得するっといった流れ
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssm_parameter
 
resource "aws_ssm_parameter" "secret" {
  name        = "/dev/database/password/master"
  description = "The DB password"
  type        = "SecureString"
  value       = random_password.password.result

  tags = {
    environment = "dev"
  }
}

補足:random_password について

* 以下の関連記事を参照のこと

Terraform ~ AWS Secrets Manager ~
https://dk521123.hatenablog.com/entry/2023/04/11/152801

関連記事

Terraform ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/05/000224
Terraform ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/09/222057
Terraform ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/05/03/000000
Terraform ~ AWS IAM ~
https://dk521123.hatenablog.com/entry/2023/04/12/214311
Terraform ~ AWS S3 ~
https://dk521123.hatenablog.com/entry/2023/04/09/104204
Terraform ~ AWS MSK ~
https://dk521123.hatenablog.com/entry/2023/05/14/122215
Terraform ~ AWS Secrets Manager ~
https://dk521123.hatenablog.com/entry/2023/04/11/152801