# Migrando do Terraform Provider v1.x para v2.0

Este guia fornece instruções detalhadas para migrar do Azion Terraform Provider v1.x (API v3) para v2.0 (API v4). Siga os passos abaixo para garantir uma transição suave.

---

## Visão Geral da Migração

O Terraform Provider v2.0 representa uma versão principal que migra para a API v4 da Azion. Esta versão introduz novos recursos e remove os descontinuados para se alinhar com a nova arquitetura da API.

### Mudanças Principais

| Aspecto | v1.x (API v3) | v2.0 (API v4) |
| --- | --- | --- |
| **Versão da API** | Azion API v3 | Azion API v4 |
| **Gerenciamento de Domínios** | recurso `azion_domain` | recursos `azion_workload` e `azion_workload_deployment` |
| **Gerenciamento de Origins** | recurso `azion_edge_application_origin` | recurso `azion_connector` |
| **Functions** | recurso `azion_edge_function` | recurso `azion_function` |
| **Páginas Personalizadas** | Não disponível | recurso `azion_custom_page` |

### Compatibilidade de Versões

| Versão do Terraform Provider | Versão da API | Status |
| --- | --- | --- |
| 1.41.0 e anteriores | API v3 | Descontinuado |
| 2.0.0 e posteriores | API v4 | Atual |

---

## Antes de Começar

Antes de iniciar o processo de migração, certifique-se de ter concluído as seguintes preparações.

### Pré-requisitos

- **Terraform**: Versão 1.0 ou posterior instalada
- **Conta Azion**: Conta válida com acesso à API v4
- **Token Pessoal**: Um [token pessoal](/pt-br/documentacao/produtos/gestao-de-contas/personal-tokens/) válido com permissões apropriadas
- **Backup**: Um backup completo do seu estado Terraform atual e configurações

### Backup da Configuração

Crie um backup da sua configuração Terraform atual e dos arquivos de estado antes de fazer qualquer alteração:

```bash
# Criar um diretório de backup
mkdir -p ~/terraform-backup

# Copiar seus arquivos de configuração
cp -r ./seu-projeto-terraform ~/terraform-backup/

# Fazer backup do arquivo de estado (se usando estado local)
cp terraform.tfstate ~/terraform-backup/
cp terraform.tfstate.backup ~/terraform-backup/ 2>/dev/null || true

# Se usando estado remoto, baixar uma cópia local
terraform state pull > ~/terraform-backup/terraform.tfstate
```

### Fixar Sua Versão

Se você precisar permanecer na v1.x temporariamente, fixar a versão do provider:

```hcl
terraform {
  required_providers {
    azion = {
      source  = "aziontech/azion"
      version = "1.41.0"
    }
  }
}
```

:::warning
A versão 1.41.0 e anteriores não recebem mais atualizações ou correções de bugs. Planeje sua migração para v2.0 o mais breve possível.
:::

---

## Breaking Changes

Esta seção detalha as breaking changes entre v1.x e v2.0.

### Recursos Removidos

Os seguintes recursos e data sources foram removidos na v2.0:

| Recurso | Status | Substituto |
| --- | --- | --- |
| `azion_domain` | Removido | Use `azion_workload` e `azion_workload_deployment` |
| `azion_domains` (data source) | Removido | Use data source `azion_workloads` |
| `azion_edge_application_origin` | Removido | Use `azion_connector` |
| `azion_edge_applications_origins` (data source) | Removido | Use data source `azion_connectors` |

### Recursos Renomeados

| Recurso v1.x | Recurso v2.0 | Observações |
| --- | --- | --- |
| `azion_edge_function` | `azion_function` | Recurso renomeado para se alinhar com a nova nomenclatura do produto |

### Novos Recursos na v2.0

| Recurso | Descrição |
| --- | --- |
| `azion_workload` | Gerenciar workloads da Azion (substitui o gerenciamento de domínios) |
| `azion_workload_deployment` | Gerenciar deployments de workload |
| `azion_connector` | Gerenciar connectors da Azion (substitui o gerenciamento de origins) |
| `azion_custom_page` | Gerenciar páginas personalizadas |

### Recursos Inalterados

