繁体   English   中英

参考Terraform中用for_each创建的几个aws_iam_policy_document数据源

[英]Reference several aws_iam_policy_document data sources created with for_each in Terraform

我想用for_each创建多个aws_iam_policy_document资源,稍后由多个角色承担,如下所示:

# Policy to allow services to assume the role
data "aws_iam_policy_document" "this" {
  for_each           = var.lambda_configuration
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type = "Service"

      identifiers = [
        "lambda.amazonaws.com",
        "apigateway.amazonaws.com",
      ]
    }
  }
}

# IAM role for executing the Lambda function
resource "aws_iam_role" "this" {
  for_each           = var.lambda_configuration
  name               = "my_lambda_${each.key}_Executor_Role"
  description        = "Role for executing my_lambda-${each.key} function"
  assume_role_policy = data.aws_iam_policy_document.assume_role_policy_[each.key].json
}

我应该如何插入这个

assume_role_policy = data.aws_iam_policy_document.assume_role_policy_[each.key].json

与角色做出正确的匹配?

正确的语法:

data.aws_iam_policy_document.this[each.key].json

请注意,这不是插值,正如您在问题中提到的那样。 这只是一个值查找。 我不知道你从哪里得到assume_role_policy_ ,但这不是有效的 HCL 语法。

这似乎是在资源之间链接for_each的好情况,它(主观上)倾向于导致不熟悉的读者更容易理解数据在资源之间流动的方式的配置。

data "aws_iam_policy_document" "this" {
  for_each = var.lambda_configuration

  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type = "Service"

      identifiers = [
        "lambda.amazonaws.com",
        "apigateway.amazonaws.com",
      ]
    }
  }
}

# IAM role for executing the Lambda function
resource "aws_iam_role" "this" {
  for_each = data.aws_iam_policy_document.this

  name               = "my_lambda_${each.key}_Executor_Role"
  description        = "Role for executing my_lambda-${each.key} function"
  assume_role_policy = each.value.json
}

使用第一个资源本身作为第二个资源的for_each意味着两者将始终具有完全相同的键(因为带有for_each的资源在表达式中显示为使用for_each映射中的键的对象的 map),并且each.value第二个块中的each.value是指第一个块的相应实例。

这与使用each.keydata.aws_iam_policy_document.this中的元素使用索引运算符 select 具有基本相同的行为,但是使这两个资源之间的关系更加直接,因此(同样,主观上)更易于阅读和维护在未来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM