次の方法で共有


Azure API Management (APIM) と Fabric API for GraphQL の統合

Azure API Management (APIM) と Microsoft Fabric の GraphQL 用 API を統合すると、ID 管理、レート制限、キャッシュなどの堅牢なスケーラビリティとセキュリティ機能を提供することで、API の機能を大幅に強化できます。 これらの機能を設定および構成するプロセスについて説明します。

Azure API Management に Fabric GraphQL API を追加する

このセクションでは、Fabric の GraphQL API と APIM インスタンスが既に稼働していることを前提としています。 そうでない場合は、Fabric で GraphQL API を作成する方法手順に従うか、API for GraphQL ポータルで [サンプル SQL データベースで開始] をクリックして新しい API から開始できます。

GraphQL 項目に移動し、リボンの [エンドポイントのコピー] ボタンをクリックして、Fabric ポータルから API エンドポイント の取得を開始します。 また、GraphQL スキーマをファイルに保存する必要があります。これを行うには、[ スキーマのエクスポート ] ボタンをクリックし、ローカル デバイスのファイルに保存します。

GraphQL の API リボンのスクリーンショット。

次に、Azure portal で API Management インスタンスに移動し、 API>+ API の追加を選択します。

GraphQL アイコンを選択し、[ APIM Create from GraphQL schema]\(GraphQL スキーマから作成 \) 画面で、表示名、名前、GraphQL API エンドポイントなどの必須フィールドを入力します。 [ スキーマのアップロード] を選択し、前にダウンロードしたスキーマ ファイルを使用します。

GraphQL スキーマからの APIM の作成画面のスクリーンショット。

Fabric での APIM と GraphQL 用 API でのマネージド ID の使用

次に、マネージド ID を使用してこの API の認証を処理する認証のポリシーを構成する必要があります。 マネージド ID は、Azure portal で作成することも、使用可能なツールを使用して作成することもできます。

これで、認証に使用できるマネージド ID 資格情報が作成されました。Fabric の GraphQL 項目に対するアクセス許可を付与する必要があります。 わかりやすくするために、GraphQL API とそのデータ ソースの両方が配置されているワークスペースのメンバーとして、マネージド ID (この例では apim-id) を追加します。

ワークスペースのアクセス許可のスクリーンショット。

API 自体や、LakeHouse や SQL データベースなどの API にアタッチされているデータ ソースなどの Fabric 項目への直接アクセスを有効にする場合は、各アイテムのマネージド ID に対して適切なアクセス許可を付与する必要があります(特に、単一 Sign-On (SSO) 認証を使用して API にアタッチされている場合)。 詳細については、 アクセス許可の概要を参照してください。

ワークスペース、Fabric GraphQL API、またはそのワークスペースにアタッチされているデータ ソースに対する資格情報のアクセス許可を付与したら、認証を実行するためにその資格情報を利用することを APIM に示す必要があります。 APIM コンソールに戻り、 Security>Managed ID に移動し、Fabric GraphQL API へのアクセスに使用しているのと同じユーザー割り当てマネージド ID を追加します。

次に、先ほど作成した GraphQL API の [API ポリシー] タブに移動し、次の <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>

上記のスニペットのクライアント ID をマネージド ID のクライアント ID に置き換えてください。 ポリシーを保存して続行します。

次に、API に戻り、[ テスト ] タブに移動し、GraphQL を使用して Fabric データにクエリや変更を発行できることを確認します。

APIM ポータルでのテストの成功のスクリーンショット。

APIM と Fabric GraphQL の間の正常な接続のテスト

キャッシュ処理

API および API Management 内の操作は、応答のキャッシュを使用して構成できます。 応答のキャッシュを使用すると、API の呼び出し元と API プロバイダーのバックエンド読み込みの待機時間を大幅に短縮できます。 APIM には組み込みのキャッシュがサポートされています。また、独自の Redis インスタンスを使用することもできます。 どちらの場合も、キャッシュ ポリシーを定義する必要があります。 ここでは、ほとんどのシナリオで機能する単純なキャッシュ構成で以前のポリシーを修正しました。

<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>

APIM ポータルで GraphQL API クエリまたは変更をトレースすることで、 要求がキャッシュされていることを確認できます。

APIM ポータルでのキャッシュ ヒットのスクリーンショット。

高度なキャッシュシナリオについては、キャッシュに関する APIM ドキュメント を参照してください。

レート制限

クライアントが特定の期間に実行できる API 呼び出しの数を制限できます。 特定のユーザーに対して 60 秒ごとに 2 回以下の呼び出しを強制する、以下の <inbound><base/> に追加できるレート制限ポリシー エントリの例を次に示します。

<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" />

1 分間に 2 回を超える API 呼び出しを送信すると、次のエラー メッセージが表示されます。

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

APIM でレート制限ポリシーを構成する方法の詳細については、 ドキュメントを参照してください。

Microsoft Fabric API for GraphQL と Azure API Management の統合により、Fabric の豊富なデータ機能と APIM のエンタープライズ レベルのゲートウェイ機能という両方の長所が統合されます。 マネージド ID を構成することで、Fabric に対するセキュリティで保護された認証を有効にします。 カスタム キャッシュとレート制限ポリシーを使用すると、GraphQL API の固有の特性に合わせて調整されたパフォーマンス、コスト、ユーザー エクスペリエンスをきめ細かく制御できます。

このセットアップでは、Fabric データをセキュリティで保護するためのより多くのオプションが提供されるだけでなく、チームやテナント間で運用ワークロードをサポートするために必要なスケーラビリティと可観測性も提供されます。