chomp / trimspace / trim / trimprefix / trimsuffix — 文字列トリム関数

1. 概要

  • chomp — 末尾の改行を除去
  • trimspace — 前後の空白を除去
  • trim — 指定した文字を前後から除去
  • trimprefix / trimsuffix — プレフィックス・サフィックスを除去
  • 実際のユースケース

Terraformの文字列トリム関数は、外部データの読み込みや変数値の前処理で活躍します。特にファイルから読み込んだスクリプトの改行処理や、動的に生成したリソース名の余分な記号の除去に便利です。


2. chomp — 末尾の改行を除去

chomp(string)は文字列末尾の改行文字(\n\r\n)を取り除きます。

# terraform consoleで確認
> chomp("hello\n")
"hello"

> chomp("hello\r\n")
"hello"

> chomp("hello")
"hello"

ファイルから読み込んだホスト名の改行を除去する

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"
}

locals {
  # ファイルに書かれたホスト名の末尾改行を除去
  # db_host.txt の内容: "mydb.cluster.rds.amazonaws.com\n"
  db_host = chomp(file("${path.module}/db_host.txt"))

  # テンプレートから生成したNginx設定の末尾改行を整理
  nginx_conf = chomp(templatefile("${path.module}/nginx.conf.tpl", {
    server_name = "example.com"
  }))
}

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

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

  user_data = base64encode(local.nginx_conf)

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

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

3. trimspace — 前後の空白を除去

trimspace(string)は文字列の先頭と末尾にある空白(スペース・タブ・改行)をすべて除去します。

# terraform consoleで確認
> trimspace("  hello  ")
"hello"

> trimspace("\n  hello\n  ")
"hello"

> trimspace("hello")
"hello"
locals {
  # 変数に余分な空白が混入している場合に整理
  raw_bucket_name = "  my-app-bucket  "
  bucket_name     = trimspace(local.raw_bucket_name)  # "my-app-bucket"
}

4. trim — 指定した文字を前後から除去

trim(string, cutset)は文字列の先頭と末尾から、cutsetに含まれる文字をすべて除去します。

# terraform consoleで確認
> trim("/path/to/dir/", "/")
"path/to/dir"

> trim("***hello***", "*")
"hello"

> trim("  /hello/  ", "/ ")
"hello"
locals {
  # パス文字列から先頭・末尾のスラッシュを除去
  raw_path   = "/api/v1/users/"
  clean_path = trim(local.raw_path, "/")  # "api/v1/users"
}

5. trimprefix / trimsuffix — プレフィックス・サフィックスを除去

trimprefix(string, prefix)は文字列の先頭から指定したプレフィックスを除去します。trimsuffix(string, suffix)は末尾から除去します。プレフィックス・サフィックスが存在しない場合は元の文字列をそのまま返します。

# terraform consoleで確認
> trimprefix("dev-myapp", "dev-")
"myapp"

> trimprefix("prd-myapp", "dev-")
"prd-myapp"  # プレフィックスが一致しない場合はそのまま

> trimsuffix("myapp-blue", "-blue")
"myapp"

> trimsuffix("myapp-green", "-blue")
"myapp-green"  # サフィックスが一致しない場合はそのまま
variable "environment" {
  type    = string
  default = "dev"
}

variable "service_name" {
  type    = string
  default = "dev-myapp"  # 環境プレフィックスが付いている
}

locals {
  # "dev-" プレフィックスを取り除いてサービス名だけ取り出す
  base_name = trimprefix(var.service_name, "${var.environment}-")
}

6. 比較表

関数動作ユースケース
chomp(str)末尾の改行のみ除去ファイル読み込み後の改行整理
trimspace(str)前後のすべての空白を除去外部データの前処理
trim(str, cutset)前後から指定文字を除去パスのスラッシュ除去など
trimprefix(str, prefix)先頭のプレフィックスを除去環境名プレフィックスの除去
trimsuffix(str, suffix)末尾のサフィックスを除去拡張子や色名の除去

7. 関連記事


8. まとめ

  • chomp(str) — 末尾の改行を除去。file()で読み込んだ内容の整理に定番
  • trimspace(str) — 前後のすべての空白(スペース・タブ・改行)を除去
  • trim(str, cutset) — 前後から指定した文字セットの文字を除去
  • trimprefix(str, prefix) — 先頭のプレフィックスを除去(一致しない場合はそのまま)
  • trimsuffix(str, suffix) — 末尾のサフィックスを除去(一致しない場合はそのまま)

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