<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>rss.livelink.threads-in-node</title>
    <link>https://techcommunity.microsoft.com/t5/regional-blogs/ct-p/RegionalBlogs</link>
    <description>rss.livelink.threads-in-node</description>
    <pubDate>Tue, 28 Apr 2026 16:11:40 GMT</pubDate>
    <dc:creator>RegionalBlogs</dc:creator>
    <dc:date>2026-04-28T16:11:40Z</dc:date>
    <item>
      <title>Detectando Anomalias de Custo no Azure com FinOps Hub + SRE Agent</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/detectando-anomalias-de-custo-no-azure-com-finops-hub-sre-agent/ba-p/4513809</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Introdução&lt;/H1&gt;
&lt;P&gt;Um dos maiores desafios em ambientes cloud é manter a visibilidade sobre os custos. Picos inesperados podem passar despercebidos por dias e quando chegam na fatura, já é tarde demais.&lt;/P&gt;
&lt;P&gt;Neste artigo, vou mostrar como configurei uma &lt;STRONG&gt;análise automática diária de anomalias de custo&lt;/STRONG&gt; usando o &lt;STRONG&gt;Azure SRE Agent&lt;/STRONG&gt;, conectado ao &lt;STRONG&gt;FinOps Hub (Azure Data Explorer)&lt;/STRONG&gt;, com &lt;STRONG&gt;notificação automática no Microsoft Teams&lt;/STRONG&gt; quando algo fora do padrão é detectado.&lt;/P&gt;
&lt;H2&gt;🏗️ Arquitetura da Solução&lt;/H2&gt;
&lt;P&gt;FinOps Hub (ADX)&amp;nbsp; →&amp;nbsp; SRE Agent (Scheduled Task)&amp;nbsp; →&amp;nbsp; KQL Anomaly Detection&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ↓ anomalia detectada?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM → Adaptive Card → Teams Channel&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NÃO → Log: 'custos dentro do esperado'&lt;/P&gt;
&lt;H1&gt;Pré-requisitos&lt;/H1&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Requisito&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Detalhe&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;FinOps Hub implantado&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Com dados de custo sendo ingeridos no Azure Data Explorer&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Azure SRE Agent configurado&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Com acesso à subscription onde o FinOps Hub está&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Canal no Microsoft Teams&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Onde as notificações serão postadas&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Permissões adequadas&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Managed Identity com Viewer no database Hub do ADX&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Passo a Passo&lt;/H1&gt;
&lt;H2&gt;① Identificar o Cluster ADX do FinOps Hub&lt;/H2&gt;
&lt;P&gt;O primeiro passo é localizar o cluster Azure Data Explorer onde o FinOps Hub armazena os dados de custo. No Azure SRE Agent, usamos o Azure Resource Graph:&lt;/P&gt;
&lt;P&gt;az graph query -q "Resources | where type =~ 'Microsoft.Kusto/clusters'" --first 10 --subscription &amp;lt;subscription-id&amp;gt;&lt;/P&gt;
&lt;P&gt;No meu caso como exemplo, o cluster retornado foi:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Propriedade&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Valor&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Nome&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;finopshubadx&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;URI&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;https://finopshubadx.northcentralus.kusto.windows.net&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Database&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Hub&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;SKU&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Dev(No SLA)_Standard_D11_v2&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Região&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;North Central US&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;② Configurar Permissões (RBAC no ADX)&lt;/H2&gt;
&lt;P&gt;A managed identity do SRE Agent precisa de acesso &lt;STRONG&gt;Viewer&lt;/STRONG&gt; ao database &lt;STRONG&gt;Hub&lt;/STRONG&gt; do ADX. Sem isso, a query KQL falhará com erro 403.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Opção A — Azure CLI:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;az kusto database-principal-assignment create \&lt;BR /&gt;&amp;nbsp; --cluster-name finopshubadx \&lt;BR /&gt;&amp;nbsp; --database-name Hub \&lt;BR /&gt;&amp;nbsp; --resource-group &amp;lt;resource-group&amp;gt; \&lt;BR /&gt;&amp;nbsp; --subscription &amp;lt;subscription-id&amp;gt; \&lt;BR /&gt;&amp;nbsp; --principal-assignment-name "sre-agent-viewer" \&lt;BR /&gt;&amp;nbsp; --principal-id "&amp;lt;managed-identity-client-id&amp;gt;" \&lt;BR /&gt;&amp;nbsp; --principal-type App --role Viewer&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Opção B — Portal:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ADX → Cluster → Database Hub → Permissions → Add → Viewer → Selecionar managed identity&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Opção C — KQL (ADX Web UI):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;.add database Hub viewers ('aadapp=&amp;lt;client-id&amp;gt;') 'SRE Agent'&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;③ A Query KQL de Detecção de Anomalias&lt;/H2&gt;
&lt;P&gt;Esta query utiliza &lt;STRONG&gt;series_decompose_anomalies&lt;/STRONG&gt; do Kusto para detectar padrões anômalos nos custos diários ao longo dos últimos 12 meses:&lt;/P&gt;
&lt;P&gt;let numberOfMonths = 12;&lt;BR /&gt;let start = startofmonth(ago(numberOfMonths * 30d));&lt;BR /&gt;let end = now();&lt;BR /&gt;let interval = 1d;&lt;BR /&gt;&lt;BR /&gt;Costs()&lt;BR /&gt;| where ChargePeriodStart between (start .. end)&lt;BR /&gt;| summarize DailyCost = sum(EffectiveCost)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; by bin(ChargePeriodStart, interval)&lt;BR /&gt;| make-series CostSeries = sum(DailyCost)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; on ChargePeriodStart from start to end step interval&lt;BR /&gt;| extend anomalies = series_decompose_anomalies(CostSeries)&lt;BR /&gt;| project ChargePeriodStart, CostSeries, anomalies&lt;/P&gt;
&lt;H3&gt;💡 Como a query funciona&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Costs() → Função do FinOps Hub que retorna dados de custo consolidados&lt;/LI&gt;
&lt;LI&gt;make-series → Cria série temporal diária contínua (sem gaps)&lt;/LI&gt;
&lt;LI&gt;series_decompose_anomalies → Algoritmo ML nativo do Kusto que detecta spikes e drops usando decomposição sazonal + STL&lt;/LI&gt;
&lt;LI&gt;Score &amp;gt; 0 → custo acima do esperado | Score &amp;lt; 0 → abaixo do esperado&lt;/LI&gt;
&lt;LI&gt;Quanto maior o |score|, mais significativa a anomalia&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;④ Configurar Webhook no Microsoft Teams&lt;/H2&gt;
&lt;P&gt;Para receber notificações no Teams, criamos um &lt;STRONG&gt;Incoming Webhook via Power Automate Workflows&lt;/STRONG&gt; (método recomendado pela Microsoft):&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;No canal do Teams, clique nos 3 pontos (...) → Workflows&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;Pesquise "Post to a channel when a webhook request is received"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;Selecione o Team e Channel desejados → Add workflow&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;Copie a URL gerada (formato: https://prod-xx...logic.azure.com/...)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;Ative o workflow no Power Automate (My flows → Turn on)&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;⚠️ Atenção: &lt;/STRONG&gt;O workflow pode ser criado com status 'Suspended'. Ative em: Power Automate → My flows → Turn on.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;⑤ Criar a Scheduled Task no SRE Agent&lt;/H2&gt;
&lt;P&gt;Agora a parte principal: criar a &lt;STRONG&gt;tarefa agendada (Scheduled Task)&lt;/STRONG&gt; no Azure SRE Agent. Basta pedir em linguagem natural:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"Crie uma tarefa diária para analisar anomalias de custo no FinOps Hub e me notificar pelo Teams quando houver anomalias detectadas."&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;O SRE Agent criará a task com os seguintes parâmetros:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Parâmetro&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Valor&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Nome&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Daily FinOps Cost Anomaly Analysis&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Schedule&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;0 8 * * * (diariamente às 08:00 UTC)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;ADX Cluster&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;https://finopshubadx.northcentralus.kusto.windows.net&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Database&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Hub&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Query&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;KQL com series_decompose_anomalies (12 meses)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Notificação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Adaptive Card no Teams via webhook&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Escalação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;HIGH se anomalias por 3+ dias consecutivos&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Idempotência&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Sem anomalia = 'custos dentro do esperado'&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;img /&gt;
&lt;P&gt;Task details:&lt;/P&gt;
&lt;P&gt;Obs: Modificar os campos na task para adequar seu ambiente&lt;/P&gt;
&lt;LI-CODE lang="markdown"&gt;Autonomous Scheduled Run - Daily FinOps Cost Anomaly Analysis

## Scope
- Subscription: xxxxxxx-xxxxxxx-xxxxxx-xxxx-xxxxx
- ADX Cluster: https://finopshub.northcentralus.kusto.windows.net
- Database: Hub
- Resource Group: finopshub-rg

## Goal
Detect cost anomalies in Azure spending using the FinOps Hub data. Run the KQL query against the ADX cluster, analyze results, and notify via Teams if anomalies are found.

## Step 1: Execute KQL Query
Use the KustoQuery subagent to run this query against the ADX cluster (https://finopshubadx.northcentralus.kusto.windows.net, database: Hub):

```kql
let numberOfMonths = 12;
let start = startofmonth(ago(numberOfMonths * 30d));
let end = now();
let interval = 1d;
Costs()
| where ChargePeriodStart between (start .. end)
| summarize DailyCost = sum(EffectiveCost) by bin(ChargePeriodStart, interval)
| make-series CostSeries = sum(DailyCost) on ChargePeriodStart from start to end step interval
| extend anomalies = series_decompose_anomalies(CostSeries)
| project ChargePeriodStart, CostSeries, anomalies
```

## Step 2: Analyze Results
- Parse the anomalies array from series_decompose_anomalies output
- Identify days where anomaly score is significantly positive (cost spike) or negative (unusual drop)
- For each anomaly found, calculate: the date, actual cost value, expected baseline, and percentage deviation
- Focus on the last 7 days of data for actionable anomalies, but use the full 12-month history for context

## Step 3: Generate Report
Create a summary with:
- Total anomalies detected in the last 7 days
- For each anomaly: date, cost value, deviation from expected, severity (high/medium/low)
- Trend analysis: whether costs are trending up, down, or stable
- Top recommendations (e.g., investigate specific resource groups, check for new deployments, review reserved instances)

## Step 4: Teams Notification (ONLY if anomalies detected in last 7 days)
If anomalies are found, send a notification to Microsoft Teams using the executing_code skill (ExecutePythonCode) to POST to this webhook URL:
https://839eace659ab424397eca5b8fcc104.e4.environment.api.powerplatform.com:443/powerautomate/automations/direct/workflows/88ec6b6c43014d8f8cb13999714dddd8/triggers/manual/paths/invoke?api-version=1&amp;amp;sp=%2Ftriggers%2Fmanual%2Frun&amp;amp;sv=1.0&amp;amp;sig=br2rNi4x1zKjWp6CgKWcajvEUW_7EUBkHrkbnp6Hk2g

Use Adaptive Card format for the Teams message with:
- Title: "⚠️ Azure Cost Anomaly Detected"
- Summary of anomalies (dates, values, deviations)
- Severity indicator
- Link back to this SRE Agent thread for details

Python code example for the webhook POST:
```python
import urllib.request
import json

webhook_url = "&amp;lt;colar-url-webhook-aqui&amp;gt;"

card = {
    "type": "message",
    "attachments": [{
        "contentType": "application/vnd.microsoft.card.adaptive",
        "content": {
            "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
            "type": "AdaptiveCard",
            "version": "1.4",
            "body": [
                {"type": "TextBlock", "text": "⚠️ Azure Cost Anomaly Detected", "weight": "Bolder", "size": "Large"},
                {"type": "TextBlock", "text": "&amp;lt;ANOMALY_SUMMARY_HERE&amp;gt;", "wrap": True},
                {"type": "FactSet", "facts": [
                    {"title": "Date", "value": "&amp;lt;DATE&amp;gt;"},
                    {"title": "Actual Cost", "value": "&amp;lt;COST&amp;gt;"},
                    {"title": "Expected", "value": "&amp;lt;EXPECTED&amp;gt;"},
                    {"title": "Deviation", "value": "&amp;lt;DEVIATION&amp;gt;%"},
                    {"title": "Severity", "value": "&amp;lt;SEVERITY&amp;gt;"}
                ]}
            ],
            "actions": [{"type": "Action.OpenUrl", "title": "View in SRE Agent", "url": "https://sre.azure.com/agents/subscriptions/&amp;lt;sua-subscricao&amp;gt;/resourceGroups/finopshub-rg/providers/Microsoft.App/agents/finopshub/views/thread/7314d219-77d6-4e12-a3fb-f30606d13077"}]
        }
    }]
}

req = urllib.request.Request(webhook_url, data=json.dumps(card).encode('utf-8'), headers={'Content-Type': 'application/json'}, method='POST')
response = urllib.request.urlopen(req)
```

## Step 5: Report in Thread
Always post a summary in this thread with:
- Whether anomalies were found or not
- Key metrics and trends
- If no anomalies: "No material cost anomalies detected. Daily costs within expected range."

## Constraints
- Read-only operations only against ADX
- Max 5 KQL queries per execution
- Do not modify any Azure resources

## Idempotence
If no anomalies detected in the last 7 days and costs are within normal thresholds, output: "No material cost anomalies detected. Daily costs within expected range."

## Escalation
If anomalies are detected for 3+ consecutive days, flag as HIGH severity in the Teams notification and recommend immediate investigation.&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;⑥ Notificação no Teams (Adaptive Card)&lt;/H2&gt;
&lt;P&gt;Quando anomalias são detectadas, o SRE Agent envia um Adaptive Card rico para o Teams:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;⚠️ AZURE COST ANOMALY DETECTED&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;🔴 HIGH — 2026-04-21&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Custo Real&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;$1,847.32&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Custo Esperado&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;$623.15&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Desvio&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;+196.5% (↑ $1,224.17)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Score Anomalia&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;4.7 (threshold: 1.5)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;🟡 MEDIUM — 2026-04-20&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Custo Real&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;$987.44&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Desvio&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;+59.5% (↑ $368.54)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;📊 Trend (7d)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;$601 → $615 → $622 → $619 → $987 → $1,847&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;EM&gt;Exemplo de Adaptive Card enviado ao canal do Teams&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;O card inclui botões: Ver Detalhes no SRE Agent e Abrir FinOps Hub (ADX) para investigação.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;⑦ Testar a Integração (Simular Anomalia)&lt;/H2&gt;
&lt;P&gt;Antes de confiar no agendamento, teste pedindo ao SRE Agent:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"Simular uma anomalia de custo para eu receber no Teams"&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;O agente enviará um Adaptive Card de teste com dados simulados para validar que o webhook está funcionando.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Dica: &lt;/STRONG&gt;Se o webhook retornar erro 400 - WorkflowTriggerIsNotEnabled, ative o flow em: Power Automate → My flows → Turn on.&lt;/P&gt;
&lt;img /&gt;
&lt;H1&gt;Como Funciona no Dia a Dia&lt;/H1&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Horário&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Ação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Resultado&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;08:00 UTC&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;SRE Agent executa query KQL no ADX&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Dados de custo (12 meses)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;08:01 UTC&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Análise de anomalias (últimos 7 dias)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Identifica spikes e drops&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;08:02 UTC&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Se anomalia → Teams notification&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Adaptive Card no canal&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;08:02 UTC&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Se normal → log no thread&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;"Custos dentro do esperado"&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Contínuo&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;3+ dias anomalia → escalação HIGH&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Investigação recomendada&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Gerenciamento da Task&lt;/H2&gt;
&lt;P&gt;Após criada, a tarefa pode ser gerenciada pelo SRE Agent:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt; Pausar: &lt;/STRONG&gt;"Pausar a tarefa de anomalia de custo"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; Retomar: &lt;/STRONG&gt;"Retomar a tarefa"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; Alterar horário: &lt;/STRONG&gt;"Mudar para executar às 10h UTC"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; Ver histórico: &lt;/STRONG&gt;"Mostrar histórico de execuções"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; Cancelar: &lt;/STRONG&gt;"Cancelar a tarefa de anomalia"&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Conclusão&lt;/H1&gt;
&lt;P&gt;Com essa configuração, você tem um &lt;STRONG&gt;sistema inteligente de vigilância de custos&lt;/STRONG&gt; que:&lt;/P&gt;
&lt;P&gt;🔍 Analisa 12 meses de histórico para detectar padrões sazonais&lt;/P&gt;
&lt;P&gt;🤖 Usa ML nativo do Kusto — sem infraestrutura adicional&lt;/P&gt;
&lt;P&gt;📱 Notifica proativamente no Teams — só quando há anomalia&lt;/P&gt;
&lt;P&gt;📈 Escala automaticamente a severidade em anomalias persistentes&lt;/P&gt;
&lt;P&gt;💬 Mantém histórico completo no thread do SRE Agent&lt;/P&gt;
&lt;P&gt;🔧 É gerenciável por linguagem natural — sem YAML, sem pipelines&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A combinação &lt;STRONG&gt;FinOps Hub + Azure SRE Agent + Teams&lt;/STRONG&gt; transforma a governança de custos de reativa (olhar dashboards) em &lt;STRONG&gt;proativa e automatizada&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;🚀 Quer implementar na sua organização?&lt;/H2&gt;
&lt;P&gt;Se você quer testar, o Azure SRE Agent está disponível como preview. Configure um agente na sua subscription e comece a conversar em linguagem natural.&lt;/P&gt;
&lt;P&gt;Já usa &lt;A class="lia-external-url" href="https://microsoft.github.io/finops-toolkit/hubs" target="_blank" rel="noopener"&gt;FinOps Hub&lt;/A&gt;? Conte nos comentários como você monitora anomalias de custo hoje!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;#FinOps&amp;nbsp; #Azure&amp;nbsp; #SREAgent&amp;nbsp; #CostManagement&amp;nbsp; #AzureDataExplorer&amp;nbsp; #CloudGovernance&amp;nbsp; #DevOps&amp;nbsp; #MicrosoftTeams&amp;nbsp; #AIOps&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 23 Apr 2026 12:59:25 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/detectando-anomalias-de-custo-no-azure-com-finops-hub-sre-agent/ba-p/4513809</guid>
      <dc:creator>arsilvan</dc:creator>
      <dc:date>2026-04-23T12:59:25Z</dc:date>
    </item>
    <item>
      <title>Uso de contextos no Entra ID</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/uso-de-contextos-no-entra-id/ba-p/4513725</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-line="8"&gt;Visão Geral&lt;/H2&gt;
&lt;P data-line="10"&gt;Com a crescente necessidade de segurança adaptativa, o Microsoft Entra ID oferece recursos avançados para aplicar políticas dinâmicas de acesso. Em cenários corporativos, autenticação e autorização tradicionais, baseadas apenas em roles e claims estáticos, nem sempre são suficientes. Imagine que um usuário já está logado e possui permissão para acessar uma API, mas você precisa garantir que, para uma operação crítica como deletar um registro, ele esteja dentro da rede corporativa, em um dispositivo gerenciado ou tenha assinado um termo de confidencialidade. É exatamente isso que os&amp;nbsp;&lt;STRONG&gt;contextos de autenticação do Microsoft Entra ID&lt;/STRONG&gt;&amp;nbsp;resolvem.&lt;/P&gt;
&lt;P data-line="12"&gt;Neste artigo vou detalhar todo o processo, desde a habilitação do&amp;nbsp;&lt;STRONG&gt;Continuous Access Evaluation (CAE)&lt;/STRONG&gt;, passando pela configuração dos contextos e das políticas de acesso condicional no portal do Entra ID, até a integração prática com uma aplicação .NET dividida em&amp;nbsp;&lt;STRONG&gt;frontend web&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;API de backend&lt;/STRONG&gt;. No código, veremos como o MSAL intercepta o fluxo, verifica se o token contém a claim&amp;nbsp;acrs&amp;nbsp;com o contexto exigido e, caso não contenha, dispara um&amp;nbsp;&lt;STRONG&gt;challenge&lt;/STRONG&gt;&amp;nbsp;que leva o usuário de volta ao Entra ID para cumprir o requisito adicional. Se o contexto já estiver satisfeito, o fluxo é transparente para o usuário.&lt;/P&gt;
&lt;P data-line="14"&gt;O objetivo é destacar a granularidade no controle de acesso, a estrutura de contexto, os desafios de implementação e potenciais aplicações práticas.&lt;/P&gt;
&lt;H2 data-line="210"&gt;Diagrama de Arquitetura&lt;/H2&gt;
&lt;img /&gt;
&lt;H2 data-line="18"&gt;1. Caso de Uso&lt;/H2&gt;
&lt;P data-line="63"&gt;Para exemplificar, utilizamos uma aplicação&amp;nbsp;&lt;STRONG&gt;.NET&lt;/STRONG&gt;&amp;nbsp;simples, dividida em dois componentes:&lt;/P&gt;
&lt;UL data-line="65"&gt;
&lt;LI data-line="65"&gt;&lt;STRONG&gt;API de backend&lt;/STRONG&gt;, que expõe endpoints protegidos&lt;/LI&gt;
&lt;LI data-line="66"&gt;&lt;STRONG&gt;Aplicação web frontend&lt;/STRONG&gt;, que consome a API via tokens&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-line="25"&gt;Fluxo Básico&lt;/H3&gt;
&lt;OL data-line="70"&gt;
&lt;LI data-line="70"&gt;A aplicação web é protegida pelo&amp;nbsp;&lt;STRONG&gt;Entra ID&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-line="71"&gt;Ao iniciar, o&amp;nbsp;&lt;STRONG&gt;MSAL&lt;/STRONG&gt;&amp;nbsp;(SDK de identidade da Microsoft) verifica se o usuário está autenticado&lt;/LI&gt;
&lt;LI data-line="72"&gt;Se não estiver, solicita a autenticação&lt;/LI&gt;
&lt;LI data-line="73"&gt;Após autenticado, a aplicação armazena um&amp;nbsp;&lt;STRONG&gt;token&lt;/STRONG&gt;&amp;nbsp;para consumir a API&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 data-line="32"&gt;O Diferencial&lt;/H3&gt;
&lt;P data-line="77"&gt;&lt;STRONG&gt;Não basta um token de acesso convencional&lt;/STRONG&gt;&amp;nbsp;para consumir um endpoint específico da API. É necessário um token com uma&amp;nbsp;&lt;STRONG&gt;claim especial&lt;/STRONG&gt;&amp;nbsp;(acrs), contendo exatamente o valor do&amp;nbsp;&lt;STRONG&gt;contexto esperado&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H2 data-line="38"&gt;2. Configuração do Entra ID&lt;/H2&gt;
&lt;H3 data-line="40"&gt;App Registration e Contextos&lt;/H3&gt;
&lt;P data-line="85"&gt;O processo inicia com o registro das aplicações (cliente e API) no Entra ID, mantendo as etapas tradicionais de permissionamento e definição de escopos.&lt;/P&gt;
&lt;P data-line="87"&gt;A novidade está na&amp;nbsp;&lt;STRONG&gt;configuração de contextos&lt;/STRONG&gt;, que são pares chave-valor criados no Entra ID e utilizados em políticas de acesso condicional.&lt;/P&gt;
&lt;P data-line="89"&gt;&lt;STRONG&gt;Pré-requisito:&lt;/STRONG&gt;&amp;nbsp;Licença&amp;nbsp;&lt;STRONG&gt;Entra ID P1&lt;/STRONG&gt;&amp;nbsp;para uso de acesso condicional.&lt;/P&gt;
&lt;P data-line="91"&gt;O contexto é configurado em uma aba específica dentro das&amp;nbsp;&lt;STRONG&gt;políticas de acesso condicional&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ao criar um novo contexto, define-se o nome, descrição e o ID sequencial (ex:&amp;nbsp;c1). O checkbox&amp;nbsp;&lt;STRONG&gt;"Publish to apps"&lt;/STRONG&gt; torna o contexto disponível para as aplicações consumirem:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-line="50"&gt;Estrutura e Limitações dos Contextos&lt;/H3&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspecto&lt;/th&gt;&lt;th&gt;Detalhe&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Identificação&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Número sequencial (ex:&amp;nbsp;c1,&amp;nbsp;c2, até&amp;nbsp;c99)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Limite&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Vinculado ao número máximo de regras de acesso condicional (&lt;STRONG&gt;195&lt;/STRONG&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Composição&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Nome + Descrição&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Utilidade&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Depende da implementação na aplicação&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3 data-line="59"&gt;Aplicação Prática dos Contextos&lt;/H3&gt;
&lt;P data-line="104"&gt;O contexto permite&amp;nbsp;&lt;STRONG&gt;granularidade adicional&lt;/STRONG&gt;&amp;nbsp;além das tradicionais roles e claims do token JWT:&lt;/P&gt;
&lt;UL data-line="106"&gt;
&lt;LI data-line="106"&gt;&lt;STRONG&gt;Rede corporativa&lt;/STRONG&gt;: restringir acesso a uma área apenas para usuários dentro da rede interna&lt;/LI&gt;
&lt;LI data-line="107"&gt;&lt;STRONG&gt;Dispositivos gerenciados&lt;/STRONG&gt;: exigir que o dispositivo esteja em compliance&lt;/LI&gt;
&lt;LI data-line="108"&gt;&lt;STRONG&gt;Assinatura de termos&lt;/STRONG&gt;: exigir ações adicionais (ex: NDA) antes do acesso a dados sensíveis, mesmo que o token permita o acesso&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Por fim, o contexto é vinculado a uma&amp;nbsp;&lt;STRONG&gt;política de acesso condicional&lt;/STRONG&gt;. No exemplo abaixo, a policy "Teste - C10" associa o contexto "Teste WebApp" como target resource:&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="69"&gt;3. Implementação no Código&lt;/H2&gt;
&lt;H3 data-line="71"&gt;3.1 Configuração no Cliente (Startup.cs)&lt;/H3&gt;
&lt;P data-line="116"&gt;No processo de inicialização, utiliza-se o método&amp;nbsp;AddMicrosoftIdentityWebAppAuthentication&amp;nbsp;para configurar a autenticação, incluindo o parâmetro&amp;nbsp;&lt;STRONG&gt;ClientCapabilities&lt;/STRONG&gt;, que habilita o uso de contexto.&lt;/P&gt;
&lt;P data-line="118"&gt;Além disso, é adicionado o handler&amp;nbsp;MicrosoftIdentityConsentAndConditionalAccessHandler&amp;nbsp;para gerenciar o fluxo de acesso condicional.&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;// Habilita autenticação com suporte a contexto e acesso condicional
services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi(
        Configuration.GetSection("TodoList:Scopes").Get&amp;lt;string[]&amp;gt;()
    )
    .AddInMemoryTokenCaches();

// Handler para gerenciar challenge de acesso condicional
services.AddScoped&amp;lt;MicrosoftIdentityConsentAndConditionalAccessHandler&amp;gt;();&lt;/LI-CODE&gt;
&lt;H3 data-line="89"&gt;3.2 Configuração (appsettings.json)&lt;/H3&gt;
&lt;P data-line="134"&gt;O ponto-chave é o&amp;nbsp;&lt;STRONG&gt;ClientCapabilities: ["cp1"]&lt;/STRONG&gt;, que habilita o suporte a Continuous Access Evaluation:&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "cyber.meudominio.com.br",
    "TenantId": "...-8888-4400-8c9c-...",
    "ClientId": "...-e635-...-bb9f-...",
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-oidc",
    "ClientCapabilities": [ "cp1" ],
    "ClientSecret": "XHm8Q~6_rNy_ib-....~KbcvF"
  }
}&lt;/LI-CODE&gt;
&lt;P data-line="151"&gt;A classe&amp;nbsp;Configuration, passada para&amp;nbsp;AddMicrosoftIdentityWebAppAuthentication, localiza e carrega automaticamente a seção&amp;nbsp;AzureAd&amp;nbsp;do arquivo de configuração.&lt;/P&gt;
&lt;H3 data-line="110"&gt;3.3 Método Crítico: Validação do Contexto&lt;/H3&gt;
&lt;P data-line="155"&gt;No endpoint crítico (ex: deletar item), o código verifica se o token do usuário contém a claim&amp;nbsp;acrs&amp;nbsp;com o valor do contexto exigido:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;// GET: TodoList/Delete/5
public async Task&amp;lt;ActionResult&amp;gt; DeleteItem(int id)
{
    string requiredAuthContextId = "c10";
    string acrsClaimType = "acrs";

    // Construção do claimsChallenge
    var claimsChallengeObj = new
    {
        id_token = new
        {
            acrs = new
            {
                essential = true,
                value = requiredAuthContextId
            }
        }
    };
    string claimsChallenge = System.Text.Json.JsonSerializer.Serialize(claimsChallengeObj);

    // Verifica se o usuário possui o claim necessário
    Claim acrsClaim = User.FindAll(acrsClaimType)
        .FirstOrDefault(x =&amp;gt; x.Value == requiredAuthContextId);

    if (acrsClaim?.Value != requiredAuthContextId)
    {
        // Dispara challenge para cumprir o contexto exigido
        _consentHandler.ChallengeUser(
            new[]
            {
                "api://ce845259-3c67-43c1-9816-43f82f4d7704/ToDoList.Read",
                "api://ce845259-3c67-43c1-9816-43f82f4d7704/ToDoList.ReadWrite"
            },
            claimsChallenge
        );
    }

    try
    {
        var todo = await _downstreamApi.GetForUserAsync&amp;lt;Todo&amp;gt;(
            "TodoList",
            options =&amp;gt; options.RelativePath = $"api/todolist/{id}");

        if (todo == null) return NotFound();
        return View(todo);
    }
    catch (Exception)
    {
        return RedirectToAction("Index");
    }
}&lt;/LI-CODE&gt;
&lt;H3 data-line="168"&gt;Lógica do Fluxo&lt;/H3&gt;
&lt;OL data-line="213"&gt;
&lt;LI data-line="213"&gt;&lt;STRONG&gt;Claim presente e válida&lt;/STRONG&gt;: a operação é permitida normalmente&lt;/LI&gt;
&lt;LI data-line="214"&gt;&lt;STRONG&gt;Claim ausente&lt;/STRONG&gt;: o&amp;nbsp;&lt;STRONG&gt;ChallengeUser()&lt;/STRONG&gt;&amp;nbsp;abre a tela do Entra ID para o usuário cumprir o requisito (ex: MFA, assinatura de termo)&lt;/LI&gt;
&lt;LI data-line="215"&gt;&lt;STRONG&gt;Contexto já satisfeito&lt;/STRONG&gt;: o fluxo é transparente para o usuário&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-line="176"&gt;4. Fluxo de Challenge e Resposta&lt;/H2&gt;
&lt;H3 data-line="178"&gt;Do lado da API (Backend)&lt;/H3&gt;
&lt;P data-line="223"&gt;Quando o contexto&amp;nbsp;&lt;STRONG&gt;não é atendido&lt;/STRONG&gt;, a API retorna:&lt;/P&gt;
&lt;UL data-line="225"&gt;
&lt;LI data-line="225"&gt;&lt;STRONG&gt;401 Unauthorized&lt;/STRONG&gt;&amp;nbsp;com headers customizados&lt;/LI&gt;
&lt;LI data-line="226"&gt;Informações sobre o contexto exigido no corpo/headers da resposta&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-line="185"&gt;Do lado do Cliente (Frontend)&lt;/H3&gt;
&lt;OL data-line="230"&gt;
&lt;LI data-line="230"&gt;O cliente captura exceções específicas (WebApiMsalUiRequiredException)&lt;/LI&gt;
&lt;LI data-line="231"&gt;Extrai informações do header da resposta&lt;/LI&gt;
&lt;LI data-line="232"&gt;Executa o fluxo de challenge conforme necessário&lt;/LI&gt;
&lt;LI data-line="233"&gt;Após cumprido o requisito, o token é renovado com a claim&amp;nbsp;acrs&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-line="194"&gt;5. Considerações Finais&lt;/H2&gt;
&lt;UL data-line="239"&gt;
&lt;LI data-line="239"&gt;O uso de contextos no Entra ID&amp;nbsp;&lt;STRONG&gt;amplia as possibilidades&lt;/STRONG&gt;&amp;nbsp;de controle de acesso, permitindo requisitos dinâmicos e contextuais além das roles tradicionais&lt;/LI&gt;
&lt;LI data-line="240"&gt;A implementação exige&amp;nbsp;&lt;STRONG&gt;integração cuidadosa&lt;/STRONG&gt;&amp;nbsp;entre backend e frontend, além de testes para garantir o correto tratamento dos fluxos de challenge e resposta&lt;/LI&gt;
&lt;LI data-line="241"&gt;A&amp;nbsp;&lt;STRONG&gt;documentação limitada&lt;/STRONG&gt;&amp;nbsp;reforça a importância de compartilhar experiências e boas práticas para fomentar o uso do recurso&lt;/LI&gt;
&lt;LI data-line="242"&gt;Requer&amp;nbsp;&lt;STRONG&gt;licença Entra ID P1&lt;/STRONG&gt;&amp;nbsp;para acesso condicional&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-line="203"&gt;Referências&lt;/H2&gt;
&lt;UL data-line="248"&gt;
&lt;LI data-line="248"&gt;&lt;A href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-continuous-access-evaluation" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-continuous-access-evaluation"&gt;Continuous Access Evaluation in Microsoft Entra - Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="249"&gt;&lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview"&gt;Visão geral da plataforma de identidade da Microsoft - Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 23 Apr 2026 12:53:59 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/uso-de-contextos-no-entra-id/ba-p/4513725</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2026-04-23T12:53:59Z</dc:date>
    </item>
    <item>
      <title>FinOps Hub Privado: Implementação Manual em Ambientes Corporativos</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/finops-hub-privado-implementa%C3%A7%C3%A3o-manual-em-ambientes/ba-p/4509993</link>
      <description>&lt;P&gt;&lt;STRONG&gt;O que é o FinOps Hub?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O FinOps Hub é uma solução open source da Microsoft, parte do FinOps Toolkit, que fornece uma base escalável e extensível para análise, governança e otimização de custos em nuvem. A solução centraliza dados de custos por meio de recursos de armazenamento e pipelines de dados, permitindo que as organizações padronizem a forma como analisam seus gastos na nuvem, adotando o modelo de dados FOCUS definido pela FinOps Foundation.&lt;/P&gt;
&lt;P&gt;Além de disponibilizar relatórios e dashboards prontos, o FinOps Hub expõe os dados de custos de forma estruturada por meio do Azure Data Explorer ou do Microsoft Fabric, possibilitando a criação de relatórios customizados no Power BI e o desenvolvimento de soluções internas sob medida, de acordo com as necessidades do negócio.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Objetivo&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Esse artigo visa orientar a implementação manual do acesso privado ao FinOps Hub após uma implementação pública, sem usar diretamente a opção de implementação privada oferecida pelo template.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Por que implementar o FinOps Hub com acesso privado de forma manual?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O &lt;A href="https://learn.microsoft.com/en-gb/cloud-computing/finops/toolkit/hubs/deploy?tabs=azure-portal%2Cadx-dashboard#deploy-the-finops-hub-template" target="_blank" rel="noopener"&gt;template&lt;/A&gt; disponibilizado para a implementação do FinOps Hub permite que selecionemos&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-gb/cloud-computing/finops/toolkit/hubs/private-networking#comparing-network-access-options" target="_blank" rel="noopener"&gt;duas formas de implementação&lt;/A&gt;:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Pública: forma de implementação mais simples e comum. Os recursos são provisionados com acesso público habilitado, sendo acessados por meio de seus endpoints públicos padrões do Azure. O controle de acesso é feito exclusivamente via permissões RBAC.&lt;/LI&gt;
&lt;LI&gt;Privada: forma de implementação mais segura. Os recursos são provisionados com acesso público desabilitado e expostos apenas por meio de private endpoints, ficando acessíveis somente através de redes privadas que possuem conectividade com a rede onde esses endpoints estão implementados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Embora a comunicação privada traga ganhos significativos de segurança, sua habilitação através do template do FinOps Hub introduz algumas implicações importantes no processo de implantação. O template, de forma automática, tenta:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Criar uma rede virtual (/26);&lt;/LI&gt;
&lt;LI&gt;Provisionar Private DNS Zones;&lt;/LI&gt;
&lt;LI&gt;Criar os registros DNS associados aos private endpoints;&lt;/LI&gt;
&lt;LI&gt;Configurar os links entre as VNets e as zonas DNS.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Em muitas organizações, esse tipo de configuração é restrito por políticas internas. A criação de redes, zonas DNS e seus respectivos vínculos costuma ser responsabilidade de times especializados, que garantem a padronização e a aderência às diretrizes arquiteturais definidas pela empresa.&lt;/P&gt;
&lt;P&gt;Em cenários onde a organização adota, por exemplo, uma topologia Hub &amp;amp; Spoke, com landing zones bem definidas para workloads e conectividade, é fundamental considerar alguns pontos adicionais:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Garantir que a rede criada para os private endpoints não tenha sobreposição (overlap) com outras redes existentes;&lt;/LI&gt;
&lt;LI&gt;Assegurar que exista peering com a VNet de hub;&lt;/LI&gt;
&lt;LI&gt;Integrar os registros DNS dos novos private endpoints às Private DNS Zones centralizadas;&lt;/LI&gt;
&lt;LI&gt;Configurar corretamente os VNet links;&lt;/LI&gt;
&lt;LI&gt;Garantir que a resolução de nomes esteja funcional no ambiente on-premises, permitindo o acesso ao FinOps Hub por meio de VPN, ExpressRoute ou outras formas de conectividade híbrida.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Esses fatores explicam por que, em muitos casos, o uso do template com configuração privada se torna inviável quando utilizado de forma isolada. Isso ocorre porque, frequentemente, o time de FinOps não é o mesmo time responsável por redes e DNS, possuindo permissão para implantar apenas parte dos recursos necessários.&lt;/P&gt;
&lt;P&gt;Nesses cenários, a implementação privada exige a orquestração entre diferentes times, cada um atuando dentro de suas responsabilidades. Como resultado, algumas etapas que o template tenta executar automaticamente precisam ser realizadas manualmente, conforme descrito nas próximas seções.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Passo a Passo para Implementação&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Faça a implementação do template &lt;A href="https://learn.microsoft.com/en-gb/cloud-computing/finops/toolkit/hubs/deploy?tabs=azure-portal%2Cadx-dashboard#deploy-the-finops-hub-template" target="_blank" rel="noopener"&gt;seguindo o tutorial documentado&lt;/A&gt;, com “Networking” em modo público.&lt;/LI&gt;
&lt;LI&gt;Assim que o template é implementado, alguns scripts de configuração são executados. Aguarde até que esses scripts sejam executados, ou seja, desapareçam do grupo de recursos onde o FinOps Hub foi implementado para seguir com os próximos passos. Exemplos dos “Deployment Scripts” que desaparecerão:&lt;/LI&gt;
&lt;/OL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;Crie uma rede de tamanho mínimo /26 – valide com o time de infraestrutura o espaçamento que pode ser utilizado. Dentro dessa rede implemente uma subrede:
&lt;UL&gt;
&lt;LI&gt;private-endpoint-subnet (/28) – subrede para os private endpoints.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Garanta a existência das Private DNS Zones: se seu ambiente possui zonas de DNS privadas centralizadas pré-configuradas. Garanta que as seguintes zonas já existam na subscription padrão para os seus recursos de rede:
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.blob.core.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para o Data Explorer e storage&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.dfs.core.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para o Data Explorer and o data lake hospedando os dados de FinOps data e configuração das pipelines&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.table.core.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para Data Explorer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.queue.core.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para o Data Explorer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.{location}.kusto.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para Data Explorer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Configurando a Storage Account com Acesso Privado&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O primeiro recurso que a ser configurado será a Storage Account.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;A configuração a seguir deve ser realizada duas vezes uma para o target sub-resource “blob” e outra para o target sub-resource “dfs”.
&lt;UL&gt;
&lt;LI&gt;Acesse “Networking” e a aba “Private Endpoints”&lt;/LI&gt;
&lt;LI&gt;Na aba “Basics” defina:
&lt;UL&gt;
&lt;LI&gt;Subscription: mesma que o FinOps Hub foi implementado&lt;/LI&gt;
&lt;LI&gt;Resource Group: mesmo que o FinOps Hub foi implementado&lt;/LI&gt;
&lt;LI&gt;Name: use um nome que remeta ao recurso criado (private endpoint) e o sub recurso que ele fará exposição (blob/dfs). Exemplo: pe-storageaccount-blob/ pe-storageaccount-dfs&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Na aba “Resource” defina o target sub-resource para o qual a configuração está sendo feita. No caso, primeiro foi feito para “blob” e depois “dfs”.&lt;/LI&gt;
&lt;LI&gt;Na aba “Virtual Network”, deve-se selecionar a rede criada para os private endpoints bem como a subrede (private-endpoint-subnet).&lt;/LI&gt;
&lt;LI&gt;Na aba “DNS” selecione a private DNS zone na qual são realizados os registros do seus private endpoints. Quando estiver configurando o private endpoint para blob será &lt;STRONG&gt;privatelink.blob.core.windows.net&lt;/STRONG&gt; e para dfs &lt;STRONG&gt;privatelink.dfs.core.windows.net&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Adicione Tags caso seja necessário.&lt;/LI&gt;
&lt;LI&gt;Clique em “Review + create”.&lt;/LI&gt;
&lt;LI&gt;Ao final, dois private endpoints devem estar criados para a storage account:&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;Agora será necessário configurar o private endpoint usado pelo Data Factory para acessar a Storage Account.
&lt;UL&gt;
&lt;LI&gt;Acesse o Data Factory e clique em "Launch Studio".&lt;/LI&gt;
&lt;LI&gt;No menu lateral, selecione a opção "Manage" -&amp;gt; "Linked services":&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Selecione o serviço correspondente ao Azure Data Lake Storage Gen2.&lt;/LI&gt;
&lt;LI&gt;Em “Connect via integration runtime” substitua “AutoResolveIntegrationRuntime” por New+:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Em “Integration runtime setup” selecione “Azure” -&amp;gt; Botão “Continue”:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Na aba “Settings”, apenas altere o campo “Name”. Use algo como “ManagedIntegrationRuntime”. Os demais campos, mantenha como estão:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Na aba “Virtual Network”, configure conforme a imagem abaixo:&lt;img /&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Por fim, na aba “Data flow runtime”, use as configurações abaixo:&lt;/LI&gt;
&lt;LI&gt;Clique em “Create”.&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Agora, voltando a página “Edit linked Service”, adicione o “Managed Private Endpoint”. Ele ficará em estado “Pending”.&lt;/LI&gt;
&lt;LI&gt;Clique em “Save”.&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Além disso, use a managed identity fornecida na página “Edit linked Service”, e lhe dê os seguintes acessos na storage account:
&lt;UL&gt;
&lt;LI&gt;Reader&lt;/LI&gt;
&lt;LI&gt;Storage Account Contributor&lt;/LI&gt;
&lt;LI&gt;Storage Blob Data Contributor&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Por fim, acesse a seção “Networking” da Storage Account novamente, selecione o private endpoint criado pelo Data Factory e clique no botão “Approve”.&amp;nbsp;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Configurando o Linked Service ftkRepo no Data Factory&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Voltando na seção “Manage” do Azure Data Factory, será necessário editar o serviço “ftkRepo”. Nele, o único campo a ser alterado é o “Connect via integration runtime” usando o “ManagedIntegrationRuntime” criado na etapa de configuração da storage account.&lt;/LI&gt;
&lt;/OL&gt;
&lt;img /&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Clique em “Save”.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Configurando o Azure Data Explorer com Acesso Privado&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Acesse a seção “Networking” cluster do Data Explorer criado pelo script do FinOps Hub e acesse a aba “Private Endpoint Connections”&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Clique em “+ Private Endpoint”.&lt;/LI&gt;
&lt;LI&gt;Em “Basics” inclua um nome para o private endpoint e garanta que a região selecionada é a de implementação do seu FinOps Hub e da vnet criada para ele.&lt;/LI&gt;
&lt;LI&gt;Na aba “Virtual Network” selecione a rede e subrede criadas para os private endpoints.&lt;/LI&gt;
&lt;LI&gt;Na aba “DNS”, associar cada configuração a sua private DNS zone correspondente. Se essas zonas já existirem no ambiente e forem utilizadas de forma centralizada, usar as existentes. Caso contrário, a configuração poderá criar private DNS zones novas:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Novamente será preciso configurar o private endpoint gerenciado pelo Data Factory. Para isso, acesse “Managed” -&amp;gt; “Linked Services” e selecione o serviço referente ao Azure Data Explorer.&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Nessa seção, o único campo a ser editado é o “Connect via integration runtime” usando o “ManagedIntegrationRuntime” criado na etapa de configuração da storage account.&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Agora ainda em “Manage” no Data Factory, selecione a opção “Managed Private Endpoints”. Clique em “+New” -&amp;gt; “Azure Data Explorer (Kusto)”&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Forneça um nome para o private endpoint, marque a subscription na qual o Data Explorer foi implementado e em "Cluster" selecione o recurso implementado via template do FinOps Hub:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Ao final, deve-se ter dois private endpoints configurados no Azure Data Explorer:&lt;img /&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Ajustes Finais e Validações de Conectividade&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Tanto para a Storage Account quanto para o Data Explorer, acesse as configurações de rede e altere o Public network access para “Disabled”.&lt;/LI&gt;
&lt;LI&gt;Por fim, no seu servidor local de DNS, crie o registro para o Data Explorer apontando para o forwarder correto no Azure seja ele uma máquina virtual ou o inbound endpoint do Azure Private Resolver. Não use o domínio com privatelink, mas sim o padrão, no caso do Data Explorer a forma geral é &amp;lt;localização&amp;gt;.kusto.windows.net conforme o exemplo abaixo:&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL&gt;
&lt;LI&gt;Ao configurar os apontamentos corretamente, será possível configurar os dashboards em máquinas locais/on-premises que tenham acesso privado ao ambiente Azure. Os dashboards precisam ser capazes de resolver a URL do cluster Data Explorer que é apontado como parâmetro do Dashboard em PowerBI.&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Se desejar validar a comunicação antes de configurar o dashboard de Power BI, teste da sua máquina local a resolução da URI do Data Explorer implementado para o FinOps Hub, usando nslookup conforme o exemplo abaixo.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 10 Apr 2026 16:51:20 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/finops-hub-privado-implementa%C3%A7%C3%A3o-manual-em-ambientes/ba-p/4509993</guid>
      <dc:creator>carolinamelo</dc:creator>
      <dc:date>2026-04-10T16:51:20Z</dc:date>
    </item>
    <item>
      <title>Segurança Corporativa no Azure VMware Solution (AVS): Como Inspecionar o Tráfego com Firewall NVA</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/seguran%C3%A7a-corporativa-no-azure-vmware-solution-avs-como/ba-p/4501226</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Muitas vezes faz sentido usar uma NVA (Network Virtual Appliance) como firewall dentro do AVS, porque permite&lt;STRONG&gt; reaproveitar a solução de firewall já existente &lt;/STRONG&gt;(Palo Alto, Check Point, etc..) e manter a proficiência do time de segurança, evita parte da&lt;STRONG&gt; complexidade de roteamento&lt;/STRONG&gt; que pode surgir ao forçar o tráfego passar por um firewall “fora” do AVS . Além disso, administrar esse firewall dentro do AVS continua familiar para quem já opera VMware, e você ganha acesso a &lt;STRONG&gt;recursos avançados de inspeção &lt;/STRONG&gt;do fabricante (como filtragem por aplicação em camada 7 e inspeção SSL/TLS), que são muito úteis para controle de tráfego outbound e políticas corporativas.&lt;/P&gt;
&lt;P&gt;Neste artigo eu demonstro e um laboratório prático de inspeção de tráfego &lt;STRONG&gt;Norte-Sul e Leste-Oeste&lt;/STRONG&gt;, fazendo isolamento por ambiente (DEV/PRD) dentro do &lt;STRONG&gt;Azure VMware Solution (AVS) &lt;/STRONG&gt;usando&lt;STRONG&gt; NSX-T (Tier-0/Tier-1)&lt;/STRONG&gt; e um &lt;STRONG&gt;Firewall NVA (pfSense)&lt;/STRONG&gt; implantado no SDDC. Também serão demonstradas as &lt;STRONG&gt;principais configurações no NSX&lt;/STRONG&gt; (criação/associação de segments, gateways T0/T1 e ajustes de roteamento necessários para forçar o tráfego a passar pela NVA).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Arquitetura&lt;/H3&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Informações do Laboratório&lt;/STRONG&gt;&lt;/H4&gt;
&lt;H5&gt;&lt;STRONG&gt;Segmentos de Trânsito&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Transit_Outside &amp;nbsp; | CIDR: 192.168.30.0/24 | GW: 192.168.30.1&lt;/LI&gt;
&lt;LI&gt;Transit_PRD&amp;nbsp; | CIDR: 192.168.21.0/24 | GW: 192.168.21.1&lt;/LI&gt;
&lt;LI&gt;Transit_DEV&amp;nbsp; | CIDR: 192.168.22.0/24 | GW: 192.168.22.1&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Segmentos de Workloads&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;PRD_WEB | CIDR: 192.168.70.0/24 | GW: 192.168.70.1&lt;/LI&gt;
&lt;LI&gt;PRD_DATA | CIDR: 192.168.71.0/24 | GW: 192.168.71.1&lt;/LI&gt;
&lt;LI&gt;DEV_WEB | CIDR: 192.168.80.0/24 | GW: 192.168.80.1&lt;/LI&gt;
&lt;LI&gt;DEV_DATA | CIDR: 192.168.81.0/24&amp;nbsp; | GW: 192.168.81.1&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Interfaces da NVA (pfSense)&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Transit_Outside: 192.168.30.5&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Transit_PRD: 192.168.21.5&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Transit_DEV: 192.168.22.5&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;Configuração do Azure VMware Solution&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Na configuração &lt;STRONG&gt;Internet connectivity (egress/ingress) &lt;/STRONG&gt;do &lt;STRONG&gt;Azure VMware Solution (AVS) &lt;/STRONG&gt;irei utilizar a opção &lt;STRONG&gt;"Connect using Public IP down to the NSX Edge"&lt;/STRONG&gt;. Isso permite usar o NSX Data Center para criar regras de &lt;STRONG&gt;outbound e inbound&lt;/STRONG&gt; (DNAT/SNAT) usando esses IPs públicos diretamente no Edge do AVS.&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Configuração de SNAT e NoSnat no NSX&lt;/STRONG&gt;&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Regras “No SNAT”&lt;/STRONG&gt; : Define que não deve haver tradução de origem quando o tráfego vai para redes privadas RFC1918. Isso preserva o IP original de origem para comunicação interna (ex.: on-prem, Azure, spoke VNets/rotas privadas), evita quebra de roteamento/retorno.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Regra “SNAT”&lt;/STRONG&gt;: Aplica tradução de origem para o restante do tráfego (Internet). Ou seja, quando uma VM com IP privado sai para fora, o NSX troca o IP de origem pelo IP público configurado ( 20.20.138.0/32).&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Criação dos Gateways TIER-1 (PRD e DEV).&lt;/STRONG&gt;&lt;/H4&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&amp;nbsp;&lt;/H5&gt;
&lt;H5&gt;&amp;nbsp;&lt;/H5&gt;
&lt;H5&gt;&lt;STRONG&gt;Importante: Estes gateway são "Isolados", portando não serão conectados ao TIER-0&lt;/STRONG&gt;&lt;/H5&gt;
&lt;H5&gt;T1_PRD_Isolado&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;T1_DEV_Isolado&lt;/H5&gt;
&lt;img /&gt;
&lt;H4&gt;Resultado&lt;/H4&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Criação dos Segmentos de Trânsito PRD e DEV&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Importante: Estes Segmentos estarão conectados ao Tier-1 Gateway PRD (T1_PRD_Isolado) e DEV ( T1_DEV_Isolado) respectivamente criados na etapa anterior&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;TRANSIT_PRD&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;TRANSIT_DEV&lt;/H5&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Criação do Segmento PRD WEB e DATA&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Importante: Estes Segmentos estarão conectados ao Tier-1 Gateway PRD (T1_PRD_isolado) e DEV ( T1_DEV_Isolado) respectivamente criados na etapa anterior&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;PRD_WEB&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;PRD_DATA&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;DEV_WEB&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;DEV_DATA&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;Visão Geral dos Segmentos&lt;/H5&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&amp;nbsp;&lt;/H4&gt;
&lt;H4&gt;&lt;STRONG&gt;Configuração de Rotas&lt;/STRONG&gt;&lt;/H4&gt;
&lt;H4&gt;&lt;STRONG&gt;Rotas no Gateway T1 Default&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;No Gateway T1 Default que está conectado ao T0 , irei configurar rotas para todos os segmentos com Next Hop ao ip da interface Outside do meu PFsense (192.168.30.5) .&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;obs: o nome do gateway T1 é diferente em cada AVS SDDC, no meu ambiente é "TNT13-T1"&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Informei o CIDR da Rede , neste caso é para o segmento TRANSIT_PRD&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Next Hop aqui é o ip da interface Outside do PFsense ( 192.168.30.5) , que está conectada diretamente a este GW T1.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Repeti os mesmos passos para todos os outros Segmentos, sempre com next hop para 192.168.30.5.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H4&gt;&amp;nbsp;&lt;/H4&gt;
&lt;H4&gt;&lt;STRONG&gt;Interfaces Firewall Pfsense&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Neste cenário o Firewall possui apenas &lt;STRONG&gt;três interfaces.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Deve ser configurada a rota default ( 0.0.0.0/0) para o gateway do Segmento Transit Outside ( 192.168.30.1)&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Interfaces do Pfsense&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Rotas no Gateways de Transito : T1_PRD_isolado&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Estarei criado uma rota default ( 0.0.0.0/0 ) , com next hop para a interface do Inside do PFsense (192.168.21.5 ) conectada ao Gateway T1 PRD. Devido a limitações do NSX, é necessário "quebrar" em duas:&amp;nbsp; 0.0.0.0/1 e 128.0.0.1/1&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Configuração da Rodas default&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Next Hop para ip da Interface Inside PFsense.&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Rotas no Gateways de Transito : T1_DEV_Isolado&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Estarei criado uma rota default ( 0.0.0.0/0 ) , com next hop para a interface do Inside do PFsense (192.168.22.5 ) conectada ao Gateway T1 PRD. Devido a limitações do NSX, é necessário "quebrar" em duas:&amp;nbsp; 0.0.0.0/1 e 128.0.0.1/1&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Configuração da Rodas default&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Next Hop para ip da Interface Inside PFsense.&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Teste de Acesso&lt;/STRONG&gt;&lt;/H4&gt;
&lt;H5&gt;&lt;STRONG&gt;Tráfego Norte-Sul ( Saída Internet)&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;Para comprovar que conseguimos agora ter o tráfego Norte-Sul, pelo NVA PFense , irei fazer um teste a partir da máquina no segmento PRD_WEB , com ip 192.168.70.1&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;É possivel observar que o ip públlico de saída é do AVS&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Agora vou criar uma regra no Pfsense bloqueando a porta 443 , mas deixando liberada as outras portas.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Podemos comprovar que o tráfego está sendo inspersionado fazendo um teste de conexão na porta 53 e outro teste https.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;No Pfsense podemos ver o bloqueio&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;&lt;STRONG&gt;Tráfego Leste-Oeste&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;Para testar o tráfego leste oeste entre os Segmentos PRD_WEB ( VM 192.168.70.10 )&amp;nbsp; e DEV_WEB&amp;nbsp; ( VM 192.168.80.10) , irei deixar ICMP liberado e bloquear a porta 3389 ( RDP)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Fazendo o teste a partir da máquina 192.168.70.10&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Verificando no PFsense o &lt;STRONG&gt;bloqueio da porta 3389&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Resumo&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Neste laboratório demonstrei como integrar uma NVA ao Azure VMware Solution usando NSX-T com Tier-0/Tier-1, criando T1s isolados para DEV e PRD, segments de trânsito e a configuração de SNAT/NoSNAT no NSX para controlar o egress. Também mostrei o ajuste de rotas&amp;nbsp; para garantir que o tráfego siga pelo caminho de inspeção no firewall. Validei a arquitetura com testes práticos de tráfego Norte-Sul (saída para Internet com IP público do AVS) e Leste-Oeste (controle entre DEV e PRD), comprovando a inspeção via logs e bloqueios aplicados no pfSense. Como próximos passos para produção, recomenda-se padronizar regras, logging, e revisar resiliência/HA do firewall e rotas para reduzir pontos únicos de falha.&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Referências&lt;/STRONG&gt;&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/blog/azuremigrationblog/firewall-integration-in-azure-vmware-solution/2254961" target="_blank" rel="noopener"&gt;Firewall integration in Azure VMware Solution | Microsoft Community Hub&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.youtube.com/watch?v=ycbZmdI9TMQ&amp;amp;t=4s" target="_blank" rel="noopener"&gt;AVS How-to: 3rd Party Firewalls in Azure VMware Solution&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Wed, 11 Mar 2026 14:50:40 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/seguran%C3%A7a-corporativa-no-azure-vmware-solution-avs-como/ba-p/4501226</guid>
      <dc:creator>LeandroBarbosa</dc:creator>
      <dc:date>2026-03-11T14:50:40Z</dc:date>
    </item>
    <item>
      <title>Anonimização de Dados Sensíveis com a plataforma de IA do Azure</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anonimiza%C3%A7%C3%A3o-de-dados-sens%C3%ADveis-com-a-plataforma-de-ia-do-azure/ba-p/4481313</link>
      <description>&lt;P&gt;A&amp;nbsp;&lt;A href="https://www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/l13709.htm" target="_blank" rel="noopener"&gt;Lei Geral de Proteção de Dados (LGPD)&lt;/A&gt; estabelece padrões rigorosos para o tratamento de dados pessoais e sensíveis no Brasil. Dados pessoais incluem informações que identificam diretamente um indivíduo, como nome, endereço, telefone, CPF, RG e data de nascimento. Já os dados sensíveis abrangem categorias especiais, como origem racial ou étnica, crenças religiosas, opiniões políticas, dados de saúde ou genéticos, biometria, orientação sexual e filiação sindical. Esses dados exigem cuidados adicionais, pois impactam diretamente a privacidade e os direitos dos titulares.&lt;/P&gt;
&lt;P&gt;No contexto do processamento e compartilhamento de documentos — especialmente em setores como o público e o médico — é essencial reconhecer e classificar corretamente esses tipos de dados. Documentos oficiais ou registros de saúde frequentemente contêm tanto informações pessoais quanto dados altamente sensíveis, tornando a anonimização uma necessidade prática além de uma exigência legal.&lt;/P&gt;
&lt;H2 id="proposta-de-arquitetura"&gt;Proposta de Arquitetura&lt;/H2&gt;
&lt;P&gt;Para atender à demanda de anonimização de dados sensíveis em documentos, soluções modernas de inteligência artificial, como Azure Document Intelligence e Azure Language Service, oferecem capacidade para detectar e classificar automaticamente informações pessoais. Esses serviços aceleram o processo de proteção de dados, mas seus modelos genéricos podem não abranger totalmente todas as categorias previstas pela LGPD — especialmente aquelas mais complexas ou dependentes de contexto, como opiniões políticas, crenças religiosas ou informações específicas de saúde.&lt;/P&gt;
&lt;P&gt;Um caso simbólico pode ilustrar esse cenário: imagine uma plataforma responsável pelo armazenamento e compartilhamento de documentos administrativos. Para garantir que conteúdos sensíveis possam ser divulgados sem violar a privacidade das pessoas citadas, é possível implementar uma solução de anonimização baseada em IA. Ao utilizar modelos genéricos dos serviços de linguagem do Azure, conseguimos cobrir aproximadamente metade das classes previstas na LGPD, mas essas já abrangem a maior parte das classes determinísticas da legislação.&lt;/P&gt;
&lt;P&gt;Abaixo, a arquitetura sugerida é detalhada de forma segmentada:&lt;/P&gt;
&lt;img /&gt;
&lt;H3 id="-azure-document-intelligence-https-learn-microsoft-com-azure-ai-services-document-intelligence-"&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/document-intelligence/" target="_blank" rel="noopener"&gt;Azure Document Intelligence&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;O Azure Document Intelligence compõe a primeira camada do processamento, responsável por extrair texto, estrutura e coordenadas dos elementos presentes nos documentos — como tabelas, formulários, assinaturas e marcações visuais. Essa leitura estrutural permite compreender não apenas o que está escrito, mas onde cada informação se encontra.&lt;/P&gt;
&lt;P&gt;A escolha por esse serviço se deve à sua capacidade de fornecer OCR avançado, interpretar layouts complexos e identificar elementos adicionais, como códigos de barras e QR Codes, que muitas vezes carregam metadados sensíveis. Esse mapeamento preciso é essencial para aplicar anonimização diretamente nas regiões corretas, preservando a integridade visual do documento.&lt;/P&gt;
&lt;H3 id="-azure-language-service-pii-e-classifica-o-https-learn-microsoft-com-azure-ai-services-language-service-"&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/language-service/" target="_blank" rel="noopener"&gt;Azure Language Service — PII e Classificação&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;Nesta segunda etapa, o Azure Language Service é utilizado para identificar automaticamente informações pessoalmente identificáveis (PII), como nomes, endereços, dados de contato e números de documentos. O modelo analisa o conteúdo com foco semântico, classificando entidades conforme categorias previstas na LGPD.&lt;/P&gt;
&lt;P&gt;A motivação para empregá-lo está em sua capacidade de fornecer uma base abrangente e pronta para uso, permitindo detectar rapidamente grande parte dos dados sensíveis encontrados em documentos reais. Isso reduz a necessidade de regras manuais e acelera o processo de anonimização.&lt;/P&gt;
&lt;H3 id="-azure-language-service-modelos-personalizados-custom-ner-https-learn-microsoft-com-azure-ai-services-language-service-named-entity-recognition-"&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/ai-services/language-service/named-entity-recognition/overview" target="_blank" rel="noopener"&gt;Azure Language Service — Modelos Personalizados (Custom NER)&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;Embora os modelos genéricos atendam a boa parte dos cenários, documentos reais costumam conter entidades específicas do domínio — expressões próprias da instituição, cargos incomuns, nomes de sistemas internos, termos de contexto ou siglas não previstas pelo modelo padrão.&lt;/P&gt;
&lt;P&gt;Para suprir essas lacunas, são usados modelos personalizados de Reconhecimento de Entidades Nomeadas (NER). Eles permitem treinar novas categorias sensíveis e adaptar o processamento à realidade da organização. A motivação principal é reduzir falsos positivos/negativos e garantir maior precisão nos casos de uso mais complexos.&lt;/P&gt;
&lt;H3 id="-azure-computer-vision-https-learn-microsoft-com-azure-cognitive-services-computer-vision-"&gt;&lt;A href="https://learn.microsoft.com/azure/cognitive-services/computer-vision/" target="_blank" rel="noopener"&gt;Azure Computer Vision&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;Quando documentos incluem imagens, fotografias ou capturas de telas, a anonimização precisa ir além do texto. O Azure Computer Vision é utilizado para detectar rostos e outras características visuais que possam identificar indivíduos.&lt;/P&gt;
&lt;P&gt;Sua inclusão no processamento permite aplicar desfocagem ou mascaramento diretamente nos elementos encontrados, garantindo proteção também em conteúdo multimídia. Isso se torna especialmente relevante em documentos digitalizados que podem conter retratos, crachás, assinaturas digitalizadas ou imagens que exponham a identidade de terceiros.&lt;/P&gt;
&lt;H3 id="orchestrator-python-l-gica-de-anonimiza-o-baseada-em-coordenadas"&gt;Orchestrator Python — Lógica de Anonimização Baseada em Coordenadas&lt;/H3&gt;
&lt;P&gt;A última camada da solução é desenvolvida em Python, responsável por orquestrar os serviços de IA e aplicar a anonimização final no documento. Com base nas coordenadas extraídas pelo Document Intelligence e nas entidades classificadas pelo Language Service, o componente Redaction realiza o mascaramento diretamente sobre a área correspondente.&lt;/P&gt;
&lt;P&gt;A escolha pelo Python se justifica pela sua flexibilidade, ampla disponibilidade de bibliotecas para manipulação de PDFs e imagens, e facilidade para integrar diferentes serviços do Azure em um único fluxo. Além disso, permite criar filtros adicionais — como evitar mascarar nomes de organizações ou estruturas fixas — garantindo precisão e consistência no resultado final.&lt;/P&gt;
&lt;H2 id="recomenda-es"&gt;Recomendações&lt;/H2&gt;
&lt;P&gt;Veja o repositório de uma demonstração simplificada com arquivos fictícios: &lt;A href="https://github.com/anaritakrs/document-anonymization" target="_blank" rel="noopener"&gt;Repo&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Se você deseja implantar essa solução, pode utilizar o código disponível no repositório e adaptá-lo aos seus filtros e regras específicas. A estratégia recomendada é empacotar a aplicação em contêineres para facilitar a escalabilidade e a integração com diferentes ambientes.&lt;/P&gt;
&lt;P&gt;Além disso, é possível consumir os serviços do Azure diretamente via APIs, garantindo flexibilidade na arquitetura e integração com outras aplicações. Todas essas informações, incluindo exemplos e orientações detalhadas, estão disponíveis na documentação oficial dos serviços Azure.&lt;/P&gt;
&lt;P&gt;Essa abordagem integrada garante que documentos públicos possam ser compartilhados de forma segura, respeitando a legislação e protegendo a privacidade das pessoas. A evolução para modelos personalizados representa um salto importante, permitindo identificar e anonimizar dados que hoje passam despercebidos pelos modelos padrão, elevando o nível de conformidade e confiança no tratamento de dados sensíveis.&lt;/P&gt;
&lt;H2 id="agradecimentos"&gt;Agradecimentos&lt;/H2&gt;
&lt;P&gt;Agradeço especialmente ao Gilberto Santos, meu colega Cloud Solution Architect &lt;A href="https://www.linkedin.com/in/gilbertossoares/" target="_blank" rel="noopener"&gt;Linkedin&lt;/A&gt;, pela generosidade em compartilhar sua expertise sobre os serviços do Azure e pelo apoio essencial no desenvolvimento desta arquitetura.&lt;/P&gt;
&lt;P&gt;Também registro meu agradecimento ao Alexandre Teoi, Cloud Solution Architect &lt;A href="https://www.linkedin.com/in/ateoi/" target="_blank" rel="noopener"&gt;Linkedin&lt;/A&gt;, pela revisão criteriosa e pelas contribuições valiosas para o aprimoramento deste artigo.&lt;/P&gt;</description>
      <pubDate>Fri, 26 Dec 2025 17:51:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anonimiza%C3%A7%C3%A3o-de-dados-sens%C3%ADveis-com-a-plataforma-de-ia-do-azure/ba-p/4481313</guid>
      <dc:creator>anaritak</dc:creator>
      <dc:date>2025-12-26T17:51:22Z</dc:date>
    </item>
    <item>
      <title>Protegendo Máquinas no Azure VMware Solution com Azure Firewall</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/protegendo-m%C3%A1quinas-no-azure-vmware-solution-com-azure-firewall/ba-p/4462359</link>
      <description>&lt;P&gt;O&amp;nbsp; Azure VMware Solution oferece três opções principais de conectividade &lt;STRONG&gt;outbound para a Internet&lt;/STRONG&gt;.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A primeira é o &lt;STRONG&gt;Managed SNAT&lt;/STRONG&gt;, opção padrão e totalmente gerenciada pela plataforma, em que o próprio AVS realiza a tradução de endereços (SNAT) para permitir o acesso à Internet. Essa abordagem é simples e não requer configuração adicional, porém não oferece controle sobre os endereços IP públicos utilizados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A segunda opção é o uso de &lt;STRONG&gt;Public IPs no NSX-T Edge&lt;/STRONG&gt;, onde o administrador atribui endereços públicos diretamente ao edge do ambiente AVS. Com isso, o tráfego de saída das máquinas virtuais utiliza esses IPs específicos, permitindo maior controle, ideal para cenários em que é necessário manter IPs fixos ou previamente autorizados em listas de acesso externas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Por fim, há a opção de &lt;STRONG&gt;rotear o tráfego via rede Azure&lt;/STRONG&gt; (ou Azure Virtual WAN), em que uma rota padrão é anunciada por meio do ExpressRoute, direcionando o tráfego de saída para uma rede Azure que contém NVAs, Azure Firewall ou proxies. Essa abordagem oferece o maior nível de controle e segurança, pois permite aplicar inspeção, políticas e NAT centralizados, de forma integrada à arquitetura de rede do cliente.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Neste artigo será demonstrado em um ambiente de laboratório como utilizar o &lt;STRONG&gt;Virtual Wan com Azure Firewall &lt;/STRONG&gt;para inspeção do tráfego de saída das Vms em um &lt;STRONG&gt;segmento do AVS&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;A arquitetura do laboratório.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Virtual Wan com Azure Firewall&lt;/LI&gt;
&lt;LI&gt;ER Gateway conectado ao Express Route do Azure VMware Solution&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Os passos necessários são:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Configuração da opção de Internet Connectivity do AVS&lt;/LI&gt;
&lt;LI&gt;Habilitar a propagação da Rota no Vwan&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Configuração do Routing Intent&lt;/LI&gt;
&lt;/OL&gt;
&lt;H4&gt;Configuração do Azure VMware Solution.&lt;/H4&gt;
&lt;P&gt;Acesse o Private Cloud no portal do Azure e certifique que a opção abaixo esteja selecionada.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Fazendo um "dump" das rotas no T0 do NSX, é possível verificar que não temos a rota default sendo propagada.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Portanto não temos conectividade para internet a partir da máquina VM1 que está no AVS.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&amp;nbsp;&lt;/H2&gt;
&lt;H2&gt;&amp;nbsp;&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Habilitando a propagação da Rota default no Virtual Wan&lt;/H4&gt;
&lt;P&gt;Devemos agora habilitar a propagação da rota default pelo Virtual Wan , e para isso é necessário editar a conexão do Express Route do AVS, conectado ao Hub do Vwan .&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Habilite a propagação da Rota default&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&amp;nbsp;Routing Intent&lt;/H4&gt;
&lt;P&gt;O &lt;STRONG&gt;Routing Intent&lt;/STRONG&gt; no &lt;STRONG&gt;Azure Virtual WAN&lt;/STRONG&gt; é um recurso que &lt;STRONG&gt;simplifica e automatiza o roteamento de tráfego&lt;/STRONG&gt; dentro do hub do Virtual WAN. Ele define &lt;STRONG&gt;como o tráfego entre redes (VNets, branches, e Internet)&lt;/STRONG&gt; deve ser direcionado, sem necessidade de configurar manualmente tabelas de rotas complexas&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Observação:&lt;/STRONG&gt; Em geral, no Brasil, caso já exista um Express Route On-premises, o Routing Intent já deve estar ativado para permitir o tráfego na comunicação com o Express Route do AVS, devido a não disponibilidade na região do Brasil do Express Route Global Reach&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Nas configurações do HUB, habilite o &lt;STRONG&gt;Routing Intent.&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Fazendo um novo "dump"das rotas BGP no NSX, agora é possível observar a rota default sendo propagada.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Testando a partir da VM no AVS&lt;/H4&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Conforme esperado é o mesmo IP público do meu Firewall no Vwan&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Nos Logs do Azure Firewall, comprovamos que o tráfego da VM (10.145.0.10) realmente está passando pelo Azure Firewall&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Referências: &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/azure-vmware/disable-internet-access" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/azure-vmware/disable-internet-access&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Oct 2025 20:49:10 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/protegendo-m%C3%A1quinas-no-azure-vmware-solution-com-azure-firewall/ba-p/4462359</guid>
      <dc:creator>LeandroBarbosa</dc:creator>
      <dc:date>2025-10-17T20:49:10Z</dc:date>
    </item>
    <item>
      <title>Alta Disponibilidade e Resiliência com App Gateway e Múltiplos APIMs: Uma Arquitetura Estratégica</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/alta-disponibilidade-e-resili%C3%AAncia-com-app-gateway-e-m%C3%BAltiplos/ba-p/4451312</link>
      <description>&lt;H2 data-selectable-paragraph=""&gt;Resiliência como Pilar do Azure Well-Architected Framework&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;A&amp;nbsp;&lt;STRONG&gt;resiliência&lt;/STRONG&gt;&amp;nbsp;é um dos pilares fundamentais do&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/architecture/framework/" target="_blank" rel="noopener"&gt;WAF&lt;/A&gt;&amp;nbsp;e desempenha papel crítico na construção de arquiteturas modernas em nuvem. Este artigo explora o design de&amp;nbsp;&lt;STRONG&gt;alta disponibilidade (HA)&lt;/STRONG&gt;&amp;nbsp;utilizando a oferta&amp;nbsp;&lt;STRONG&gt;Premium Tier do Azure API Management (APIM)&lt;/STRONG&gt;&amp;nbsp;em cenários&amp;nbsp;&lt;STRONG&gt;multi-região&lt;/STRONG&gt;&amp;nbsp;ou mesmo&amp;nbsp;&lt;STRONG&gt;intra-região&lt;/STRONG&gt;, com foco na aplicação de&amp;nbsp;&lt;STRONG&gt;Availability Zones&lt;/STRONG&gt;&amp;nbsp;— uma prática recomendada no&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/principles" target="_blank" rel="noopener"&gt;pilar de Confiabilidade&lt;/A&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A configuração Premium permite que as regiões primária e secundária compartilhem a mesma instância de APIM. No entanto, dependendo dos requisitos de negócio e tolerância a falhas, pode ser estratégico operar com&amp;nbsp;&lt;STRONG&gt;duas instâncias separadas&lt;/STRONG&gt;, garantindo&amp;nbsp;&lt;STRONG&gt;continuidade de serviço mesmo diante de falhas regionais ou em uma das instâncias&lt;/STRONG&gt;. Essa abordagem está alinhada ao modelo de&amp;nbsp;&lt;STRONG&gt;DR Ativo-Ativo&lt;/STRONG&gt;, promovendo&amp;nbsp;&lt;STRONG&gt;tolerância a falhas&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;escalabilidade horizontal&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;resiliência operacional&lt;/STRONG&gt;, conforme descrito no&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/maturity-model" target="_blank" rel="noopener"&gt;modelo de maturidade de confiabilidade&lt;/A&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A imagem acima representa os componentes do APIM nas regiões primária e secundária. Em cenários com instâncias separadas, esses componentes também estariam presentes em cada região. Já em uma configuração com Availability Zones, os elementos podem escalar dentro da mesma região, conforme a demanda — prática que também se conecta ao pilar de&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/operational-excellence/" target="_blank" rel="noopener"&gt;excelência operacional&lt;/A&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/operational-excellence/overview," target="_blank" rel="noopener"&gt;,&lt;/A&gt;&amp;nbsp;ao permitir automação e monitoramento contínuo.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O fluxo de comunicação entre a API e os serviços de backend pode ocorrer por rotas diretas ou por meio de&amp;nbsp;&lt;STRONG&gt;balanceadores de carga&lt;/STRONG&gt;, dependendo do caso de uso. Essa arquitetura inspirou uma&amp;nbsp;&lt;STRONG&gt;solução personalizada&lt;/STRONG&gt;&amp;nbsp;para um de nossos clientes, que buscava&amp;nbsp;&lt;STRONG&gt;alta disponibilidade com baixa latência&lt;/STRONG&gt;, mesmo em cenários de falha regional.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Configuração do APIM como gateway de saída para o cluster de aplicações&lt;/H3&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-selectable-paragraph=""&gt;Em alguns casos, por questões de compliance, não é possível operar fora de um regions específica . Ainda assim, essa arquitetura já proporciona ganhos significativos mesmo dentro da mesma região, como maior resiliência, escalabilidade e eficiência operacional.&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Visão Geral da Arquitetura&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Componentes principais:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Usuário&lt;/STRONG&gt;: Inicia a requisição.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;WAF&lt;/STRONG&gt;: Protege contra ameaças e ataques na borda.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;AKS&lt;/STRONG&gt;: Gerencia APIs e aplicações containerizadas.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;App Gateway (AppGW)&lt;/STRONG&gt;: Roteia o tráfego para os APIMs.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;APIM001 e APIM002&lt;/STRONG&gt;: Instâncias do Azure API Management, com IPs distintos e potencialmente em regiões diferentes.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Sistemas legados (kubernets / VMS)&lt;/STRONG&gt;: Integração com sistemas on-premises.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Essa arquitetura é interessante, pois, neste caso de uso, o APIM atua como ponto de saída do cluster de aplicações — exatamente o caminho crítico que queremos proteger&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Com duas instâncias de APIM atrás do AppGW, é possível:&lt;/H3&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Realizar&amp;nbsp;&lt;STRONG&gt;manutenções planejadas&lt;/STRONG&gt;&amp;nbsp;em uma instância sem impactar os usuários.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Redirecionar o tráfego automaticamente para a instância saudável.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Garantir&amp;nbsp;&lt;STRONG&gt;zero downtime&lt;/STRONG&gt;, mesmo durante atualizações críticas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Essa abordagem é especialmente útil em ambientes com alta exigência de SLA, como bancos, governo e telecom.&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Testes Blue-Green com Segurança e Controle&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;A arquitetura permite implementar&amp;nbsp;&lt;STRONG&gt;estratégias Blue-Green&lt;/STRONG&gt;&amp;nbsp;com facilidade:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Uma instância do APIM pode representar o ambiente “Blue” (produção atual).&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;A outra instância representa o ambiente “Green” (nova versão).&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;O AppGW pode direcionar parte do tráfego para o ambiente Green para testes controlados.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após validação, o tráfego pode ser totalmente migrado para o Green, promovendo a nova versão com segurança.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Isso reduz riscos de regressão e permite&amp;nbsp;&lt;STRONG&gt;deploys mais confiáveis&lt;/STRONG&gt;&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Redução de Riscos em Caminhos Críticos&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Ao distribuir o tráfego entre dois APIMs:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Reduz-se o risco de&amp;nbsp;&lt;STRONG&gt;ponto único de falha&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;A arquitetura se torna mais resiliente a falhas regionais ou de serviço.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Em caso de falha de uma instância, o AppGW garante continuidade do serviço.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Essa redundância é essencial para&amp;nbsp;&lt;STRONG&gt;caminhos críticos de negócio&lt;/STRONG&gt;, como autenticação, transações financeiras ou integrações com sistemas legados.&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Outros Benefícios Estratégicos&lt;/H2&gt;
&lt;H2 data-selectable-paragraph=""&gt;✅ Disaster Recovery Ativo-Ativo&lt;/H2&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;As duas instâncias do APIM funcionam simultaneamente em modo &lt;STRONG data-start="225" data-end="240"&gt;ativo-ativo&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Em caso de falha em uma das instâncias, o tráfego é &lt;STRONG data-start="298" data-end="331"&gt;automaticamente redirecionado&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Reduz significativamente o &lt;STRONG data-start="364" data-end="371"&gt;RTO&lt;/STRONG&gt; e assegura a &lt;STRONG data-start="385" data-end="414"&gt;continuidade dos serviços&lt;/STRONG&gt;..&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;✅ Mitigação de Esgotamento de IPs&lt;/H2&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;O uso de múltiplas instâncias permite &lt;STRONG data-start="504" data-end="535"&gt;distribuir o consumo de IPs&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Evita &lt;STRONG data-start="547" data-end="567"&gt;gargalos de rede&lt;/STRONG&gt; e problemas de &lt;STRONG data-start="583" data-end="608"&gt;limitação de recursos&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;✅ Escalabilidade Regional&lt;/H2&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;A arquitetura possibilita &lt;STRONG data-start="678" data-end="720"&gt;escalabilidade horizontal simplificada&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Suporta o crescimento de demanda em &lt;STRONG data-start="762" data-end="784"&gt;diferentes regiões&lt;/STRONG&gt; de forma eficiente.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;Como configurar o APPGW para uma POC de balanceamento entre dois APIMs&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;O&amp;nbsp;&lt;STRONG&gt;Azure Application Gateway&lt;/STRONG&gt;&amp;nbsp;é um balanceador de carga de&amp;nbsp;&lt;STRONG&gt;camada 7 (HTTP/HTTPS)&lt;/STRONG&gt;&amp;nbsp;que permite gerenciar o tráfego de aplicações web com&amp;nbsp;&lt;STRONG&gt;inteligência, segurança e escalabilidade&lt;/STRONG&gt;. Ele opera com base em um conjunto de configurações como Listeners, Routing Rules, Backend Targets entre outras.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Além disso, o Application Gateway oferece recursos avançados como&amp;nbsp;&lt;STRONG&gt;WAF (Web Application Firewall)&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;SSL offloading&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;redirecionamento baseado em caminho&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;afinidade de sessão&lt;/STRONG&gt;, tornando-o ideal para cenários que exigem alta disponibilidade e proteção contra ameaças web.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;📦 Descrição de cada componente do diagrama&lt;/H2&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Listener (porta 80):&lt;/STRONG&gt;&amp;nbsp;Detecta conexões de entrada na porta especificada (ex: 80 para HTTP). É o ponto inicial onde o tráfego chega ao gateway.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Routing Rule:&lt;/STRONG&gt;&amp;nbsp;Define como o tráfego será roteado com base em critérios como URL, cabeçalhos ou métodos. É o cérebro da decisão de encaminhamento.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Backend Targets:&lt;/STRONG&gt;&amp;nbsp;Especifica os destinos finais para o tráfego, como VMs, instâncias de App Service ou containers. 🔁 Relação com Backend Pools:&amp;nbsp;&lt;STRONG&gt;1 para N&lt;/STRONG&gt;&amp;nbsp;— uma regra pode apontar para vários destinos.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Backend Setting:&lt;/STRONG&gt;&amp;nbsp;Configurações aplicadas ao tráfego, como tempo de timeout, protocolo (HTTP/HTTPS), e afinidade de sessão. 🔁 Relação com Health Probes:&amp;nbsp;&lt;STRONG&gt;1 para 1&lt;/STRONG&gt;&amp;nbsp;— cada configuração tem uma sonda associada.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Backend Pools:&lt;/STRONG&gt;&amp;nbsp;Agrupamento lógico dos destinos (targets). Permite distribuir carga entre múltiplas instâncias. 🔁 Relação com Backend Targets:&amp;nbsp;&lt;STRONG&gt;1 para N&lt;/STRONG&gt;&amp;nbsp;— um pool pode conter vários destinos.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Health Probes (path:/status-0123456789abcdef)&lt;/STRONG&gt;&lt;BR /&gt;Verifica a saúde dos destinos usando um caminho específico. Se um destino estiver inativo, ele é automaticamente removido do balanceador.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 data-selectable-paragraph=""&gt;Vamos apresentar algumas telas de configuração e destacar pontos de atenção no&amp;nbsp;&lt;STRONG&gt;Application Gateway (AppGW)&lt;/STRONG&gt;.&lt;/H3&gt;
&lt;P data-selectable-paragraph=""&gt;Um detalhe importante que acabei não mencionando:&amp;nbsp;&lt;STRONG&gt;à frente do Listener existe uma configuração de Frontend IP&lt;/STRONG&gt;, que define se o IP do AppGW será&amp;nbsp;&lt;STRONG&gt;público ou privado&lt;/STRONG&gt;. Para facilitar os testes iniciais, recomendo começar com o&amp;nbsp;&lt;STRONG&gt;Frontend IP público&lt;/STRONG&gt;,alem disso mantenha o Listener configurado na porta 80. Isso evita complicações com certificados SSL durante os testes.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Observe a imagem abaixo:&lt;/STRONG&gt;&amp;nbsp;o&amp;nbsp;&lt;STRONG&gt;Frontend IP&lt;/STRONG&gt;&amp;nbsp;está corretamente vinculado ao&amp;nbsp;&lt;STRONG&gt;Listener1&lt;/STRONG&gt;, como indicado. Essa associação é essencial para garantir que o tráfego seja direcionado corretamente, conforme a configuração do IP público ou privado definida no Frontend.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O&amp;nbsp;&lt;STRONG&gt;Listener1&lt;/STRONG&gt;, configurado na&amp;nbsp;&lt;STRONG&gt;porta 80&lt;/STRONG&gt;, está associado à&amp;nbsp;&lt;STRONG&gt;Rule1&lt;/STRONG&gt;, que define como o tráfego será roteado para o backend correspondente.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A&amp;nbsp;&lt;STRONG&gt;Rule1&lt;/STRONG&gt;&amp;nbsp;está associada às configurações de&amp;nbsp;&lt;STRONG&gt;Backend Settings&lt;/STRONG&gt;, que definem como o tráfego será encaminhado para os recursos de backend — incluindo o pool de servidores, o protocolo, a porta e os critérios de saúde.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;As&amp;nbsp;&lt;STRONG&gt;Backend Settings&lt;/STRONG&gt;&amp;nbsp;do Application Gateway incluem configurações importantes, como&amp;nbsp;&lt;STRONG&gt;“Pick host name from backend target”&lt;/STRONG&gt;&amp;nbsp;e a associação a um&amp;nbsp;&lt;STRONG&gt;Custom Probe&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Por padrão, o AppGW encaminha ao backend o mesmo cabeçalho HTTP&amp;nbsp;Host&amp;nbsp;recebido do cliente. No entanto, se o serviço ou aplicação no backend exigir um valor específico para o cabeçalho&amp;nbsp;Host, é possível sobrescrevê-lo utilizando essa configuração. Com isso, o Application Gateway passa a usar o&amp;nbsp;&lt;STRONG&gt;host do backend&lt;/STRONG&gt;&amp;nbsp;para resolver o balanceamento e validar o&amp;nbsp;&lt;STRONG&gt;probe de integridade&lt;/STRONG&gt;, garantindo compatibilidade com serviços que dependem de hostname específico para funcionar corretamente.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Perceba que o Health Probe também está vinculado às Backend Settings&lt;/STRONG&gt;, e utiliza a configuração&amp;nbsp;&lt;STRONG&gt;“Pick host name from backend settings”&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Essa associação é fundamental para garantir que o probe de integridade seja executado corretamente, especialmente em cenários onde o backend exige um cabeçalho&amp;nbsp;Host&amp;nbsp;específico. Ao ativar essa opção, o Application Gateway passa a usar o&amp;nbsp;&lt;STRONG&gt;hostname do backend&lt;/STRONG&gt;&amp;nbsp;tanto para o roteamento quanto para a validação do probe, assegurando compatibilidade com serviços que dependem dessa configuração.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Esse endereço /status-0123456789abcdef é o endereço de sondagem do apim (helth cehck) do APIM&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Voltando à Rule1&lt;/STRONG&gt;, podemos observar que ela também define o&amp;nbsp;&lt;STRONG&gt;Backend Target&lt;/STRONG&gt;, que neste caso aponta para o&amp;nbsp;&lt;STRONG&gt;serviço de backend do APIM (Azure API Management)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Essa configuração é essencial para garantir que o tráfego roteado pelo Application Gateway seja direcionado corretamente ao endpoint do APIM, respeitando as regras de roteamento, cabeçalhos e probes definidos nas Backend Settings.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Nos&amp;nbsp;&lt;STRONG&gt;Backend Pools&lt;/STRONG&gt;, temos o&amp;nbsp;&lt;STRONG&gt;pool de backend do APIM&lt;/STRONG&gt;, que contém&amp;nbsp;&lt;STRONG&gt;duas instâncias do serviço Azure API Management&lt;/STRONG&gt;. Essa configuração permite distribuir o tráfego entre as instâncias, garantindo alta disponibilidade e escalabilidade para os serviços expostos via AppGW.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Do lado do APIM&lt;/H3&gt;
&lt;P data-selectable-paragraph=""&gt;Para observar o processo de&amp;nbsp;&lt;STRONG&gt;balanceamento entre instâncias do APIM&lt;/STRONG&gt;&amp;nbsp;(por exemplo, APIM A e APIM B), podemos criar uma&amp;nbsp;&lt;STRONG&gt;API de mock&lt;/STRONG&gt;&amp;nbsp;que responda de forma simples, identificando qual instância está respondendo.&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Principais Objetos do APIM&lt;/H3&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Políticas&lt;/STRONG&gt;: São regras aplicadas às requisições HTTP, permitindo manipulações como transformação de payloads, controle de acesso, limitação de chamadas (rate limiting), entre outras.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;API&lt;/STRONG&gt;: Representa um conjunto de operações agrupadas sob um único endpoint. Cada API pode conter múltiplas operações.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Operações&lt;/STRONG&gt;: São as ações HTTP específicas, como os verbos&amp;nbsp;GET,&amp;nbsp;POST,&amp;nbsp;PUT,&amp;nbsp;DELETE, etc. Cada operação define o comportamento de uma rota dentro da API.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;Como criar um mock no Azure API Management (APIM)&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Adicionar uma nova API&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Acesse o menu lateral e clique em&amp;nbsp;&lt;STRONG&gt;“Add API”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Selecione a opção para&amp;nbsp;&lt;STRONG&gt;criar uma API manualmente&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Na caixa de diálogo exibida, preencha os dados necessários (nome, URL base, etc.).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;eu criei uma APIA, com sufixo apim&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Definir o response da operação&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Clique em “add operation” e preencha o verbo como get a url como /moq&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após criar a operação desejada, clique na aba&amp;nbsp;&lt;STRONG&gt;“Responses”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Clique em&amp;nbsp;&lt;STRONG&gt;“Add response”&lt;/STRONG&gt;&amp;nbsp;e selecione o código&amp;nbsp;&lt;STRONG&gt;200&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Em&amp;nbsp;&lt;STRONG&gt;Content type&lt;/STRONG&gt;, escolha&amp;nbsp;&lt;STRONG&gt;application/json&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;No campo&amp;nbsp;&lt;STRONG&gt;Sample&lt;/STRONG&gt;, insira um JSON de exemplo para identificar a instância, como:&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;JSON&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-selectable-paragraph=""&gt;{&lt;BR /&gt;"name": "APIMA"&lt;BR /&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Adicionar a política de mock&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Vá para a aba&amp;nbsp;&lt;STRONG&gt;“Design”&lt;/STRONG&gt;&amp;nbsp;da operação.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Na seção&amp;nbsp;&lt;STRONG&gt;Inbound processing&lt;/STRONG&gt;, clique em&amp;nbsp;&lt;STRONG&gt;“Add policy”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Selecione a política&amp;nbsp;&lt;STRONG&gt;“Mock response”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Verificação&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Após salvar, o pipeline da requisição exibirá uma&amp;nbsp;&lt;STRONG&gt;tarja amarela&lt;/STRONG&gt;, indicando que o mock está ativo.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Repita esse processo para a instância dois. Agora já podemos testar o balanceamento de carga pelo Application Gateway&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Sincronização das Instâncias com o API OPS&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Conforme mencionado no início deste artigo, a arquitetura “by the book” foi projetada para utilizar o recurso nativo de&amp;nbsp;&lt;STRONG&gt;multi-região do Azure API Management (APIM)&lt;/STRONG&gt;, o que elimina a necessidade de esforços adicionais para sincronizar configurações entre instâncias.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;No entanto, ao optarmos por manter&amp;nbsp;&lt;STRONG&gt;duas instâncias separadas na mesma região&lt;/STRONG&gt;, com o objetivo de obter os benefícios citados anteriormente, passamos a ter o desafio de&amp;nbsp;&lt;STRONG&gt;manter ambas sincronizadas&lt;/STRONG&gt;&amp;nbsp;— ou seja, com as mesmas APIs, endpoints e políticas.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Para atender a essa necessidade de sincronização, utilizaremos o&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/architecture/example-scenario/devops/automated-api-deployments-apiops" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;API Ops&lt;/STRONG&gt;&lt;/A&gt;, que automatiza o processo de publicação e atualização das configurações entre as instâncias, garantindo consistência e reduzindo o risco de divergências operacionais.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Resumo do Fluxo de API Ops para Sincronização com o APIM&lt;/H3&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Operadores de API&lt;/STRONG&gt;&amp;nbsp;executam o pipeline de extração para sincronizar o repositório Git com a instância do API Management, populando o repositório com os objetos no formato necessário.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Se houver alterações detectadas na instância do APIM, é criado um&amp;nbsp;&lt;STRONG&gt;Pull Request (PR)&lt;/STRONG&gt;&amp;nbsp;para revisão. Após aprovação, os operadores fazem o merge das mudanças no repositório.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Desenvolvedores de API&lt;/STRONG&gt;&amp;nbsp;clonam o repositório, criam uma branch e definem as APIs usando especificações OpenAPI ou ferramentas de sua preferência.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Quando um desenvolvedor envia alterações para o repositório, um novo PR é gerado para revisão.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;O PR pode ser&amp;nbsp;&lt;STRONG&gt;aprovado automaticamente&lt;/STRONG&gt;&amp;nbsp;ou&amp;nbsp;&lt;STRONG&gt;revisado manualmente&lt;/STRONG&gt;, conforme o nível de controle exigido.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após a aprovação e o merge, o&amp;nbsp;&lt;STRONG&gt;pipeline de publicação&lt;/STRONG&gt;&amp;nbsp;implanta as alterações na instância do API Management.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Os operadores também podem criar ou modificar políticas, diagnósticos, produtos e outros objetos relevantes, e então&amp;nbsp;&lt;STRONG&gt;comitar&lt;/STRONG&gt;&amp;nbsp;essas alterações.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após o merge, o pipeline publica as mudanças usando o processo de definição de APIs.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-selectable-paragraph=""&gt;Conclusão&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;A adoção de uma arquitetura com&amp;nbsp;&lt;STRONG&gt;App Gateway à frente de múltiplos APIMs&lt;/STRONG&gt;, integrada com&amp;nbsp;&lt;STRONG&gt;Akamai WAF&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;Azure Functions&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;Key Vault&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;sistemas legados&lt;/STRONG&gt;, oferece uma solução robusta, segura e altamente disponível. Essa abordagem não apenas melhora a experiência do usuário, mas também reduz riscos operacionais e facilita a evolução contínua da plataforma.&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Referencias&lt;/H3&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/" target="_blank" rel="noopener"&gt;Estrutura de Well-Architected do Azure — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/principles" target="_blank" rel="noopener"&gt;Princípios de design de confiabilidade — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/maturity-model?tabs=level1" target="_blank" rel="noopener"&gt;Modelo de maturidade de confiabilidade — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/operational-excellence/" target="_blank" rel="noopener"&gt;Links rápidos de excelência operacional — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/architecture/example-scenario/devops/automated-api-deployments-apiops" target="_blank" rel="noopener"&gt;Implantações de API automatizadas usando APIOps — Azure Architecture Center | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/OL&gt;</description>
      <pubDate>Tue, 09 Sep 2025 18:54:23 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/alta-disponibilidade-e-resili%C3%AAncia-com-app-gateway-e-m%C3%BAltiplos/ba-p/4451312</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2025-09-09T18:54:23Z</dc:date>
    </item>
    <item>
      <title>AKS - Problemas de desempenho do NGINX Ingress Controller Gerenciado</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aks-problemas-de-desempenho-do-nginx-ingress-controller/ba-p/4447419</link>
      <description>&lt;P&gt;O&amp;nbsp;&lt;A href="https://learn.microsoft.com/azure/aks/app-routing" target="_blank"&gt;NGINX ingress controller gerenciado&lt;/A&gt; é um complemento de roteamento que permite direcionar tráfego HTTP e HTTPS para aplicações executando em um cluster &lt;A href="https://learn.microsoft.com/azure/aks/" target="_blank"&gt;Azure Kubernetes Service (AKS)&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Em problemas relacionados à performance, o sistema de roteamento pode ser a causa raiz. Este artigo fornece um guia passo a passo para solucionar problemas de performance do NGINX ingress controller.&lt;/P&gt;
&lt;H2 id="pr-requisitos"&gt;Pré-requisitos&lt;/H2&gt;
&lt;P&gt;Antes de começar, certifique-se de ter as seguintes ferramentas instaladas:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Kubernetes CLI (&lt;CODE&gt;kubectl&lt;/CODE&gt;)&lt;/STRONG&gt;: Use o Azure CLI para instalar executando o comando &lt;CODE&gt;az aks install-cli&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="sintomas-comuns"&gt;Sintomas Comuns&lt;/H2&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Sintoma&lt;/th&gt;&lt;th&gt;Descrição&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Erros de Gateway HTTP&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Códigos de erro como 502, 504 podem indicar um problema de exaustão do NGINX.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Alta Diferença no Tempo de Resposta&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Diferença significativa entre o tempo de resposta do seu serviço e o tempo de resposta fim a fim. Existe uma latência comum adicionada pelo NGINX, mas quando é muito grande, pode indicar exaustão do NGINX.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2 id="passo-1-verifique-o-comportamento-do-hpa"&gt;Passo 1: Verifique o Comportamento do HPA&lt;/H2&gt;
&lt;P&gt;A razão mais comum para problemas de performance no NGINX é exaustão de CPU. Durante picos de carga no sistema, uma boa abordagem é observar o comportamento do &lt;A href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/" target="_blank"&gt;HPA&lt;/A&gt;. Por padrão, o plugin de roteamento cria um &lt;A href="https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" target="_blank"&gt;namespace&lt;/A&gt; chamado &lt;CODE&gt;app-routing-system&lt;/CODE&gt;.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Obtenha o nome do HPA&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;get&lt;/SPAN&gt; hpa -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Observe o comportamento do HPA&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;get&lt;/SPAN&gt; hpa &lt;SPAN class="hljs-symbol"&gt;&amp;lt;HPA_NAME&amp;gt;&lt;/SPAN&gt; -n app-routing-&lt;SPAN class="hljs-built_in"&gt;system&lt;/SPAN&gt; -&lt;SPAN class="hljs-keyword"&gt;w&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Avalie o resultado&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; $ kubectl get hpa &amp;lt;HPA_NAME&amp;gt; -n app-routing-system -w&lt;BR /&gt;
 NAME    REFERENCE          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
 nginx   Deployment/nginx   cpu: 83%/70%  &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;         77m
 nginx   Deployment/nginx   cpu: 83%/70%  &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;         77m
 nginx   Deployment/nginx   cpu: 106%/70%       &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;         79m
 nginx   Deployment/nginx   cpu: 133%/70%       &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;         80m
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;A coluna &lt;STRONG&gt;TARGETS&lt;/STRONG&gt; mostra o limite de CPU onde o &lt;CODE&gt;HPA&lt;/CODE&gt; irá acionar o aumento de replicas. Você deve interpretar esse comportamento. Existem algumas possibilidades:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;O &lt;CODE&gt;HPA&lt;/CODE&gt; atingiu o número máximo de pods.&lt;/LI&gt;
&lt;LI&gt;Não há &lt;A href="https://kubernetes.io/docs/concepts/architecture/nodes" target="_blank"&gt;nodes&lt;/A&gt; disponíveis para agendar os pods.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="passo-2-procure-por-pods-em-estado-pending"&gt;Passo 2: Procure por Pods em Estado Pending&lt;/H2&gt;
&lt;P&gt;Se no passo anterior você viu que o &lt;CODE&gt;NGINX HPA&lt;/CODE&gt; não atingiu o número máximo de pods, o &lt;A href="https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/#kube-scheduler" target="_blank"&gt;kube-scheduler&lt;/A&gt; pode estar tendo dificuldades para encontrar nodes disponíveis para agendar os pods do &lt;CODE&gt;NGINX&lt;/CODE&gt;.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Obtenha Pods em Pending&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-meta"&gt;get&lt;/SPAN&gt; pod --&lt;SPAN class="hljs-meta"&gt;field&lt;/SPAN&gt;-&lt;SPAN class="hljs-keyword"&gt;selector=status.phase=Pending &lt;/SPAN&gt;-n app-routing-system
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Se houver pods em Pending, o cluster provavelmente está enfrentando um problema de exaustão de recursos. Nesse caso, consulte&amp;nbsp;&lt;A href="https://learn.microsoft.com/troubleshoot/azure/azure-kubernetes/availability-performance/troubleshoot-pod-scheduler-errors" target="_blank"&gt;Solucionar erros do agendador de pods no Azure Kubernetes Service&lt;/A&gt;.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H2 id="passo-3-verifique-se-existem-limites-aplicados-ao-deployment-do-nginx"&gt;Passo 3: Verifique se Existem Limites Aplicados ao Deployment do NGINX&lt;/H2&gt;
&lt;P&gt;Qualquer configuração incorreta nos &lt;A href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/" target="_blank"&gt;limites ou requests de recursos&lt;/A&gt; do &lt;CODE&gt;NGINX&lt;/CODE&gt; pode fazer com que o &lt;CODE&gt;HPA&lt;/CODE&gt; escale mais pods do que o necessário.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Descreva o Deployment do NGINX&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;describe&lt;/SPAN&gt; deploy nginx -n app-routing-&lt;SPAN class="hljs-built_in"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Verifique Requests e Limits&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; $ kubectl describe deploy nginx -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
 Name:                   nginx
 ....
 Selector:               app=nginx
 ....
 Pod Template:
 ....
 Containers:
 controller:
     ...
     Limits:
     ...
     Requests:
     ...
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 id="solu-o"&gt;Solução&lt;/H2&gt;
&lt;P&gt;Por padrão, a versão atual do NGINX ingress controller não define limites para os pods do NGINX e define requests &lt;CODE&gt;500m&lt;/CODE&gt; de CPU, que é usado pelo &lt;CODE&gt;HPA&lt;/CODE&gt;. Não é recomendado alterar esses valores diretamente na definição do deployment.&lt;/P&gt;
&lt;P&gt;Se o seu &lt;CODE&gt;HPA&lt;/CODE&gt; está atingindo o número máximo de pods e os requests e limits do deployment permanecem inalterados, você deve configurar o &lt;A href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/" target="_blank"&gt;custom resource definition (CRD)&lt;/A&gt; chamado &lt;A href="https://github.com/Azure/aks-app-routing-operator/blob/main/config/crd/bases/approuting.kubernetes.azure.com_nginxingresscontrollers.yaml" target="_blank"&gt;NginxIngressController&lt;/A&gt;.&lt;/P&gt;
&lt;H3 id="op-es-de-configura-o"&gt;Opções de Configuração&lt;/H3&gt;
&lt;P&gt;As opções de configuração abaixo impactam diretamente o comportamento do &lt;CODE&gt;HPA&lt;/CODE&gt;:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Propriedade&lt;/th&gt;&lt;th&gt;Tipo&lt;/th&gt;&lt;th&gt;Descrição&lt;/th&gt;&lt;th&gt;Obrigatório&lt;/th&gt;&lt;th&gt;Padrão&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;scaling&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;objeto&lt;/td&gt;&lt;td&gt;Configuração para escalonamento do controller. Contém propriedades aninhadas.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;maxReplicas&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;inteiro&lt;/td&gt;&lt;td&gt;Limite superior de réplicas.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;minReplicas&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;inteiro&lt;/td&gt;&lt;td&gt;Limite inferior de réplicas.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;threshold&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;Limite de escalonamento definindo quão agressivo será o scaling. Opções: &lt;CODE&gt;rapid&lt;/CODE&gt;, &lt;CODE&gt;steady&lt;/CODE&gt;, &lt;CODE&gt;balanced&lt;/CODE&gt;.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;balanced&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3 id="como-aplicar-a-configura-o"&gt;Como Aplicar a Configuração&lt;/H3&gt;
&lt;P&gt;Siga os passos abaixo para aplicar a configuração:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Edite o CRD NginxIngressController&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-keyword"&gt;edit&lt;/SPAN&gt; nginxingresscontroller -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Adicione ou modifique a configuração de scaling&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-yaml"&gt;&lt;SPAN class="hljs-symbol"&gt; spec:&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;   scaling:&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;     maxReplicas:&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;10&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;     minReplicas:&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;     threshold:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;"balanced"&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Salve e saia&lt;/STRONG&gt; do editor para aplicar as alterações.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Verifique as alterações&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;get&lt;/SPAN&gt; hpa -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;O HPA será atualizado automaticamente com base na nova configuração, e o NGINX ingress controller irá escalar conforme os parâmetros especificados.&lt;/P&gt;
&lt;H2 id="recursos-adicionais"&gt;Recursos adicionais&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com//azure/aks/best-practices" target="_blank"&gt;Saiba mais sobre boas práticas do Azure Kubernetes Service (AKS)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze" target="_blank"&gt;Monitore a performance do seu cluster Kubernetes com Container insights&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/kubernetes/ingress-nginx" target="_blank"&gt;NGINX ingress controller&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Fri, 05 Sep 2025 13:44:38 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aks-problemas-de-desempenho-do-nginx-ingress-controller/ba-p/4447419</guid>
      <dc:creator>ClaudioGodoy</dc:creator>
      <dc:date>2025-09-05T13:44:38Z</dc:date>
    </item>
    <item>
      <title>Zonas de Disponibilidade no Azure: Entendendo a Diferença entre Zonas Lógicas e Físicas</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/zonas-de-disponibilidade-no-azure-entendendo-a-diferen%C3%A7a-entre/ba-p/4447134</link>
      <description>&lt;P&gt;&lt;STRONG&gt;O que é o mapeamento de zonas do Azure (Zona Lógica vs Zona Física)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;No Azure, as Zonas de Disponibilidade (AZs) são agrupamentos de datacenters fisicamente separados dentros de uma mesma região. Cada zona possui infraestrutura independente - energia, refrigeração e rede - garantindo alta disponibilidade e resiliência.&lt;/P&gt;
&lt;P&gt;Porém, há uma distinção entre:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Tipo de Zona&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Definição&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Zona Lógica&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Identificador exibido no portal do Azure (AZ1, AZ2, AZ3).&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Zona Física&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Grupo real de datacenters. O mapeamento entre lógica e física varia por assinatura&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;O mapeamento entre zonas lógicas e físicas não é fixo. Isso significa que:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;AZ1 na assinatura A pode ser fisicamente igual à AZ3 na assinatura B.&lt;/LI&gt;
&lt;LI&gt;Sem verificação, você pode estar executando produção e DR na mesma infraestrutura física, anulando os benefícios da separação.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Esse comportamento é intencional e inspirado no modelo da AWS, que também não garante consistência entre zonas lógicas em diferentes contas.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Qual o objetivo desse design?&lt;/STRONG&gt;&lt;BR /&gt;A motivação por trás desse mapeamento dinâmico é:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Distribuir a carga de consumo de forma mais eficiente entre os datacenters.&lt;/LI&gt;
&lt;LI&gt;Evitar hotspots e garantir resiliência operacional.&lt;/LI&gt;
&lt;LI&gt;Permitir flexibilidade de alocação conforme a capacidade física disponível.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Esse modelo ajuda a balancear o uso da infraestrutura global, sem expor diretamente a topologia física aos clientes — o que também reforça a segurança e abstração da plataforma.&lt;/P&gt;
&lt;P&gt;Essa distinção é essencial: a zona lógica AZ1 em uma assinatura pode, na prática, ser a mesma zona física que a AZ3 em outra. Sem uma verificação adequada, o cliente pode acabar executando cargas de produção e de DR (Disaster Recovery) na mesma infraestrutura física, o que anula os benefícios esperados da separação entre zonas.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Exemplo prático de risco&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Vamos considerar o seguinte cenário de um cliente:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Produção: AZ1 e AZ2 em uma assinatura A&lt;/LI&gt;
&lt;LI&gt;DR: AZ3 em outra assinatura B, na mesma região&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;O cliente acredita estar distribuindo suas cargas entre três zonas distintas. No entanto, ao verificar o mapeamento real, encontra a seguinte saída:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 93.4259%; height: 239px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 239px;"&gt;&lt;td style="height: 239px;"&gt;
&lt;P&gt;[&lt;/P&gt;
&lt;P&gt;&amp;nbsp;{ "logicalZone": "1", "physicalZone": "brazilsouth-az3" },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;{ "logicalZone": "2", "physicalZone": "brazilsouth-az1" },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;{ "logicalZone": "3", "physicalZone": "brazilsouth-az2" }&lt;/P&gt;
&lt;P&gt;]&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;Neste exemplo, a AZ3 lógica está mapeada para a AZ2 física, que já está sendo usada na produção. Ou seja, não há separação física real.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Como verificar o mapeamento de zonas?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Para evitar esse problema, é essencial verificar o mapeamento entre zonas lógicas e físicas em cada assinatura. Use o seguinte comando via Azure CLI:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 93.7037%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;az rest --method get \&lt;/P&gt;
&lt;P&gt;&amp;nbsp;--uri "/subscriptions/&amp;lt;subscription-id&amp;gt;/locations?api-version=2022-12-01" \&lt;/P&gt;
&lt;P&gt;&amp;nbsp;--query "value[?name=='&amp;lt;region-name&amp;gt;'].{displayName: displayName,name: name,availabilityZoneMappings: availabilityZoneMappings }" \&lt;/P&gt;
&lt;P&gt;&amp;nbsp;-o json&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Substitua &amp;lt;subscription-id&amp;gt; e &amp;lt;region-name&amp;gt; (ex: brazilsouth) conforme necessário.&lt;/P&gt;
&lt;P&gt;Veja abaixo um exemplo de saída obtida no meu ambiente de laboratório, onde tenho duas assinaturas. Vou executar o mapeamento de zonas entre elas para a região Brazil South.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Na primeira subscription 1 temos o seguinte mapeamento.&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Zona lógica: 1 &amp;nbsp;– Zona Física: &amp;nbsp;brazilsouth-az1&lt;/LI&gt;
&lt;LI&gt;Zona lógica: 2 – Zona Física: brazilsouth-az2&lt;/LI&gt;
&lt;LI&gt;Zona lógica: 3 &amp;nbsp;– Zona Física: brazilsouth-az3&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Na segunda subscription 2 temos o seguinte mapeamento.&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Zona lógica: 1 &amp;nbsp;– Zona Física: &amp;nbsp;brazilsouth-az3&lt;/LI&gt;
&lt;LI&gt;Zona lógica: 2 – Zona Física: brazilsouth-az1&lt;/LI&gt;
&lt;LI&gt;Zona lógica: 3 &amp;nbsp;– Zona Física: brazilsouth-az2&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Resumindo:&lt;/STRONG&gt; Se minha estratégia de DR envolve o uso das zonas lógicas 1 e 2 na subscription 1, pois elas estão mapeadas fisicamente para as zonas AZ1 e AZ2, então, na subscription 2 destinada ao DR, devo utilizar a zona lógica 1 — já que, nessa assinatura, ela está mapeada fisicamente para a AZ3.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Boas práticas&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Sempre verifique o mapeamento entre zonas lógicas e físicas antes de definir sua estratégia de DR.&lt;/LI&gt;
&lt;LI&gt;Evite assumir que AZ1, AZ2 e AZ3 representam zonas físicas distintas entre diferentes assinaturas.&lt;/LI&gt;
&lt;LI&gt;Considere utilizar regiões diferentes para DR quando a separação física for um requisito crítico.&lt;/LI&gt;
&lt;LI&gt;Documente e compartilhe o mapeamento com sua equipe de arquitetura e operações para garantir alinhamento e evitar riscos.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Referência oficial&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Para mais detalhes, consulte a documentação oficial da Microsoft:&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/availability-zones/az-overview" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/availability-zones/az-overview&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/architecture/aws-professional/regions-zones" target="_blank"&gt;Comparing AWS and Azure regions and zones - Azure Architecture Center | Microsoft Learn&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 26 Aug 2025 13:17:42 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/zonas-de-disponibilidade-no-azure-entendendo-a-diferen%C3%A7a-entre/ba-p/4447134</guid>
      <dc:creator>fabiodasilva</dc:creator>
      <dc:date>2025-08-26T13:17:42Z</dc:date>
    </item>
    <item>
      <title>Anatomia de um serviço ASP.NET Core</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anatomia-de-um-servi%C3%A7o-asp-net-core/ba-p/4423980</link>
      <description>&lt;P&gt;O ecossistema do &lt;A href="https://learn.microsoft.com/dotnet/" target="_blank" rel="noopener"&gt;.NET&lt;/A&gt; é uma plataforma de desenvolvimento de software criada pela Microsoft. Ele inclui ferramentas, bibliotecas e frameworks para a criação de aplicações desktop, web, mobile, serviços e muito mais. Desde sua unificação, o &lt;CODE&gt;.NET Core&lt;/CODE&gt; e o &lt;CODE&gt;.NET Framework&lt;/CODE&gt; passaram a ser conhecidos apenas como &lt;CODE&gt;.NET&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;O &lt;A href="https://learn.microsoft.com/dotnet/core/sdk" target="_blank" rel="noopener"&gt;.NET SDK (Software Development Kit)&lt;/A&gt; fornece as ferramentas necessárias para criar, compilar, depurar e publicar aplicações &lt;CODE&gt;.NET&lt;/CODE&gt;. Ele inclui o compilador &lt;A href="https://en.wikipedia.org/wiki/C_Sharp_(programming_language" target="_blank" rel="noopener"&gt;C#&lt;/A&gt;), bibliotecas de classes como &lt;A href="https://dotnet.microsoft.com/learn/aspnet/what-is-aspnet-core" target="_blank" rel="noopener"&gt;ASP.NET Core&lt;/A&gt; e &lt;A href="https://learn.microsoft.com/ef/core/" target="_blank" rel="noopener"&gt;Entity Framework Core&lt;/A&gt;, além de utilitários como o &lt;A href="https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild" target="_blank" rel="noopener"&gt;MSBuild&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;O ambiente de execução &lt;CODE&gt;.NET&lt;/CODE&gt; (&lt;A href="https://learn.microsoft.com/dotnet/standard/clr" target="_blank" rel="noopener"&gt;Common Language Runtime ou CLR&lt;/A&gt;) gerencia a execução de programas &lt;CODE&gt;.NET&lt;/CODE&gt;, oferecendo serviços como gerenciamento de memória, coleta de lixo e controle de exceções.&lt;/P&gt;
&lt;H2 id="tipos-de-aplica-es-net"&gt;Tipos de Aplicações .NET&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://dotnet.microsoft.com/apps/aspnet/apis" target="_blank" rel="noopener"&gt;Web API&lt;/A&gt;&lt;/STRONG&gt;: Aplicações que fornecem serviços e endpoints &lt;A href="https://learn.microsoft.com/azure/architecture/best-practices/api-design" target="_blank" rel="noopener"&gt;RESTful&lt;/A&gt; para interação com clientes.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/aspnet/core/blazor/components/class-libraries-and-static-server-side-rendering?view=aspnetcore-9.0" target="_blank" rel="noopener"&gt;Razor com SSR (Server-Side Rendering)&lt;/A&gt;&lt;/STRONG&gt;: Ideal para aplicações que precisam de SEO e renderização eficiente.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/dotnet/core/tutorials/with-visual-studio-code" target="_blank" rel="noopener"&gt;Console Application&lt;/A&gt;&lt;/STRONG&gt;: Útil para tarefas automatizadas e scripts.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://dotnet.microsoft.com/apps/maui" target="_blank" rel="noopener"&gt;MAUI (Multi-platform App UI)&lt;/A&gt;&lt;/STRONG&gt;: Permite o desenvolvimento de aplicativos multiplataforma.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/dotnet/standard/class-libraries" target="_blank" rel="noopener"&gt;Libraries (.NET Standard/Core Libraries)&lt;/A&gt;&lt;/STRONG&gt;: Conjuntos de código reutilizável para funcionalidades específicas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="asp-net-core-webapi"&gt;ASP.NET Core WebAPI&lt;/H2&gt;
&lt;P&gt;Uma WebAPI segue o estilo arquitetural &lt;A href="https://learn.microsoft.com/azure/architecture/best-practices/api-design" target="_blank" rel="noopener"&gt;REST (Representational State Transfer)&lt;/A&gt;, utilizando o protocolo &lt;A href="https://www.rfc-editor.org/rfc/rfc2616" target="_blank" rel="noopener"&gt;HTTP&lt;/A&gt; para comunicação.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Protocolo HTTP:&lt;/STRONG&gt; Define métodos como GET, POST, PUT e DELETE para manipulação de recursos.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;REST API:&lt;/STRONG&gt; Utiliza URIs para identificar recursos e métodos HTTP para operações CRUD.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://martinfowler.com/articles/richardsonMaturityModel.html" target="_blank" rel="noopener"&gt;Modelo de Richardson&lt;/A&gt;:&lt;/STRONG&gt; Estabelece níveis de maturidade em APIs REST.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;O foco principal do artigo está na WebAPI, devido à sua relevância na criação de serviços modernos.&lt;/P&gt;
&lt;H2 id="demo"&gt;Demo&lt;/H2&gt;
&lt;P&gt;Para criar uma &lt;CODE&gt;webapi&lt;/CODE&gt;, com o &lt;A href="https://dotnet.microsoft.com/download" target="_blank" rel="noopener"&gt;dotnet sdk&lt;/A&gt; instalado, rode o comando:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-sh"&gt;dotnet &lt;SPAN class="hljs-keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;webapi&lt;/SPAN&gt; -n MinhaApi
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Após executar o comando, será gerada uma estrutura básica de projeto contendo:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Controllers&lt;/STRONG&gt;: Arquivos para definir os endpoints da API.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Program.cs&lt;/STRONG&gt;: Configuração inicial da aplicação.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;appsettings.json&lt;/STRONG&gt;: Arquivo de configuração.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Você pode iniciar o servidor com:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-sh"&gt;&lt;SPAN class="hljs-built_in"&gt;cd&lt;/SPAN&gt; MinhaApi
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;PRE&gt;&lt;CODE class="lang-sh"&gt;dotnet &lt;SPAN class="hljs-keyword"&gt;run&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H2 id="ciclo-de-vida-de-uma-requisi-o-http-em-aplica-es-asp-net-core"&gt;Ciclo de vida de uma requisição HTTP em aplicações ASP.NET Core&lt;/H2&gt;
&lt;H3 id="server"&gt;Server&lt;/H3&gt;
&lt;P&gt;Uma aplicação &lt;A href="https://learn.microsoft.com/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-8.0" target="_blank" rel="noopener"&gt;ASP.NET Core&lt;/A&gt; é executada com uma implementação de servidor &lt;CODE&gt;HTTP in-process&lt;/CODE&gt;. Esse servidor escuta por requisições HTTP e as disponibiliza para a aplicação através do &lt;A href="https://learn.microsoft.com/dotnet/api/system.web.httpcontext?view=netframework-4.8.1" target="_blank" rel="noopener"&gt;HttpContext&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;As responsabilidades do servidor incluem:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Escutar em uma porta específica para receber solicitações HTTP.&lt;/LI&gt;
&lt;LI&gt;Processar as requisições e encaminhá-las para os middlewares configurados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 id="middlewares"&gt;Middlewares&lt;/H3&gt;
&lt;P&gt;Os middlewares são componentes que processam requisições e respostas. Eles podem:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Autenticar usuários.&lt;/LI&gt;
&lt;LI&gt;Registrar logs.&lt;/LI&gt;
&lt;LI&gt;Manipular erros.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Exemplo de configuração de middleware:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-csharp"&gt;app.UseRouting()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
app.UseAuthentication()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
app.UseAuthorization()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
app.UseEndpoints(endpoints =&amp;gt;
{
    endpoints.MapControllers()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
})&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H3 id="controllers"&gt;Controllers&lt;/H3&gt;
&lt;P&gt;Os controllers são responsáveis por definir os endpoints da API. Um exemplo básico:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-csharp"&gt;[ApiController]
[Route(&lt;SPAN class="hljs-string"&gt;"api/[controller]"&lt;/SPAN&gt;)]
&lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;class&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;MinhaController&lt;/SPAN&gt; : &lt;SPAN class="hljs-type"&gt;ControllerBase&lt;/SPAN&gt;&lt;/SPAN&gt;
{
    [HttpGet]
    &lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt; IActionResult Get()
    {
        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; Ok(&lt;SPAN class="hljs-string"&gt;"Hello World"&lt;/SPAN&gt;);
    }
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H3 id="resumo"&gt;Resumo&lt;/H3&gt;
&lt;P&gt;O ciclo de vida de uma requisição HTTP envolve o servidor, middlewares e controllers, garantindo que cada etapa seja processada de forma eficiente e escalável.&lt;/P&gt;
&lt;H3 id="conclus-o"&gt;Conclusão&lt;/H3&gt;
&lt;P&gt;O &lt;STRONG&gt;ASP.NET Core&lt;/STRONG&gt; é uma plataforma poderosa e flexível que permite o desenvolvimento de aplicações modernas, robustas e escaláveis. Desde sua arquitetura modular com middlewares até a configuração do pipeline de requisições, ele fornece ferramentas essenciais para criar soluções otimizadas e adaptadas a diferentes necessidades, seja para web, APIs RESTful ou sistemas distribuídos.&lt;/P&gt;
&lt;P&gt;Ao longo deste artigo, exploramos desde os fundamentos do &lt;CODE&gt;.NET&lt;/CODE&gt; e a ampla gama de tipos de aplicativos que podem ser criados, até os detalhes do ciclo de vida de uma requisição HTTP e a importância dos servidores Kestrel e HTTP.sys. Com uma compreensão clara do pipeline de requisições e dos middlewares, é possível projetar sistemas que não apenas atendem aos requisitos técnicos, mas também oferecem excelente desempenho e uma experiência de usuário consistente.&lt;/P&gt;
&lt;P&gt;Dominar o ecossistema do &lt;STRONG&gt;ASP.NET Core&lt;/STRONG&gt; é essencial para desenvolvedores que desejam se destacar no desenvolvimento de serviços e aplicações web de alto desempenho.&lt;/P&gt;</description>
      <pubDate>Mon, 30 Jun 2025 00:39:17 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anatomia-de-um-servi%C3%A7o-asp-net-core/ba-p/4423980</guid>
      <dc:creator>ClaudioGodoy</dc:creator>
      <dc:date>2025-06-30T00:39:17Z</dc:date>
    </item>
    <item>
      <title>Participe da 2ª edição do GitHub Copilot Global Bootcamp</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/participe-da-2%C2%AA-edi%C3%A7%C3%A3o-do-github-copilot-global-bootcamp/ba-p/4417042</link>
      <description>&lt;P data-start="202" data-end="593"&gt;O &lt;STRONG&gt;GitHub Copilot Global Bootcamp&lt;/STRONG&gt; começou em fevereiro como uma jornada totalmente virtual de aprendizado — e foi um sucesso. Mais de &lt;STRONG&gt;60 mil desenvolvedores&lt;/STRONG&gt; participaram da primeira edição, em vários idiomas e regiões. Agora, estamos empolgados em lançar a &lt;STRONG&gt;segunda edição&lt;/STRONG&gt; — maior e melhor — &lt;STRONG&gt;com workshops virtuais e presenciais,&lt;/STRONG&gt; organizados por comunidades de tecnologia ao redor do mundo.&lt;/P&gt;
&lt;P data-start="595" data-end="747"&gt;Essa nova edição chega logo após os anúncios do &lt;STRONG&gt;Microsoft Build 2025&lt;/STRONG&gt;, onde as equipes do GitHub e do Visual Studio Code revelaram novidades empolgantes:&lt;/P&gt;
&lt;UL data-start="749" data-end="1067"&gt;
&lt;LI data-start="749" data-end="845"&gt;A&lt;STRONG&gt; extensão GitHub Copilot Chat será open source,&lt;/STRONG&gt; reforçando a transparência e a colaboração.&lt;/LI&gt;
&lt;LI data-start="846" data-end="976"&gt;A IA está sendo profundamente integrada ao &lt;STRONG&gt;Visual Studio Code&lt;/STRONG&gt;, que agora está evoluindo para um editor de IA de código aberto.&lt;/LI&gt;
&lt;LI data-start="977" data-end="1067"&gt;Novas APIs e ferramentas estão tornando mais fácil do que nunca construir com IA e LLMs.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1069" data-end="1276"&gt;Este bootcamp é a sua oportunidade de explorar essas novas ferramentas, entender como usar o GitHub Copilot de forma eficaz e fazer parte da crescente conversa global sobre IA no desenvolvimento de software.&lt;/P&gt;
&lt;P data-start="1283" data-end="1314"&gt;👩‍💻 &lt;STRONG data-start="1289" data-end="1314"&gt;Quem pode participar?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-start="1316" data-end="1599"&gt;Seja você um(a) desenvolvedor(a) iniciante, estudante ou profissional experiente em tecnologia, este bootcamp foi feito para você. Você aprenderá casos de uso práticos do GitHub Copilot e como aumentar sua produtividade usando IA — em um formato acessível e prático.&lt;/P&gt;
&lt;H3 data-start="1606" data-end="1641"&gt;&lt;STRONG data-start="1610" data-end="1641"&gt;Participe da edição virtual&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="1643" data-end="1725"&gt;Não importa onde você esteja, é possível participar online e aprender com a gente:&lt;/P&gt;
&lt;P data-start="1727" data-end="1760"&gt;&lt;STRONG data-start="1727" data-end="1758"&gt;Português (Brasil – UTC -3)&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-start="1761" data-end="1922"&gt;
&lt;LI style="font-weight: bold;" data-start="1761" data-end="1833"&gt;&lt;STRONG&gt;24 de junho, 19h: &lt;A class="lia-external-url" href="https://developer.microsoft.com/en-us/reactor/events/25931/" target="_blank" rel="noopener"&gt;&lt;EM data-start="1781" data-end="1831"&gt;Boas práticas para dominar o GitHub Copilot Chat&lt;/EM&gt;&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI style="font-weight: bold;" data-start="1834" data-end="1922"&gt;&lt;STRONG&gt;25 de junho, 19h: &lt;A class="lia-external-url" href="https://developer.microsoft.com/en-us/reactor/events/25932/" target="_blank" rel="noopener"&gt;&lt;EM data-start="1854" data-end="1920"&gt;Integrações práticas com MCP Servers no VS Code e GitHub Copilot&lt;/EM&gt;&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="2314" data-end="2346"&gt;&lt;STRONG data-start="2318" data-end="2344"&gt;Aprenda na sua cidade!&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2347" data-end="2479"&gt;Estamos em parceria com comunidades locais de desenvolvedores para levar workshops presenciais a diversas cidades ao redor do mundo.&lt;/P&gt;
&lt;P data-start="2722" data-end="2758"&gt;&lt;STRONG data-start="2722" data-end="2758"&gt;Sessões presenciais confirmadas no Brasil:&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 94.8529%; height: 187.6px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 26.8px;"&gt;&lt;th style="height: 26.8px; border-width: 1px;"&gt;Data&lt;/th&gt;&lt;th style="height: 26.8px; border-width: 1px;"&gt;Cidade&lt;/th&gt;&lt;th style="height: 26.8px; border-width: 1px;"&gt;Inscrições&lt;/th&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;17 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Brasília, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://forms.office.com/r/rUNtTWNndV" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;17 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Pato de Minas, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://forms.office.com/r/tXXP6Ce7Xq" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;21 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Mogi das Cruzes, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://cloudexpertschool.com.br/github-copilot-global-bootcamp/" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;26 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Recife, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://forms.office.com/r/yFqWJfY2iW" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px;"&gt;27 de Junho&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;Rio de Janeiro, Brasil&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;&lt;A href="https://capsula.rj.senac.br/github2025/" target="_blank"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;img /&gt;
&lt;P data-start="4355" data-end="4697"&gt;O&amp;nbsp;&lt;STRONG data-start="4357" data-end="4385"&gt;Microsoft Applied Skills&lt;/STRONG&gt; é um programa de credenciamento criado para validar sua capacidade de realizar tarefas técnicas específicas do mundo real. Diferente das certificações tradicionais que costumam abranger cargos amplos, o Applied Skills foca em habilidades práticas e cenários reais, diretamente aplicáveis a desafios de negócios.&lt;/P&gt;
&lt;P data-start="4699" data-end="4917"&gt;&lt;STRONG data-start="4699" data-end="4743"&gt;E a melhor parte? É totalmente gratuito!&lt;/STRONG&gt;&lt;BR data-start="4743" data-end="4746" /&gt;Você demonstra suas habilidades por meio de avaliações interativas, baseadas em tarefas, em um ambiente simulado — sem perguntas de múltipla escolha, apenas trabalho real.&lt;/P&gt;
&lt;P data-start="4919" data-end="5131"&gt;Uma das adições mais recentes é o &lt;STRONG data-start="4953" data-end="4988"&gt;Applied Skill do GitHub Copilot&lt;/STRONG&gt;, que comprova sua habilidade de aproveitar a IA para aumentar a produtividade no desenvolvimento de software e melhorar a qualidade do código:&lt;/P&gt;
&lt;P data-start="5135" data-end="5204" data-is-last-node=""&gt;&lt;A class="lia-external-url" href="https://aka.ms/appliedskills/github-copilot" target="_blank" rel="noopener"&gt;&lt;STRONG data-start="5135" data-end="5204" data-is-last-node=""&gt;Acelere o desenvolvimento de aplicativos usando o GitHub Copilot.&lt;/STRONG&gt;&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 06 Jun 2025 14:19:57 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/participe-da-2%C2%AA-edi%C3%A7%C3%A3o-do-github-copilot-global-bootcamp/ba-p/4417042</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-06-06T14:19:57Z</dc:date>
    </item>
    <item>
      <title>Crie seu Primeiro Agente de IA com JavaScript e Azure AI Agent Service!</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/crie-seu-primeiro-agente-de-ia-com-javascript-e-azure-ai-agent/ba-p/4411651</link>
      <description>&lt;H2 data-line="4"&gt;&lt;STRONG&gt;Introdução: A Era dos Agentes de IA em JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="8"&gt;Durante o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/events/25323/" data-href="https://developer.microsoft.com/en-us/reactor/events/25323/" target="_blank"&gt;AI Agents Hackathon&lt;/A&gt;&lt;/STRONG&gt;, uma das sessões mais aguardadas foi apresentada por&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.linkedin.com/in/wassimchegham/" data-href="https://www.linkedin.com/in/wassimchegham/" target="_blank"&gt;Wassim Chegham&lt;/A&gt;&lt;/STRONG&gt;, que é Senior AI Developer Advocate em JavaScript na Microsoft. O tema?&amp;nbsp;&lt;STRONG&gt;"Como Criar seu Primeiro Agente de IA com JavaScript e Azure AI Agent Service?"&lt;/STRONG&gt;&amp;nbsp;- uma ferramenta poderosa e pensada para desenvolvedores modernos que desejam criar aplicações AI-first com segurança, escabilidade e produtividade.&lt;/P&gt;
&lt;P data-line="10"&gt;E, nesse artigo, vamos explorar os principais pontos abordados na sessão, com um foco especial em como você pode criar seu próprio agente de IA utilizando JavaScript e o Azure AI Agent Service.&lt;/P&gt;
&lt;P data-line="12"&gt;A proposta do vídeo é clara: mostrar o passo a passo de como qualquer pessoa pode criar agentes de IA com JavaScript e TypeScript, utilizando&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Foundry&lt;/A&gt;&lt;/STRONG&gt;, e explicar todos os conceitos essenciais para dominar esse novo paradigma de desenvolvimento.&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="12"&gt;Se você perdeu a sessão, não se preocupe! Você pode assistir a gravação:&lt;/P&gt;
&lt;P data-line="12"&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://www.youtube.com/watch?v=RNphlRKvmJQ/1746638815221" data-video-remote-vid="https://www.youtube.com/watch?v=RNphlRKvmJQ/1746638815221" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FRNphlRKvmJQ%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DRNphlRKvmJQ&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FRNphlRKvmJQ%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;H2 data-line="20"&gt;&lt;STRONG&gt;O que são Agentes de IA?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="22"&gt;Wassim inicia a sessão com um panorama histórico: desde os chatbots tradicionais até os agentes inteligentes e autônomos que conhecemos hoje. Ele destacou:&lt;/P&gt;
&lt;UL data-line="24"&gt;
&lt;LI data-line="24"&gt;&lt;STRONG&gt;Agentes baseados em LLMs (Large Language Models)&lt;/STRONG&gt;&amp;nbsp;que entendem a linguagem natural.&lt;/LI&gt;
&lt;LI data-line="26"&gt;&lt;STRONG&gt;Agentes com ferramentas (tools)&lt;/STRONG&gt;&amp;nbsp;que executam ações no mundo real, como chamadas de API, buscas, execução de código etc.&lt;/LI&gt;
&lt;LI data-line="28"&gt;&lt;STRONG&gt;Sistemas multiagentes&lt;/STRONG&gt;, que coordenam vários agentes para resolver tarefas complexas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P class="lia-clear-both"&gt;O diferencial do Azure AI Agent Service é simplificar tudo isso, oferecendo uma plataforma gerenciada que cuida da orquestração, segurança, rastreamento e execução dos agentes.&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="36"&gt;&lt;STRONG&gt;Arquitetura de Soluções com Azure AI Agent Service&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P data-line="40"&gt;Durante a sessão, Wassim apresentou uma visão clara da arquitetura típica de uma aplicação de agente de IA desenvolvida com JavaScript. Ele explicou que, embora seja possível ter uma interface gráfica (FrontEnd) usando frameworks como Angular ou React, isso não é obrigatório - a aplicação pode muito bem funcionar num terminal, como foi o caso das demonstrações feitas ao vivo.&lt;/P&gt;
&lt;P data-line="42"&gt;No BackEnd, o foco recai sobre o uso de Node.js, que pode ser combinado com frameworks como&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://expressjs.com/" data-href="https://expressjs.com/" target="_blank"&gt;Express.js&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;ou&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://fastify.dev/" data-href="https://fastify.dev/" target="_blank"&gt;Fastify&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para expor APIs que comunicam com os agentes. Essa camada de API atua como ponte entre o usuário e a lógica do agente, coordenando mensagens, execuções e chamadas de ferramentas.&lt;/P&gt;
&lt;P data-line="44"&gt;O próprio agente é criado e gerenciado com o SDK&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/ai-projects, que fornece uma API simples e direta para registrar agentes, definir instruções, anexar ferramentas e controlar execuções. Wassim destacou o quanto essa abordagem reduz a complexidade em comparação a outros frameworks de agentes, que exigem configuração manual de estado, orquestração e controle de contexto.&lt;/P&gt;
&lt;P data-line="46"&gt;Além disso, há uma camada de ferramentas integradas ao serviço que ampliam significamente as capacidades do agente. São elas:&lt;/P&gt;
&lt;UL data-line="48"&gt;
&lt;LI data-line="48"&gt;&lt;STRONG&gt;Code Interpreter&lt;/STRONG&gt;: para execução de código Python em sandbox&lt;/LI&gt;
&lt;LI data-line="49"&gt;&lt;STRONG&gt;Function Calling&lt;/STRONG&gt;: para chamadas de funções definidas pelo usuário&lt;/LI&gt;
&lt;LI data-line="50"&gt;&lt;STRONG&gt;Azure AI Search&lt;/STRONG&gt;: para buscas vetoriais e RAG (Retrieval-Augmented Generation)&lt;/LI&gt;
&lt;LI data-line="51"&gt;&lt;STRONG&gt;Bing Search&lt;/STRONG&gt;: para grounding com dados em tempo real&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;Todas essas ferramentas são disponibilizadas de forma plug-and-play pela infraestrutura do&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Toda essa arquitetura é gerenciada por uma instância do Azure AI Foundry, que centraliza o controle de modelos, ferramentas, conexões e dados, proporcionando uma base robusta, segura e escalável para criar aplicações AI-first. Wassim fez questão de frisar que o agente é o verdadeiro "cérebro" da aplicação - recebendo instruções, raciocionando sobre elas e coordenando a execução de tarefas com auxílio de ferramentas externas, tudo isso com o poucos comandos em JavaScript.&lt;/P&gt;
&lt;H2 data-line="61"&gt;&lt;STRONG&gt;Criando seu primeiro agente: Hands-on com JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P&gt;Durante a demonstração prática, Wassim conduz os participantes por todas as etapas necessárias para criar um agente de IA funcional com JavaScript, utilizando o Azure AI Agent Service. Ele começa destacando que todo o código utilizado está disponível publicamente num repositório no GitHub, o que permite que qualquer pessoa possa clonar, rodar e adaptar os exemplos para seus próprios projetos.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;gt; Link do repositório:&amp;nbsp;&lt;A href="http://aka.ms/azure-ai-agents-javascript" data-href="http://aka.ms/azure-ai-agents-javascript" target="_blank"&gt;Azure AI Agent Service - Demonstration&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-line="69"&gt;A primeira etapa envolve a instalação dos pacotes essenciais. O principal deles é o SDK&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/ai-projects&amp;nbsp;(&lt;STRONG&gt;&lt;A href="https://www.npmjs.com/package/@azure/ai-projects" data-href="https://www.npmjs.com/package/@azure/ai-projects" target="_blank"&gt;pacote npm - aqui&lt;/A&gt;&lt;/STRONG&gt;), responsável por toda a interação com o serviço de agentes. Também é necessário instalar o&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/identity, que permite autenticar de forma segura com as credenciais da Azure sem precisar lidar com chaves ou tokens diretamente — utilizando, por exemplo, o&amp;nbsp;DefaultAzureCredential.&lt;/P&gt;
&lt;P data-line="71"&gt;Após configurar o ambiente com as dependências, Wassim mostra como criar uma instância do cliente de agente a partir de uma string de conexão obtida no&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://ai.azure.com/" data-href="https://ai.azure.com/" target="_blank"&gt;portal do Azure Foundry&lt;/A&gt;&lt;/STRONG&gt;. Essa string é armazenada em um arquivo&amp;nbsp;.env, e permite que o código se conecte de forma segura ao serviço para criar e gerenciar agentes.&lt;/P&gt;
&lt;P data-line="73"&gt;Com o cliente em mãos, o próximo passo é criar o agente propriamente dito. Para isso, é necessário definir o nome, o modelo de linguagem a ser usado (como o GPT-4) e fornecer instruções claras sobre o comportamento desejado para o agente — seja para realizar cálculos, responder perguntas, interpretar dados ou interagir com ferramentas externas.&lt;/P&gt;
&lt;P data-line="75"&gt;Na sequência, Wassim introduz o conceito de&amp;nbsp;&lt;EM&gt;thread&lt;/EM&gt;, que funciona como um espaço de conversa entre o agente e o usuário. É nesse thread que as mensagens são armazenadas, as execuções são iniciadas e o histórico de interações é mantido. Ele mostra como criar um thread, enviar uma mensagem e iniciar uma&amp;nbsp;&lt;EM&gt;run&lt;/EM&gt;, ou seja, uma execução do agente a partir da mensagem fornecida.&lt;/P&gt;
&lt;P data-line="77"&gt;A sessão então avança para demonstrar o uso de ferramentas. No primeiro exemplo, o agente resolve uma equação simples apenas com seu conhecimento interno, sem recorrer a ferramentas externas — um exemplo clássico para mostrar como o modelo pode raciocinar com base nas instruções fornecidas. Em seguida, Wassim mostra como ativar uma chamada de função personalizada: o agente acessa uma função que retorna o uso da CPU da máquina local, demonstrando a capacidade de executar ações no ambiente do usuário.&lt;/P&gt;
&lt;P data-line="79"&gt;Outro exemplo impressionante é o uso do&amp;nbsp;&lt;STRONG&gt;Code Interpreter&lt;/STRONG&gt;, uma ferramenta que permite executar código Python remotamente e com segurança. Wassim fornece um arquivo CSV contendo dados de vendas de carros, e o agente não só processa os dados, como também gera visualizações gráficas em tempo real.&lt;/P&gt;
&lt;P data-line="81"&gt;Além disso, ele demonstra como o agente pode utilizar o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Bing Grounding&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para buscar informações atualizadas diretamente da internet, como cotações do mercado de ações. E, por fim, mostra a integração com o Azure AI Search, onde um índice vetorial previamente carregado com informações sobre planos de saúde é consultado para responder perguntas específicas, com direito a citações precisas da fonte utilizada — um ótimo exemplo do padrão RAG (Retrieval-Augmented Generation) em ação.&lt;/P&gt;
&lt;P data-line="83"&gt;Esses exemplos mostram que, mesmo com poucos comandos em JavaScript, é possível criar agentes sofisticados, capazes de interagir com dados, ferramentas e usuários de maneira fluida, segura e produtiva.&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="87"&gt;&lt;STRONG&gt;Entendendo a mecânica interna: Como um agente funciona?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="89"&gt;Wassim explica os conceitos fundamentais do ciclo de vida de um agente:&lt;/P&gt;
&lt;UL data-line="91"&gt;
&lt;LI data-line="91"&gt;&lt;EM&gt;Agent&lt;/EM&gt;: configurado com modelo e instruções.&lt;/LI&gt;
&lt;LI data-line="93"&gt;&lt;EM&gt;Thread&lt;/EM&gt;: representa a conversa (contexto).&lt;/LI&gt;
&lt;LI data-line="95"&gt;&lt;EM&gt;Run&lt;/EM&gt;: execução de uma tarefa.&lt;/LI&gt;
&lt;LI data-line="97"&gt;&lt;EM&gt;Run Steps&lt;/EM&gt;: etapas da execução.&lt;/LI&gt;
&lt;LI data-line="99"&gt;&lt;EM&gt;Tools&lt;/EM&gt;: definidas com schemas e acionadas conforme necessário.&lt;/LI&gt;
&lt;LI data-line="101"&gt;&lt;EM&gt;Events&lt;/EM&gt;: eventos emitidos durante a execução (streaming, tool-call, resposta, erro, etc).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="103"&gt;Além disso, ele demonstra um projeto pessoal: uma ferramenta de tracing visual para acompanhar em tempo real cada etapa do agente, o que facilita o entendimento e o debug.&lt;/P&gt;
&lt;H2 data-line="105"&gt;&lt;STRONG&gt;Um pouco sobre as tecnologias utilizadas no projeto&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="107"&gt;Para quem está curioso sobre as tecnologias utilizadas no projeto, Wassim fez questão de destacar algumas delas:&lt;/P&gt;
&lt;UL data-line="109"&gt;
&lt;LI data-line="109"&gt;📦 SDK utilizado
&lt;UL data-line="110"&gt;
&lt;LI data-line="110"&gt;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/ai-projects@2.0.0-beta.4&lt;/LI&gt;
&lt;LI data-line="111"&gt;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/identity&amp;nbsp;para autenticação com credenciais seguras.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-line="113"&gt;🔧 Ferramentas integradas
&lt;UL data-line="114"&gt;
&lt;LI data-line="114"&gt;Function Calling: executa funções com base na entrada do LLM.&lt;/LI&gt;
&lt;LI data-line="115"&gt;Code Interpreter: executa código Python remotamente com segurança.&lt;/LI&gt;
&lt;LI data-line="116"&gt;Azure AI Search: busca vetorial e full-text com RAG.&lt;/LI&gt;
&lt;LI data-line="117"&gt;Bing Search Grounding: informações em tempo real da web.&lt;/LI&gt;
&lt;LI data-line="118"&gt;File Search (em breve): busca em arquivos carregados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-line="120"&gt;⚙️ Segurança e compliance
&lt;UL data-line="121"&gt;
&lt;LI data-line="121"&gt;Autenticação sem chaves (keyless)&lt;/LI&gt;
&lt;LI data-line="122"&gt;Private Networking (VNet)&lt;/LI&gt;
&lt;LI data-line="123"&gt;Content Filtering&lt;/LI&gt;
&lt;LI data-line="124"&gt;Tracing e logs para evitar alucinações&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-line="126"&gt;&lt;STRONG&gt;Conclusão: O Futuro dos Agentes de IA com JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="128"&gt;A sessão de Wassim Chegham no&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/events/25323/" data-href="https://developer.microsoft.com/en-us/reactor/events/25323/" target="_blank"&gt;AI Agents Hackathon&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;foi uma verdadeira aula sobre como criar agentes de IA com JavaScript e Azure AI Agent Service. Ele não só apresentou os conceitos fundamentais, mas também mostrou na prática como é fácil e rápido desenvolver aplicações inteligentes utilizando essa nova abordagem.&lt;/P&gt;
&lt;P data-line="130"&gt;Novamente se você perdeu a sessão, não se preocupe! Você pode assistir a gravação&amp;nbsp;&lt;A href="https://www.youtube.com/watch?v=RNphlRKvmJQ" data-href="https://www.youtube.com/watch?v=RNphlRKvmJQ" target="_blank"&gt;aqui&lt;/A&gt;.&lt;/P&gt;
&lt;P data-line="132"&gt;E, claro , não deixe de conferir o repositório no GitHub com todos os exemplos e códigos utilizados durante a apresentação:&amp;nbsp;&lt;STRONG&gt;&lt;A href="http://aka.ms/azure-ai-agents-javascript" data-href="http://aka.ms/azure-ai-agents-javascript" target="_blank"&gt;Azure AI Agent Service - Demonstration&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-line="134"&gt;E, no final, Wassim deixou uma mensagem clara: o futuro dos agentes de IA é promissor, e com as ferramentas certas, qualquer desenvolvedor pode criar soluções inovadoras e impactantes. Então, não perca tempo! Comece a explorar o Azure AI Agent Service e crie seu próprio agente de IA hoje mesmo!&lt;/P&gt;
&lt;H2 data-line="136"&gt;&lt;STRONG&gt;Links úteis&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL data-line="138"&gt;
&lt;LI data-line="138"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service&lt;/A&gt;&lt;/STRONG&gt;: Documentação oficial do serviço de agentes de IA da Azure.&lt;/LI&gt;
&lt;LI data-line="139"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Foundry&lt;/A&gt;&lt;/STRONG&gt;: Plataforma para criar e gerenciar agentes de IA.&lt;/LI&gt;
&lt;LI data-line="140"&gt;&lt;STRONG&gt;&lt;A href="http://aka.ms/azure-ai-agents-javascript" data-href="http://aka.ms/azure-ai-agents-javascript" target="_blank"&gt;Azure AI Agent Service - Demonstration&lt;/A&gt;&lt;/STRONG&gt;: Repositório GitHub com exemplos e códigos utilizados na sessão.&lt;/LI&gt;
&lt;LI data-line="141"&gt;&lt;STRONG&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/events/25323/" data-href="https://developer.microsoft.com/en-us/reactor/events/25323/" target="_blank"&gt;AI Agents Hackathon&lt;/A&gt;&lt;/STRONG&gt;: Evento que reuniu desenvolvedores para explorar o potencial dos agentes de IA.&lt;/LI&gt;
&lt;LI data-line="142"&gt;&lt;STRONG&gt;&lt;A href="https://www.linkedin.com/in/wassimchegham/" data-href="https://www.linkedin.com/in/wassimchegham/" target="_blank"&gt;Wassim Chegham&lt;/A&gt;&lt;/STRONG&gt;: LinkedIn do apresentador da sessão.&lt;/LI&gt;
&lt;LI data-line="143"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-foundry/quickstarts/get-started-playground" data-href="https://learn.microsoft.com/azure/ai-foundry/quickstarts/get-started-playground" target="_blank"&gt;Azure AI Foundry - Getting Started&lt;/A&gt;&lt;/STRONG&gt;: Guia para começar a usar o Azure AI Foundry.&lt;/LI&gt;
&lt;LI data-line="144"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/quickstart?WT.mc_id=javascript-00000-gllemos&amp;amp;pivots=programming-language-typescript" data-href="https://learn.microsoft.com/azure/ai-services/agents/quickstart?WT.mc_id=javascript-00000-gllemos&amp;amp;pivots=programming-language-typescript" target="_blank"&gt;Azure AI Agent Service - Quickstart&lt;/A&gt;&lt;/STRONG&gt;: Tutorial rápido para criar seu primeiro agente de IA.&lt;/LI&gt;
&lt;LI data-line="145"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/overview" data-href="https://learn.microsoft.com/azure/ai-services/agents/overview" target="_blank"&gt;Azure AI Agent Service - Tools&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre as ferramentas disponíveis no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="146"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/function-calling?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/function-calling?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Function Calling&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre chamadas de função no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="147"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/code-interpreter?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/code-interpreter?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Code Interpreter&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre o interpretador de código no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="148"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/azure-ai-search?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/azure-ai-search?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Azure AI Search&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre o Azure AI Search no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="149"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Bing Search&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre o Bing Search no serviço de agentes de IA.&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Wed, 07 May 2025 17:37:50 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/crie-seu-primeiro-agente-de-ia-com-javascript-e-azure-ai-agent/ba-p/4411651</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-05-07T17:37:50Z</dc:date>
    </item>
    <item>
      <title>Conectando o Azure Vmware Solution (AVS) com VPN Site to Site em topologia Hub Spoke.</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/conectando-o-azure-vmware-solution-avs-com-vpn-site-to-site-em/ba-p/4410454</link>
      <description>&lt;P&gt;A conexão de VPN entre AVS e o ambiente On-premises na maioria das vezes é realizada através do Virtual WAN, conforme descrito em: &lt;U&gt;https://learn.microsoft.com/en-us/azure/azure-vmware/configure-site-to-site-vpn-gateway&lt;/U&gt;.&lt;/P&gt;
&lt;P&gt;Contudo, caso necessário utilizar em uma topologia Hub-Spoke, existem componentes adicionais que devem ser considerados para permitir o trânsito entre o ExpressRoute do AVS e o VPN Gateway, bem como a propagação das rotas para o ambiente On-premises, assim como é feito por padrão com o Virtual WAN.&lt;/P&gt;
&lt;P&gt;Nesta topologia, o Azure Route Server deve ser integrado para habilitar esse trânsito (propagação de rotas)&amp;nbsp;&lt;/P&gt;
&lt;P&gt;O objetivo deste artigo é demonstrar em um ambiente de laboratório como conectar um ambiente On-premises com o Azure VMware Solution (AVS) através de uma VPN Site-to-Site em topologia Hub-Spoke.&lt;/P&gt;
&lt;P&gt;Arquitetura do Laboratório com topologia Hub-Spoke.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Componentes Azure.&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Vnet 10.90.0.0/16 com 3 Subnets.
&lt;UL&gt;
&lt;LI&gt;Gateway Subnet - 10.90.0.0/24&lt;/LI&gt;
&lt;LI&gt;RouteServerSubnet - 10.90.1.0/24&lt;/LI&gt;
&lt;LI&gt;VmSubnet : 10.90.2.0/24&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Virtual Network Gateway - VPN&lt;/LI&gt;
&lt;LI&gt;Virtual Network Gateway - Express Route&lt;/LI&gt;
&lt;LI&gt;Azure Route Server&lt;/LI&gt;
&lt;LI&gt;Azure Vm Linux Ubuntu&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Componentes On-premises&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Firewall VPN PfSense - 192.168.90.0/24 , 192.168.200.0/22 , 192.168.92.0/24&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Componetes Azure Vmware Solution&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;VMware SDDC&lt;/LI&gt;
&lt;LI&gt;Circuito Express Route&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;*Este laboratório presume que os componentes como o Azure Vmware Solution e ambiente On-premises com Pfsense ou qualquer outro equipamento esteja presente.&lt;/P&gt;
&lt;H5&gt;1. Deploy componentes Azure&lt;/H5&gt;
&lt;LI-CODE lang="bash"&gt;# 1. Variáveis - Altere conforme necessário
RESOURCE_GROUP="rg-avs-lab"
LOCATION="eastus2"
VNET_NAME="vnet-avs-lab"
VNET_ADDRESS_PREFIX="10.90.0.0/16"
SUBNET_GATEWAY_PREFIX="10.90.0.0/24"
SUBNET_ROUTE_SERVER_PREFIX="10.90.1.0/24"
SUBNET_GATEWAY_NAME="GatewaySubnet"
SUBNET_ROUTE_SERVER_NAME="RouteServerSubnet"

EXPRESSROUTE_GW_NAME="er-avs-lab"
VPN_GW_NAME="vpn-avs-lab"
VPN_GW_IP1_NAME="vpn-gw-ip1"
VPN_GW_IP2_NAME="vpn-gw-ip2"
VPN_GW_ASN=65515

EXPRESSROUTE_IP_NAME="er-ip"
LOCAL_NETWORK_GATEWAY_NAME="local-gw-avs-lab"
BGP_PEER_IP="192.168.90.1"
ASN_LOCAL=65503

ROUTE_SERVER_NAME="rserver-avs-lab"

# Variáveis para subnet e VM
SUBNET_VM_NAME="subnet-vm"
SUBNET_VM_PREFIX="10.90.5.0/24"
VM_NAME="vm-ubuntu"
VM_ADMIN_USERNAME='azureuser'
VM_ADMIN_PASSWORD='P@ssword123!' # Use um método seguro em produção
VM_NIC_NAME="vm-ubuntu-nic"
VM_IMAGE="Canonical:0001-com-ubuntu-server-focal:20_04-lts:latest"
VM_SIZE="Standard_B2ms"

# 2. Criar grupo de recursos
az group create --name $RESOURCE_GROUP --location $LOCATION

# 3. Criar VNet e subnets
az network vnet create \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --name $VNET_NAME \
  --address-prefixes $VNET_ADDRESS_PREFIX \
  --subnet-name $SUBNET_GATEWAY_NAME \
  --subnet-prefix $SUBNET_GATEWAY_PREFIX

az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --name $SUBNET_ROUTE_SERVER_NAME \
  --address-prefix $SUBNET_ROUTE_SERVER_PREFIX

# Criar subnet para a VM
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --name $SUBNET_VM_NAME \
  --address-prefix $SUBNET_VM_PREFIX

# 4. Criar IP público para ExpressRoute
az network public-ip create \
  --resource-group $RESOURCE_GROUP \
  --name $EXPRESSROUTE_IP_NAME \
  --sku Standard \
  --allocation-method Static

# 5. Criar Gateway ExpressRoute
az network vnet-gateway create \
  --resource-group $RESOURCE_GROUP \
  --name $EXPRESSROUTE_GW_NAME \
  --location $LOCATION \
  --vnet $VNET_NAME \
  --public-ip-addresses $EXPRESSROUTE_IP_NAME \
  --gateway-type ExpressRoute \
  --sku Standard 

# 6. Criar IPs públicos para VPN Gateway ativo-ativo
az network public-ip create \
  --resource-group $RESOURCE_GROUP \
  --name $VPN_GW_IP1_NAME \
  --sku Standard \
  --allocation-method Static

az network public-ip create \
  --resource-group $RESOURCE_GROUP \
  --name $VPN_GW_IP2_NAME \
  --sku Standard \
  --allocation-method Static

# 7. Criar VPN Gateway 
az network vnet-gateway create \
  --resource-group $RESOURCE_GROUP \
  --name $VPN_GW_NAME \
  --location $LOCATION \
  --vnet $VNET_NAME \
  --public-ip-addresses $VPN_GW_IP1_NAME $VPN_GW_IP2_NAME \
  --gateway-type Vpn \
  --vpn-type RouteBased \
  --sku VpnGw1

# Após a criação, configurar ativo-ativo e BGP
az network vnet-gateway update \
  --resource-group $RESOURCE_GROUP \
  --name $VPN_GW_NAME \
  --set activeActive=true enableBgp=true bgpSettings.asn=$VPN_GW_ASN

# 8. Criar Local Network Gateway com BGP e ASN
az network local-gateway create \
  --resource-group $RESOURCE_GROUP \
  --name $LOCAL_NETWORK_GATEWAY_NAME \
  --gateway-ip-address $BGP_PEER_IP \
  --local-address-prefixes "192.168.90.0/24" \
  --asn $ASN_LOCAL \
  --bgp-peering-address $BGP_PEER_IP \
  --location $LOCATION

# 9. Criar conexão VPN entre o Gateway de VPN e o Local Network Gateway
az network vpn-connection create \
  --resource-group $RESOURCE_GROUP \
  --name vpn-s2s-connection \
  --vnet-gateway1 $VPN_GW_NAME \
  --local-gateway2 $LOCAL_NETWORK_GATEWAY_NAME \
  --shared-key 'teste@123' \
  --enable-bgp


# 10. Criar NIC para a VM 
az network nic create \
  --resource-group $RESOURCE_GROUP \
  --name $VM_NIC_NAME \
  --vnet-name $VNET_NAME \
  --subnet $SUBNET_VM_NAME

# 12. Criar VM com Ubuntu
az vm create \
  --resource-group $RESOURCE_GROUP \
  --name $VM_NAME \
  --nics $VM_NIC_NAME \
  --image $VM_IMAGE \
  --admin-username $VM_ADMIN_USERNAME \
  --admin-password $VM_ADMIN_PASSWORD \
  --size $VM_SIZE \
  --location $LOCATION&lt;/LI-CODE&gt;
&lt;H5&gt;2. Conectando o Express Route do AVS no VPN Gateway da Hub.&lt;/H5&gt;
&lt;P&gt;No Virtual Network Gateway de ER , adicione uma conexão&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Defina o connection type como ExpressRoute&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;No AVS, copie o authorization key e o ExpressRoute ID&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Para este cenário será utilizado o modelo de resiliência standard, o Virtual network gateway, informe um nome para conexão, insira a "authorization key" e "ExpressRoute ID" (per cirtuit URI) copiados nos passos acima e execute o deploy.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Verificando que a conexão foi estabelecida com sucesso.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Verificando as rotas na Vm de teste.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Ao verificar as rotas do Pfsense ( onprem) ,&amp;nbsp; é possível observar que não temos as rotas do AVS, somente da Vnet do Azure.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Para habilitar o trânsito e troca de rotas entre o Express Route do AVS e o VPN gateway precisamos inserir o Azure Route Server.&lt;/P&gt;
&lt;H5&gt;3. Deploy do Azure Route Server.&lt;/H5&gt;
&lt;LI-CODE lang="bash"&gt;
#Criar Azure Route Server 
#Cria Public IP para o Route Server
az network public-ip create --resource-group $RESOURCE_GROUP --name routeserver-pip --sku Standard --allocation-method Static

# Identifica o ID da Subnet do Route Server
SUBNET_ID=$(az network vnet subnet list --resource-group $RESOURCE_GROUP --vnet-name $VNET_NAME --query "[?name=='$SUBNET_ROUTE_SERVER_NAME'].id" --output tsv)

# Cria o Route Server
az network routeserver create \
  --resource-group $RESOURCE_GROUP \
  --name $ROUTE_SERVER_NAME \
  --hosted-subnet $SUBNET_ID \
  --location $LOCATION \
  --public-ip-address routeserver-pip&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Após criado habilitamos a opção Branch-to-Branch&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Podemos verificar que agora as rotas do AVS (172.30.0.0/22), agora foram propagadas para o Pfsense.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Validando acesso ao Vcenter do AVS.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Referências:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/route-server/overview" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/route-server/overview&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/architecture/networking/architecture/hub-spoke" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/architecture/networking/architecture/hub-spoke&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 05 May 2025 14:46:04 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/conectando-o-azure-vmware-solution-avs-com-vpn-site-to-site-em/ba-p/4410454</guid>
      <dc:creator>LeandroBarbosa</dc:creator>
      <dc:date>2025-05-05T14:46:04Z</dc:date>
    </item>
    <item>
      <title>Migração de Aplicações Full Framework para Azure AKS e .NET Core</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/migra%C3%A7%C3%A3o-de-aplica%C3%A7%C3%B5es-full-framework-para-azure-aks-e-net-core/ba-p/4408306</link>
      <description>&lt;H2 data-selectable-paragraph=""&gt;Criando e Abrindo um projeto 4.7.2&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Vou criar o projeto no Visual Studio 2015, usando a versão FULL Framework&amp;nbsp; .NET 4.7 escolhi o template de uma aplicação ASP.NET Web Application. Este é um projeto pequeno, desses que já nascem prontos, vai servir bem para testar as ferramentas de migração.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Depois de criado o projeto, e é importante habilitar essa versão .NET Core no Visual Studio 2022, pois precisaremos abrir o projeto nessa IDE para usar as extensões. Caso você tenha algum projeto pronto em uma versão mais antiga do dotnet então basta usá-lo&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Depois de ter o projeto que vamos migrar, precisei instar o dotnet-appcat conforme essa doc &lt;A href="https://learn.microsoft.com/en-us/azure/migrate/appcat/dotnet" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment for .NET — Azure Migrate | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A documentação pende a instalando dessa extensão no visual studio &lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.appcat" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment — Visual Studio Marketplace&lt;/A&gt; depois disso podemos abri o projeto pelo Visual Studio 2022 e já e vamos encontrar a opção &lt;STRONG&gt;re-plataform to Azure&lt;/STRONG&gt; clicando com botão direito no projeto ou na solution.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Se escolhermos clicar na solution o item &lt;STRONG&gt;re-plataform to Azure&amp;nbsp;&lt;/STRONG&gt;disponibilizara&amp;nbsp;a opção new report&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Então vamos escolher para qual o tipo de computação a aplicação vai ser migrada&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;E como escolhemos a solution, agora vamos selecionar os projetos que queremos analisar&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Um relatório com as issues será apresentado&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;entramos na issue e podemos ver a opção de perguntar para o copilot&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Resposta do copilot para um issue especifica&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;E é isso basta ir resolvendo as issues, com essa ferramenta você pode verificar o código-fonte, configurações e binários da sua aplicação para encontrar oportunidades de migração para o Azure. Ele vai ajudar a identificar problemas ao mover sua aplicação para o Azure e melhora o desempenho, escalabilidade e segurança, sugerindo soluções modernas e nativas da nuvem.&lt;/P&gt;
&lt;H1 data-selectable-paragraph=""&gt;NET Upgrade Assistant&lt;/H1&gt;
&lt;P data-selectable-paragraph=""&gt;Agora vamos pensar na migração do código, antigamente eu utilizava um cara chamado Portability Analyzer &lt;A href="https://learn.microsoft.com/pt-br/dotnet/standard/analyzers/portability-analyzer" target="_blank" rel="noopener"&gt;O .NET Portability Analyzer — .NET — .NET | Microsoft Learn&lt;/A&gt;, mas ele foi descontinuado e no lugar agora temos o &lt;STRONG&gt;Assistente de Atualização do .NET&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Vou escolher um projeto por vez, clicando com o botão direito sobre o projeto e selecionando a opção 'update'. Esse método, em vez de gerar um relatório com as issues, tenta uma conversão direta de código. Na maioria das vezes, ele apenas faz o retarget, mas mesmo assim ajuda&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;No caso de um projeto WEB, a melhor opção é criar um novo projeto, pois ele vai criar uma espécie de proxy para permitir a migração paralela dos controllers&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Selecionar o framework para 8&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O assistente vai criar o projeto .net core, mas apenas uma casca, sem ter migrado ó código de fato&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A partir disso, precisamos voltar ao projeto original onde começamos a migração e clicar novamente em '&lt;STRONG&gt;update&lt;/STRONG&gt;' usando o botão direito sobre esse projeto. Então, será possível migrar controller por controller. Cada controller migrada leva consigo suas dependência&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Escolher a solution&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Também podemos escolher a solution que contém vários projetos. Nesse caso, vou clicar na solution e não no projeto. Veja que agora, em vez de converter, ele me dá a opção de criar um relatório.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;e então ele analisa projeto por projeto e gera as issues para serem corrigidas&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;aqui também consegui pedir ajuda do copilot paras as issues, e assim fica muito mais prático do que o Portability Analyzer&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O Assistente de Atualização do .NET ajuda a atualizar projetos para versões mais recentes do .NET e analisa seu código para detectar e corrigir possíveis incompatibilidades. Um foco da ferramenta é ajudar a migrar um projeto do .NET Framework, .NET Core ou .NET para a versão mais recente do .NET. Você usa a extensão ou a ferramenta para atualizar projetos inteiros do .NET ou algum aspecto do projeto, como a migração de um arquivo de configuração de um tipo mais antigo para um tipo mais recente.&lt;/P&gt;
&lt;H1 data-selectable-paragraph=""&gt;Podemos utilizar a CLI&lt;/H1&gt;
&lt;LI-CODE lang="powershell"&gt;upgrade-assistant --help&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;para iniciar o assistente use o comando&lt;/P&gt;
&lt;LI-CODE lang="powershell"&gt;upgrade-assistant upgrade&lt;/LI-CODE&gt;
&lt;P data-selectable-paragraph=""&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Script para fazer vários projetos&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="powershell"&gt;upgrade-assistant upgrade# Defina o diretório raiz $rootDir = "..." $destDir = "..." # Obtenha todos os arquivos .csproj no diretório raiz e subdiretórios $csprojFiles = Get-ChildItem -Path $rootDir -Recurse -Filter *.csproj # Execute o comando upgrade-assistant para cada arquivo .csproj foreach ($file in $csprojFiles) { Write-Host "Executando upgrade-assistant para $($file.FullName)" Start-Process -FilePath "upgrade-assistant" -ArgumentList "upgrade $($file.FullName) --operation Inplace --targetFramework net8.0 --destination ${destDir} " -Wait }&lt;/LI-CODE&gt;
&lt;H2 data-selectable-paragraph=""&gt;Referência&lt;/H2&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/migrate/appcat/dotnet" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment for .NET — Azure Migrate | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://dotnet.microsoft.com/pt-br/download/dotnet-framework" target="_blank" rel="noopener"&gt;Baixar .NET Framework | Downloads oficiais gratuitos&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/dotnet/standard/analyzers/portability-analyzer" target="_blank" rel="noopener"&gt;O .NET Portability Analyzer — .NET — .NET | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/en-us/dotnet/core/porting/upgrade-assistant-overview" target="_blank" rel="noopener"&gt;.NET Upgrade Assistant Overview — .NET Core | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.upgradeassistant" target="_blank" rel="noopener"&gt;.NET Upgrade Assistant — Visual Studio Marketplace&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.appcat" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment — Visual Studio Marketplace&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://wilsonsantosnet.medium.com/migra%C3%A7%C3%A3o-net-core-2-2-3-1-d92f67d71d73" target="_blank" rel="noopener"&gt;Migração dotnet core 2.2 para 3.1 | by Wilson Santos | Medium&lt;/A&gt;&lt;/LI&gt;
&lt;/OL&gt;</description>
      <pubDate>Mon, 28 Apr 2025 12:18:09 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/migra%C3%A7%C3%A3o-de-aplica%C3%A7%C3%B5es-full-framework-para-azure-aks-e-net-core/ba-p/4408306</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2025-04-28T12:18:09Z</dc:date>
    </item>
    <item>
      <title>Destaques do VS Code Live: Agent Mode Day</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/destaques-do-vs-code-live-agent-mode-day/ba-p/4406750</link>
      <description>&lt;div data-video-id="https://www.youtube.com/watch?v=HNly8eNtCtA/1745347578164" data-video-remote-vid="https://www.youtube.com/watch?v=HNly8eNtCtA/1745347578164" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FHNly8eNtCtA%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DHNly8eNtCtA&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FHNly8eNtCtA%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P&gt;&lt;STRONG&gt;🎙️ Palestrantes:&amp;nbsp;&lt;/STRONG&gt;&lt;A href="https://x.com/OliviaGuzzardo" target="_blank" rel="noopener"&gt;Olivia McVicker&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/cassidoo" target="_blank" rel="noopener"&gt;Cassidy Williams&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/burkeholland" target="_blank" rel="noopener"&gt;Burke Holland&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/digitarald" target="_blank" rel="noopener"&gt;Harald Kirschner&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/toby" target="_blank" rel="noopener"&gt;Toby Padilla&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/roblourens" target="_blank" rel="noopener"&gt;Rob Lourens&lt;/A&gt;,&amp;nbsp;&lt;A href="https://www.linkedin.com/in/timrogers1/" target="_blank" rel="noopener"&gt;Tim Rogers&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/JamesMontemagno" target="_blank" rel="noopener"&gt;James Montemagno&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/donjayamanne" target="_blank" rel="noopener"&gt;Don Jayamanne&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/BrigitMurtaugh" target="_blank" rel="noopener"&gt;Brigit Murtaugh&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/geektrainer" target="_blank" rel="noopener"&gt;Chris Harrison&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;O que é o Agent Mode?&lt;/H2&gt;
&lt;P&gt;O Agent Mode no VS Code representa um avanço além da tradicional sugestão de código por IA. Em vez de apenas sugerir trechos de código, o Agent Mode permite que a IA:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Escreva, edite e itere sobre o código&lt;/LI&gt;
&lt;LI&gt;Execute comandos no terminal de forma autônoma&lt;/LI&gt;
&lt;LI&gt;Corrija seus próprios erros durante o fluxo de trabalho&lt;/LI&gt;
&lt;LI&gt;Interaja com ferramentas externas, APIs e serviços&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Isso cria um parceiro de codificação mais dinâmico e “agente”, capaz de automatizar tarefas complexas, reduzir intervenções manuais e manter o desenvolvedor no fluxo. O Agent Mode está disponível diretamente no VS Code e se integra perfeitamente ao GitHub Copilot, tornando recursos avançados de IA acessíveis a desenvolvedores de todos os níveis.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;1. Model Context Protocol (MCP)&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O MCP é um protocolo aberto que padroniza como aplicações fornecem contexto para Modelos de Linguagem de Grande Escala (LLMs). Ele serve como uma ponte, permitindo que agentes de IA no VS Code se conectem de forma segura a um vasto ecossistema de ferramentas, APIs e recursos internos — muito além do que está disponível nativamente.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Principais pontos sobre o MCP:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Abordagem de ecossistema: permite conectar Copilot e outros agentes a tudo que for necessário — documentação interna, bancos de dados, ferramentas de design como Figma, etc.&lt;/LI&gt;
&lt;LI&gt;Aberto e extensível: qualquer pessoa pode criar e compartilhar novas integrações, com milhares de servidores MCP já disponíveis.&lt;/LI&gt;
&lt;LI&gt;Encadeamento de ferramentas: servidores MCP podem ser combinados, permitindo que a IA automatize fluxos de trabalho que envolvem múltiplas ferramentas.&lt;/LI&gt;
&lt;LI&gt;Seguro e em evolução: o protocolo está evoluindo para suportar autenticação mais segura e facilitar a descoberta e instalação de integrações.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;STRONG&gt;2. Next Edit Suggestions (NES)&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O Next Edit Suggestions (NES) é um recurso projetado para aprimorar a experiência de edição, oferecendo recomendações contextuais para mudanças no código. O NES auxilia desenvolvedores sugerindo edições relevantes com base no contexto atual, apoiando tarefas como refatoração, correção de bugs e adição de funcionalidades. Ele permite aceitar, desfazer ou iterar rapidamente sobre mudanças sugeridas pela IA, mantendo o controle total sobre o código.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;3. Bring Your Own Key (BYOK): Integração de Modelos de IA Personalizados&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O BYOK permite que usuários conectem suas próprias chaves de API para modelos de IA personalizados, incluindo OpenAI, Anthropic ou até modelos locais. Com o BYOK, desenvolvedores podem escolher entre vários modelos, integrar soluções locais ou em nuvem por motivos de privacidade, custo ou desempenho, e adaptar a experiência da IA às suas necessidades específicas.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;4. &lt;/STRONG&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;O Futuro Agente&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Uma prévia do “Project Padawan” mostrou que fluxos de trabalho agentes poderão rodar de forma assíncrona na nuvem. Será possível delegar tarefas ao Copilot (como resolver issues do GitHub), que criará pull requests, executará testes e iterará sobre feedbacks de forma autônoma, enquanto o desenvolvedor foca em outras atividades.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;STRONG&gt;GitHub Copilot Skills Challenge&lt;BR /&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Quer aprender e experimentar o Agent Mode do GitHub Copilot enquanto conquista um Selo Digital? Participe do GitHub Copilot Skills Challenge — uma experiência prática de aprendizado no Microsoft Learn, onde você construirá um aplicativo Python usando o Agent Mode por meio de um tutorial guiado. Complete o desafio até 30 de abril de 2025 para ganhar seu selo!&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Confira as regras oficiais:&amp;nbsp;&lt;A href="https://aka.ms/csc/terms" target="_blank" rel="noopener"&gt;https://aka.ms/csc/terms&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Inscreva-se no Desafio: &lt;A href="https://aka.ms/csc/githubcopilot" target="_blank" rel="noopener"&gt;https://aka.ms/csc/githubcopilot&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Solicite seu selo em: &lt;A href="https://aka.ms/getyourbadge" target="_blank" rel="noopener"&gt;https://aka.ms/getyourbadge&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Como começar&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://aka.ms/AAvrhq0" target="_blank"&gt;Ative o Agent Mode &lt;/A&gt;— disponível nas versões estável e insiders do VS Code — para experimentar esses recursos avançados de IA. Explore integrações MCP navegando pela lista de servidores ou criando o seu próprio com os SDKs disponíveis.&lt;/P&gt;
&lt;P&gt;Quer ver essas funcionalidades em ação? Assista ao stream completo para demonstrações ao vivo, dicas de especialistas e marque a data para o próximo episódio da nossa série VS Code Live: &lt;A class="lia-external-url" href="https://aka.ms/VSCode/Live" target="_blank"&gt;https://aka.ms/VSCode/Live&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Happy coding!&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 22 Apr 2025 19:04:13 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/destaques-do-vs-code-live-agent-mode-day/ba-p/4406750</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-04-22T19:04:13Z</dc:date>
    </item>
    <item>
      <title>Modo Agente disponível para todos os usuários do VS Code e com suporte a MCP</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/modo-agente-dispon%C3%ADvel-para-todos-os-usu%C3%A1rios-do-vs-code-e-com/ba-p/4401754</link>
      <description>&lt;P&gt;&lt;STRONG&gt;O Modo Agente está sendo lançado para todos os usuários do VS Code! &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O agente atua como um programador autônomo que realiza tarefas de codificação em várias etapas sob seu comando, como analisar sua base de código, propor edições de arquivos e executar comandos no terminal. Ele responde a erros de compilação e lint, monitora a saída do terminal e corrige automaticamente em um loop até que a tarefa seja concluída.&lt;/P&gt;
&lt;P&gt;O agente também pode usar ferramentas contribuídas, permitindo que ele interaja com servidores MCP externos ou extensões do VS Code para realizar uma ampla variedade de tarefas.&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/GCTap89a8Fw/1744060633299" data-video-remote-vid="https://youtu.be/GCTap89a8Fw/1744060633299" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FGCTap89a8Fw%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGCTap89a8Fw&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FGCTap89a8Fw%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;H2&gt;&lt;STRONG&gt;Disponível para todos os usuários&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Abra a visualização de Chat, faça login no GitHub, configure&amp;nbsp;chat.agent.enabled&amp;nbsp;nas suas configurações e selecione Agente no menu suspenso do modo de Chat. Se você não vir a configuração, certifique-se de recarregar o VS Code após atualizar para a versão mais recente. Nas próximas semanas, estamos lançando isso por padrão para todos - nenhuma configuração será necessária.&lt;/P&gt;
&lt;P&gt;O modo Agente é ótimo para cenários onde:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Sua tarefa envolve várias etapas. O agente edita o código, executa comandos no terminal, monitora erros e itera para resolver quaisquer problemas que surgirem.&lt;/LI&gt;
&lt;LI&gt;Você não tem certeza sobre o escopo das mudanças. O agente determina automaticamente os arquivos e o contexto relevantes.&lt;/LI&gt;
&lt;LI&gt;Sua tarefa requer interação com aplicativos ou dados externos. O agente se integra com servidores MCP e extensões do VS Code.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Por outro lado, use o modo de edição quando a tarefa tiver um escopo bem definido, você quiser uma resposta rápida ou quiser um controle mais preciso sobre o número de solicitações ao LLM.&lt;/P&gt;
&lt;P&gt;Criamos uma experiência de chat unificada, combinando as visualizações de Chat e Edições, que traz benefícios como histórico de sessões, mover o chat para uma janela separada e simplificação da visualização do Conjunto de Trabalho. Tudo isso agora também está disponível no modo Agente.&lt;/P&gt;
&lt;P&gt;Continuamos a receber um feedback fantástico dos usuários (&lt;A href="http://github.com/microsoft/vscode-copilot-release/issues/" target="_blank"&gt;por favor, continuem enviando!&lt;/A&gt;), o que inspirou muitas das melhorias que fizemos. Mais notavelmente:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A ação de desfazer agora reverte as mudanças até a última chamada da ferramenta de edição de arquivos.&lt;/LI&gt;
&lt;LI&gt;Suporte para múltiplas sessões de agente no mesmo workspace (melhor quando as sessões de edição não modificam os mesmos arquivos).&lt;/LI&gt;
&lt;LI&gt;O agente agora pode criar e editar notebooks.&lt;/LI&gt;
&lt;LI&gt;A capacidade de aprovar automaticamente chamadas de ferramentas (aprovação automática de terminal chegando em abril).&lt;/LI&gt;
&lt;LI&gt;Uma série de melhorias na qualidade de vida e correções de bugs.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Tanto as experiências de perguntar quanto de editar estão evoluindo para uma arquitetura que, como o agente, utiliza ferramentas. Estamos fazendo essa mudança para unificar os modos de perguntar/editar/agente para serem todos agenticos, com o objetivo de suavizar a experiência geral do usuário. Isso permite que o modo de edição use a ferramenta de edição de arquivos para melhorar a velocidade, e os modos de edição e pergunta usem #codebase, uma busca agentica na base de código. Consequentemente, modelos de linguagem sem suporte para chamadas de ferramentas não estarão mais disponíveis no modo de edição.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Extensível: Servidores MCP e Extensões do VS Code&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Assim como as extensões do VS Code permitem que você personalize seus fluxos de trabalho específicos, a extensibilidade do agente permite que você adapte o agente às suas necessidades. Com a extensibilidade, o agente pode realizar ações no navegador (depuração web com IA), conectar-se aos seus aplicativos de chat e de anotações, interagir com seus bancos de dados, obter contexto do seu sistema de design, obter problemas e contexto de repositório do GitHub e integrar-se com suas plataformas de nuvem. O poder do modo agente está na diversidade de ferramentas disponíveis e na flexibilidade de adicionar e remover ferramentas conforme necessário. Estamos lançando a extensibilidade em preview e disponível para todos os usuários.&lt;/P&gt;
&lt;P&gt;O modo agente pode usar as seguintes ferramentas:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Ferramentas integradas contribuídas pelo VS Code (azul no diagrama), que permitem ao agente pesquisar no workspace, aplicar mudanças de código, executar comandos no terminal, capturar erros de compilação ou linting do editor, buscar conteúdo de sites (#fetch para acionar manualmente), e mais.&lt;/LI&gt;
&lt;LI&gt;Ferramentas contribuídas por servidores MCP (verde no diagrama).&lt;/LI&gt;
&lt;LI&gt;Ferramentas contribuídas por extensões do VS Code (verde no diagrama).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Quando a equipe do VS Code inventou o &lt;A href="https://microsoft.github.io/language-server-protocol/" target="_blank"&gt;Protocolo de Servidor de Linguagem (LSP)&lt;/A&gt; em &lt;A href="https://code.visualstudio.com/blogs/2016/06/27/common-language-protocol" target="_blank"&gt;2016&lt;/A&gt;, nosso objetivo era padronizar como os servidores de linguagem se comunicam com as ferramentas de desenvolvimento. Estamos orgulhosos de que o LSP se tornou um padrão amplamente adotado e cumpriu nossa visão. Recentemente, as &lt;A href="https://x.com/dsp_/status/1897821339332882617" target="_blank"&gt;ideias por trás do LSP&lt;/A&gt; inspiraram um novo protocolo: o &lt;A href="https://modelcontextprotocol.io/introduction" target="_blank"&gt;Protocolo de Contexto de Modelo (MCP)&lt;/A&gt;, que padroniza como as aplicações fornecem contexto para LLMs. Com o modo agente no VS Code usando ferramentas contribuídas por servidores MCP, agora completamos o ciclo de volta ao VS Code.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;É sobre controle do desenvolvedor&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Nem toda tarefa precisa de todas as ferramentas que você pode ter adicionado ao modo agente, e como em qualquer fluxo de trabalho de IA, ser específico leva a melhores resultados. Recomendamos usar a interface de ferramentas para gerenciar e habilitar as ferramentas necessárias para cada cenário ou referenciar explicitamente as ferramentas em seu prompt digitando&lt;STRONG&gt; #&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Para lhe dar total controle, cada invocação de ferramenta é exibida de forma transparente na interface e requer sua aprovação (exceto para ferramentas integradas de leitura). Você pode permitir uma ferramenta específica para a sessão atual, workspace ou todas as invocações futuras. Se você quiser minimizar interrupções permitindo sempre que o agente use todas as ferramentas, enquanto ainda mantém a segurança, considere usar a extensão &lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank"&gt;Dev Containers&lt;/A&gt;. Isso isola todas as mudanças feitas pelo agente dentro do ambiente do contêiner até certo ponto (por exemplo, o agente ainda pode enviar mudanças para o remoto se você permitir).&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Comece agora&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Para personalizar o agente para seus fluxos de trabalho, selecione o ícone de &lt;STRONG&gt;"Ferramentas"&lt;/STRONG&gt; na entrada do chat e siga o fluxo &lt;STRONG&gt;Adicionar Mais Ferramentas&lt;/STRONG&gt;.... Alternativamente, &lt;A href="https://aka.ms/vscode-add-mcp" target="_blank"&gt;leia nossa documentação do servidor MCP&lt;/A&gt;, que explica o formato de configuração, como adicionar um servidor MCP ou como importar servidores MCP de um aplicativo cliente MCP existente, como o Claude Desktop. O VS Code suporta entrada/saída padrão local (&lt;STRONG&gt;stdio&lt;/STRONG&gt;) e eventos enviados pelo servidor (&lt;STRONG&gt;sse&lt;/STRONG&gt;) para transporte de servidor MCP.&lt;/P&gt;
&lt;P&gt;O &lt;A href="https://github.com/modelcontextprotocol/servers" target="_blank"&gt;repositório oficial de servidores do MCP&lt;/A&gt; é um ótimo ponto de partida para servidores oficiais e contribuídos pela comunidade que mostram a versatilidade do MCP. Para instalar extensões que contribuem com ferramentas, abra a visualização de Extensões e pesquise usando a tag &lt;STRONG&gt;@tag:language-model-tools.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Como desenvolvedor, você pode estender o agente criando um servidor MCP, ou se você é um autor de extensão, pode &lt;A href="https://marketplace.visualstudio.com/search?term=%40tag%3Alanguage-model-tools&amp;amp;target=VSCode&amp;amp;category=All%20categories&amp;amp;sortBy=Relevance"&gt;contribuir com ferramentas&lt;/A&gt; para sua extensão do VS Code. Consulte &lt;A href="https://code.visualstudio.com/docs/copilot/copilot-extensibility-overview" target="_blank"&gt;estes documentos&lt;/A&gt; para orientações e melhores práticas sobre como escrever ferramentas.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;O que vem a seguir&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O modo Agente está melhorando a cada dia, e para estar entre os primeiros a se beneficiar, considere instalar o &lt;A href="https://code.visualstudio.com/insiders/" target="_blank"&gt;VS Code Insiders&lt;/A&gt;. Usar o VS Code Insiders e fornecer feedback em &lt;A href="http://github.com/microsoft/vscode-copilot-release/issues/" target="_blank"&gt;nosso repositório&lt;/A&gt; é a melhor maneira de nos ajudar a melhorar o produto. Em seguida, planejamos trabalhar em:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Suporte para modos personalizados com conjuntos de ferramentas e &lt;A href="https://code.visualstudio.com/docs/copilot/copilot-customization" target="_blank"&gt;instruções personalizadas&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Uma experiência de aplicação de código mais rápida&lt;/LI&gt;
&lt;LI&gt;Expandir o suporte MCP de ferramentas para prompts, recursos e as atualizações mais recentes das especificações&lt;/LI&gt;
&lt;LI&gt;Transmissão de edições limitada a blocos de código alterados para melhorar a velocidade&lt;/LI&gt;
&lt;LI&gt;Pontos de verificação para voltar facilmente a uma etapa específica na sua sessão de modo agente&lt;/LI&gt;
&lt;LI&gt;Melhorias gerais de desempenho e qualidade de serviço&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Certifique-se de estar na versão mais recente do VS Code Stable, configure&amp;nbsp;&lt;STRONG&gt;chat.agent.enabled&lt;/STRONG&gt;&amp;nbsp;nas suas configurações e selecione &lt;STRONG&gt;Agente &lt;/STRONG&gt;no menu suspenso do modo. Experimente hoje e nos diga o que você acha! Você pode encontrar a &lt;A href="https://aka.ms/vscode-copilot-agent" target="_blank"&gt;documentação aqui.&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 07 Apr 2025 21:17:34 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/modo-agente-dispon%C3%ADvel-para-todos-os-usu%C3%A1rios-do-vs-code-e-com/ba-p/4401754</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-04-07T21:17:34Z</dc:date>
    </item>
    <item>
      <title>Aprenda IA Generativa com JavaScript: Curso Gratuito e Interativo! 💡🤖</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aprenda-ia-generativa-com-javascript-curso-gratuito-e-interativo/ba-p/4399822</link>
      <description>&lt;P&gt;No vídeo mais recente do meu&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.youtube.com/@GlauciaLemos" data-href="https://www.youtube.com/@GlauciaLemos" target="_blank"&gt;Canal do YouTube&lt;/A&gt;&lt;/STRONG&gt;, o time de Advocacia de JavaScript + A.I da Microsoft apresenta uma iniciativa inovadora para desenvolvedores que querem dar os primeiros passos com Inteligência Artificial: o curso gratuito&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/microsoft/generative-ai-with-javascript" data-href="https://github.com/microsoft/generative-ai-with-javascript" target="_blank"&gt;Generative AI with JavaScript&lt;/A&gt;&lt;/STRONG&gt;. Combinando aprendizado técnico com uma experiência gamificada, o curso é uma excelente porta de entrada para quem deseja explorar IA Generativa usando JavaScript/TypeScript.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Vamos falar um pouco mais sobre o curso e como ele pode ajudar você a se tornar um desenvolvedor mais habilidoso e atualizado com as últimas tendências em tecnologia.&lt;/P&gt;
&lt;H2 data-line="10"&gt;&lt;STRONG&gt;Sobre o Curso: Generative AI with JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Gravei um vídeo onde explico os principais conceitos abordados no curso, incluindo técnicas de IA Generativa, exemplos práticos e dicas para maximizar seu aprendizado. Se você não assistiu, deixo o link abaixo&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://youtu.be/LfmtHe4oJm4?si=_wgnFrs4Lhyuj_Gx" data-href="https://youtu.be/LfmtHe4oJm4?si=_wgnFrs4Lhyuj_Gx" target="_blank"&gt;em português, com legendas em inglês&lt;/A&gt;.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://www.youtube.com/watch?v=LfmtHe4oJm4" data-video-remote-vid="https://www.youtube.com/watch?v=LfmtHe4oJm4" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FLfmtHe4oJm4%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DLfmtHe4oJm4&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FLfmtHe4oJm4%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P data-line="16"&gt;O vídeo começa com uma introdução ao repositório do curso,&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/microsoft/generative-ai-with-javascript" data-href="https://github.com/microsoft/generative-ai-with-javascript" target="_blank"&gt;hospedado na organização oficial da Microsoft no GitHub&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-line="18"&gt;O curso propõe uma abordagem única, utilizando o conceito de viagens no tempo, onde você interage com personagens históricos como Leonardo da Vinci, Ada Lovelace, Montezuma e muitos outros, enquanto aprende os fundamentos de IA.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Essa narrativa envolvente é suportada por conteúdo técnico sólido. Cada lição contém material didático em formato de leitura, desafios práticos com exercícios e quizzes, além de um aplicativo complementar onde você pode conversar com os personagens históricos usando modelos de linguagem (LLMs). A combinação de storytelling e tecnologia torna o processo de aprendizado imersivo e acessível.&lt;/P&gt;
&lt;H2 data-line="26"&gt;&lt;STRONG&gt;A experiencia do Curso&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Durante o vídeo, eu fiz uma tour completa pelo repositório, destacando que o curso ainda está em inglês &lt;STRONG&gt;(&lt;A href="https://github.com/microsoft/generative-ai-with-javascript/blob/main/lessons/01-intro-to-genai/translations/README.pt-br.md" data-href="https://github.com/microsoft/generative-ai-with-javascript/blob/main/lessons/01-intro-to-genai/translations/README.pt-br.md" target="_blank"&gt;agora já está disponível em português&lt;/A&gt;!!)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="32"&gt;O curso está estruturado em cinco lições iniciais, com a promessa de atualizações frequentes, acompanhando a evolução acelerada do campo de IA Generativa. Hoje falamos de RAG (Retrieval Augmented Generation), amanhã já estamos explorando Model Context Protocol e agentes inteligentes. Por isso, o repositório deve ser visto como um projeto vivo e em constante expansão.&lt;/P&gt;
&lt;P data-line="34"&gt;Para começar a estudar o curso, você pode tanto clonar o repositório localmente quanto usar o GitHub Codespaces, uma alternativa recomendada no vídeo. Com 60 horas gratuitas por mês, o Codespaces permite iniciar o ambiente de desenvolvimento completo direto do navegador, sem necessidade de instalações locais. Essa praticidade democratiza o acesso ao conteúdo, especialmente para quem tem recursos limitados.&lt;/P&gt;
&lt;P data-line="36"&gt;Uma vez dentro do Codespaces, você encontrará um ambiente pré-configurado com todas as dependências necessárias para executar os exemplos e desafios do curso. O repositório contém um arquivo&amp;nbsp;&lt;STRONG&gt;README.md&lt;/STRONG&gt;&amp;nbsp;com instruções detalhadas sobre como configurar o ambiente, além de links para o aplicativo complementar e outros recursos úteis.&lt;/P&gt;
&lt;P data-line="38"&gt;Na primeira lição, por exemplo, os alunos aprendem sobre os fundamentos da IA Generativa e os LLMs, explorando suas aplicações e limitações no contexto de desenvolvimento com JavaScript. Além do conteúdo textual, há um vídeo introdutório e slides complementares, oferecendo múltiplas formas de aprendizado.&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="42"&gt;&lt;STRONG&gt;Um Curso com Personagens Históricos!&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="44"&gt;Um dos pontos altos do curso é o &lt;STRONG&gt;Characters App&lt;/STRONG&gt;, uma aplicação interativa que simula conversas com figuras históricas utilizando LLMs. O vídeo mostra como rodar essa aplicação diretamente no Codespaces, bastando navegar até a pasta correta, executar os comandos&amp;nbsp;&lt;EM&gt;npm install&lt;/EM&gt;&amp;nbsp;e&amp;nbsp;&lt;EM&gt;npm run start&lt;/EM&gt;, e abrir a porta&amp;nbsp;&lt;EM&gt;3000&lt;/EM&gt;&amp;nbsp;no navegador integrado.&lt;/P&gt;
&lt;P data-line="46"&gt;Ao iniciar o app, os usuários podem escolher personagens como Dinocrates de Alexandria, Leonardo da Vinci, Ludovico Sforza, Montezuma e Ada Lovelace. Cada um responde com sua personalidade e contexto histórico, permitindo ao aluno experimentar diferentes estilos de interação com IA.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;A experiência é enriquecida com suporte a voz, dando ainda mais vida aos personagens e estimulando uma forma lúdica de compreender os conceitos de IA. É uma abordagem que combina aprendizado técnico com imersão cultural e histórica.&lt;/P&gt;
&lt;H2 data-line="52"&gt;&lt;STRONG&gt;Aprendizado Guiado com Exercícios&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Outro aspecto importante do curso é que ele não se limita a conceitos teóricos. Cada lição vem acompanhada de exercícios práticos, que desafiam o aluno a aplicar o que foi aprendido. O vídeo mostra onde localizar esses desafios e como encontrar as soluções propostas, o que ajuda tanto quem está começando quanto quem quer revisar seus conhecimentos.&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="58"&gt;A ideia é que você realmente se envolva com o conteúdo. Ao invés de apenas consumir o que está pronto, você é incentivado a tentar resolver os problemas por conta própria antes de consultar a solução. Essa abordagem ativa favorece a retenção do conhecimento.&lt;/P&gt;
&lt;P data-line="60"&gt;Além disso, há dicas úteis para configurar o ambiente, usar o GitHub Copilot e aproveitar as requisições gratuitas de modelos como Claude, Gemini e GPT-4o. O vídeo reforça que, hoje em dia, há múltiplas opções para quem deseja aprender e experimentar com IA sem precisar gastar dinheiro, entre elas o uso do GitHub Models!&lt;/P&gt;
&lt;H2 data-line="62"&gt;&lt;STRONG&gt;Conclusão&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="64"&gt;Fica o convite! Explore o curso com calma, interaja com os personagens, faça os exercícios e acompanhe todas as atualizações direto no repositório do curso. Assim, você estará sempre à frente no aprendizado de IA Generativa com JavaScript/TypeScript&lt;/P&gt;
&lt;P data-line="66"&gt;Se você ainda não explorou o curso, essa é a hora. Dê&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/microsoft/generative-ai-with-javascript/fork" data-href="https://github.com/microsoft/generative-ai-with-javascript/fork" target="_blank"&gt;um fork no repositório&lt;/A&gt;&lt;/STRONG&gt;, experimente o curso direto no&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/features/codespaces" data-href="https://github.com/features/codespaces" target="_blank"&gt;Codespaces&lt;/A&gt;&lt;/STRONG&gt;, converse com Da Vinci ou Ada Lovelace, e comece a construir seu próprio conhecimento em IA Generativa com JavaScript.&lt;/P&gt;
&lt;P data-line="68"&gt;Você está há um passo de se tornar expert em IA Generativa com JAvaScript - comece agora mesmo com um simples git clone!&lt;/P&gt;</description>
      <pubDate>Wed, 02 Apr 2025 00:27:37 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aprenda-ia-generativa-com-javascript-curso-gratuito-e-interativo/ba-p/4399822</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-04-02T00:27:37Z</dc:date>
    </item>
    <item>
      <title>Use IA de Graça com GitHub Models e TypeScript! 💸💸💸</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/use-ia-de-gra%C3%A7a-com-github-models-e-typescript/ba-p/4399817</link>
      <description>&lt;P data-line="6"&gt;A Inteligência Artificial está se tornando cada vez mais acessível para desenvolvedores. Porém, um dos maiores desafios ainda é o custo das APIs de modelos avançados, como GPT-4o e tantos outros. Felizmente, o&amp;nbsp;&lt;EM&gt;GitHub Models&lt;/EM&gt;&amp;nbsp;veio para mudar esse cenário! Agora, você pode experimentar IA de graça, sem precisar de uma chave de API paga ou baixar modelos pesados em suas máquinas locais.&lt;/P&gt;
&lt;P data-line="8"&gt;Neste artigo, vamos explicar em detalhes o que é o&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;e como utilizar gratuitamente com&amp;nbsp;&lt;STRONG&gt;TypeScript&lt;/STRONG&gt;&amp;nbsp;em um projeto prático. Escolhemos como exemplo o projeto&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" data-href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;, um projeto open source de microblog com funcionalidades de IA.&lt;/P&gt;
&lt;P data-line="10"&gt;Iremos abordar a estrutura desse projeto e demonstrar passo a passo como integrar com o GitHub Models, substituindo a necessidade de fazer uso de LLMs pagos, incluindo comparações de código&amp;nbsp;&lt;STRONG&gt;antes e depois&lt;/STRONG&gt;&amp;nbsp;das modificações. Também veremos como configurar e executar o projeto localmente, e discutiremos as vantagens e limitações do GitHub Models para prototipagem de projetos em IA.&lt;/P&gt;
&lt;P data-line="12"&gt;Pode ter certeza que, ao final deste artigo, você terá uma compreensão sólida do&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;e como utilizá-lo em seus próprios projetos e começar a explorar o mundo da IA de forma acessível e gratuita.&lt;/P&gt;
&lt;P data-line="14"&gt;Vamos lá!&lt;/P&gt;
&lt;H2 data-line="16"&gt;&lt;STRONG&gt;O que é o GitHub Models?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P data-line="20"&gt;O&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://docs.github.com/en/github-models" data-href="https://docs.github.com/en/github-models" target="_blank"&gt;GitHub Models&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;é uma iniciativa do GitHub que disponibiliza uma coleção de modelos de IA prontos para uso, integrados à plataforma. Pense no GitHub Models como um&amp;nbsp;&lt;EM&gt;Marketplace de Modelos de IA&lt;/EM&gt;: onde os desenvolvedores podem descobrir modelos de linguagem grande (LLMs) de diferentes provedores, testar suas capacidades em um playground interativo e incorporar em suas aplicações de forma simplificada.&lt;/P&gt;
&lt;P data-line="22"&gt;Há modelos de diversas origens e portes - por exemplo, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://platform.openai.com/docs/models/gpt-4o" data-href="https://platform.openai.com/docs/models/gpt-4o" target="_blank"&gt;OpenAI GPT-4o&lt;/A&gt;&lt;/STRONG&gt;, modelos Open Source como o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.llama.com/" data-href="https://www.llama.com/" target="_blank"&gt;Meta Llama 3.1&lt;/A&gt;&lt;/STRONG&gt;, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://azure.microsoft.com/products/phi?WT.mc_id=javascript-00000-gllemos" data-href="https://azure.microsoft.com/products/phi?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Phi-3&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;da Microsoft, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://mistral.ai/news/mistral-large-2407" data-href="https://mistral.ai/news/mistral-large-2407" target="_blank"&gt;Mistral Large 2&lt;/A&gt;&lt;/STRONG&gt;, entre outros. Todos podem ser acessados gratuitamente para fins de experimentação.&lt;/P&gt;
&lt;P data-line="24"&gt;Uma das grandes vantagens do GitHub Models é permitir o uso&amp;nbsp;&lt;STRONG&gt;gratuito&lt;/STRONG&gt;&amp;nbsp;desses modelos durante a fase de prototipagem. Ou seja, você pode testar e construir um proof of concept (POC) sem custos, utilizando a infraestrutura fornecida pelo GitHub. Na prática, existem duas maneiras de interagir com os modelos:&lt;/P&gt;
&lt;UL data-line="26"&gt;
&lt;LI data-line="26"&gt;&lt;STRONG&gt;Playground (interface web)&lt;/STRONG&gt;: nesse playground, você pode testar os modelos diretamente no navegador do GitHub. Nele, você pode fazer perguntas e obter respostas em tempo real com diferentes modelos, ajustar parâmetros (temperatura, número máximo de tokens e etc.) e até comparar lado a lado a saída de dois modelos diferentes.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL data-line="30"&gt;
&lt;LI data-line="30"&gt;&lt;STRONG&gt;Via API/SDK:&lt;/STRONG&gt;&amp;nbsp;agora, caso você necessite integrar algum modelo em um projeto, o GitHub Models também disponibiliza uma API REST e SDKs para diversas linguagens, como Python, JavaScript/TypeScript, Java, C#, e REST. Cada modelo possui um endpoint de inferência público. Você pode fazer chamadas HTTP para esses endpoints ou usar SDKs (como o SDK do Azure OpenAI ou o próprio SDK do GitHub Models) em diversas linguagens.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A autenticação é feita de forma simples com um token de acesso pessoal do GitHub (PAT), sem necessidade de chaves de API separadas. Basta gerar um PAT na sua conta do GitHub (sem escopos especiais, usando a opção Beta disponível)​, e usá-lo nas requisições. Em outras palavras, seu token do GitHub funciona como a credencial para chamar o modelo, dentro dos limites gratuitos de uso.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H3 data-line="36"&gt;&lt;STRONG&gt;Vantagens e Limitações&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-line="38"&gt;Mas, tudo que é gratuito tem suas limitações, certo? Então, vamos explicar as limitações do GitHub Models.&lt;/P&gt;
&lt;P data-line="40"&gt;Atualmente, há restrições de chamadas por minuto e por dia, quantidade de tokens por requisição e número de requisições simultâneas. Por exemplo, modelos de categoria low (menores) permitem algo em torno de 15 requisições por minuto e 150 por dia, enquanto modelos high (como o GPT-4o) possuem limites um pouco mais baixos por serem mais pesados​&lt;/P&gt;
&lt;P data-line="42"&gt;Mas, e se curtiu o modelo e desejar colocar em produção? Bom, nesse caso, o GitHub Models sugere a migração para um&amp;nbsp;&lt;EM&gt;endpoint&lt;/EM&gt;&amp;nbsp;pago do Azure – e o interessante é que basta trocar o token do GitHub por uma chave do Azure que o resto do código continuará funcionando, sem necessidade de alterações adicionais!&lt;/P&gt;
&lt;P data-line="44"&gt;Resumindo: o GitHub Models é uma maneira prática de&amp;nbsp;&lt;STRONG&gt;encontrar e experimentar modelos de IA de ponta gratuitamente&lt;/STRONG&gt;​. Com ele, desenvolvedores podem incorporar funcionalidades de IA em projetos TypeScript (ou de outras linguagens) usando apenas uma conta GitHub. A seguir, conheceremos o exemplo do Microblog AI Remix e, depois, veremos na prática como usar o GitHub Models nesse projeto.&lt;/P&gt;
&lt;H2 data-line="46"&gt;&lt;STRONG&gt;Microblog AI Remix com GitHub Models&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="48"&gt;O&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" data-href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;(ou simplesmente Microblog AI) é um projeto de exemplo que combina um aplicativo web de microblog com recursos de Inteligência Artificial. Ele foi criado para demonstrar como construir aplicações web modernas e escaláveis utilizando a stack da Microsoft Azure juntamente com técnicas de Server-Side Rendering (SSR) e IA generativa. Em alto nível, o Microblog AI permite que usuários criem e visualizem pequenos posts de blog (microblogs), contando com a ajuda de um modelo de IA avançado para gerar conteúdo a partir de sugestões do usuário.&lt;/P&gt;
&lt;P data-line="50"&gt;Aproveito para pedir a testarem o projeto, dando um fork e contribuindo com melhorias. O projeto é open source e pode ser testado no GitHub Codespaces. Deixa a sua estrela ⭐️ e contribua com melhorias!&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="54"&gt;Originalmente o projeto utiliza o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/cognitive-services/openai-service/overview" data-href="https://learn.microsoft.com/en-us/azure/cognitive-services/openai-service/overview" target="_blank"&gt;Azure OpenAI&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;como provedor de IA, mas vamos substituí-lo pelo&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://docs.github.com/en/github-models" data-href="https://docs.github.com/en/github-models" target="_blank"&gt;GitHub Models&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para proporcionar uma alternativa gratuita e acessível.&lt;/P&gt;
&lt;H3 data-line="56"&gt;&lt;STRONG&gt;Passo a Passo para Configurar o Microblog AI&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-line="58"&gt;Eu gravei um vídeo mostrando o passo a passo em como migrar o projeto para o GitHub Models. O vídeo está disponível no meu canal do YouTube (em português) e você pode assisti-lo aqui:&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/4Pv1BrdiZDg?si=0y_MHiKYlt0eeZfM/1741313546429" data-video-remote-vid="https://youtu.be/4Pv1BrdiZDg?si=0y_MHiKYlt0eeZfM/1741313546429" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F4Pv1BrdiZDg%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D4Pv1BrdiZDg&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F4Pv1BrdiZDg%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P data-line="62"&gt;Antes de tudo precisamos clonar o projeto e configurar as dependências. Siga os passos abaixo:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Clone o repositório oficial do Microblog AI Remix:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="bash"&gt;git clone https://github.com/Azure-Samples/microblog-ai-remix.git cd microblog-ai-remix&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2. Instale as dependências do projeto:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;npm install cd server npm install&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. Crie um arquivo .env na raiz do projeto e adicione as seguintes variáveis de ambiente:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;GITHUB_MODELS_ENDPOINT=https://models.inference.ai.azure.com GITHUB_MODELS_TOKEN=SEU_TOKEN&lt;/LI-CODE&gt;
&lt;P&gt;Esse token você pode gerar na sua conta do GitHub em&amp;nbsp;&lt;STRONG&gt;Settings &amp;gt; Developer Settings &amp;gt; Personal Access Tokens &amp;gt; Generate new token (beta)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;4. No diretório /server, crie o arquivo local.settings.json com o seguinte conteúdo:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node", "GITHUB_MODELS_ENDPOINT": "https://models.inference.ai.azure.com", "GITHUB_MODELS_TOKEN": "SEU_TOKEN" }, "Host": { "LocalHttpPort": 7071, "CORS": "*", "CORSCredential": true } }&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;5. Agora, vá até o arquivo: app/services/openaiService.ts e faça as seguintes alterações:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-line="111"&gt;
&lt;LI data-line="111"&gt;&lt;STRONG&gt;Importação do Cliente OpenAI&lt;/STRONG&gt;: substitua a importação do AzureOpenAI para OpenAI:&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang="typescript"&gt;import { OpenAI } from "openai";&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="117"&gt;
&lt;LI data-line="117"&gt;&lt;STRONG&gt;Renomeação da Classe e Cliente:&lt;/STRONG&gt;&amp;nbsp;Substituição da importação do AzureOpenAIService foi renomeada para GitHubModelsService. E, a instância do cliente AzureOpenAI foi renomeada para OpenAI. Adição de um modelName padrão (gpt-4o) para ser usado nas requisições de criação de completions. Porém aqui poderia ser quaisquer outro modelName de sua escolha, como o Llama 3.1 ou o Mistral 7B.&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang="typescript"&gt;class GitHubModelsService { private client: OpenAI; private readonly toneGuidelines: ToneGuidelines; private readonly modelName: string = "gpt-4o"; (...)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="128"&gt;
&lt;LI data-line="128"&gt;&lt;STRONG&gt;Configuração do Cliente:&lt;/STRONG&gt; As variáveis de ambiente específicas do Azure (AZURE_OPENAI_API_KEY,&amp;nbsp;AZURE_OPENAI_ENDPOINT, etc.) foram substituídas por variáveis de ambiente do GitHub (GITHUB_TOKEN&amp;nbsp;e&amp;nbsp;GITHUB_MODELS_ENDPOINT).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;this.client = new OpenAI({ baseURL: process.env.GITHUB_MODELS_ENDPOINT || "https://models.inference.ai.azure.com", apiKey: process.env.GITHUB_TOKEN, });&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="137"&gt;
&lt;LI data-line="137"&gt;&lt;STRONG&gt;Exportação da Instância da Classe:&lt;/STRONG&gt; A instância exportada da classe foi renomeada de&amp;nbsp;&lt;EM&gt;azureOpenAIService&lt;/EM&gt;&amp;nbsp;para&amp;nbsp;&lt;EM&gt;GitHubModelsService&lt;/EM&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang="typescript"&gt;export const azureOpenAIService = new GitHubModelsService();&lt;/LI-CODE&gt;
&lt;P data-line="143"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-line="143"&gt;E pronto! Agora você já pode executar o projeto localmente e testar as funcionalidades de IA com o GitHub Models. Se desejar saber mais detalhes do que foi alterado deixei disponível uma branch chamada &lt;A href="https://github.com/Azure-Samples/microblog-ai-remix/pull/30/files" data-href="https://github.com/Azure-Samples/microblog-ai-remix/pull/30/files" target="_blank"&gt;&lt;STRONG&gt;feat/github-models-usage&lt;/STRONG&gt;&lt;/A&gt;&amp;nbsp;com todas as alterações feitas. Você pode comparar com a branch&amp;nbsp;main&amp;nbsp;para ver o que foi modificado.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;6. Por fim, para executar o projeto, basta rodar o seguinte comando na raiz do projeto:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;npm run build:all npm run dev&lt;/LI-CODE&gt;
&lt;P&gt;Agora, você pode acessar a aplicação na URL: &lt;EM&gt;http://localhost:5173/&lt;/EM&gt; e começar a criar seus microblogs com a ajuda do GitHub Models!&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="156"&gt;&lt;STRONG&gt;Conclusão&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="158"&gt;O&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;é uma excelente alternativa para quem quer experimentar IA sem custos. Ele permite testar modelos avançados como GPT-4o sem precisar pagar por APIs ou configurar infraestrutura complexa. No caso do&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" data-href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;, conseguimos substituir a API paga do Azure OpenAI pelo GitHub Models com mínimas alterações no código, tornando a aplicação acessível para qualquer desenvolvedor.&lt;/P&gt;
&lt;P data-line="160"&gt;Claro que, novamente, caso você queira colocar em produção, o GitHub Models sugere a migração para um endpoint pago do Azure. Mas, para fins de prototipagem e aprendizado, ele é uma ferramenta poderosa e gratuita.&lt;/P&gt;
&lt;P data-line="162"&gt;Se você gostou deste artigo, não esqueça de testar o Microblog AI Remix e dar uma ⭐ no repositório! Queremos saber sua opinião sobre essa abordagem e como você pretende utilizar IA nos seus projetos.&lt;/P&gt;
&lt;P data-line="164"&gt;Agora é sua vez: clone o repositório, teste as mudanças e explore o GitHub Models gratuitamente. Bora codar com IA sem gastar nada! 💸💸💸&lt;/P&gt;</description>
      <pubDate>Tue, 01 Apr 2025 23:56:06 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/use-ia-de-gra%C3%A7a-com-github-models-e-typescript/ba-p/4399817</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-04-01T23:56:06Z</dc:date>
    </item>
    <item>
      <title>Novidades no Visual Studio Code 1.98</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/novidades-no-visual-studio-code-1-98/ba-p/4394213</link>
      <description>&lt;P data-start="249" data-end="743"&gt;A versão 1.98 do&amp;nbsp;&lt;STRONG data-start="301" data-end="323"&gt;Visual Studio Code &lt;/STRONG&gt;está no ar e&amp;nbsp;traz uma série de novidades que vão aprimorar ainda mais a sua experiência de desenvolvimento. Entre os destaques principais, estão recursos que integram de forma ainda mais profunda a &lt;STRONG data-start="527" data-end="572"&gt;inteligência artificial do GitHub Copilot&lt;/STRONG&gt;, como o &lt;STRONG data-start="581" data-end="605"&gt;Modo Agente (prévia)&lt;/STRONG&gt;, o &lt;STRONG data-start="609" data-end="641"&gt;Copilot Edits para notebooks&lt;/STRONG&gt;, e o inédito &lt;STRONG data-start="655" data-end="673"&gt;Copilot Vision&lt;/STRONG&gt;, que permite interagir com imagens diretamente nas conversas de chat.&lt;/P&gt;
&lt;P data-start="1462" data-end="1600"&gt;Se quiser conferir as atualizações completas, acesse a página de&amp;nbsp;&lt;A href="https://code.visualstudio.com/updates" target="_blank" rel="noopener" data-start="1530" data-end="1583"&gt;Atualizações&lt;/A&gt; no site oficial.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P data-start="1602" data-end="1791"&gt;&lt;STRONG data-start="1602" data-end="1614"&gt;Insiders&lt;/STRONG&gt;: Quer testar as novidades o quanto antes? Baixe a versão &lt;A href="https://code.visualstudio.com/insiders" target="_blank" rel="noopener" data-start="1672" data-end="1722"&gt;Insiders&lt;/A&gt; e explore os recursos mais recentes assim que estiverem disponíveis!&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H3&gt;&lt;STRONG&gt;Copilot Agent Mode (Preview)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="883" data-end="1119"&gt;O&amp;nbsp;&lt;STRONG data-start="885" data-end="907"&gt;Copilot Agent Mode (preview)&lt;/STRONG&gt;, transforma a interação com o código: ele busca automaticamente contexto no projeto, sugere comandos no terminal e edita arquivos de forma autônoma. Com isso, tarefas inteiras podem ser automatizadas!&lt;/P&gt;
&lt;P data-start="1121" data-end="1134"&gt;Destaques:&lt;/P&gt;
&lt;UL data-start="1135" data-end="1362"&gt;
&lt;LI data-start="1135" data-end="1214"&gt;Comandos de terminal visíveis inline, podendo ser editados antes da execução.&lt;/LI&gt;
&lt;LI data-start="1215" data-end="1295"&gt;Ações de &lt;STRONG data-start="1226" data-end="1246"&gt;desfazer/refazer&lt;/STRONG&gt; específicas para edições realizadas pelo agente.&lt;/LI&gt;
&lt;LI data-start="1296" data-end="1362"&gt;Integração com tarefas de compilação automáticas (configurável).&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Copilot Edits em Notebooks (Preview)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="1793" data-end="1973"&gt;A partir de agora, é possível editar notebooks diretamente com o Copilot, facilitando fluxos de trabalho para cientistas de dados e profissionais que utilizam documentação técnica.&lt;/P&gt;
&lt;UL data-start="1975" data-end="2073"&gt;
&lt;LI data-start="1975" data-end="2020"&gt;Criação, modificação e exclusão de células.&lt;/LI&gt;
&lt;LI data-start="2021" data-end="2073"&gt;Suporte completo para diferentes tipos de células.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Interface Renovada nas Edições do Copilot&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2268" data-end="2467"&gt;A interface de Edições foi redesenhada para melhorar a experiência de revisão de arquivos modificados. Os arquivos aparecem como anexos comuns e a lista de arquivos alterados fica logo acima do chat.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Terminal IntelliSense (Preview)&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Uma verdadeira revolução para quem gosta de trabalhar no terminal:&amp;nbsp;&lt;STRONG&gt;IntelliSense&lt;/STRONG&gt; agora funciona direto no terminal do VS Code!&lt;/P&gt;
&lt;P&gt;Principais benefícios:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Sugestões inteligentes para &lt;STRONG&gt;bash, zsh, fish e PowerShell&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Completions para comandos git, npm, brew, ssh e muito mais.&lt;/LI&gt;
&lt;LI&gt;Integração com &lt;STRONG&gt;branches do Git&lt;/STRONG&gt;, &lt;STRONG&gt;CDPATH&lt;/STRONG&gt; e &lt;STRONG&gt;aliases personalizados&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Autocomplete para git checkout:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Ative o Terminal IntelliSense:&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;"terminal.integrated.suggest.enabled": true&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG style="color: var(--lia-bs-headings-color); font-family: var(--lia-bs-headings-font-family); font-size: var(--lia-bs-h2-font-size); font-style: var(--lia-headings-font-style); letter-spacing: var(--lia-h2-letter-spacing); background-color: var(--lia-rte-bg-color);"&gt;Next Edit Suggestions (Preview)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O Copilot agora oferece&amp;nbsp;&lt;STRONG&gt;sugestões de próximas edições&lt;/STRONG&gt;, tornando o fluxo de trabalho ainda mais fluido. Com o &lt;STRONG&gt;modo colapsado&lt;/STRONG&gt;, você foca apenas no que interessa:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Sugestões aparecem discretamente na margem.&lt;/LI&gt;
&lt;LI&gt;Ative-as apenas quando quiser navegar até elas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Menu de ativação do modo colapsado:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Configuração&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;github.copilot.nextEditSuggestions.enabled&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG style="color: var(--lia-bs-headings-color); font-family: var(--lia-bs-headings-font-family); font-size: var(--lia-bs-h2-font-size); font-style: var(--lia-headings-font-style); letter-spacing: var(--lia-h2-letter-spacing); background-color: var(--lia-rte-bg-color);"&gt;Copilot Vision (Preview)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Nós estamos rapidamente implementando suporte de visão de ponta a ponta nesta versão do Copilot Chat. Isso permite que você anexe imagens e interaja com imagens em solicitações de chat.&lt;/P&gt;
&lt;P&gt;Por exemplo, se você encontrar um erro durante a depuração, anexe uma captura de tela do VS Code e peça ao Copilot para ajudá-lo a resolver o problema. Você também pode anexar um mockup de UI e deixar o Copilot fornecer algum HTML e CSS para implementar o mockup.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Você pode anexar imagens de várias maneiras:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Arraste e solte imagens do seu sistema operacional ou da visualização Explorer&lt;/LI&gt;
&lt;LI&gt;Cole uma imagem da sua área de transferência&lt;/LI&gt;
&lt;LI&gt;Anexe uma captura de tela da janela do VS Code (selecione o&amp;nbsp;&lt;STRONG&gt;botão de clipe de papel 📎&lt;/STRONG&gt;&amp;nbsp;&amp;gt;&amp;nbsp;&lt;STRONG&gt;Captura de Tela da Janela&lt;/STRONG&gt;)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Um aviso é mostrado se o modelo selecionado atualmente não tiver a capacidade de lidar com o tipo de arquivo. O único modelo suportado no momento será GPT 4o, mas o suporte para anexos de imagem com Claude 3.5 Sonnet e Gemini 2.0 Flash será lançado em breve também. Atualmente, os tipos de imagem suportados são JPEG/JPG, PNG, GIF e WEBP.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Disponibilidade geral de instruções personalizadas&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Instruções personalizadas permitem que você adapte o GitHub Copilot para fornecer respostas de chat e sugestões de código de acordo com a forma como você e sua equipe trabalham. Descreva seus requisitos específicos em formato Markdown em um arquivo&amp;nbsp;&lt;STRONG&gt;.github/copilot-instructions.md&lt;/STRONG&gt;&amp;nbsp;no seu espaço de trabalho.&lt;/P&gt;
&lt;P&gt;Neste marco, estamos disponibilizando instruções personalizadas com&amp;nbsp;&lt;STRONG&gt;.github/copilot-instructions.md&lt;/STRONG&gt; de forma geral. Certifique-se de que a configuração do VS Code está habilitada para que o Copilot possa utilizar essas instruções ao gerar respostas.&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;github.copilot.chat.codeGeneration.useInstructionFiles&lt;/LI-CODE&gt;
&lt;P&gt;Saiba mais sobre&amp;nbsp;&lt;A href="https://code.visualstudio.com/docs/copilot/copilot-customization" target="_blank" rel="noopener"&gt;instruções personalizadas no Copilot&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Melhorias no descarte de alterações não rastreadas&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Ao longo dos anos, recebemos vários relatórios sobre perda de dados porque descartar um arquivo não rastreado excluía permanentemente o arquivo, mesmo que o VS Code mostrasse um diálogo modal deixando claro que o arquivo seria excluído permanentemente.&lt;/P&gt;
&lt;P&gt;A partir desta atualização, descartar um arquivo não rastreado moverá o arquivo para a Lixeira quando possível, para que o arquivo possa ser facilmente recuperado. Você pode ativar ou desativar essa funcionalidade acessando as configurações do VS Code e buscando por &lt;STRONG&gt;git.discardUntrackedChangesToTrash&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;Hook de commit para diagnósticos (Experimental)&lt;/H4&gt;
&lt;P&gt;Introduzimos um novo hook de commit que solicita que você resolva quaisquer diagnósticos não resolvidos para os arquivos alterados. Este é atualmente um recurso experimental que pode ser habilitado usando a configuração &lt;STRONG&gt;git.diagnosticsCommitHook.Enabled&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Por padrão, o hook de commit solicita quaisquer diagnósticos de nível de erro, mas as fontes e níveis de diagnóstico podem ser personalizados usando a configuração &lt;STRONG&gt;git.diagnosticsCommitHook.Sources&lt;/STRONG&gt;. Experimente e nos dê seu feedback.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Acessibilidade no Copilot Edits&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Nós tornamos as Edições do Copilot muito mais acessíveis.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Agora há sinais sonoros para arquivos com modificações e para regiões alteradas (inserções, modificações e exclusões).&lt;/LI&gt;
&lt;LI&gt;O visualizador de diff acessível agora está disponível para arquivos modificados. Assim como nos editores de diff, selecione&amp;nbsp;&lt;STRONG&gt;kb(chatEditor.action.showAccessibleDiffView)&lt;/STRONG&gt;&amp;nbsp;para ativá-lo.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4&gt;&lt;STRONG&gt;activeEditorState&lt;/STRONG&gt;&amp;nbsp;variável de título da janela&lt;/H4&gt;
&lt;P&gt;Nós temos uma nova variável &lt;STRONG&gt;setting(window.title)&lt;/STRONG&gt; chamada &lt;STRONG&gt;activeEditorState &lt;/STRONG&gt;para indicar informações do editor, como estado modificado, o número de problemas e quando um arquivo tem Edições (Edits) do Copilot pendentes para usuários de leitores de tela. Quando no modo otimizado para leitores de tela, isso é anexado por padrão e pode ser desativado com&amp;nbsp;&lt;STRONG&gt;accessibility.windowTitleOptimized:false.&lt;/STRONG&gt;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Barra de título customizada no Linux&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;A tão pedida &lt;STRONG&gt;barra de título customizada&lt;/STRONG&gt; no Linux já está habilitada por padrão!&lt;/P&gt;
&lt;P&gt;A barra de título customizada agora está habilitada por padrão no Linux. A barra de título customizada dá acesso a controles de layout, ao menu do Copilot e muito mais.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Você sempre pode reverter para as decorações de título nativas, seja a partir do menu de contexto da barra de título customizada ou configurando&amp;nbsp;&lt;STRONG&gt;setting(window.titleBarStyle)&lt;/STRONG&gt; para &lt;STRONG&gt;native&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Estamos felizes com o feedback contínuo sobre essa experiência e já estamos trabalhando para melhorá-la ainda mais em futuros releases com base nos feedbacks da comunidade.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Modelos de IA&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Adicionamos mais modelos para escolher ao usar o Copilot. Os seguintes modelos estão agora disponíveis no seletor de modelo no Visual Studio Code e no chat do github.com:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;GPT 4.5 (Prévia)&lt;/STRONG&gt;: O modelo mais recente da OpenAI, GPT-4.5, agora está disponível no Chat do GitHub Copilot para usuários do Copilot Enterprise. O GPT-4.5 é um modelo de linguagem grande projetado com capacidades avançadas em intuição, estilo de escrita e conhecimento amplo. Saiba mais sobre a disponibilidade do modelo GPT-4.5 no&amp;nbsp;&lt;A href="https://github.blog/changelog/2025-02-27-openai-gpt-4-5-in-github-copilot-now-available-in-public-preview" target="_blank" rel="noopener"&gt;post do blog do GitHub&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Claude 3.7 Sonnet (Prévia)&lt;/STRONG&gt;: Claude 3.7 Sonnet agora está disponível para todos os clientes em planos pagos do Copilot. Este novo modelo Sonnet suporta tanto modos de pensamento quanto de não pensamento no Copilot. Nos testes iniciais, vimos melhorias particularmente fortes em cenários de agente. Saiba mais sobre a disponibilidade do modelo Claude 3.7 Sonnet no&amp;nbsp;&lt;A href="https://github.blog/changelog/2025-02-24-claude-3-7-sonnet-is-now-available-in-github-copilot-in-public-preview/" target="_blank" rel="noopener"&gt;post do blog do GitHub&lt;/A&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4 data-start="127" data-end="139"&gt;Conclusão&lt;/H4&gt;
&lt;P data-start="141" data-end="652"&gt;A versão 1.98 do &lt;STRONG data-start="158" data-end="180"&gt;Visual Studio Code&lt;/STRONG&gt; marca um avanço significativo na integração de inteligência artificial ao ambiente de desenvolvimento, com recursos que aumentam a produtividade e oferecem mais controle para desenvolvedores individuais e equipes. As melhorias em &lt;STRONG data-start="411" data-end="433"&gt;Copilot Agent Mode&lt;/STRONG&gt;, &lt;STRONG data-start="435" data-end="459"&gt;edições em notebooks&lt;/STRONG&gt;, &lt;STRONG data-start="461" data-end="489"&gt;IntelliSense no terminal&lt;/STRONG&gt; e &lt;STRONG data-start="492" data-end="523"&gt;personalização de sugestões&lt;/STRONG&gt; refletem um esforço contínuo da equipe do VS Code em fornecer uma experiência de desenvolvimento moderna, eficiente e acessível.&lt;/P&gt;
&lt;P data-start="654" data-end="861"&gt;Se você deseja explorar todas essas funcionalidades, a atualização para a versão mais recente já está disponível. Além disso, os recursos em prévia podem ser testados por meio da versão &lt;STRONG data-start="840" data-end="860"&gt;VS Code Insiders&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-start="863" data-end="1046"&gt;Para mais informações e download, acesse:&lt;BR data-start="904" data-end="907" /&gt;➡️ &lt;A href="https://code.visualstudio.com/updates" target="_blank" rel="noopener" data-start="910" data-end="982"&gt;Notas de versão do VS Code 1.98&lt;/A&gt;&lt;BR data-start="982" data-end="985" /&gt;➡️ &lt;A href="https://code.visualstudio.com/insiders" target="_blank" rel="noopener" data-start="988" data-end="1046"&gt;VS Code Insiders&lt;/A&gt;&lt;/P&gt;
&lt;P data-start="1048" data-end="1212"&gt;Caso tenha feedback ou sugestões sobre os novos recursos, participe das discussões na comunidade do &lt;A href="https://github.com/microsoft/vscode/issues" target="_blank" rel="noopener" data-start="1148" data-end="1211"&gt;GitHub do VS Code&lt;/A&gt;.&lt;/P&gt;</description>
      <pubDate>Tue, 18 Mar 2025 15:49:21 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/novidades-no-visual-studio-code-1-98/ba-p/4394213</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-03-18T15:49:21Z</dc:date>
    </item>
    <item>
      <title>Use IA de Graça com GitHub Models e TypeScript! 💸💸💸</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/use-ia-de-gra%C3%A7a-com-github-models-e-typescript/ba-p/4390441</link>
      <description>&lt;P data-line="6"&gt;A Inteligência Artificial está se tornando cada vez mais acessível para desenvolvedores. Porém, um dos maiores desafios ainda é o custo das APIs de modelos avançados, como GPT-4o e tantos outros. Felizmente, o&amp;nbsp;&lt;EM&gt;GitHub Models&lt;/EM&gt;&amp;nbsp;veio para mudar esse cenário! Agora, você pode experimentar IA de graça, sem precisar de uma chave de API paga ou baixar modelos pesados em suas máquinas locais.&lt;/P&gt;
&lt;P data-line="8"&gt;Neste artigo, vamos explicar em detalhes o que é o&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;e como utilizar gratuitamente com&amp;nbsp;&lt;STRONG&gt;TypeScript&lt;/STRONG&gt;&amp;nbsp;em um projeto prático. Escolhemos como exemplo o projeto&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank" rel="noopener" data-href="https://github.com/Azure-Samples/microblog-ai-remix"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;, um projeto open source de microblog com funcionalidades de IA.&lt;/P&gt;
&lt;P data-line="10"&gt;Iremos abordar a estrutura desse projeto e demonstrar passo a passo como integrar com o GitHub Models, substituindo a necessidade de fazer uso de LLMs pagos, incluindo comparações de código&amp;nbsp;&lt;STRONG&gt;antes e depois&lt;/STRONG&gt;&amp;nbsp;das modificações. Também veremos como configurar e executar o projeto localmente, e discutiremos as vantagens e limitações do GitHub Models para prototipagem de projetos em IA.&lt;/P&gt;
&lt;P data-line="12"&gt;Pode ter certeza que, ao final deste artigo, você terá uma compreensão sólida do&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;e como utilizá-lo em seus próprios projetos e começar a explorar o mundo da IA de forma acessível e gratuita.&lt;/P&gt;
&lt;P data-line="14"&gt;Vamos lá!&lt;/P&gt;
&lt;H2 data-line="16"&gt;&lt;STRONG&gt;O que é o GitHub Models?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P data-line="20"&gt;O&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://docs.github.com/en/github-models" target="_blank" rel="noopener" data-href="https://docs.github.com/en/github-models"&gt;GitHub Models&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;é uma iniciativa do GitHub que disponibiliza uma coleção de modelos de IA prontos para uso, integrados à plataforma. Pense no GitHub Models como um&amp;nbsp;&lt;EM&gt;Marketplace de Modelos de IA&lt;/EM&gt;: onde os desenvolvedores podem descobrir modelos de linguagem grande (LLMs) de diferentes provedores, testar suas capacidades em um playground interativo e incorporar em suas aplicações de forma simplificada.&lt;/P&gt;
&lt;P data-line="22"&gt;Há modelos de diversas origens e portes - por exemplo, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://platform.openai.com/docs/models/gpt-4o" target="_blank" rel="noopener" data-href="https://platform.openai.com/docs/models/gpt-4o"&gt;OpenAI GPT-4o&lt;/A&gt;&lt;/STRONG&gt;, modelos Open Source como o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.llama.com/" target="_blank" rel="noopener" data-href="https://www.llama.com/"&gt;Meta Llama 3.1&lt;/A&gt;&lt;/STRONG&gt;, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://azure.microsoft.com/products/phi?WT.mc_id=javascript-00000-gllemos" target="_blank" rel="noopener" data-href="https://azure.microsoft.com/products/phi?WT.mc_id=javascript-00000-gllemos"&gt;Phi-3&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;da Microsoft, o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://mistral.ai/news/mistral-large-2407" target="_blank" rel="noopener" data-href="https://mistral.ai/news/mistral-large-2407"&gt;Mistral Large 2&lt;/A&gt;&lt;/STRONG&gt;, entre outros. Todos podem ser acessados gratuitamente para fins de experimentação.&lt;/P&gt;
&lt;P data-line="24"&gt;Uma das grandes vantagens do GitHub Models é permitir o uso&amp;nbsp;&lt;STRONG&gt;gratuito&lt;/STRONG&gt;&amp;nbsp;desses modelos durante a fase de prototipagem. Ou seja, você pode testar e construir um proof of concept (POC) sem custos, utilizando a infraestrutura fornecida pelo GitHub. Na prática, existem duas maneiras de interagir com os modelos:&lt;/P&gt;
&lt;UL data-line="26"&gt;
&lt;LI data-line="26"&gt;&lt;STRONG&gt;Playground (interface web)&lt;/STRONG&gt;: nesse playground, você pode testar os modelos diretamente no navegador do GitHub. Nele, você pode fazer perguntas e obter respostas em tempo real com diferentes modelos, ajustar parâmetros (temperatura, número máximo de tokens e etc.) e até comparar lado a lado a saída de dois modelos diferentes.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL data-line="30"&gt;
&lt;LI data-line="30"&gt;&lt;STRONG&gt;Via API/SDK:&lt;/STRONG&gt;&amp;nbsp;agora, caso você necessite integrar algum modelo em um projeto, o GitHub Models também disponibiliza uma API REST e SDKs para diversas linguagens, como Python, JavaScript/TypeScript, Java, C#, e REST. Cada modelo possui um endpoint de inferência público. Você pode fazer chamadas HTTP para esses endpoints ou usar SDKs (como o SDK do Azure OpenAI ou o próprio SDK do GitHub Models) em diversas linguagens.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A autenticação é feita de forma simples com um token de acesso pessoal do GitHub (PAT), sem necessidade de chaves de API separadas. Basta gerar um PAT na sua conta do GitHub (sem escopos especiais, usando a opção Beta disponível)​, e usá-lo nas requisições. Em outras palavras, seu token do GitHub funciona como a credencial para chamar o modelo, dentro dos limites gratuitos de uso.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H3 data-line="36"&gt;&lt;STRONG&gt;Vantagens e Limitações&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-line="38"&gt;Mas, tudo que é gratuito tem suas limitações, certo? Então, vamos explicar as limitações do GitHub Models.&lt;/P&gt;
&lt;P data-line="40"&gt;Atualmente, há restrições de chamadas por minuto e por dia, quantidade de tokens por requisição e número de requisições simultâneas. Por exemplo, modelos de categoria low (menores) permitem algo em torno de 15 requisições por minuto e 150 por dia, enquanto modelos high (como o GPT-4o) possuem limites um pouco mais baixos por serem mais pesados​&lt;/P&gt;
&lt;P data-line="42"&gt;Mas, e se curtiu o modelo e desejar colocar em produção? Bom, nesse caso, o GitHub Models sugere a migração para um&amp;nbsp;&lt;EM&gt;endpoint&lt;/EM&gt;&amp;nbsp;pago do Azure – e o interessante é que basta trocar o token do GitHub por uma chave do Azure que o resto do código continuará funcionando, sem necessidade de alterações adicionais!&lt;/P&gt;
&lt;P data-line="44"&gt;Resumindo: o GitHub Models é uma maneira prática de&amp;nbsp;&lt;STRONG&gt;encontrar e experimentar modelos de IA de ponta gratuitamente&lt;/STRONG&gt;​. Com ele, desenvolvedores podem incorporar funcionalidades de IA em projetos TypeScript (ou de outras linguagens) usando apenas uma conta GitHub. A seguir, conheceremos o exemplo do Microblog AI Remix e, depois, veremos na prática como usar o GitHub Models nesse projeto.&lt;/P&gt;
&lt;H2 data-line="46"&gt;&lt;STRONG&gt;Microblog AI Remix com GitHub Models&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="48"&gt;O&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank" rel="noopener" data-href="https://github.com/Azure-Samples/microblog-ai-remix"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;(ou simplesmente Microblog AI) é um projeto de exemplo que combina um aplicativo web de microblog com recursos de Inteligência Artificial. Ele foi criado para demonstrar como construir aplicações web modernas e escaláveis utilizando a stack da Microsoft Azure juntamente com técnicas de Server-Side Rendering (SSR) e IA generativa. Em alto nível, o Microblog AI permite que usuários criem e visualizem pequenos posts de blog (microblogs), contando com a ajuda de um modelo de IA avançado para gerar conteúdo a partir de sugestões do usuário.&lt;/P&gt;
&lt;P data-line="50"&gt;Aproveito para pedir a testarem o projeto, dando um fork e contribuindo com melhorias. O projeto é open source e pode ser testado no GitHub Codespaces. Deixa a sua estrela ⭐️ e contribua com melhorias!&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="54"&gt;Originalmente o projeto utiliza o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/cognitive-services/openai-service/overview" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/azure/cognitive-services/openai-service/overview"&gt;Azure OpenAI&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;como provedor de IA, mas vamos substituí-lo pelo&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://docs.github.com/en/github-models" target="_blank" rel="noopener" data-href="https://docs.github.com/en/github-models"&gt;GitHub Models&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para proporcionar uma alternativa gratuita e acessível.&lt;/P&gt;
&lt;H3 data-line="56"&gt;&lt;STRONG&gt;Passo a Passo para Configurar o Microblog AI&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-line="58"&gt;Eu gravei um vídeo mostrando o passo a passo em como migrar o projeto para o GitHub Models. O vídeo está disponível no meu canal do YouTube (em português) e você pode assisti-lo aqui:&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/4Pv1BrdiZDg?si=0y_MHiKYlt0eeZfM/1741313546429" data-video-remote-vid="https://youtu.be/4Pv1BrdiZDg?si=0y_MHiKYlt0eeZfM/1741313546429" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F4Pv1BrdiZDg%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D4Pv1BrdiZDg&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F4Pv1BrdiZDg%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P data-line="62"&gt;Antes de tudo precisamos clonar o projeto e configurar as dependências. Siga os passos abaixo:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Clone o repositório oficial do Microblog AI Remix:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;git clone https://github.com/Azure-Samples/microblog-ai-remix.git
cd microblog-ai-remix&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2. Instale as dependências do projeto:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;npm install
cd server 
npm install&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. Crie um arquivo .env na raiz do projeto e adicione as seguintes variáveis de ambiente:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;GITHUB_MODELS_ENDPOINT=https://models.inference.ai.azure.com
GITHUB_MODELS_TOKEN=SEU_TOKEN&lt;/LI-CODE&gt;
&lt;P&gt;Esse token você pode gerar na sua conta do GitHub em&amp;nbsp;&lt;STRONG&gt;Settings &amp;gt; Developer Settings &amp;gt; Personal Access Tokens &amp;gt; Generate new token (beta)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;4. No diretório /server, crie o arquivo local.settings.json com o seguinte conteúdo:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "GITHUB_MODELS_ENDPOINT": "https://models.inference.ai.azure.com",
    "GITHUB_MODELS_TOKEN": "SEU_TOKEN"
  },
  "Host": {
    "LocalHttpPort": 7071,
    "CORS": "*",
    "CORSCredential": true
  }
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;5. Agora, vá até o arquivo: app/services/openaiService.ts e faça as seguintes alterações:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-line="111"&gt;
&lt;LI data-line="111"&gt;&lt;STRONG&gt;Importação do Cliente OpenAI&lt;/STRONG&gt;: substitua a importação do AzureOpenAI para OpenAI:&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;import { OpenAI } from "openai";&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="117"&gt;
&lt;LI data-line="117"&gt;&lt;STRONG&gt;Renomeação da Classe e Cliente:&lt;/STRONG&gt;&amp;nbsp;Substituição da importação do AzureOpenAIService foi renomeada para GitHubModelsService. E, a instância do cliente AzureOpenAI foi renomeada para OpenAI. Adição de um modelName padrão (gpt-4o) para ser usado nas requisições de criação de completions. Porém aqui poderia ser quaisquer outro modelName de sua escolha, como o Llama 3.1 ou o Mistral 7B.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;class GitHubModelsService {
  private client: OpenAI;
  private readonly toneGuidelines: ToneGuidelines;
  private readonly modelName: string = "gpt-4o";

(...)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="128"&gt;
&lt;LI data-line="128"&gt;&lt;STRONG&gt;Configuração do Cliente:&lt;/STRONG&gt; As variáveis de ambiente específicas do Azure (AZURE_OPENAI_API_KEY,&amp;nbsp;AZURE_OPENAI_ENDPOINT, etc.) foram substituídas por variáveis de ambiente do GitHub (GITHUB_TOKEN&amp;nbsp;e&amp;nbsp;GITHUB_MODELS_ENDPOINT).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;this.client = new OpenAI({
      baseURL: process.env.GITHUB_MODELS_ENDPOINT || "https://models.inference.ai.azure.com",
      apiKey: process.env.GITHUB_TOKEN,
    });&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL data-line="137"&gt;
&lt;LI data-line="137"&gt;&lt;STRONG&gt;Exportação da Instância da Classe:&lt;/STRONG&gt; A instância exportada da classe foi renomeada de&amp;nbsp;&lt;EM&gt;azureOpenAIService&lt;/EM&gt;&amp;nbsp;para&amp;nbsp;&lt;EM&gt;GitHubModelsService&lt;/EM&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="typescript"&gt;export const azureOpenAIService = new GitHubModelsService();&lt;/LI-CODE&gt;
&lt;P data-line="143"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-line="143"&gt;E pronto! Agora você já pode executar o projeto localmente e testar as funcionalidades de IA com o GitHub Models. Se desejar saber mais detalhes do que foi alterado deixei disponível uma branch chamada &lt;A href="https://github.com/Azure-Samples/microblog-ai-remix/pull/30/files" target="_blank" rel="noopener" data-href="https://github.com/Azure-Samples/microblog-ai-remix/pull/30/files"&gt;&lt;STRONG&gt;feat/github-models-usage&lt;/STRONG&gt;&lt;/A&gt;&amp;nbsp;com todas as alterações feitas. Você pode comparar com a branch&amp;nbsp;main&amp;nbsp;para ver o que foi modificado.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;6. Por fim, para executar o projeto, basta rodar o seguinte comando na raiz do projeto:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="bash"&gt;npm run build:all
npm run dev&lt;/LI-CODE&gt;
&lt;P&gt;Agora, você pode acessar a aplicação na URL: &lt;EM&gt;http://localhost:5173/&lt;/EM&gt; e começar a criar seus microblogs com a ajuda do GitHub Models!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="156"&gt;&lt;STRONG&gt;Conclusão&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="158"&gt;O&amp;nbsp;&lt;STRONG&gt;GitHub Models&lt;/STRONG&gt;&amp;nbsp;é uma excelente alternativa para quem quer experimentar IA sem custos. Ele permite testar modelos avançados como GPT-4o sem precisar pagar por APIs ou configurar infraestrutura complexa. No caso do&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://github.com/Azure-Samples/microblog-ai-remix" target="_blank" rel="noopener" data-href="https://github.com/Azure-Samples/microblog-ai-remix"&gt;Microblog AI Remix&lt;/A&gt;&lt;/STRONG&gt;, conseguimos substituir a API paga do Azure OpenAI pelo GitHub Models com mínimas alterações no código, tornando a aplicação acessível para qualquer desenvolvedor.&lt;/P&gt;
&lt;P data-line="160"&gt;Claro que, novamente, caso você queira colocar em produção, o GitHub Models sugere a migração para um endpoint pago do Azure. Mas, para fins de prototipagem e aprendizado, ele é uma ferramenta poderosa e gratuita.&lt;/P&gt;
&lt;P data-line="162"&gt;Se você gostou deste artigo, não esqueça de testar o Microblog AI Remix e dar uma ⭐ no repositório! Queremos saber sua opinião sobre essa abordagem e como você pretende utilizar IA nos seus projetos.&lt;/P&gt;
&lt;P data-line="164"&gt;Agora é sua vez: clone o repositório, teste as mudanças e explore o GitHub Models gratuitamente. Bora codar com IA sem gastar nada! 💸💸💸&lt;/P&gt;</description>
      <pubDate>Fri, 07 Mar 2025 02:21:44 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/use-ia-de-gra%C3%A7a-com-github-models-e-typescript/ba-p/4390441</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-03-07T02:21:44Z</dc:date>
    </item>
  </channel>
</rss>

