Usando Terraform no Azure Pipelines
Tags: azure, devops, pipeline, braziliandevs
Published: 2023-04-26 14:06:00

Já vimos o que é Azure Pipelines e agora vamos construir uma pipeline para executar um código Terraform. 

Para saber mais o que é o Terraform: [https://developer.hashicorp.com/terraform/tutorials/aws-get-started](https://developer.hashicorp.com/terraform/tutorials/aws-get-started)

Para executar um código terraform precisaremos do programa binário de Terraform e o AWS CLI, vamos ver como configurar cada um deles. 

Primeira configuração e a trigger, nessa configuração informamos qual branch será utilizado para iniciar a pipeline de forma contínua e integrada.
```yaml
trigger:
  branches:
    include:
    - master
```
Em seguida, escrevemos as estruturas básicas do Azure Pipelines de stages, jobs e steps.  
```yaml
stages:
- stage: DeployTerraform
  displayName: Deploy Terraform
  jobs:
  - job: DeployTerraform
    displayName: 'Deploy infrastructure with Terraform'
    steps: 
```
Agora vamos criar nosso primeiro step de instalação do programa binário de Terraform no job que estamos executando. 

Relembrando o job funciona como um container para a execução das etapas da nossa pipeline. 
```yaml
- bash: |
    echo "# Downloading Terraform v1.3.7"
    wget https://releases.hashicorp.com/terraform/1.3.7/terraform_1.3.7_linux_amd64.zip
    echo "# Unzipping files"
    unzip terraform_1.3.7_linux_amd64.zip
              
    echo "# Configuring terraform and checking version"
    export TERRAFORM_PATH=$(which terraform)
    ls -lha
    sudo mv terraform $TERRAFORM_PATH
    
    terraform -v
```

Por último, vamos instalar o AWS Cli utilizando a task AWSShellScript@1 e executar os comandos do Terraform para realizarmos o build e deploy do nosso Terraform. 
```yaml
    - task: AWSShellScript@1
      displayName: 'Deploy Service'
      inputs:
          awsCredentials: aws-teste-dev
          regionName: $(AWS_REGION)
          scriptType: 'inline'
          inlineScript: |
            terraform init
            terraform plan
            terraform apply -auto-approve
            terraform destroy -auto-approve
```
Beleza, mas a task AWSShellScript@1 exige a utilização de credenciais de acesso aos serviços AWS, para isso, precisamos criar uma IAM user credentials. 

Para criar a IAM user credentials basta seguir o passo a passo da AWS no link [https://docs.aws.amazon.com/cli/latest/userguide/cli-authentication-user.html](https://docs.aws.amazon.com/cli/latest/userguide/cli-authentication-user.html)

Agora precisamos configurar a credencial criada no Azure Pipelines, para isso vamos utilizar a configuração Service Connections. 

O Service Connections do Azure Pipelines é um recurso que permite que você conecte seus pipelines a serviços externos, como Azure, GitHub, Bitbucket, Jenkins, Docker Hub, etc.

Essa conexão é estabelecida por meio de um endpoint seguro, que é uma configuração de conexão que inclui as credenciais necessárias para se comunicar com o serviço externo. O endpoint é criado e gerenciado pelo Azure Pipelines e pode ser usado em seus pipelines para se conectar ao serviço externo.

Ao criar um Service Connection, você pode configurá-lo com diferentes tipos de autenticação, dependendo do serviço externo que está sendo usado. Por exemplo, ao conectar-se ao Azure, você pode usar a autenticação baseada em certificado, enquanto que para o GitHub, você pode usar autenticação baseada em token.

Uma vez que o Service Connection é criado e configurado, ele pode ser usado em seus pipelines para conectar seus repositórios, contêineres, máquinas virtuais e outros serviços. Por exemplo, você pode usar um Service Connection para se conectar ao seu repositório GitHub e implementar seu aplicativo em um ambiente de hospedagem do Azure.

Além disso, o Azure Pipelines também permite que você compartilhe seus Service Connections com outros projetos e equipes na organização, o que simplifica o gerenciamento de credenciais e aumenta a segurança.

Agora vamos instalar o  AWS Toolkit for Azure DevOps No Azure Devops 

1.  Acesse o link: [https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-vsts-tools](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-vsts-tools)
2.  Clique em "Get it free"
3.  Selecione a organização que deseja instalar e clique no botão "Install" 
![Azure Devops AWS](https://lh6.googleusercontent.com/9evZAqlFS2X4dDzIu2d_CNigcXwlkHJ91PUbE1c1o7qz-lG-ObRRorWcx4H0wLQXfyCoz2kXhvvJ5nwUurdeCiNW4rcN5Z2BIGWpH4aQ4tvaJRdgsf4_nQGqqrzt-2uypflkBV3zt_Ww4nGNAaA2Yio)

Agora podemos utilizar as credenciais criadas no Service Connections através do AWS Toolkit for Azure DevOps.

1.  Acesse o projeto no Azure Devops e clique em Project Settings
2.  Em pipelines, clique em Service Connection
3.  Clique em New service connection e selecione AWS, clique em Next
4.  Insira as credenciais criadas em Access Key ID e Secret Access Key
5.  Inclua o Service connection name, marque o checkbox Grant access permission to all pipelines e clique em Save
![credenciais](https://lh6.googleusercontent.com/V3ksjYr01mDslbZ2L9L5k_dasRhZTIxTDH_wOcy7F_SgmDkpaH-NYFoMvdtFXiiUmQKDDFa1IniEPMdEQj5i-6Bykw5w8HnJew4hymFm7DfIs3n6eF8wAPue2YKuvPELInvaWOq_A5C1HZZ75OJuzTk)

O Service connection name é muito importante pois ele será utilizado na task AWSShellScript@1 no input awsCredentials. 

Por último, vamos criar um código Terraform simples. Utilizei o mesmo código utilizado no AWS get started da Hashicorp.
```terraform  
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.16"
    }
  }

  required_version = ">= 1.2.0"
}

provider "aws" {
  region  = "us-west-2"
}

resource "aws_instance" "app_server" {
  ami           = "ami-830c94e3"
  instance_type = "t2.micro"

  tags = {
    Name = "ExampleAppServerInstance"
  }
}
```
Agora é só seguir o passo a passo de como executar uma pipeline, post com mais detalhes:
![executar uma pipeline](https://lh4.googleusercontent.com/xjPeQ2ZIj9W7FPHWqpgGHbAf1njmZrZg7jk40uH65VYVENJdKF3hZP3_fc7KhCAAeF8iu_LcvLTXs4gYERoetQP8zl9JpWomtD5px3w8ZIA5iy7otoX4eUOp2p-Qj8wUZ0WuvPbItLanDFwWW4vJicw)

Pronto, você tem uma pipeline executando código Terraform.  
![terraform com azure pipelines](https://lh5.googleusercontent.com/JqfHg_RLItIjwRZWDMxvqRNPLWVHVkxGGbzZULFp6q4WSk970cO6o9ndANxeAZ92RM_mjtQJxPuR3r2izMusubgEjJPkBRIKckeWaUbFhdAhfJEXzYzkRk60LSxPHfLYpegytCPpV0BBkMcprS0fZOE)