Os seguintes recursos permanecem disponíveis com seus nomes originais:

| Recurso | Descrição |
| --- | --- |
| `azion_intelligent_dns_zone` | Zonas DNS |
| `azion_intelligent_dns_record` | Registros DNS |
| `azion_intelligent_dns_dnssec` | Configurações DNSSEC |
| `azion_network_list` | Network Lists |
| `azion_waf_rule_set` | Conjuntos de regras WAF |
| `azion_digital_certificate` | Certificados digitais |
| `azion_environment_variable` | Variáveis de ambiente |

---

## Mapeamento de Recursos

Esta seção fornece o mapeamento detalhado entre os recursos v1.x e v2.0.

### Mapeamento de Domínio para Workload

O gerenciamento de domínios na v1.x foi substituído por um modelo de dois recursos na v2.0:

| v1.x (Domain) | v2.0 (Workload) |
| --- | --- |
| `azion_domain` | `azion_workload` + `azion_workload_deployment` |
| `azion_domains` (data source) | `azion_workloads` |

**Diferenças Principais:**

- **v1.x**: Um único recurso `azion_domain` gerenciava todo o ciclo de vida do domínio
- **v2.0**: Separação de responsabilidades com `azion_workload` (definição) e `azion_workload_deployment` (deployment)

### Mapeamento de Origin para Connector

O gerenciamento de origins foi substituído por connectors:

| v1.x (Origin) | v2.0 (Connector) |
| --- | --- |
| `azion_edge_application_origin` | `azion_connector` |
| `azion_edge_applications_origins` (data source) | `azion_connectors` |

**Diferenças Principais:**

- **v1.x**: Origins eram definidos dentro do contexto de Applications
- **v2.0**: Connectors são recursos independentes que fornecem opções de integração mais flexíveis

### Mapeamento de Edge Function para Function

| v1.x | v2.0 |
| --- | --- |
| `azion_edge_function` | `azion_function` |
| `azion_edge_functions` (data source) | data source `azion_functions` |

---

## Exemplos de Migração

Esta seção fornece exemplos de configuração lado a lado para migrar seus recursos Terraform.

### Migração de Domínio para Workload

#### Configuração v1.x

```hcl
terraform {
  required_providers {
    azion = {
      source  = "aziontech/azion"
      version = "1.41.0"
    }
  }
}

provider "azion" {
  api_token = var.api_token
}

# Recurso Domain (v1.x)
resource "azion_domain" "example" {
  name               = "meu-dominio"
  cname_access_only  = false
  digital_certificate = 1234
  edge_application   = 5678
  is_active          = true

  # Vinculação do nome do domínio
  domain_name = "exemplo.com"
}
```

#### Configuração v2.0

```hcl
terraform {
  required_providers {
    azion = {
      source  = "aziontech/azion"
      version = "2.0.0"
    }
  }
}

provider "azion" {
  api_token = var.api_token
}

# Recurso Workload (v2.0)
resource "azion_workload" "example" {
  name = "meu-workload"

  # Opções de configuração do workload
  # Consulte a documentação do Terraform Registry para opções completas
}

# Deployment do workload (v2.0)
resource "azion_workload_deployment" "example" {
  workload_id = azion_workload.example.id

  # Configuração do deployment
  # Consulte a documentação do Terraform Registry para opções completas
}
```

### Migração de Origin para Connector

#### Configuração v1.x

```hcl
# Edge Application Origin (v1.x)
resource "azion_edge_application_origin" "example" {
  edge_application_id = azion_edge_application_main_setting.example.id

  name               = "minha-origin"
  origin_type        = "single_origin"
  origin_address     = "origin.exemplo.com"
  origin_protocol    = "https"
  origin_path        = "/api"
  host_header        = "origin.exemplo.com"

  # Configurações de conexão
  connection_timeout = 30
  read_timeout       = 60
}
```

#### Configuração v2.0

```hcl
# Connector (v2.0)
resource "azion_connector" "example" {
  name = "meu-connector"

  # Configuração do connector
  # Consulte a documentação do Terraform Registry para opções completas

  # Exemplo de configuração
  origin = {
    address = "origin.exemplo.com"
    protocol = "https"
    path = "/api"
  }

  # Configurações de conexão
  connection_timeout = 30
  read_timeout = 60
}
```

