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

変数(概要)
--
__変数にはローカル変数と外部変数の2種類があります。__

1.	ローカル変数 ローカル変数は、TerraformのHCLコード内で定義され、同じファイル内でのみ使用される変数です。ローカル変数を使用することで、HCLコード内で再利用可能な値を定義できます。ローカル変数は locals ブロック内で定義されます。

__ローカル変数の例__
~~~
locals {
  region  = "us-west-2"
  vpc_id  = "vpc-1234567890abcdefg"
  subnet_ids = [
    "subnet-1234567890abcdefg",
    "subnet-0987654321hgfedcba"
  ]
}
~~~

2.	外部変数 外部変数は、TerraformのHCLコード外から渡される変数であり、terraform.tfvars ファイル、コマンドラインフラグ、環境変数、またはリモートステートから取得されます。外部変数を使用することで、TerraformのHCLコードを実行するたびに変数の値を変更することができます。外部変数は variable ブロック内で定義されます。

__外部変数の例__
~~~
variable "region" {
  description = "The region to deploy the infrastructure"
  type        = string
}

variable "vpc_id" {
  description = "The ID of the VPC"
  type        = string
}

variable "subnet_ids" {
  description = "The IDs of the subnets"
  type        = list(string)
}
~~~

外部変数は、terraform.tfvars ファイルで値を設定できます。例えば、以下のようにして外部変数 region に値を設定できます。
~~~
region = "us-west-2" 
~~~

また、コマンドラインフラグや環境変数を使用して、Terraform実行時に外部変数を設定することもできます。例えば、以下のようにして region 外部変数に値を設定できます。
~~~
terraform plan -var="region=us-west-2" 
~~~

この場合、Terraformは terraform.tfvars ファイルで定義された値ではなく、コマンドラインで渡された値を使用します。

Terraformで外部変数を使用するためのサンプルコード
--

まず、外部変数を定義するために、variables.tfというファイルを作成します。

~~~
variable "aws_access_key" {
  description = "AWS access key"
}

variable "aws_secret_key" {
  description = "AWS secret key"
}

variable "region" {
  description = "AWS region"
}
~~~
次に、これらの変数をTerraformのコードで使用するために、main.tfというファイルを作成します。

~~~
provider "aws" {
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region     = var.region
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}
~~~
このコードでは、AWSプロバイダーを使用してEC2インスタンスを作成しています。AWSアクセスキー、シークレットキー、リージョンは、variables.tfで定義された外部変数を使用して渡されます。

最後に、外部変数の値を渡すためのファイルを作成します。ここでは、terraform.tfvarsというファイルを使用して、変数の値を渡します。

~~~
aws_access_key = "YOUR_AWS_ACCESS_KEY"
aws_secret_key = "YOUR_AWS_SECRET_KEY"
region = "us-west-2"
~~~
これで、Terraformのコードで外部変数を使用する準備が整いました。terraform applyコマンドを実行すると、terraform.tfvarsから変数の値を読み取り、EC2インスタンスを作成します。


変数(詳細)
--
1.	String Variables: 文字列を表す変数
~~~
variable "region" {
  type    = string
  default = "us-east-1"
}
~~~

2.	Number Variables: 数値を表す変数
~~~
variable "instance_count" {
  type    = number
  default = 1
}
~~~

3.	Boolean Variables: 真偽値を表す変数
~~~
variable "is_production" {
  type    = bool
  default = false
}
~~~

4.	List Variables: 複数の値を持つ変数
~~~
variable "availability_zones" {
  type    = list(string)
  default = ["us-east-1a", "us-east-1b"]
}
~~~

5.	Map Variables: キーと値のペアを持つ変数
~~~
variable "instance_tags" {
  type    = map(string)
  default = {
    environment = "dev"
    owner       = "John Doe"
  }
}
~~~

6.	Object Variables: オブジェクトを表す変数
~~~
variable "instance_details" {
  type = object({
    instance_type = string
    ami_id        = string
    subnet_id     = string
  })

  default = {
    instance_type = "t2.micro"
    ami_id        = "ami-0c55b159cbfafe1f0"
    subnet_id     = "subnet-1234567890abcdef0"
  }
}
~~~

これらの変数を使用することで、Terraformコードを柔軟に構築し、パラメータを変更することなく、異なる環境で再利用できるようにすることができます。

`terraform ${var.変数名}`を活用する例
--

例1: EC2インスタンスの作成

```
resource "aws_instance" "example" {
  ami           = var.ami_id
  instance_type = var.instance_type
}
```

上記のTerraformコードでは、`aws_instance`リソースを作成しています。その際に、AMI IDとインスタンスタイプはTerraform変数を使用して指定されています。具体的には、`ami_id`と`instance_type`という2つの変数があるものとします。

この場合、以下のように`terraform apply`コマンドを実行することで、Terraform変数に渡した値を使用してEC2インスタンスが作成されます。

```
terraform apply -var="ami_id=ami-0c55b159cbfafe1f0" -var="instance_type=t2.micro"
```

例2: S3バケットの作成

```
resource "aws_s3_bucket" "example" {
  bucket = var.bucket_name
}
```

上記のTerraformコードでは、`aws_s3_bucket`リソースを作成しています。その際に、バケット名はTerraform変数を使用して指定されています。

この場合、以下のように`terraform apply`コマンドを実行することで、Terraform変数に渡した値を使用してS3バケットが作成されます。

```
terraform apply -var="bucket_name=my-example-bucket"
```

このように、`terraform ${var.変数名}`を活用することで、Terraformコードを再利用しやすくしたり、実行時に柔軟に値を指定したりすることができます。

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を利用する方法をまとめてみた(5/10)
https://qiita.com/kimuni-i/items/11efb60b9a731d212211
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