web-dev-qa-db-fra.com

Avoir le fichier d'état de Terraform Azure sous un abonnement différent

J'ai deux abonnements à Azure. Appelons-les sous-dev et sous-prod. Sous Sous-Dev, j'ai des ressources pour le développement (dans un groupe de ressources RG-Dev) et dans des ressources sous-produits pour la production (dans un groupe de ressources RG-PRO).

Maintenant, je voudrais n'avoir qu'un seul fichier d'état pour Dev et Prod. Je peux faire cela comme j'utilise les espaces de travail Terraform (dev et prod). Il existe un compte de stockage sous Sous-Dev (RG-Dev) nommé Tfsate. Il a un conteneur, etc. Le backend Azure est configuré comme ceci:

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

Si je veux postuler à l'environnement Dev, je dois changer AZ CLI au sous-dev. De même, pour la production, je devrais utiliser Sub-Prod. Je change l'abonnement par défaut avec AZ CLI:

az account set -s sub-prod

Le problème est que le compte de stockage de l'État est sous Sous-Dev et non sous-produit. Je vais avoir des erreurs d'accès lorsque vous essayez de terraform init (ou appliquer) lorsque l'abonnement par défaut est défini sur Sub-Prod.

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 '[email protected]' 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."

J'ai essayé de couper quelques choses:

  • J'ai ajouté subscription_id = "sub-dev"
  • J'ai généré A SAS Jeton pour le compte de stockage Tfstate et ajouté le sas_token Valeur de configuration (supprimée resource_group_name)

mais en vain et obtenir la même erreur.

J'ai essayé de az logout Mais Terraform me demande de me connecter en premier. Dois-je accorder des autorisations dans l'extrémité azur (c'est difficile car l'environnement Azure est configuré par une tierce partie) ou est-ce que Terraform prend en charge ce type de fichier d'état sous différentes installations d'abonnement?

8
Juho Rutila

Pour le meilleur ou le pire (je n'ai pas beaucoup expérimenté avec d'autres méthodes d'organisation Terraform), nous utilisons Terraform de la manière exacte que vous décrivez. Un fichier d'état, dans un backend distant, dans un abonnement différent à mes ressources. Les espaces de travail sont créés pour gérer les environnements pour le déploiement.

Nos fichiers d'état sont spécifiés comme ceci:

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"
  }
}

Nous conservons notre compte de stockage Terraform dans un abonnement complètement différent à nos déploiements, mais cela n'est pas nécessaire.

Lors de la configuration de votre fichier d'état comme vous, il authentifie sur le backend distant via AZ CLI, en utilisant le contexte de la personne qui interagit avec la CLI. Cette personne doit avoir le rôle "Reader & Data Access" dans le compte de stockage afin de récupérer de manière dynamique les touches de compte de stockage au moment de l'exécution.

Avec le fichier d'état ci-dessus configuré, l'exécution du Terraform serait

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

Il y a une autre façon de faire ça. Vous pouvez utiliser la clé d'accès associée au compte de stockage sur l'autre abonnement et l'exporter comme variable d'environnement. Frapper:

export ARM_ACCESS_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query '[0].value' -o tsv)

PowerShell:

$env:ARM_ACCESS_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query '[0].value' -o tsv)
0
ehsan khodadadi