Amazon web services 根据地形中是否存在特定资源有条件地设置IAM策略

Amazon web services 根据地形中是否存在特定资源有条件地设置IAM策略,amazon-web-services,terraform,amazon-iam,amazon-kms,Amazon Web Services,Terraform,Amazon Iam,Amazon Kms,我试图根据IAM角色是否存在来设置KMS密钥策略。yaml文件如下所示 data "aws_iam_policy_document" "key_policy" { statement { sid = "Give Access to the my Role" actions = [ "kms:GenerateDateKey", "kms:Decrypt"

我试图根据IAM角色是否存在来设置KMS密钥策略。yaml文件如下所示

data "aws_iam_policy_document" "key_policy" {
  statement {
    sid = "Give Access to the my Role"

    actions = [
      "kms:GenerateDateKey",
      "kms:Decrypt"
    ]

    resources = ["*"]

    principals {
      type        = "AWS"
      identifiers = ["arn:aws:iam::${var.account_id}:role/myrole"]
    }
  }
}

这个terraform脚本的问题是,如果我的帐户中不存在
myrole
,它就会失败。我们有多个AWS帐户,其中只有一部分拥有此
myrole
。我们的CI将为所有帐户运行相同的脚本。只有当
myrole
存在时,才有方法应用此语句吗?

terraform(TF)的设计原则规定了当前TF配置文件应明确定义您的基础结构。这意味着定义解决方案的资源仅由给定的配置文件和当前TF状态管理。如果某个资源不处于TF状态,则认为它不在TF范围内,并且不存在

因此,TF不直接支持检查是否存在任何资源,也不基于此类条件。这将导致问题,因为您的TF不能完全代表您的体系结构

因此,建议:

我们建议应用依赖项倒置方法,而不是试图编写一个模块来检测某个对象是否存在,如果不存在则创建它:通过输入变量使模块接受它所需的对象作为参数

基于以上内容,您应该致力于开发您的
aws\u iam\u策略文件。key\u policy
,以便它基于输入变量创建相关的
语句。这意味着您的CICD管道必须检查角色是否存在,并将此信息作为输入变量传递给CF文件,例如,
my_role\u exists
具有
true
false

然后,您可以使用将
语句设置为有条件的:

data "aws_iam_policy_document" "key_policy" {

  dynamic "statement" {

    for_each = var.my_role_exists == true ? [1] : [] 

    content {
      sid = "Give Access to the my Role"

      actions = [
        "kms:GenerateDateKey",
        "kms:Decrypt"
      ]

      resources = ["*"]

      principals {
        type        = "AWS"
        identifiers = ["arn:aws:iam::${var.account_id}:role/myrole"]
      }
    }
   } 
}

terraform(TF)的设计原则规定了当前TF配置文件应明确定义基础设施的定义。这意味着定义解决方案的资源仅由给定的配置文件和当前TF状态管理。如果某个资源不处于TF状态,则认为它不在TF范围内,并且不存在

因此,TF不直接支持检查是否存在任何资源,也不基于此类条件。这将导致问题,因为您的TF不能完全代表您的体系结构

因此,建议:

我们建议应用依赖项倒置方法,而不是试图编写一个模块来检测某个对象是否存在,如果不存在则创建它:通过输入变量使模块接受它所需的对象作为参数

基于以上内容,您应该致力于开发您的
aws\u iam\u策略文件。key\u policy
,以便它基于输入变量创建相关的
语句。这意味着您的CICD管道必须检查角色是否存在,并将此信息作为输入变量传递给CF文件,例如,
my_role\u exists
具有
true
false

然后,您可以使用将
语句设置为有条件的:

data "aws_iam_policy_document" "key_policy" {

  dynamic "statement" {

    for_each = var.my_role_exists == true ? [1] : [] 

    content {
      sid = "Give Access to the my Role"

      actions = [
        "kms:GenerateDateKey",
        "kms:Decrypt"
      ]

      resources = ["*"]

      principals {
        type        = "AWS"
        identifiers = ["arn:aws:iam::${var.account_id}:role/myrole"]
      }
    }
   } 
}

myrole
是由terraform管理的,还是它的存在完全独立于您在每个帐户中使用的terraform配置?谢谢@Marcin的评论。它由一组不同的地形脚本管理。这些脚本分别在不同的CI下运行。话虽如此,我不确定这两组脚本之间是否可以共享存在状态。
myrole
是由terraform管理的,还是它的存在完全独立于您在每个帐户中使用的terraform配置?谢谢@Marcin的评论。它由一组不同的地形脚本管理。这些脚本分别在不同的CI下运行。也就是说,我不确定是否有可能在这两组脚本之间共享存在状态。