一千萬個為什麽

搜索

根據terraform.workspace創建資源名稱



我想根據使用terraform的不同環境獲得不同的s3名稱。

如果我在terraform.tfvar中定義名稱,它將不起作用:

s3_bucket_name          = "tf-${terraform.workspace}"

如果我在s3.tf中硬編碼s3存儲桶名稱,它將起作用:

resource "aws_s3_bucket" "s3" {
   bucket        = "tf-${terraform.workspace}"
   ....
}

如何從terraform.tfvar定義工作空間相關名稱?我不想在tf文件中硬編碼。

轉載註明原文: 根據terraform.workspace創建資源名稱

一共有 1 個回答:

變量是來自命令行或來自 tfvars 文件的靜態文本輸入。在這裏不可能使用插值,因為在插值開始之前處理變量值,以便使其可用於其他表達式。


如果目標是在一個地方定義S3存儲桶名稱,並在同一配置中多次重復使用它,那麽 本地值 功能可以在您使用Terraform v0.10.4或更新版本時執行此操作。您可以在您的 .tf 文件之一中聲明指定的值:

locals {
  s3_bucket_name = "tf-${terraform.workspace}"
}

然後,您可以使用名稱 local.s3_bucket_name 在您的配置中的各個位置插入此值,如下所示:

resource "aws_s3_bucket" "s3" {
  bucket = "${local.s3_bucket_name}"
  ...
}

本地值在概念上與模塊輸出類似,但它們在相同的模塊中公開它們被定義,而不是將值傳遞給父模塊。


如果目標是允許這個生成的默認名稱被變量覆蓋,那麽可以通過一些條件邏輯來實現:

variable "override_s3_bucket_name" {
  default = ""
}

locals {
  s3_bucket_name = "${var.override_s3_bucket_name != "" ? var.override_s3_bucket_name : "tf-${terraform.workspace}"}"
}

resource "aws_s3_bucket" "s3" {
  bucket = "${local.s3_bucket_name}"
  ...
}

如果未設置 override_s3_bucket_name ,上面的代碼將根據所選工作區生成默認名稱,但如果設置了該變量,則將使用其值。