Terraform: инфраструктура на уровне кода | страница 113



Вы могли бы создать новую булеву входную переменную с именем var.is_t2_instance, но тогда бы она дублировала var.instance_type, а вы, скорее всего, забудете обновлять их вместе. Лучшая альтернатива — использование условного выражения:

resource "aws_cloudwatch_metric_alarm" "low_cpu_credit_balance" {

  count = format("%.1s", var.instance_type) == "t" ? 1 : 0

  alarm_name  = "${var.cluster_name}-low-cpu-credit-balance"

  namespace   = "AWS/EC2"

  metric_name = "CPUCreditBalance"

  dimensions = {

    AutoScalingGroupName = aws_autoscaling_group.example.name

  }

  comparison_operator = "LessThanThreshold"

  evaluation_periods  = 1

  period              = 300

  statistic           = "Minimum"

  threshold           = 10

  unit                = "Count"

}

Код оповещения остается прежним, если не считать относительно сложного параметра count:

count = format("%.1s", var.instance_type) == "t" ? 1 : 0

Здесь используется функция format, которая извлекает первый символ из var.in­stance_type. Если это символ t (как в случае с t2.micro), параметру count присваивается значение 1; в противном случае параметр count будет равен 0. Таким образом, оповещение создается только для серверов, у которых действительно есть показатель CPUCreditBalance.


Выражения if-else с использованием параметра count

Теперь вы знаете, как создавать выражения if. Но что насчет if-else?

Ранее в этой главе вы создали несколько пользователей IAM с правом на чтение ресурсов EC2. Представьте, что вы хотите дать одному из них, Neo, еще и доступ к CloudWatch, но будет этот доступ только на чтение или еще и на запись, должен решать тот, кто применяет конфигурацию Terraform. Этот пример немного надуманный, но он позволяет легко продемонстрировать простую разновидность выражения if-else, в которой существенно лишь то, какая из веток, if или else, будет выполнена. В то же время остальному коду Terraform не нужно ничего об этом знать.

Вот правило IAM, которое разрешает доступ на чтение к CloudWatch:

resource "aws_iam_policy" "cloudwatch_read_only" {

  name   = "cloudwatch-read-only"

  policy = data.aws_iam_policy_document.cloudwatch_read_only.json

}

data "aws_iam_policy_document" "cloudwatch_read_only" {

  statement {

    effect    = "Allow"

    actions   = [

      "cloudwatch:Describe*",

      "cloudwatch:Get*",

      "cloudwatch:List*"

    ]

    resources = ["*"]

  }

}

А вот правило IAM, которое выдает полный доступ к CloudWatch (на чтение и запись):