AWSで、Terraformを利用する方法をまとめてみた(5/10)

データ型
--

- string: 文字列
- number: 数値
- bool: 真偽値
- list: 配列
- set: 集合
- map: マップ
- object: オブジェクト

これらのデータ型を組み合わせることで、HCL2は複雑なデータ構造を扱うことができます。

`list`、`map`、`object`を使用した参考例 その1
--
【list: 配列】

```
variable "example_list" {
  type = list(string)
  default = ["item1", "item2", "item3"]
}

resource "aws_instance" "example" {
  count = length(var.example_list)

  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  tags = {
    Name = "example-instance-${var.example_list[count.index]}"
  }
}
```

上記の例では、`variable`ブロックを使用して`example_list`という名前のlist型の変数を定義しています。デフォルト値として、3つの文字列要素を持つ配列を指定しています。`resource`ブロックでは、AMI IDやインスタンスタイプなどの定数値の代わりに、`var.example_list[count.index]`を使用して可変の値を指定しています。`count.index`は、Terraformのループ構文で使用される内部変数です。

【map: マップ】

```
variable "example_map" {
  type = map(string)
  default = {
    key1 = "value1"
    key2 = "value2"
    key3 = "value3"
  }
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  tags = var.example_map
}
```

上記の例では、`variable`ブロックを使用して`example_map`という名前のmap型の変数を定義しています。デフォルト値として、3つのキーと値のペアを持つマップを指定しています。`resource`ブロックでは、`tags`プロパティに`var.example_map`を渡すことで、AWSインスタンスにタグを設定しています。

【object: オブジェクト】

```
variable "example_object" {
  type = object({
    key1 = string
    key2 = number
    key3 = bool
  })
  default = {
    key1 = "value1"
    key2 = 123
    key3 = true
  }
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  tags = {
    Name = "example-instance"
    Extra = var.example_object.key1
  }
}
```

上記の例では、`variable`ブロックを使用して`example_object`という名前のobject型の変数を定義しています。デフォルト値として、3つのキーと値のペアを持つオブジェクトを指定しています。`resource`ブロックでは、`tags`プロパティに`var.example_object.key1`を渡すことで、AWSインスタンスに`Extra`タグを設定しています。

`list`、`map`、`object`を使用した参考例 その2
--

### listの使い方

```
variable "servers" {
  type = list(string)
  default = ["web1", "web2", "db1"]
}

resource "aws_instance" "example" {
  count = length(var.servers)
  ami = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  tags = {
    Name = var.servers[count.index]
  }
}
```

上記の例では、`servers`という名前の`list`型変数を定義し、デフォルト値として3つの文字列を含むリストを設定しています。`aws_instance`リソースを定義する際に、`count`を`length(var.servers)`とすることで、`servers`変数の要素数だけリソースを作成します。また、`tags`ブロックの`Name`キーには、`servers`変数の各要素を順番に使用してタグを付けます。

### mapの使い方

```
variable "aws_regions" {
  type = map(string)
  default = {
    us-west-1 = "Oregon"
    us-west-2 = "N. California"
    us-east-1 = "N. Virginia"
    us-east-2 = "Ohio"
  }
}

resource "aws_instance" "example" {
  ami = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  for_each = var.aws_regions

  tags = {
    Name = each.key
    Region = each.value
  }
}
```

上記の例では、`aws_regions`という名前の`map`型変数を定義し、デフォルト値として4つのキーと値を含むマップを設定しています。`aws_instance`リソースを定義する際に、`for_each`を`var.aws_regions`とすることで、`aws_regions`変数のキーと値のペアだけリソースを作成します。また、`tags`ブロックの`Name`キーには、`each.key`を使用して各リソースに名前を付けます。`Region`キーには、`each.value`を使用して各リソースのリージョンをタグ付けします。

### objectの使い方

```
variable "example" {
  type = object({
    name = string
    age = number
    email = string
    address = object({
      street = string
      city = string
      state = string
    })
  })
  default = {
    name = "John Smith"
    age = 30
    email = "john@example.com"
    address = {
      street = "123 Main St"
      city = "Anytown"
      state = "CA"
    }
  }
}

output "name" {
  value = var.example.name
}

output "city" {
  value = var.example.address.city
}
```

上記の例では、`example`という名前の`object`型変数を定義し、`name`、`age`、`email`、`address`のプロパティを持つオブジェクトを設定しています。`address`プロパティはさらに`street`、`city`、`state`のプロパティを持つネストされたオブジェクトです。

また、`default`キーワードを使用して、`example`変数のデフォルト値を指定しています。

`output`ブロックでは、`name`と`city`のプロパティを出力しています。`var.example.name`は`example`変数の`name`プロパティの値を取得し、`var.example.address.city`は`example`変数の`address`プロパティの`city`プロパティの値を取得しています。

このように、`object`型を使用すると、複数のプロパティを持つオブジェクトを定義し、その値にアクセスすることができます。ネストされたオブジェクトを使用することで、さらに複雑なデータ構造を表現することも可能です。

AWSで、Terraformを利用する方法をまとめてみた(1/10)
https://qiita.com/kimuni-i/items/ffde2f8df96fe5d9513f
AWSで、Terraformを利用する方法をまとめてみた(2/10)
https://qiita.com/kimuni-i/items/6298ed10adc6ad450488
AWSで、Terraformを利用する方法をまとめてみた(3/10)
https://qiita.com/kimuni-i/items/4d2f90506eb2dd4ee702
AWSで、Terraformを利用する方法をまとめてみた(4/10)
https://qiita.com/kimuni-i/items/b97089a820cc06ed2d9c
AWSで、Terraformを利用する方法をまとめてみた(6/10)
https://qiita.com/kimuni-i/items/943daf8f4e80af12b70e
AWSで、Terraformを利用する方法をまとめてみた(7/10)
https://qiita.com/kimuni-i/items/b2cc6e1e4b5d5c1a92cb
AWSで、Terraformを利用する方法をまとめてみた(8/10)
https://qiita.com/kimuni-i/items/2934372c385ba0561425
AWSで、Terraformを利用する方法をまとめてみた(9/10)
https://qiita.com/kimuni-i/items/edbdc88f0bca9c0354d2
AWSで、Terraformを利用する方法をまとめてみた(10/10)
https://qiita.com/kimuni-i/items/2f900d792c38ad93979c