### Migração de Function

#### Configuração v1.x

```hcl
# Edge Function (v1.x)
resource "azion_edge_function" "example" {
  name    = "minha-funcao"
  active  = true
  code    = file("${path.module}/function.js")

  # Argumentos da função
  json_args = jsonencode({
    key = "valor"
  })
}
```

#### Configuração v2.0

```hcl
# Function (v2.0)
resource "azion_function" "example" {
  name   = "minha-funcao"
  active = true
  code   = file("${path.module}/function.js")

  # Argumentos da função
  json_args = jsonencode({
    key = "valor"
  })
}
```

### Exemplo Completo: Aplicação com Workload

#### Configuração v1.x

```hcl
terraform {
  required_providers {
    azion = {
      source  = "aziontech/azion"
      version = "1.41.0"
    }
  }
}

provider "azion" {
  api_token = var.api_token
}

# Edge Application
resource "azion_edge_application_main_setting" "app" {
  name = "minha-aplicacao"
}

# Origin
resource "azion_edge_application_origin" "origin" {
  edge_application_id = azion_edge_application_main_setting.app.id
  name               = "minha-origin"
  origin_type        = "single_origin"
  origin_address     = "origin.exemplo.com"
}

# Domain
resource "azion_domain" "domain" {
  name             = "meu-dominio"
  edge_application = azion_edge_application_main_setting.app.id
  domain_name      = "exemplo.com"
}

# Edge Function
resource "azion_edge_function" "func" {
  name   = "minha-funcao"
  active = true
  code   = file("${path.module}/function.js")
}
```

#### Configuração v2.0

```hcl
terraform {
  required_providers {
    azion = {
      source  = "aziontech/azion"
      version = "2.0.0"
    }
  }
}

provider "azion" {
  api_token = var.api_token
}

# Application 
resource "azion_application_main_setting" "app" {
  name = "minha-aplicacao"
}

# Connector (substitui origin)
resource "azion_connector" "connector" {
  name = "meu-connector"
  # Configuração do connector
}

# Workload (substitui domain)
resource "azion_workload" "workload" {
  name = "meu-workload"
}

# Workload deployment
resource "azion_workload_deployment" "deployment" {
  workload_id = azion_workload.workload.id
  # Configuração do deployment
}

# Function (renomeada)
resource "azion_function" "func" {
  name   = "minha-funcao"
  active = true
  code   = file("${path.module}/function.js")
}
```

---

## Passos de Migração de Estado

Siga estes passos para migrar seu estado Terraform de v1.x para v2.0.

### Passo 1: Atualizar a Versão do Provider

Atualize sua configuração Terraform para usar o Provider v2.0:

```hcl
terraform {
  required_providers {
    azion = {
      source  = "aziontech/azion"
      version = "2.0.0"
    }
  }
}
```

### Passo 2: Inicializar o Novo Provider

Execute Terraform init para baixar o novo provider:

```bash
terraform init -upgrade
```

### Passo 3: Remover Recursos Descontinuados do Estado

Remova os recursos descontinuados do seu estado Terraform:

```bash
# Remover recursos de domínio
terraform state rm azion_domain.example

# Remover recursos de origin
terraform state rm azion_edge_application_origin.example

# Remover recursos da function (serão recriados como azion_function)
terraform state rm azion_edge_function.example
```

### Passo 4: Atualizar Arquivos de Configuração

