git 如何处理Terraform项目的开发和主要分支之间的差异

hxzsmxv2  于 2023-03-28  发布在  Git
关注(0)|答案(1)|浏览(97)

TF项目分为主分支和发展分支。
在develop分支中,可能有使用依赖于AWS环境的ID指定的资源,例如2c289348-cc9d-41ed-a4ae-fb015b0ec9b1-6是AWS MSK集群ID:

resource "aws_iam_policy" "msk-admin-policy" {
  name        = "msk-admin-policy"
  description = "Policy for MSK"

  policy = jsonencode({
    Version   = "2012-10-17",
    "Statement": [
      {

        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
          <...actions>
        ],
        "Resource": [
          "arn:aws:kafka:${data.aws_region.current.id}:${data.aws_caller_identity.current.account_id}:cluster/integrations/2c289348-cc9d-41ed-a4ae-fb015b0ec9b1-6",
        ]
      }
    ]
  })
}

在主分支中,有不同的AWS MSK ID,代表生产AWS环境中AWS MSK集群的ID。
这导致我们单独管理developmain分支,这意味着我们不能从develop到main执行marge请求。相反,我们从develop创建一个特性分支,然后从特性分支创建一个合并请求到develop。然后我们从main创建特性分支,从特性分支创建一个合并请求到main
正如您所看到的,我们通过${data.aws_region.current.id}:${data.aws_caller_identity.current.account_id}在region和account id的分支之间应用了某种统一。
有没有一种方法来处理TF中主分支和开发分支之间的这种差异?

h79rfbju

h79rfbju1#

你根本不应该硬编码这些值,你应该引用Terraform资源,或者查找数据源。如果你必须硬编码这些值,那么我建议在TerraformMap变量中硬编码它,比如:

variable "msk_id" {
  description = "the MSK Cluster ID"

  type = map(string)
  default = {
    dev: "2c289348-cc9d-41ed-a4ae-fb015b0ec9b1-6"
    production : "some-other-id"
  }
}

然后,您可以将环境名称作为另一个变量传递,或者理想情况下使用Terraform Workspaces来管理不同的环境。
然后,您的IAM策略将如下所示(环境名称在var中):

"Resource": [
  "arn:aws:kafka:${data.aws_region.current.id}:${data.aws_caller_identity.current.account_id}:cluster/integrations/${var.msk_id[var.environment]}",
]

或(使用Terraform工作区):

"Resource": [
  "arn:aws:kafka:${data.aws_region.current.id}:${data.aws_caller_identity.current.account_id}:cluster/integrations/${var.msk_id[terraform.workspace]}",
]

相关问题