Partilhar via


Integrar o Gerenciamento de API do Azure (APIM) com a API de malha para GraphQL

A integração do Gerenciamento de API do Azure (APIM) com a API do Microsoft Fabric para GraphQL pode melhorar significativamente os recursos da sua API, fornecendo escalabilidade robusta e recursos de segurança, como gerenciamento de identidade, limitação de taxa e cache. Vamos guiá-lo através do processo de instalação e configuração desses recursos.

Adicionar uma API Fabric GraphQL ao Gerenciamento de API do Azure

Para esta seção, assumimos que você tenha uma API GraphQL no Fabric e uma instância APIM já em execução. Caso contrário, pode seguir as instruções sobre como criar uma API GraphQL na Fabric ou pode clicar em Iniciar com uma base de dados SQL de exemplo no portal API para GraphQL para iniciar a partir de uma nova API.

Para começar, recupere o seu endpoint da API no portal do Fabric, acessando o item GraphQL e clicando no botão Copiar endpoint na barra de ferramentas. Você também precisará salvar seu esquema GraphQL em um arquivo, o que você pode fazer clicando no botão Exportar esquema e salvando-o em um arquivo em seu dispositivo local:

Captura de ecrã da barra de ferramentas da API para GraphQL.

Agora navegue até sua instância de Gerenciamento de API no portal do Azure e selecione APIs>+ Adicionar API.

Escolha o ícone GraphQL e, na tela APIM Create from GraphQL schema , preencha os campos obrigatórios, como Nome para exibição, Nome e ponto de extremidade da API GraphQL. Selecione Carregar esquema e use o arquivo de esquema que você baixou anteriormente:

Captura de ecrã da criação do APIM a partir da tela do esquema GraphQL.

Usando identidades gerenciadas com APIM e API para GraphQL no Fabric

Em seguida, precisamos configurar uma política para autenticação usando uma identidade gerenciada para lidar com a autenticação dessa API. Você pode criar uma identidade gerenciada no portal do Azure ou usando qualquer uma das ferramentas disponíveis para fazer isso.

Agora temos uma credencial de identidade gerenciada que podemos usar para autenticação, precisamos conceder permissões para o item GraphQL no Fabric. Para simplificar, adicionamos a identidade gerenciada (neste exemplo, apim-id) como um membro do espaço de trabalho onde a API GraphQL e sua fonte de dados estão localizadas:

Captura de tela das permissões do espaço de trabalho.

Se preferir ativar o acesso diretamente aos itens do Fabric, como a própria API e as fontes de dados associadas à API, como um banco de dados LakeHouse ou SQL, necessita conceder as permissões adequadas para a identidade gerida em cada item, especialmente no caso de terem sido associados à API usando autenticação única Sign-On (SSO). Você pode encontrar mais informações no resumo de permissões.

Depois de conceder suas permissões de credencial para seu espaço de trabalho, API Fabric GraphQL e/ou fontes de dados anexadas a ele, você precisará indicar ao APIM que deseja aproveitar essa credencial para executar a autenticação. De volta ao console do APIM, vá paraIdentidades gerenciadas> e adicione a mesma identidade gerenciada atribuída ao usuário que você está usando para acessar a API do Fabric GraphQL.

Em seguida, vá para a guia "Políticas de API" na API do GraphQL que você criou anteriormente e, em seguida, edite a política de processamento de entrada adicionando as seguintes entradas abaixo <inbound><base/>:

<authentication-managed-identity 
            resource="https://analysis.windows.net/powerbi/api" 
            client-id="MANAGED IDENTITY CLIENT ID GOES HERE" 
            output-token-variable-name="token-variable" 
            ignore-error="false" />
<set-header name="Authorization" exists-action="override">
            <value>@("Bearer " + (string)context.Variables["token-variable"])</value>
</set-header>

Certifique-se de substituir o ID do cliente no trecho acima pelo ID do cliente da identidade gerenciada. Guarde a política para continuar.

Agora, de volta à API, vá para a guia Teste e confirme que você pode emitir consultas e/ou mutações nos dados do Fabric via GraphQL:

Captura de tela do teste bem-sucedido no portal APIM.

