Post

Terraform autenticando no Microsoft Azure com service principal

Terraform autenticando no Microsoft Azure com service principal

Olá pessoal! Blz?

Nesse artigo eu quero trazer como se conectar ao Microsoft Azure com o terraform usando um service principal, e é claro que em ambiente corporativo você irá fazer essa conexão através de ferramentas de Devops, seja com o Jenkins, Azure Devops, GitHub Actions, GitLab ou outras ferramentas, mas quando você está no começo do código ou esteja em seu computador pessoal estudando, fazer o deploy por pipelines não é necessário e demandaria mais tempo.

Você pode estar se perguntando, por que usar um service principal para se conectar se eu posso diretamente na linha de comando me conectar usando o powershell ou Azure cli? Bem, a resposta para o meu caso é simples: “Garantir que voce está fazendo o deploy na Assinatura do Microsoft Azure correta!”.

Eu ainda não sei o porque, mas tive problema no passado quando eu me conectava usando o Connect-AzAccount e Set-AzContext -Subscription "<subscription_id_or_subscription_name>" no terminal do Vs Code mas ao alternar para outra Assinatura Azure no navegador o meu VS Code assumia que a Assinatura Azure alvo seria a que eu alternei no navegador, com isso eu acabava fazendo o deploy em uma assinatura que eu não queria.

Se tem placa tem história

Se tem placa tem história!!! 😊 😜

Bom, o que precisamos então para fazer essa conexão e autenticação? No Microsoft Azure precisaremos de um service principal e que esse service principal tenha permissão na Assinatura e/ou no Resource Group que iremos realizar o deploy.

Criando um Service Principal

Eu prefiro criar pela linha de comando mas caso queiram criar o service principal pelo portal do Microsoft Azure podem usar esse link. de como criar usando o portal.

O comando para criar o service principal e já dar permissão é esse:

1
2
3
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role contributor \
                         --scopes /subscriptions/00000000-0000-0000-0000-000000000000

O exemplo acima estou criando o Service Principal e já dando acesso de contributor na assinatura toda, mas se você quer dar acesso somente a um Resource Group específico é só adicional a parte final do comando o trecho /resourceGroups/myRG.

Autenticando usando variáveis de ambiente

Se estiver usando o Linux com o bash edite o arquivo ~/.bashrc adicionando as variáveis de ambiente a seguir:

1
2
3
4
export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
export ARM_TENANT_ID="<azure_subscription_tenant_id>"
export ARM_CLIENT_ID="<service_principal_appid>"
export ARM_CLIENT_SECRET="<service_principal_password>"

Para executar o script ~/.bashrc, execute source ~/.bashrc e você também pode sair e reabrir o Cloud Shell para que o script seja executado automaticamente.

Com o comando abaixo você pod consultar os valores:

1
printenv | grep ^ARM

Mas se estiver usando o POWERSHELL use os comandos abaixo para definir as variáveis de ambiente:

1
2
3
4
$env:ARM_CLIENT_ID="<service_principal_app_id>"
$env:ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
$env:ARM_TENANT_ID="<azure_subscription_tenant_id>"
$env:ARM_CLIENT_SECRET="<service_principal_password>"

Para consultar as variáveis de ambiente você pode usar o seguinte comando:

1
Get-Childitem Env:ARM

Usando as credenciais no código Terraform

Você pode especificar dentro do código os valores para se conectar a uma Assinatura do Microsoft Azure, isso não é uma boa prática e não é recomendada, mas confesso que uso as vezes disso quando estou criando algo simples ou estudando algum recurso. Mas o que faço é colocar no .gitignore o nome do arquivo que contém o bloco com essa configuração e assim esse arquivo não é mantido no histórico de commits.

Por mais que disse que uso e adiciono o nome do arquivo ao .gitignore não é recomendado essa abordagem

Abaixo como definimos isso dentro de um arquivo .tf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

Conectando o Terraform com AWS

Primeiramente gostaria de deixar claro que meu uso de terraform é 100% com Microsoft Azure mas gostaria de deixar nesse artigo como configurar a autenticação com outro cloud provider como AWS, porém, posso estar fazendo algo errado que não seja mais utilizado e/ou não seja a forma correta de se fazer. Se isso estiver errado por favor me avise:

Para se conectar AWS no bash e terraform com as variáveis a serem configuradas são:

1
2
export AWS_ACCESS_KEY_ID="anaccesskey"
export AWS_SECRET_ACCESS_KEY="asecretkey"
1
2
$env:AWS_ACCESS_KEY_ID="anaccesskey"
$env:AWS_SECRET_ACCESS_KEY="asecretkey"

Usando no bloco de configuração, tão errado como com Microsoft Azure:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
terraform {
    required_providers {
      aws = {
        source = "hashicorp/aws"
        version = "~> 4.0.0"
      }
    }
}

provider "aws" {
    region = "us-east-1"
    access_key = "your_aws_access_key"
    secret_key = "your_aws_secret_access_key"
}

Concluindo!

Eu quis compartilhar com vocês como configuro o ambiente quando estou trabalhando localmente com o terraform em meu computador, em um próximo artigo irei trazer como fazer a mesma autenticação no Azure Devops e no GitHub Actions.

Bom pessoal, espero que tenha gostado e que esse artigo seja útil a vocês!

Compartilhe o artigo com seus amigos clicando nos icones abaixo!!!

Este post está licenciado sob CC BY 4.0 e pelo autor.