Terraform 変数、ローカル値、出力について - AWS 規範ガイダンス

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

Terraform 変数、ローカル値、出力について

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

変数

AWS CloudFormation はパラメータを使用して、あるスタックのデプロイから次のスタックへの設定とリセットが可能なカスタム値を表します。同様に、Terraform は入力変数 、または変数 を使用します。変数は 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 として分類されていない場合は、変数の値をデプロイごとに設定する必要があります。それ以外の場合は、変数に新しい値を設定することはオプションです。ルートモジュールでは、コマンドライン 、環境変数 、または terraform.tfvars ファイルで現在の変数値を設定できます。 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"

この例dogsterraform.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 は、失敗した条件のエラーメッセージのみを表示します。これにより、変数値にあらゆる種類のルールを適用できます。変数値が原因でパイプラインに障害が発生した場合は、その理由が正確にわかります。

ローカル値

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

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

値にアクセスすると、localsキーワードが のように単数になることに注意してくださいlocal.LocalConfigId

出力値

Terraform 入力変数が CloudFormation パラメータに似ている場合、Terraform 出力値はCloudFormation出力 に似ていると言えるでしょう。どちらもデプロイスタック内から値を公開するために使用されます。ただし、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." } }