{"id":50618974,"url":"https://github.com/edneimonteiro/internal-apim","last_synced_at":"2026-06-06T09:02:11.749Z","repository":{"id":361507034,"uuid":"1244153645","full_name":"EdneiMonteiro/internal-apim","owner":"EdneiMonteiro","description":"Azure API Management Internal (VNet) — Terraform reference with CAF naming, private DNS and private endpoints","archived":false,"fork":false,"pushed_at":"2026-05-30T23:50:43.000Z","size":51,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T01:13:29.127Z","etag":null,"topics":["apim","azure","caf","infrastructure-as-code","networking","private-dns","terraform","tutorial","vnet"],"latest_commit_sha":null,"homepage":null,"language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EdneiMonteiro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-20T02:31:06.000Z","updated_at":"2026-05-30T23:50:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/EdneiMonteiro/internal-apim","commit_stats":null,"previous_names":["edneimonteiro/internal-apim"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/EdneiMonteiro/internal-apim","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdneiMonteiro%2Finternal-apim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdneiMonteiro%2Finternal-apim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdneiMonteiro%2Finternal-apim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdneiMonteiro%2Finternal-apim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EdneiMonteiro","download_url":"https://codeload.github.com/EdneiMonteiro/internal-apim/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdneiMonteiro%2Finternal-apim/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33975476,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-06T02:00:07.033Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apim","azure","caf","infrastructure-as-code","networking","private-dns","terraform","tutorial","vnet"],"created_at":"2026-06-06T09:02:09.361Z","updated_at":"2026-06-06T09:02:11.729Z","avatar_url":"https://github.com/EdneiMonteiro.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Internal APIM no Azure\n\n[![ORCID](https://img.shields.io/badge/ORCID-0009--0006--0765--4201-A6CE39?logo=orcid\u0026logoColor=white)](https://orcid.org/0009-0006-0765-4201)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Azure](https://img.shields.io/badge/Cloud-Azure-0078D4?logo=microsoftazure\u0026logoColor=white)](#)\n[![Last commit](https://img.shields.io/github/last-commit/EdneiMonteiro/internal-apim)](https://github.com/EdneiMonteiro/internal-apim/commits)\n\nTutorial completo de como provisionar um **Azure API Management** em modo **Internal VNet** — com explicação dos pré-requisitos, passo-a-passo via Portal e **Infrastructure as Code (Terraform)** pronto para uso.\n\n\u003e ⚠️ Este repositório é um **tutorial / prova de conceito**. Antes de usar em produção, revise: segurança, escalabilidade, observabilidade, custos e conformidade. Veja [DISCLAIMER.md](./DISCLAIMER.md) e [SUPPORT.md](./SUPPORT.md).\n\n\u003e 📖 Baseado na documentação oficial: [Deploy your Azure API Management instance to a virtual network — internal mode](https://learn.microsoft.com/en-us/azure/api-management/api-management-using-with-internal-vnet)\n\u003e\n\u003e 🏷️ Convenção de nomenclatura: [Cloud Adoption Framework — Resource abbreviations](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations)\n\n---\n\n## 🎯 O que você vai aprender\n\n- Diferença entre os modos **External** e **Internal** de VNet integration do APIM.\n- Quais recursos do Azure são pré-requisito para um APIM Internal.\n- Como configurar **NSG**, **Subnet** e **DNS** para que tudo funcione.\n- **Por que NÃO criar Private DNS Zone em `azure-api.net`** (mesmo em sub-FQDN) e como usar **custom domain** em um TLD privado.\n- Como provisionar o ambiente via **Portal Azure** (visual) **ou** **Terraform** (IaC).\n- Como validar que o APIM está respondendo no VIP privado.\n\n---\n\n## 🧭 Índice\n\n| # | Documento | Conteúdo |\n|---|-----------|----------|\n| 1 | [Pré-requisitos](docs/01-pre-requisitos.md) | SKU, permissões, recursos necessários |\n| 2 | [Arquitetura](docs/02-arquitetura.md) | Diagrama, decisões e nomenclatura CAF |\n| 3 | [Tutorial — Portal Azure](docs/03-tutorial-portal.md) | Passo-a-passo manual via portal |\n| 4 | [Tutorial — Terraform](docs/04-tutorial-terraform.md) | Provisão via IaC |\n| 5 | [Configuração de DNS](docs/05-configuracao-dns.md) | **Custom domain + Private DNS em `.internal`** (não toca `azure-api.net`) |\n| 6 | [Validação](docs/06-validacao.md) | Como testar o gateway interno |\n| 7 | [Cleanup](docs/07-cleanup.md) | Como destruir o ambiente |\n| 8 | [Evidência da validação](docs/08-evidencia-validacao.md) | Saída real do `terraform apply` (validado em Brazil South) |\n\n---\n\n## ⚡ Quick start (Terraform)\n\n\u003e Requer **Terraform ≥ 1.5**, **Azure CLI** logado e um **publisher e-mail** válido.\n\n```bash\ngit clone https://github.com/EdneiMonteiro/internal-apim.git\ncd internal-apim/terraform\n\n# 1. Configure variáveis\ncp terraform.tfvars.example terraform.tfvars\n# Edite terraform.tfvars com publisher_email, subscription, owner, cert_password etc.\n\n# 2. Faça login no Azure\naz login\naz account set --subscription \u003cSUBSCRIPTION_ID\u003e\n\n# 3. Provisione (⚠️ APIM Developer leva ~30-45 minutos)\nterraform init\nterraform plan -out=tfplan\nterraform apply tfplan\n```\n\nAo final você terá:\n\n| Recurso | Nome (default) | Abreviação CAF |\n|---------|----------------|----------------|\n| Resource Group | `rg-internal-dev-brs` | `rg` |\n| Virtual Network | `vnet-internal-dev-brs` | `vnet` |\n| Subnet | `snet-apim-dev` | `snet` |\n| Network Security Group | `nsg-apim-dev-brs` | `nsg` |\n| API Management | `apim-internal-owner-dev` | `apim` |\n| Log Analytics Workspace | `log-internal-dev-brs` | `log` |\n| Application Insights | `appi-internal-dev-brs` | `appi` |\n| Private DNS Zone | `api.internal` | — |\n\nE o APIM acessível via `https://apim.api.internal` (somente de dentro da VNet).\n\n---\n\n## ✅ Status da validação\n\n\u003e Este tutorial foi **validado com uma execução real** em `Brazil South` usando a SKU `Developer_1`. Veja a saída completa em [docs/08-evidencia-validacao.md](docs/08-evidencia-validacao.md).\n\u003e\n\u003e - `provisioningState = Succeeded`\n\u003e - `vnetType = Internal`\n\u003e - Custom domain configurado em `api.internal` (sem zonas em `azure-api.net`)\n\u003e - Cert self-signed gerado pelo Terraform via provider `tls` + `chilicat/pkcs12`\n\n---\n\n## 🛡️ Licença\n\nEste projeto está licenciado sob os termos da licença incluída em [LICENSE](LICENSE).\n\n---\n\n## Suporte e Aviso Legal\n\n- Sem SLA nem suporte oficial. Veja [SUPPORT.md](./SUPPORT.md).\n- Uso sujeito a [DISCLAIMER.md](./DISCLAIMER.md).\n- **Não afiliado nem endossado pela Microsoft.** Marcas usadas apenas para descrição.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedneimonteiro%2Finternal-apim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fedneimonteiro%2Finternal-apim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fedneimonteiro%2Finternal-apim/lists"}