web-dev-qa-db-ja.com

Terraformで変数を使用して命名されたリソースを参照

さまざまな変数入力で複数回インスタンス化できるモジュールをTerraformで作成しようとしています。モジュール内で、名前が入力変数に依存している場合、どのようにリソースを参照しますか?ブラケット構文("${aws_ecs_task_definition[var.name].arn}")しかし、私はそれを推測しただけです。

(注意:私はこれについて完全に間違った方法で行っているかもしれません)

これが私のモジュールの(簡略化された)main.tfファイル:

variable "name" {}

resource "aws_ecs_service" "${var.name}" {
    name = "${var.name}_service"
    cluster = ""
    task_definition = "${aws_ecs_task_definition[var.name].arn}"
    desired_count = 1
}

resource "aws_ecs_task_definition" "${var.name}" {
    family = "ecs-family-${var.name}"
    container_definitions = "${template_file[var.name].rendered}"
}

resource "template_file" "${var.name}_task" {
    template = "${file("task-definition.json")}"

    vars {
        name = "${var.name}"
    }
}

次のエラーが発生します。

Error loading Terraform: Error downloading modules: module foo: Error loading .terraform/modules/af13a92c4edda294822b341862422ba5/main.tf: Error reading config for aws_ecs_service[${var.name}]: parse error: syntax error
14
Mike Ottum

モジュールの仕組みを根本的に誤解していました。

Terraformはリソース名の補間をサポートしていません( relevantissues を参照)が、モジュールの各インスタンスのリソースはインスタンスの名前空間。リソース名の衝突を心配していましたが、モジュールシステムは既にそれを処理しています。

22
Mike Ottum

下の写真は何が起こっているかを示しています。

Terraformのドキュメントでは、 "NAME" "name"インフラストラクチャベンダー(AWSやGoogle Cloudなど)によって作成された実際のリソースに使用される値。

また、常に "name =とは限りませんが、" endpoint =または "resource_group_name =または何でも。

そして、複数の "name"値を生成する方法はいくつかあります-カウント、変数などを使用するか、またはtfvarファイル内で実行してterraform apply -var-file = foo.tfvars

terraform resource

2
warrens