Terraform: Có một cú pháp ngắn gọn để chỉ định nhiều thẻ cho một tài nguyên không?


9

Để đính kèm nhiều thẻ vào tài nguyên, tôi hiện đang sử dụng nhiều tagkhối:

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
  }
}

Nó hoạt động, nhưng tôi tự hỏi nếu có một cú pháp ngắn gọn hơn. Đây cũng là một lỗi dễ xảy ra khi bạn phải chỉ định propagate_at_launchcho mỗi thẻ.

Cập nhật: Câu hỏi đã được viết trước khi Terrafrom v0.12 xuất hiện. Kể từ đó, sự hỗ trợ đã được cải thiện với Dynamic Nested Blocks (xem câu trả lời của tôi bên dưới ).

Câu trả lời:


7

Đối với một auto-scaling-groupđiều này là cú pháp ngắn gọn nhất có sẵn.

Đối với hầu hết các tài nguyên khác, bạn sử dụng tagscú pháp giống như:

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

2

Terraform v0.12 đã thêm hỗ trợ cho Dynamic Nested Blocks. Ví dụ sau được lấy từ bài đăng trên blog của họ về các tính năng mới (xem phần Khối lồng nhau động ):

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

Một lựa chọn khác là sử dụng terraform-null-labelmô-đun. Nó hỗ trợ chuyển một biến được gọi tagslà bản đồ Terraform tiêu chuẩn. Sau đó, mô-đun phát ra một đầu ra được gọi là tags_as_list_of_mapschứa các thẻ theo định dạng bạn muốn. Nhưng một lý do thậm chí tốt hơn để sử dụng mô-đun này là để tạo ra một tập hợp các tên tài nguyên nhất quán theo một quy ước cố định.

Ví dụ: bạn có thể làm điều này:

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"
               }
}

Vì vậy, từ ví dụ của bạn, sau đó chúng ta có thể viết một cái gì đó như thế này:

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

LƯU Ý: Tôi đã thêm nametrường để hiển thị cách tạo đồng


Điều gì sẽ là cách tốt nhất để tạo "tên" uniq cho mỗi nguồn tài nguyên? nếu bạn sử dụng mô-đun null-nhãn thì mọi "tên" trên các nguồn tài nguyên đều giống nhau. Điều gì nếu bạn muốn đặt tên cho mạng con của bạn với một hậu tố như -private-subnet? Có cách nào mà nhãn null có thể xử lý được không?
Izac

0

Hiện aws_autoscaling_grouptại không hỗ trợ danh sách các thẻ ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Nhưng điều này có vẻ hơi khác với cú pháp của các tài nguyên địa hình khác:

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

Điều này cũng cho phép tự động xây dựng các thẻ thông qua nội suy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.