AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1123582
Accepted
Arrow Root
Arrow Root
Asked: 2023-02-23 21:26:55 +0800 CST2023-02-23 21:26:55 +0800 CST 2023-02-23 21:26:55 +0800 CST

为什么 Terraform 要完全删除 aws_iam_policy_document?

  • 772

我不明白为什么 Terraform 要删除 json 策略。在其他情况下,当在应用期间读取数据时,计划显示 json 策略被删除并添加到同一计划中,但它没有发生,Terraform 只是删除它。

这是政策:

data "aws_iam_policy_document" "my_policy" {
  statement {
    sid = "S3"
    effect = "Allow"
    actions = ["s3:*"]
    resources = [
      aws_s3_bucket.some-bucket.arn,
      "arn:aws:s3:::another-bucket/*",
      "arn:aws:s3:::another-bucket/"
    ]
  }
  statement {
    sid = "CloudWatch"
    effect = "Allow"
    actions = ["logs:*"]
    resources = [
      aws_cloudwatch_log_group.some_lambda.arn,
      "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group:*",
      "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group"
    ]
  }
}

这是计划:

  # data.aws_iam_policy_document.my_policy will be read during apply
  # (config refers to values not yet known)
 <= data "aws_iam_policy_document" "my_policy"  {
      ~ id      = "123456789" -> (known after apply)
      ~ json    = jsonencode(
            {
              - Statement = [
                  - {
                      - Action   = "s3:*"
                      - Effect   = "Allow"
                      - Resource = [
                          - "arn:aws:s3:::another-bucket/*",
                          - "arn:aws:s3:::another-bucket/",
                        ]
                      - Sid      = "S3"
                    },
                  - {
                      - Action   = "logs:*"
                      - Effect   = "Allow"
                      - Resource = [
                          - "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group:*",
                          - "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group",
                        ]
                      - Sid      = "CloudWatch"
                    },
                ]
              - Version   = "2012-10-17"
            }
        ) -> (known after apply)
      - version = "2012-10-17" -> null

      ~ statement {
          - not_actions   = [] -> null
          - not_resources = [] -> null
          ~ resources     = [
              + "arn:aws:s3:::some-bucket/",
                # (2 unchanged elements hidden)
            ]
            # (3 unchanged attributes hidden)
        }
      ~ statement {
          - not_actions   = [] -> null
          - not_resources = [] -> null
            # (4 unchanged attributes hidden)
        }
    }

1 - 为什么 Terraform 想要消除这个 json 策略?

2 -not_actions和not_resources是可选的。我以为它不会出现在计划中。这是正常的吗?

terraform
  • 1 1 个回答
  • 13 Views

1 个回答

  • Voted
  1. Best Answer
    Martin Atkins
    2023-02-24T07:28:09+08:002023-02-24T07:28:09+08:00

    Terraform 在这里描述的不是删除策略 JSON,而是原地更新:

      ~ json = jsonencode(...) -> (known after apply)
    

    请注意,整个属性上的注释是~,而不是-,这意味着它正在就地更新。

    这部分(known after apply)是有趣的部分:它告诉您 Terraform 还不知道最终的政策文档 JSON 是什么。如果对文档有贡献的任何值是直到应用步骤才知道的值,通常会发生这种情况,这就是计划顶部的注释试图说明的内容:

      # (config refers to values not yet known)
    

    在应用阶段,Terraform 将再次尝试评估此数据资源,此时所有值都应该是已知的,因此它将能够读取它。然后它应该生成一个有效的策略文档供使用,这可能与旧文档类似,但 Terraform 本身还不知道。

    如果您想在将新策略应用到任何其他资源之前-target完整地查看它,那么您可以使用该选项让 Terraform 只关注进行允许决定 JSON 文档的更改,如下所示:

    terraform apply -target=aws_s3_bucket.some-bucket.arn -target=aws_cloudwatch_log_group.some_lambda.arn
    

    使用这些-target选项,Terraform 将跳过规划数据资源和依赖于它的任何其他内容,因此您不会data "aws_iam_policy_document" "my_policy"在规划中看到任何提及。一旦您应用了该部分更改,您就可以terraform apply像往常一样在没有任何参数的情况下运行,然后 Terraform 应该能够在规划阶段评估 JSON 策略文档,因为所有输入值都已经知道。


    [] -> null那些not_actions和参数的变化not_resources似乎只是提供者中的小错误:提供者似乎不一致关于 unset 是表示为空列表还是表示为null,因此 Terraform CLI 在屏幕上呈现这种差异。提供者应该对其表示方式保持一致,以避免显示这种令人困惑的额外噪音。

    • 1

相关问题

  • 子网没有在 azure 上使用 terraform 创建,如何解决?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve