issensitive / nonsensitive — sensitive値の操作

1. 概要

  • issensitive — 値がsensitiveかどうかを確認
  • nonsensitive — sensitive値のsensitiveフラグを解除
  • sensitiveの伝播のしくみ
  • 実際のユースケース

issensitive(value)nonsensitive(value)はTerraformのsensitive値を操作するための関数です。sensitive属性は自動的に伝播するため、意図せずsensitiveになった値の扱いに使います。


2. issensitive — sensitive値かどうかを確認

issensitive(value)は値がsensitiveならtrue、そうでなければfalseを返します。

# terraform consoleで確認
> issensitive("plain text")
false

> issensitive(sensitive("secret"))
true

デバッグでの活用

terraform {
  required_version = ">= 1.9"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

variable "environment" {
  description = "環境名"
  type        = string
  default     = "dev"
}

variable "db_password" {
  description = "データベースパスワード"
  type        = string
  sensitive   = true
}

locals {
  # sensitiveな値を含む文字列はsensitiveが伝播する
  connection_string = "postgres://user:${var.db_password}@localhost:5432/mydb"
  # connection_stringもsensitiveになる

  # issensitiveで確認
  is_conn_sensitive = issensitive(local.connection_string)  # → true
}

data "aws_ami" "amazon_linux_2023" {
  most_recent = true
  owners      = ["amazon"]
  filter {
    name   = "name"
    values = ["al2023-ami-*-x86_64"]
  }
}

resource "aws_instance" "db" {
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = "t3.micro"

  root_block_device {
    volume_size = 20
    volume_type = "gp3"
    encrypted   = true
  }

  tags = {
    Name        = "${var.environment}-db"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

3. sensitiveの伝播のしくみ

variable "secret" {
  type      = string
  sensitive = true
}

locals {
  # sensitiveが伝播するケース(すべてsensitiveになる)
  concat_str   = "prefix-${var.secret}"       # sensitive
  in_list      = [var.secret, "other"]          # sensitive
  in_map       = { key = var.secret }           # sensitive
  after_upper  = upper(var.secret)              # sensitive

  # 補足: sha256などのハッシュ関数を使ってもsensitive
  hashed = sha256(var.secret)                   # sensitive(ハッシュでも伝播する)
}

4. nonsensitive — sensitiveフラグを解除する

nonsensitive(value)はsensitive値のsensitiveフラグを解除します。解除した値はplanやログに平文で表示されるため、本当に安全な値にのみ使います。

variable "api_key" {
  description = "APIキー"
  type        = string
  sensitive   = true
}

locals {
  # APIキーのsha256ハッシュ(先頭8文字)をタグに使いたい
  # sha256のハッシュはsensitiveが伝播するが、ハッシュ自体は安全
  api_key_hash = sha256(var.api_key)

  # nonsensitiveで解除してタグに使えるようにする
  # ハッシュ値は元の値を復元できないので安全
  api_key_tag  = nonsensitive(substr(local.api_key_hash, 0, 8))
}

resource "aws_s3_bucket" "app" {
  bucket = "${var.environment}-app"

  tags = {
    Name        = "${var.environment}-app"
    Environment = var.environment
    ManagedBy   = "terraform"
    ApiKeyRef   = local.api_key_tag  # ハッシュの先頭8文字(安全)
  }
}

5. nonsensitiveの正しい使い方

# ✅ 安全な使い方
locals {
  # ハッシュ値は元のパスワードを復元できないので安全
  password_hash_display = nonsensitive(sha256(var.password))

  # 長さ(文字数)は安全
  key_length = nonsensitive(length(var.api_key))
}

# ❌ 危険な使い方(絶対にしない)
locals {
  # 平文のパスワードをnonsensitiveで解除するのは危険
  # plaintext_password = nonsensitive(var.password)  # ← 絶対にやらない
}

6. 関連記事


7. まとめ

  • issensitive(value) — 値がsensitiveかどうかをboolで返す。デバッグに使う
  • nonsensitive(value) — sensitiveフラグを解除する。ハッシュ値など元の値を復元できない場合のみ使う
  • sensitiveは自動的に伝播する。文字列結合・リスト・mapへの代入でも伝播する
  • nonsensitive()で解除した値はplanやログに平文で表示される。使用は慎重に

動作確認バージョン: Terraform >= 1.9 公式ドキュメント: https://developer.hashicorp.com/terraform/language/functions/issensitive