Terraform:リソースに複数のタグを指定するための簡潔な構文はありますか?


9

リソースに複数のタグを付けるために、私は現在複数のtagブロックを使用しています:

resource "aws_autoscaling_group" "instance" {
  ...

  tag {
    key                 = "Name"
    value               = "${var.cluster_prefix}"
    propagate_at_launch = true
  }

  tag {
    key                 = "Owner"
    value               = "${var.tag_Owner}"
    propagate_at_launch = true
  }

  tag {
    key                 = "Project"
    value               = "${var.tag_Project}"
    propagate_at_launch = true
  }
}

うまくいきますが、もっと簡潔な構文があるのでしょうか。またpropagate_at_launch、タグごとに指定する必要があるため、ビットエラーが発生しやすくなります。

更新:この質問は、Terrafrom v0.12が出る前に書かれました。それ以降、サポートは動的ネストブロックで改善されました(以下の私の回答を参照してください)。

回答:


7

以下の場合auto-scaling-group、これは利用できる最も簡潔な構文です。

他のほとんどのリソースでは、tags次のような構文を使用します。

tags {
  Key1 = "value1"
  Key2 = "value2"
}

2

Terraform v0.12では、動的ネストブロックのサポートが追加されました。次の例は、新機能に関するブログ投稿から派生したものです(「動的ネストブロック」を参照)。

locals {
  standard_tags = {
    Name    = var.cluster_prefix
    Owner   = var.tag_Owner
    Project = var.tag_Project
  }
}

resource "aws_autoscaling_group" "example" {
  # ...

  dynamic "tag" {
    for_each = local.standard_tags

    content {
      key                 = tag.key
      value               = tag.value
      propagate_at_launch = true
    }
  }
}

1

別のオプションは、terraform-null-labelモジュールを使用することです。tags標準のTerraformマップと呼ばれる変数の受け渡しをサポートしています。次に、モジュールtags_as_list_of_mapsは、必要な形式のタグを含むと呼ばれる出力を発行します。しかし、このモジュールを使用するさらに良い理由は、固定された規則に従う一貫したリソース名のセットを生成することです。

たとえば、これを行うことができます:

module "example" {
  source     = "git::https://github.com/cloudposse/terraform-null-label.git?ref=master"
  namespace  = "eg"
  stage      = "prod"
  name       = "bastion"
  tags       = { 
                 "BusinessUnit" = "XYZ" 
                 "Snapshot" = "true"
               }
}

したがって、あなたの例から、次のように書くことができます:

resource "aws_autoscaling_group" "instance" {
  ...
  name = "${module.example.id}"
  ...
  tags = "${module.example.tags_as_list_of_maps}"
  ...
}

注:name coを生成する方法を示すフィールドを追加しました


「名前」を各リソースに一意にするための最良の方法は何ですか?null-labelモジュールを使用する場合、リソースのすべての「名前」は同じです。サブネットに-private-subnetのようなサフィックスを付けたい場合はどうでしょうか?nullラベルがそれを処理できる方法はありますか?
Izac

0

aws_autoscaling_group今(タグのリストをサポートしていないhttps://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags)。しかし、これは他のTerraformリソースの構文とは少し異なります。

tags = [
  {
    key                 = "explicit1"
    value               = "value1"
    propagate_at_launch = true
  },
  {
    key                 = "explicit2"
    value               = "value2"
    propagate_at_launch = true
  },
]

これにより、補間によってタグを動的に構築することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.