如何覆盖Terraform模块中的资源?

时间:2017-07-14 07:40:54

标签: terraform

我有一个这样的Terraform模块:

module "helloworld" {
  source = ../service"
}

../service包含:

resource "aws_cloudwatch_metric_alarm" "cpu_max" {
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = "2"
  ... etc
}

如何覆盖模块中的service变量comparison_operatorevaluation_periods

E.g。将cpu_max设置为4是否与模块中的aws_cloudwatch_metric_alarm .cpu_max.evaluation_periods = 4一样简单?

3 个答案:

答案 0 :(得分:6)

您必须使用具有默认值的variable

variable "evaluation_periods" {
    default = 4
}

resource "aws_cloudwatch_metric_alarm" "cpu_max" {
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = "${var.evaluation_periods}"
}

在你的模块中

module "helloworld" {
  source = ../service"
  evaluation_periods = 2
}

答案 1 :(得分:2)

您必须在模块中定义变量。你的模块将是:

variable "eval_period" {default = 2} # this becomes the input parameter of the module

resource "aws_cloudwatch_metric_alarm" "cpu_max" {
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = "${var.eval_period}"
  ... etc
}

你可以像以下一样使用它:

module "helloworld" {
  source = ../service"
  eval_period = 4
}

答案 2 :(得分:2)

除了其他使用变量的答案:

如果您想覆盖整个资源或只是合并配置值,还可以使用Terraform中的覆盖行为:

使用此功能,您可以拥有一个名为service_override.tf的文件,其内容为:

resource "aws_cloudwatch_metric_alarm" "cpu_max" {
   comparison_operator = "LessThanThreshold"
   evaluation_periods  = "4"
   ... etc
}