Atualize seus arquivos `.tf` com as novas configurações de recursos seguindo os exemplos na seção [Exemplos de Migração](#exemplos-de-migração).

### Passo 5: Importar Novos Recursos

Importe seus recursos existentes para os novos tipos de recursos:

```bash
# Importar workloads
terraform import azion_workload.example <workload_id>

# Importar connectors
terraform import azion_connector.example <connector_id>

# Importar functions
terraform import azion_function.example <function_id>
```

### Passo 6: Verificar o Plano

Execute um plan para verificar as mudanças esperadas:

```bash
terraform plan
```

Revise a saída cuidadosamente para garantir:
- Nenhum recurso será destruído inesperadamente
- Novos recursos serão criados corretamente
- Atributos dos recursos estão mapeados corretamente

### Passo 7: Aplicar as Mudanças

Aplique as mudanças:

```bash
terraform apply
```

---

## Solução de Problemas

Esta seção aborda problemas comuns encontrados durante a migração.

### Erros Comuns e Soluções

#### Erro: Conflito de Versão do Provider

```
Error: Failed to query available provider packages
Could not retrieve the list of available versions for provider aziontech/azion
```

**Solução**: Certifique-se de especificar a fonte e versão corretas. Execute:

```bash
terraform init -upgrade
```

#### Erro: Tipo de Recurso Não Encontrado

```
Error: Invalid resource type
on main.tf line 10:
10: resource "azion_domain" "example" {
The provider aziontech/azion does not support resource type "azion_domain".
```

**Solução**: Este recurso foi removido na v2.0. Substitua pelos recursos `azion_workload` e `azion_workload_deployment`.

#### Erro: Falha na Migração de Estado

```
Error: Error refreshing state: azion_application_origin.example:
resource not found
```

**Solução**: O recurso já foi removido ou não existe. Remova-o do estado:

```bash
terraform state rm azion_application_origin.example
```

#### Erro: Importação Não Encontrada

```
Error: Cannot import non-existent remote object
```

**Solução**: Certifique-se de que o ID do recurso que você está importando existe na API v4. Alguns recursos da API v3 podem ter IDs diferentes na API v4. Verifique o Console da Azion para encontrar os IDs de recursos corretos.

### Recursos Adicionais

- [Documentação do Terraform Provider v2.0](/pt-br/documentacao/produtos/terraform-provider/)
- [Documentação do Terraform Provider v1.x](/pt-br/documentacao/produtos/terraform-provider-v3/) (Descontinuado)
- [Documentação da API v4 da Azion](https://api.azion.com/)
- [Terraform Registry - Azion Provider](https://registry.terraform.io/providers/aziontech/azion/latest)

### Obtendo Ajuda

Se você encontrar problemas durante a migração:

1. Revise a seção [Solução de Problemas](#solução-de-problemas)
2. Consulte a [documentação do Terraform Registry](https://registry.terraform.io/providers/aziontech/azion/latest/docs)
3. Entre em contato com o Suporte Azion através do [Portal de Suporte](https://tickets.azion.com/)
4. Visite a [Comunidade Azion](https://www.azion.com/pt-br/documentacao/) para recursos adicionais

---

## Checklist de Migração

Use este checklist para acompanhar o progresso da sua migração:

### Preparação

- [ ] Verificar se a conta está habilitada para API v4
- [ ] Fazer backup do estado Terraform atual
- [ ] Fazer backup dos arquivos de configuração `.tf`
- [ ] Fixar a versão do provider para 1.41.0 (última versão v1.x)
- [ ] Documentar os recursos atuais em uso
- [ ] Identificar recursos que serão removidos ou renomeados

### Migração

- [ ] Atualizar a versão do provider para 2.0.0
- [ ] Executar `terraform init -upgrade`
- [ ] Remover recursos descontinuados do estado (`azion_domain`, `azion_edge_application_origin`, etc.)
- [ ] Atualizar arquivos de configuração `.tf`
- [ ] Substituir `azion_domain` por `azion_workload` + `azion_workload_deployment`
- [ ] Substituir `azion_edge_application_origin` por `azion_connector`
- [ ] Substituir `azion_edge_function` por `azion_function`
- [ ] Importar novos recursos para o estado
- [ ] Executar `terraform plan` e revisar mudanças

### Validação

- [ ] Verificar se nenhum recurso será destruído inesperadamente
- [ ] Verificar se novos recursos serão criados corretamente
- [ ] Confirmar que atributos estão mapeados corretamente
- [ ] Executar `terraform apply` em ambiente de teste
- [ ] Validar funcionamento dos recursos migrados
- [ ] Atualizar pipelines de CI/CD se necessário

### Pós-Migração

- [ ] Remover código legado não utilizado
- [ ] Atualizar documentação do projeto
- [ ] Comunicar equipe sobre mudanças
- [ ] Arquivar backups após confirmação de sucesso