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」にパスワードが記載されていることが確認できます。

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を使用する際の参考となれば幸いです。