Testando a conexão bem-sucedida entre o APIM e o Fabric GraphQL

Armazenamento em cache

APIs e operações no Gerenciamento de API podem ser configuradas com cache de resposta. A colocação em cache de respostas pode reduzir significativamente a latência dos autores de chamadas à API e a carga de back-end dos fornecedores de API. O APIM tem suporte para cache interno ou você pode optar por usar sua própria instância do Redis. Em ambos os casos, você precisa definir sua política de cache. Aqui temos a política anterior alterada com uma configuração de cache simples que funcionaria para a maioria dos cenários:

<policies>
    <inbound>
        <base />
        <authentication-managed-identity 
            resource="https://analysis.windows.net/powerbi/api" 
            client-id="MANAGED IDENTITY CLIENT ID GOES HERE" 
            output-token-variable-name="token-variable" 
            ignore-error="false" />
        <set-header name="Authorization" exists-action="override">
            <value>@("Bearer " + (string)context.Variables["token-variable"])</value>
        </set-header>
        <cache-lookup-value 
            key="@(context.Request.Body.As<String>(preserveContent: true))" 
            variable-name="cachedResponse" 
            default-value="not_exists" />
    </inbound>
    <!-- Control if and how the requests are forwarded to services  -->
    <backend>
        <choose>
            <when condition="@(context.Variables.GetValueOrDefault<string>("cachedResponse") == "not_exists")">
                <forward-request />
            </when>
        </choose>
    </backend>
    <!-- Customize the responses -->
    <outbound>
        <base />
        <choose>
            <when condition="@(context.Variables.GetValueOrDefault<string>("cachedResponse") != "not_exists")">
                <set-body>@(context.Variables.GetValueOrDefault<string>("cachedResponse"))</set-body>
            </when>
            <when condition="@((context.Response.StatusCode == 200) && (context.Variables.GetValueOrDefault<string>("cachedResponse") == "not_exists"))">
                <cache-store-value key="@(context.Request.Body.As<String>(preserveContent: true))" value="@(context.Response.Body.As<string>(preserveContent: true))" duration="60" />
            </when>
        </choose>
    </outbound>
    <!-- Handle exceptions and customize error responses  -->
    <on-error>
        <base />
    </on-error>
</policies>

Você pode confirmar que as solicitações estão sendo armazenadas em cache rastreando uma consulta ou mutação da API do GraphQL no portal do APIM:

Captura de tela do cache atingido no portal APIM.

Para cenários avançados de cache, consulte a documentação do APIM sobre cache.

Limitação de Velocidade

Você pode limitar o número de chamadas de API que um cliente pode fazer em um período de tempo específico. Aqui está uma entrada de política de limitação de taxa que pode ser adicionada abaixo de <inbound><base/> e que impõe um máximo de 2 chamadas a cada 60 segundos para um determinado utilizador:

<rate-limit-by-key 
    calls="2" 
    renewal-period="60" 
    counter-key="@(context.Request.Headers.GetValueOrDefault("Authorization"))" 
    increment-condition="@(context.Response.StatusCode == 200)" 
    remaining-calls-variable-name="remainingCallsPerUser" />

Depois de enviar mais de 2 chamadas de API em um minuto, você receberá uma mensagem de erro:

{
    "statusCode": 429,
    "message": "Rate limit is exceeded. Try again in 58 seconds."
}

Para obter mais detalhes sobre como configurar políticas de limitação de taxa no APIM, consulte a documentação.

A integração da API do Microsoft Fabric para GraphQL com o Gerenciamento de API do Azure reúne o melhor dos dois mundos: os recursos de dados avançados do Fabric e os recursos de gateway de nível empresarial do APIM. Ao configurar identidades gerenciadas, você habilita a autenticação segura no Fabric. Com o cache personalizado e as políticas de limitação de taxa, você ganha um controle refinado sobre o desempenho, o custo e a experiência do usuário, adaptado às características exclusivas das APIs do GraphQL.

Essa configuração não apenas fornece mais opções para proteger seus dados de malha, mas também fornece a escalabilidade e a observabilidade necessárias para dar suporte a cargas de trabalho de produção entre equipes e locatários.