gpt4 book ai didi

azure - 将 Terraform azure 状态文件置于不同的订阅下

转载 作者:行者123 更新时间:2023-12-03 15:45:37 25 4
gpt4 key购买 nike

我在 Azure 中有两个订阅。我们称它们为子开发和子产品。在子开发下,我有用于开发的资源(在资源组 rg-dev 中),在子产品资源下有用于生产的资源(在资源组 rg-prod 中)。

现在,我只想为开发和生产提供一个状态文件。我可以这样做,因为我正在使用 Terraform 工作区(开发和产品)。 sub-dev (rg-dev) 下有一个名为 tfsate 的存储帐户。它有一个容器等。Azure 后端的配置如下:

terraform {
backend "azurerm" {
resource_group_name = "rg-dev"
storage_account_name = "tfstate"
container_name = "tfcontainer"
key = "terraform.tfstate"
}
}

如果我想应用到开发环境,我必须将 Az Cli 切换到子开发环境。同样,对于生产,我必须使用子产品。我使用 az cli 切换默认订阅:

az account set -s sub-prod

问题是状态的存储帐户位于 sub-dev 而不是 sub-prod 下。当默认订阅设置为子产品时,尝试terraform init(或应用)时,我会收到访问错误。

Error: Failed to get existing workspaces: Error retrieving keys for Storage Account "tfstate": storage.AccountsClient#ListKeys: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="AuthorizationFailed" Message="The client '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e095938592a08598818d908c85ce838f8d" rel="noreferrer noopener nofollow">[email protected]</a>' with object id '<redacted>' does not have authorization to perform action 'Microsoft.Storage/storageAccounts/listKeys/action' over scope '/subscriptions/sub-prod/resourceGroups/rg-dev/providers/Microsoft.Storage/storageAccounts/tfstate' or the scope is invalid. If access was recently granted, please refresh your credentials."

我尝试了几件事:

  • 我添加了subscription_id = "sub-dev"
  • 我为 tfstate 存储帐户生成了 SAS token ,并添加了 sas_token 配置值(删除了 resource_group_name)

但徒劳并得到同样的错误。

我尝试az logout,但 terraform 要求我先登录。我是否必须以某种方式调整 Azure 端的权限(这很困难,因为 Azure 环境是由第 3 方配置的),或者 Terraform 是否支持这种将状态文件置于不同的订阅设置下?

最佳答案

无论好坏(我没有尝试过太多组织 terraform 的其他方法),我们按照您所描述的方式使用 terraform。状态文件,位于远程后端,位于对我的资源的不同订阅中。创建工作区是为了处理部署环境。

我们的状态文件是这样指定的:

terraform {
required_version = ">= 0.12.6"

backend "azurerm" {
subscription_id = "<subscription GUID storage account is in>"
resource_group_name = "terraform-rg"
storage_account_name = "myterraform"
container_name = "tfstate"
key = "root.terraform.tfstate"
}
}

我们将 terraform 存储帐户保留在与我们的部署完全不同的订阅中,但这不是必需的。

像这样配置状态文件时,它会使用与 CLI 交互的人员的上下文,通过 az CLI 向远程后端进行身份验证。此人需要具有存储帐户的“读取者和数据访问”角色,以便在运行时动态检索存储帐户 key 。

配置上述状态文件后,执行 Terraform 将是

az login
az account set -s "<name of subscription where you want to create resources>"
terraform init
terraform plan
terraform apply

关于azure - 将 Terraform azure 状态文件置于不同的订阅下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57289924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com