Cloud Service
Azure API Management
API の玄関(API ゲートウェイ)。受けたリクエストを認証・流量制限・変換・キャッシュしてバックエンド(App Service / Functions / AKS / 任意の HTTP)へ繋ぐマネージドサービス。開発者ポータルや API 製品によるパッケージ化も担う。AWS の Amazon API Gateway に相当。
- 1.複数 API をまとめて公開する API ゲートウェイ(受付窓口)。
- 2.認証・流量制限・変換・キャッシュをポリシーで処理しバックエンドへ橋渡し。
- 3.製品とサブスクリプションキーで配布管理、開発者ポータルも自動提供。
解決する課題
- API 用のゲートウェイを自前で運用したくない(認証・レート制限・変換を共通の玄関で)
- バックエンド(Functions / App Service / AKS など)を安全に公開し、直接アクセスを遮断したい
- 社内外の利用者へ API をパッケージ化(製品)して配布し、サブスクリプションキーで利用を管理したい
- 既存の SOAP / REST / GraphQL / WebSocket を統一されたファサードの裏に隠し、後からバックエンドを差し替えたい
- API のドキュメント・試用環境(開発者ポータル) を自動で提供したい
主要概念と用語
- API / オペレーション: 公開する API と、その中の個々のエンドポイント(メソッド + URL テンプレート)
- 製品(プロダクト): 1 つ以上の API を束ねた公開単位。公開/非公開、サブスクリプション要否、レート制限・クォータを製品単位で設定
- サブスクリプション / サブスクリプションキー: 利用者ごとのアクセスキー。既定では
Ocp-Apim-Subscription-Keyヘッダ(またはクエリ)で送る。AWS の API キー + 使用量プランに相当 - ポリシー(Policies): ゲートウェイの中核。リクエスト/レスポンスに対し XML で記述する処理パイプライン(
inbound/backend/outbound/on-error)。認証・レート制限・変換・キャッシュ・モック・ヘッダ操作などを宣言的に適用 - バックエンド / API バックエンド: 転送先。
backendエンティティで資格情報や回路ブレーカーをまとめて管理できる - 開発者ポータル: API カタログ・ドキュメント・対話的な試用(Try it)・サブスクリプション申請を提供する自動生成サイト(カスタマイズ可)
- 名前付き値(Named values): ポリシーで使う設定値/シークレットの集中管理。Key Vault 参照が可能
- ゲートウェイ(マネージド / セルフホスト): 既定はマネージドゲートウェイ。セルフホストゲートウェイは同じゲートウェイをコンテナとしてオンプレ/他クラウド/エッジで実行できる(ハイブリッド/マルチクラウド向け)
- API バージョン / リビジョン: 破壊的変更を扱うバージョンと、無停止で差し替えるリビジョン
仕様・制限・クォータ
- SKU(レベル) で機能・SLA・スケール方式が異なる: Consumption(従量・サーバーレス、スケールゼロ)/ Developer(SLA なし・検証用)/ Basic / Standard / Premium、および新世代の Basic v2 / Standard v2(高速デプロイ、VNet 統合の簡素化)。Premium のみマルチリージョン展開・VNet(注入)・複数カスタムドメイン・可用性ゾーンに対応
- キャパシティ単位(スケールユニット) で性能をスケール。Premium はリージョンごとに複数ユニットへスケールアウト可(自動スケール対応)
- レート制限(rate-limit)とクォータ(quota)はポリシーで実装。短期のバースト抑制(例: 5 秒間に N 回)と、月次などの消費上限を分けて設定できる
- 応答キャッシュは内蔵キャッシュ、または Azure Cache for Redis(外部キャッシュ)を利用可能
- VNet 接続は 注入(injection: 専用サブネットに APIM を配置) と 統合(v2 の VNet integration)/ Private Endpoint(インバウンドのプライベート化) の方式がある
- 従来 SKU のプロビジョニング/構成変更は数十分かかることがある(特に Premium の VNet 構成)。v2 SKU は大幅に高速化
内部の仕組み
リクエストは クライアント → APIM ゲートウェイ → バックエンドの順に流れ、ゲートウェイ内でポリシーパイプラインが段階的に実行されます。
- inbound: 受信時。サブスクリプションキー検証・JWT 検証(
validate-jwt)・IP 制限・レート制限/クォータ・URL/ヘッダ/ボディの書き換え・キャッシュ参照(cache-lookup)など - backend: バックエンド呼び出しの前後。タイムアウト・リトライ・回路ブレーカー・バックエンド選択
- outbound: 応答返却前。ボディ変換(XML⇔JSON 等)・ヘッダ除去・キャッシュ格納(
cache-store) - on-error: いずれかでエラーが発生した時のハンドリング
ポリシーは グローバル → 製品 → API → オペレーションの各スコープで定義でき、<base /> で上位スコープの処理を差し込みます。バックエンドへの通信は APIM がファサードとして仲介するため、利用者にバックエンドの実体(ホスト名/認証方式)を隠蔽できます。
ポリシーはグローバル/製品/API/オペレーションで重ねがけされ、<base /> の位置で上位スコープが展開されます。意図しない順序・二重適用を避けるため、どのスコープに何を置くかを設計段階で決めること。共通の認証・流量制御は上位スコープ、個別の変換はオペレーションスコープが定石です。
設計パターン / ベストプラクティス
- APIM + Azure Functions / App Service / AKS でサーバーレス〜コンテナ API のファサードを構築。バックエンドは APIM 経由のみ許可
- JWT 検証を玄関に集約:
validate-jwtで Microsoft Entra ID(旧 Azure AD) のトークンを検証し、認可(OAuth 2.0 / OpenID Connect)をゲートウェイで統一 - 製品 + サブスクリプションで利用者・プラン(無料/有料)を分け、製品単位でレート制限・クォータを設定
- バックエンドの保護: バックエンド(App Service など)は VNet + Private Endpoint に隠し、APIM からのみ到達可能にする。あるいは APIM を前段の唯一の入口にして直接公開しない
- シークレットは名前付き値 + Key Vault 参照で管理し、ポリシーに直書きしない
- 可用性が要件なら Premium のマルチリージョン + 可用性ゾーン。前段に Front Door / Application Gateway(WAF) を併用して L7 防御・グローバル配信
- バージョンとリビジョンを使い分け、破壊的変更は新バージョン、無停止の修正はリビジョンで安全に反映
運用・監視
- Azure Monitor / メトリクス: 要求数(Requests)、容量(Capacity %)、バックエンド/全体の応答時間、4xx/5xx を監視。Capacity が高止まりならユニット追加(スケールアウト)
- Application Insights 連携で API 単位のテレメトリ・依存関係・例外を分析(サンプリング率に注意)
- 診断ログ(ゲートウェイログ)を Log Analytics / Storage / Event Hub へ送出。エラーやレイテンシのトレンドを把握
- 429(Too Many Requests) はレート制限/クォータポリシーの上限を確認。トレース(
Ocp-Apim-Trace) でポリシーパイプラインの実行を可視化して原因を切り分け - セルフホストゲートウェイはコンテナのヘルスと構成同期(コントロールプレーン到達性)を監視
コスト
| 観点 | Consumption | 従来 SKU(Developer〜Premium)/ v2 |
|---|---|---|
| 課金モデル | 実行(呼び出し)回数の従量+無料枠 | 時間課金(インスタンス/ユニット稼働) |
| スケール | 自動・ゼロまでスケール | ユニット数で段階スケール(Premium は複数ユニット/自動スケール) |
| コールドスタート | あり(アイドル後に遅延の可能性) | 原則なし(常時稼働) |
| VNet / マルチリージョン | 非対応 | Premium で対応(v2 は統合/Private Endpoint) |
| 向いている用途 | 間欠的・小規模・サーバーレス API | 定常トラフィック・本番・エンタープライズ要件 |
- Consumption は呼び出し回数ベースの従量(一定の無料枠あり)で、トラフィックが間欠的なら安価。ただしコールドスタートや一部機能制限がある
- 従来 SKU / v2 は稼働時間(ユニット)課金が中心。定常的に流量がある本番では予測しやすく、機能(VNet・マルチリージョン・複数ドメイン)も揃う
- 応答キャッシュに Azure Cache for Redis を使う場合は Redis 側の料金が別途かかる。Application Insights / Log Analytics の取り込み量にも注意
セキュリティ
- サブスクリプションキーで利用を識別・制限し、
validate-jwtで Entra ID / OAuth 2.0・OpenID Connect トークンを検証(認可を玄関に集約) - mTLS(クライアント証明書) 認証や、バックエンドへのクライアント証明書/マネージド ID による認証に対応。APIM にマネージド ID を付与し、Key Vault や Functions などへ資格情報レスでアクセス
- IP 制限・レート制限・クォータポリシーで乱用を抑止。前段に Front Door / Application Gateway の WAF を併用して L7 攻撃を緩和
- VNet 注入 / Private Endpoint で APIM 自体やバックエンドをプライベート化。TLS 1.2 以上を維持し、弱い暗号スイートを無効化
- 名前付き値 + Key Vault でシークレットを集中管理し、ポリシーや構成への直書きを排除
APIM を導入しても、バックエンド(App Service / Functions / VM)が公衆インターネットに直接公開されたままだと、攻撃者は APIM を迂回してバックエンドを直撃でき、認証・レート制限・WAF をすべて回避できます。バックエンドは VNet + Private Endpoint で非公開にする、または最低でも APIM からのトラフィックのみ許可(IP 制限 / マネージド ID / クライアント証明書での相互検証)して、APIM を唯一の入口にしてください。
関連サービス・比較(AWS との対応)
| 観点 | Azure API Management | Amazon API Gateway |
|---|---|---|
| 位置づけ | API ゲートウェイ + 製品/開発者ポータル | API ゲートウェイ(REST/HTTP/WebSocket) |
| 処理の記述 | ポリシー(XML パイプライン) | 統合 + マッピングテンプレート(VTL) |
| 認証認可 | validate-jwt(Entra ID/OAuth)+ サブスクリプションキー + mTLS | Cognito / Lambda オーソライザー / IAM + API キー |
| 流量制御 | rate-limit / quota ポリシー | スロットリング + 使用量プラン |
| 利用管理 | 製品 + サブスクリプション + 開発者ポータル | 使用量プラン + API キー(ポータルは別途) |
| ハイブリッド | セルフホストゲートウェイ(他クラウド/オンプレ) | 原則 AWS マネージド(要件次第で別構成) |
| 課金モデル | Consumption(従量)/ ユニット時間課金 | リクエスト課金(HTTP API は安価) |
- APIM はポリシー(XML)で処理を宣言的に組み立てる点と、製品/サブスクリプション/開発者ポータルによる API の配布・収益化機能が標準で一体である点が特徴。API Gateway は HTTP API / REST API の使い分けでコストと機能を調整する
- ハイブリッド/マルチクラウドでは APIM の セルフホストゲートウェイが強み。Azure 側のバックエンド保護は VNet / Private Endpoint、前段の WAF は Front Door / Application Gateway が定番の組み合わせ
ハンズオン / CLI例
# リソースグループを作成
az group create --name demo-rg --location japaneast
# API Management インスタンスを作成(Consumption は安価・サーバーレス)
# ※ Developer/Basic などは作成に数十分かかる場合がある
az apim create \
--resource-group demo-rg \
--name demo-apim-0603 \
--location japaneast \
--publisher-name "Contoso" \
--publisher-email admin@contoso.com \
--sku-name Consumption
# 既存のバックエンド(OpenAPI/Swagger)から API をインポート
az apim api import \
--resource-group demo-rg \
--service-name demo-apim-0603 \
--api-id petstore \
--path petstore \
--specification-format OpenApi \
--specification-url https://petstore3.swagger.io/api/v3/openapi.json
# 製品を作成し、API を割り当て(サブスクリプション必須・公開)
az apim product create \
--resource-group demo-rg \
--service-name demo-apim-0603 \
--product-id starter \
--product-name "Starter" \
--subscription-required true \
--approval-required false \
--state published
az apim product api add \
--resource-group demo-rg \
--service-name demo-apim-0603 \
--product-id starter \
--api-id petstore
# API 一覧を確認
az apim api list \
--resource-group demo-rg \
--service-name demo-apim-0603 \
--query "[].{Name:displayName, Path:path}" -o table
レート制限・JWT 検証などはポリシー(XML)で API/製品スコープに適用します。例として、5 秒あたり 10 回に制限する inbound ポリシーは次のとおりです。
<policies>
<inbound>
<base />
<rate-limit calls="10" renewal-period="5" />
<!-- 例: Entra ID の JWT を検証して認可を玄関に集約 -->
<!-- <validate-jwt header-name="Authorization" failed-validation-httpcode="401">
<openid-config url="https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration" />
<audiences><audience>api://<app-id></audience></audiences>
</validate-jwt> -->
</inbound>
<backend><base /></backend>
<outbound><base /></outbound>
<on-error><base /></on-error>
</policies>
Azure Service
Azure API Managementを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
アプリ統合
比較で見る軸
クラウド: Azure / カテゴリ: アプリ統合 / 難易度: intermediate
導入後に効く点
認証・流量制限・変換・キャッシュをポリシーで処理しバックエンドへ橋渡し。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Azure
- カテゴリ
- アプリ統合
- 難易度
- intermediate
- 関連資格
- —
- 設計柱
- security / performance / operational / reliability
判断チェックリスト
- 自社の用途が「アプリ統合 / security」に近いか確認する。
- 強みである「複数 API をまとめて公開する API ゲートウェイ(受付窓口)。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。
他クラウドの同等サービス
役割が近いサービスです。設計の置き換えや比較検討の参考に。