自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Terraform】(初心者向け)forとfor_eachの違いについて_2

すごい時間が経ってしまいましたが、以下記事の続きです。

www.guri2o1667.work

forとfor_eachの記事というよりは、タプルとオブジェクトの記事になっています。。。

tuple(タプル)とは?

タプルは、複数の要素を一つにまとめたもので、各要素はそれぞれ異なる型を持つことができます。以下にTerraformでのタプルの例を示します。

variable "example_tuple" {
  description = "A tuple combining different types"
  type        = tuple([string, number, bool])
  default     = ["hello", 42, true]
}

この例では、タプルの型はtuple([string, number, bool])と定義されており、それぞれ文字列、数値、ブール型の要素からなるタプルを作成します。

デフォルト値として["hello", 42, true]が設定されています。

object(オブジェクト)とは?

一方、オブジェクトはキーと値のペアの集合です。各キーは固有の型を持つことができます。

以下にTerraformでのオブジェクトの例を示します。

variable "example_object" {
  description = "An object combining different types"
  type        = object({
    name    = string
    age     = number
    isAlive = bool
  })
  default = {
    name    = "John Doe"
    age     = 30
    isAlive = true
  }
}

この例では、オブジェクトの型はobject({name = string, age = number, isAlive = bool})と定義されており、それぞれnameageisAliveというキーを持つオブジェクトを作成します。

各キーにはデフォルト値として"John Doe"30trueが設定されています。

タプルとオブジェクトの違い

これら二つのデータ構造の主な違いは、データへのアクセス方法とその柔軟性にあります。

タプルは順序によって要素にアクセスするのに対し、オブジェクトはキーによって要素にアクセスします。また、タプルは固定の長さと型を持つ一方で、オブジェクトはキーとその型を自由に定義することができます。

以下に、タプルとオブジェクトを使ってAWSのS3バケットを作成する例を示します。

タプルを利用したS3バケットの作成

variable "s3_bucket_settings" {
  description

 = "S3 bucket settings"
  type        = object({ bucket_name = string, acl = string, region = string })
  default     = { bucket_name = "my-example-bucket", acl = "private", region = "us-west-2" }
}

resource "aws_s3_bucket" "bucket" {
  bucket = var.s3_bucket_settings.bucket_name
  acl    = var.s3_bucket_settings.acl
  region = var.s3_bucket_settings.region
}

上記のコードでは、s3_bucket_settingsというオブジェクト変数を使用して、S3バケットの設定を定義しています。その後、このオブジェクトの各キー(bucket_nameaclregion)を使用してS3バケットを作成します。

オブジェクトを利用したS3バケットの作成

variable "s3_bucket_settings" {
  description = "S3 bucket settings"
  type        = tuple([string, string, string])
  default     = ["my-example-bucket", "private", "us-west-2"]
}

resource "aws_s3_bucket" "bucket" {
  bucket = var.s3_bucket_settings[0]
  acl    = var.s3_bucket_settings[1]
  region = var.s3_bucket_settings[2]
}

上記のコードではタプルを使用して同じ設定を行っています。しかし、この場合は各設定項目にアクセスするためにその位置(インデックス)を使用しています。

タプル/オブジェクトのどちらを採用するかはケースバイケースですがデータ構造が複雑になるにつれてオブジェクトの方が使いやすくなる傾向があります。

オブジェクトはキーによるアクセスが可能なため、どの要素がどの設定に対応しているかが明確になります。

タプルはその位置に基づいてアクセスするため、データ構造が複雑になると管理が難しくなることがあります。

以上です。