首页 > 解决方案 > 预处理 Terraform Locals

问题描述

我有一堆 TF locals,,,,它使用一些三元运算符,当我通过 var.env stg 时,它工作正常,

locals {
  allowed_roles = [
    "rqm-airflow-task-prd",
    "${var.env == "stg" ? "rqm-airflow-task-stg" : "" }",
    "rqm-airflow-task-rnd",
    "rqm-ecs-pag_mock-task-role-prd",
    "${var.env == "stg" ? "rqm-ecs-pag_mock-task-role-stg" : "" }"
}
data "aws_iam_role" "allowed_roles" {
  count = "${length(local.allowed_roles)}"
  name  = "${local.allowed_roles[count.index]}"
} 

但是 stg 是一个动态的环境,并不总是持续存在,所以当 stg env 被删除时,三元运算符的值变为空“”,代码会用 var.env 重新运行,比如“prd”,然后data.aws_iam_role 失败。

Error: Error refreshing state: 1 error occurred:
    * data.aws_iam_role.allowed_roles: 4 errors occurred:
    * data.aws_iam_role.allowed_roles[7]: data.aws_iam_role.allowed_roles.7: error reading IAM Role (): InvalidParameter: 1 validation error(s) found.
- minimum field size of 1, GetRoleInput.RoleName.
    * data.aws_iam_role.allowed_roles[1]: data.aws_iam_role.allowed_roles.1: error reading IAM Role (): InvalidParameter: 1 validation error(s) found.
- minimum field size of 1, GetRoleInput.RoleName.

有没有办法预处理这个?

标签: terraform

解决方案


It looks like what you need here is the result of the compact function:

compact takes a list of strings and returns a new list with any empty string elements removed.

locals {
  allowed_roles = compact([
    "rqm-airflow-task-prd",
    var.env == "stg" ? "rqm-airflow-task-stg" : "",
    "rqm-airflow-task-rnd",
    "rqm-ecs-pag_mock-task-role-prd",
    var.env == "stg" ? "rqm-ecs-pag_mock-task-role-stg" : "",
  ])
}

推荐阅读