Terraformにてwrite-only attributeを利用する

Terraformのv1.11.0にてwrite-only attributesの機能が追加されました。 github.com

今回はwrite-only attributesを利用してみようと思います。

write-only attributesとは

write-only attributesは、Terraformが管理するリソースにおいてシークレット情報をステートファイルに書き込まずにリソースを構成するためのパラメータです。

※ステートファイルはTerraformを実行する際に、「.tfstate」にて作成されるファイルです。

従来、パスワードなどのシークレット情報はステートファイルに記載されるため、セキュリティ上の懸念がありました。

しかし、write-only attributesパラメータを活用することで、これらの情報を外部に漏らすことなく、セキュリティを向上させることができます。

前提条件

前提条件として、以下バージョン以上が必要です。

  • Terraformのバージョン:v1.11.0 以上
  • AzureRMプロバイダー:v4.21 以上

現在Azureリソースでサポートされているリソースは以下です。

  • azurerm_mssql_job_credential
  • azurerm_mssql_server
  • azurerm_mysql_flexible_server
  • azurerm_postgresql_flexible_server
  • azurerm_postgresql_server
  • azurerm_key_vault_secret ※v4.23より追加

詳細については以下のURLをご確認ください。 learn.microsoft.com

実行してみる

write-only attributesを利用しない場合

まずはwrite-only attributesを利用せず、シークレット情報がステートファイルに含まれる場合を確認してみます。

Terraform定義ファイルを作成する

Terraform定義ファイルを作成します。

今回は既存リソースグループにPostgreSQLフレキシブルサーバを作成します。

以下、PostgreSQLフレキシブルサーバを作成するためのTerraform定義ファイルを示します。

【main.tf】

# Env info
provider "azurerm" {
  features {}
  subscription_id = var.subscription_id
  tenant_id       = var.tenant_id
}

# Azure Provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>4.23.0"
    }
  }

  # Store Terraform state in Azure Storage
  backend "azurerm" {
    resource_group_name  = "<Resource Group名(状態格納用ストレージアカウントが格納されているResource Group)>"
    storage_account_name = "<Storage Account名>"
    container_name       = "<Blob Container名>"
    # Statment File Name
    key = "terraform.tfstate"
  }
}

【rg.tf】

#-------------------------------
# Resource Group
#-------------------------------

# Resource Group
data "azurerm_resource_group" "rg" {
  name = var.resource_group_name
}

【psql.tf】

#-------------------------------
# PostgreSQL Flexible Server
#-------------------------------

# PostgreSQL Flexible Server
resource "azurerm_postgresql_flexible_server" "psql" {
  name                = var.psql_name
  location            = var.location
  resource_group_name = data.azurerm_resource_group.rg.name

  administrator_login          = var.psql_admin_user
  administrator_password  = var.psql_admin_pw
  //administrator_password_wo = var.psql_admin_pw
  //administrator_password_wo_version = 1

  sku_name   = var.psql_sku
  version    = var.psql_ver
  storage_mb = var.psql_st

  public_network_access_enabled    = true

  depends_on = [
    data.azurerm_resource_group.rg
  ]
}

【variables.tf】

#-------------------------------
# 基本変数定義
#-------------------------------
# Subscription ID
variable "subscription_id" {}
# TenantID
variable "tenant_id" {}
# Region
variable "location" {
  default = "japaneast"
}

#-------------------------------
# Resource Group
#-------------------------------
# Resource Group Name
variable "resource_group_name" {
  default = "nishiyamas-tf-rg"
}

#----------------------------------
# PostgreSQL Flexible Server
#----------------------------------
# PostgreSQL Flexible Server Name
variable "psql_name" {
  default = "<PostgreSQL Flexible Server名>"
}
# Admin User
variable "psql_admin_user" {}
# Admin Password
variable "psql_admin_pw" {}
# SKU
variable "psql_sku" {
  default = "B_Standard_B1ms"
}
# Version
variable "psql_ver" {
  default = "16"
}
# Storage
variable "psql_st" {
  default = "32768"
}

【terraform.tfvars】

# Tenand ID
tenant_id = "<Tenant ID>"

# SubScription ID
subscription_id = "<Subscription ID>"

# Administrator User
psql_admin_user = "<Administrator User名>"

# Administrator Password
psql_admin_pw = "<Administrator Userパスワード>"
リソースを作成する

リソースを作成します。

実行コマンドについては以下URLの「Terraformコマンドの実行」をご参照ください。 blog.jbs.co.jp

ステートファイルを確認する

ステートファイルを確認すると、「administrator_password」にパスワードが記載されていることが確認できます。

terraform.tfvars(write-only argumentなし)

write-only attributesを利用した場合

次に、write-only attributesを使用した場合を確認します。

Terraform定義ファイルを作成する

「psql.tf」を以下のように更新します。

【psql.tf】

#-------------------------------
# PostgreSQL Flexible Server
#-------------------------------

# PostgreSQL Flexible Server
resource "azurerm_postgresql_flexible_server" "psql" {
  name                = var.psql_name
  location            = var.location
  resource_group_name = data.azurerm_resource_group.rg.name

  administrator_login          = var.psql_admin_user
  //administrator_password  = var.psql_admin_pw
  administrator_password_wo = var.psql_admin_pw
  administrator_password_wo_version = 1

  sku_name   = var.psql_sku
  version    = var.psql_ver
  storage_mb = var.psql_st

  public_network_access_enabled    = true

  depends_on = [
    data.azurerm_resource_group.rg
  ]
}
リソースを作成する

リソースを作成します。

実行コマンドについては以下URLの「Terraformコマンドの実行」をご参照ください。 blog.jbs.co.jp

ステートファイルを確認する

ステートファイルを確認すると、「administrator_password」にパスワードが記載されず、「null」となっていることが確認できます。

terraform.tfvars(write-only argumentあり)

おわりに

最後までお読みいただき、ありがとうございます。

本記事が、Terraformを使用する際の参考となれば幸いです。

執筆担当者プロフィール
西山 正太郎

西山 正太郎(日本ビジネスシステムズ株式会社)

クラウドソリューション事業本部に所属。近年は業務で主にMicrosoft Azureに携わっています。山登りが趣味です。

担当記事一覧