

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Terraform 変数、ローカル値、出力について
<a name="variables-locals-outputs"></a>

変数は、コードのブロック内のプレースホルダーを許可することで、コードの柔軟性を高めます。変数は、コードが再利用されるたびに異なる値を表すことができます。Terraform は、モジュールスコープによって変数タイプを区別します。入力変数はモジュールに挿入できる外部値であり、出力値は外部で共有できる内部値であり、ローカル値は常に元の範囲内にとどまります。

## [変数]
<a name="variables"></a>

AWS CloudFormation は[パラメータ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)を使用して、あるスタックデプロイから次のスタックデプロイに設定およびリセットできるカスタム値を表します。同様に、Terraform は[入力変数](https://developer.hashicorp.com/terraform/language/values/variables)または *変数*を使用します。変数は Terraform 設定ファイルの任意の場所で宣言でき、通常は必要なデータ型またはデフォルト値で宣言されます。次の 3 つの式はすべて有効な Terraform 変数宣言です。

```
variable "thing_i_made_up" {
  type = string
}

variable "random_number" {
  default = 5
}

variable "dogs" {
  type = list(object({
    name  = string
    breed = string
  }))

  default = [
    {
      name  = "Sparky",
      breed = "poodle"
    }
  ]
}
```

設定内で Sparky の品種にアクセスするには、変数 を使用します`var.dogs[0].breed`。変数にデフォルトがなく、nullable として分類されていない場合、変数の値はデプロイごとに設定する必要があります。それ以外の場合は、変数に新しい値を設定することはオプションです。ルートモジュールでは、[コマンドライン](https://developer.hashicorp.com/terraform/language/values/variables#variables-on-the-command-line)、[環境変数、または terraform.tfvars ファイルで現在の変数](https://developer.hashicorp.com/terraform/language/values/variables#environment-variables)値を設定できます。 [https://developer.hashicorp.com/terraform/language/values/variables#variable-definitions-tfvars-files](https://developer.hashicorp.com/terraform/language/values/variables#variable-definitions-tfvars-files)次の例は、モジュールの最上位ディレクトリに保存されている **terraform.tfvars** ファイルに変数値を入力する方法を示しています。

```
# terraform.tfvars
dogs = [
   { 
      name  = "Sparky", 
      breed = "poodle" 
   },
   { 
      name  = "Fluffy", 
      breed = "chihuahua" 
   }
]

random_number = 7

thing_i_made_up = "Kabibble"
```

この例`dogs`の **terraform.tfvars** ファイルの の値は、変数宣言のデフォルト値を上書きします。子モジュール内で変数を宣言する場合は、次の例に示すように、モジュール宣言ブロック内で変数値を直接設定できます。

```
module "my_custom_module" {
  source        = "modulesource/custom"
  version       = "0.0.1"
  random_number = 8
}
```

変数を宣言するときに使用できる他の引数には、次のようなものがあります。
+ `sensitive` – これを に設定すると、変数値が Terraform プロセス出力で公開され`true`なくなります。 
+ `nullable` – これを に設定すると、変数`true`に値を指定できなくなります。これは、デフォルトが設定されていない変数に便利です。
+ `description` – スタックのメタデータに変数の説明を追加します。
+ `validation` – 変数の検証ルールを設定します。

Terraform 変数の最も便利な側面の 1 つは、変数宣言内に 1 つ以上の検証オブジェクト を追加する機能です。検証オブジェクトを使用して、変数が渡す必要がある条件を追加できます。そうしないと、デプロイは失敗します。条件に違反するたびに表示するカスタムエラーメッセージを設定することもできます。

たとえば、チームのメンバーが実行する Terraform 設定ファイルを設定します。スタックをデプロイする前に、チームメンバーは **terraform.tfvars** ファイルを作成して重要な設定値を設定する必要があります。これらを思い出すには、次のような操作を行います。

```
variable "important_config_setting" {
  type = string

  validation {
    condition     = length(var.important_config_setting) > 0
    error_message = "Don't forget to create the terraform.tfvars file!"
  }

  validation {
    condition     = substr(var.important_config_setting, 0, 7) == "prefix-"
    error_message = "Remember that the value always needs to start with 'prefix-'"
  }
}
```

この例に示すように、1 つの変数内に複数の条件を設定できます。Terraform は、失敗した条件のエラーメッセージのみを表示します。これにより、変数値にあらゆる種類のルールを適用できます。変数値が原因でパイプラインに障害が発生した場合は、その理由が正確にわかります。

## ローカル値
<a name="local-values"></a>

モジュール内にエイリアスを設定する値がある場合は、更新されないデフォルトの変数を宣言するのではなく、 `locals`キーワードを使用します。名前が示すように、`locals`ブロックには、その特定のモジュールに内部的にスコープされる用語が含まれています。リソース名で使用する変数値にプレフィックスを追加するなど、文字列値を変換する場合は、ローカル値を使用することをお勧めします。次の例に示すように、1 つの`locals`ブロックでモジュールのすべてのローカル値を宣言できます。

```
locals {
  moduleName    = "My Module"
  localConfigId = concat("prefix-", var.important_config_setting)
}
```

値にアクセスすると、`locals`キーワードは のように特異になることに注意してください`local.LocalConfigId`。

## 出力値
<a name="output-values"></a>

Terraform 入力変数が CloudFormation パラメータに似ている場合、[Terraform 出力値は ](https://developer.hashicorp.com/terraform/language/values/outputs) [CloudFormation 出力](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)に似ています。どちらも、デプロイスタック内から値を公開するために使用されます。ただし、Terraform モジュールはツールのファブリックにより深く組み込まれているため、Terraform 出力値を使用して、モジュール内のすべてのモジュールが同じデプロイスタック内にある場合でも、モジュール内の値を親モジュールまたは他の子モジュールに公開します。2 つのカスタムモジュールを構築し、最初のモジュールが 2 番目のモジュールの ID 値にアクセスする必要がある場合は、次の`output`ブロックを 2 番目のモジュールに追加する必要があります。

```
output "module_id" {
  value = local.module_id
}
Then in the first module you could use it like this:
module "first_module" {
  source = "path/to/first/module"
}

resource "example_resource" "example_resource_name" {
  module_id = module.first_module.module_id
}
```

Terraform 出力値は同じスタック内で使用できるため、 `output`ブロックの `sensitive` 属性を使用して、スタック出力に値が表示されないようにすることもできます。さらに、 `output` ブロックは、変数が`precondition`ブロックを使用するのと同じ方法で`validation`ブロックを使用できます。これにより、変数が特定のルールのセットに従うようになります。これにより、デプロイを続行する前に、モジュール内のすべての値が想定どおりに存在することを確認できます。

```
output "important_config_setting" {
  value = var.important_config_setting

  precondition {
    condition     = length(var.important_config_setting) > 0
    error_message = "You forgot to create the terraform.tfvars file again."
  }
}
```