Contents
Apigee のポリシー概念と全体像
Apigee では ポリシー が API リクエスト/レスポンスのフローに差し込むモジュールとして機能します。ポリシーは実行順序やスコープ(プロキシ全体・フロー単位)を明示的に管理でき、認証・レート制限・メッセージ変換といったロジックをコード不要で実装できます。本節では、ポリシーの基本構造と公式ドキュメントで押さえておくべきポイントを整理します。
ポリシーの基本構築と実行順序
Apigee のフローは PreFlow → Request → Target → Response → PostFlow の 5 段階に分かれ、各段階に任意のポリシーを配置できます。同一フロー内では XML に記述した順番がそのまま実行順になるため、設計時は「早期リターン」や「共通エラーハンドリング」を意識して配置しましょう。
- PreFlow: 認証系ポリシー(例:OAuthV2)を置くことで不正リクエストを即座に遮断
- Request: 入力パラメータの正規化や変換処理
- Target: 実際のバックエンド呼び出し前後で必要なヘッダー付与など
- Response: レスポンスフォーマット統一やキャッシュ制御
- PostFlow: ロギング・監査情報の送信
公式 Docs で確認すべき重要ポイント
Apigee のポリシーを安全に運用するために、ドキュメントで特に意識すべき点をまとめます。
- 名前空間(
name属性) は必ず設定し、プロキシ内で一意になるよう命名規則を決める - FaultRule によるエラーハンドリングは必須。デフォルトの XML エラーはユーザー体験が損なわれやすいため、カスタムスクリプトへ委譲することが推奨されます
- 環境変数(environment variables) を活用すると dev / prod で設定を切り替えやすく、CI/CD パイプラインでも同一テンプレートを再利用可能
OAuthV2 ポリシーによるトークン検証
OAuth2 のアクセストークン有効性を確認する代表的なポリシーが OAuthV2 です。本節では、実装例と共にエラーハンドリングのベストプラクティスを解説します。なお、以下で参照している外部ブログは2025年6月掲載(Apigee の主要セキュリティポリシーと自動デプロイ方法)であり、執筆時点ではリンクが有効でした。
XML テンプレートと必須属性
OAuthV2 ポリシーは Operation と AccessToken が必須項目です。以下のテンプレートは公式推奨例をベースにしています。
|
1 2 3 4 5 6 7 8 9 10 11 |
<OAuthV2 name="VerifyAccessToken"> <Operation>VerifyAccessToken</Operation> <AccessToken ref="request.header.authorization"/> <Scope>read write</Scope> <GenerateResponse enabled="true"/> </OAuthV2> <FaultRule name="OAuthFault"> <Step><Name>HandleOAuthError</Name></Step> </FaultRule> |
Operation:VerifyAccessTokenが必須で、トークン検証を指示しますAccessToken:Authorizationヘッダーから自動的に Bearer プレフィックスを除去して取得Scope: 必要なスコープをスペース区切りで列挙し、足りない場合は Fault が発生
カスタムエラーハンドリングのベストプラクティス
デフォルトの XML エラーは XML 形式で返却されるため、クライアント側で統一的に処理しづらくなります。ここでは JavaScript ポリシーを組み合わせて JSON 形式のエラーレスポンスに変換する例を示します。
|
1 2 3 4 |
<JavaScript name="HandleOAuthError"> <ResourceURL>jsc://oauth_error.js</ResourceURL> </JavaScript> |
|
1 2 3 4 5 6 7 8 9 |
// resources/oauth_error.js var errorResponse = { error: "invalid_token", message: "アクセストークンが無効です。再取得してください。", code: 401 }; context.setVariable("response.content", JSON.stringify(errorResponse)); context.setVariable("httpResponse.status", 401); |
この構成により、トークン検証失敗時でも RESTful な JSON が即座に返却され、フロントエンドのハンドリングが簡潔になります。
Verify API Key ポリシーとキー管理連携
API キー認証は軽量で導入コストが低い反面、キー漏洩時の影響を最小化するための設計が重要です。本節ではキャッシュ活用とローテーション時の処理について解説します。
API キー取得・キャッシュ構成
以下はヘッダー apikey からキーを取得し、KVM(Key‑Value Map)や外部 Vault への問い合わせ回数を削減するキャッシュ設定例です。
|
1 2 3 4 5 6 7 8 |
<VerifyAPIKey name="CheckApiKey"> <APIKey ref="request.header.apikey"/> <ContinueOnError>false</ContinueOnError> <CacheLookup>api-key-cache</CacheLookup> </VerifyAPIKey> <Cache name="api-key-cache" ttl="300"/> |
CacheLookup: 5 分間(TTL=300 秒)キャッシュし、同一キーの繰り返しリクエストで KVM/Vault へのアクセスを回避ContinueOnError:falseに設定するとキー検証失敗時に即座に Fault が発生します
ローテーションとキャッシュ失効の実装例
キーがローテーションされた際は、キャッシュを手動で無効化する必要があります。以下は Python ポリシーで統一エラーメッセージを生成しつつ、CacheInvalidate と組み合わせるパターンです。
|
1 2 3 4 5 6 |
<Python name="ApiKeyErrorHandler"> <ResourceURL>python://api_key_error.py</ResourceURL> </Python> <CacheInvalidate name="InvalidateApiKeyCache" target="api-key-cache"/> |
|
1 2 3 4 5 6 7 8 9 10 |
# resources/api_key_error.py import json error_body = { "error": "invalid_api_key", "message": "提供された API キーは無効です。管理者にお問い合わせください。", "code": 403 } context.setVariable("response.content", json.dumps(error_body)) context.setVariable("httpResponse.status", 403) |
キー情報が更新されると同時に InvalidateApiKeyCache を実行すれば、次回リクエストから新しいキー情報が即座に反映されます。
AccessControl ポリシーでの IP とヘッダー制御
IP アドレスや特定ヘッダーによるアクセス制限は、内部向け API と外部公開 API を分離する際に有効です。本節ではホワイトリスト/ブラックリストと環境変数を組み合わせた条件付与の実装例を示します。
IP ホワイトリスト・ブラックリスト設定
以下は許可 IP(ホワイトリスト)と拒否 IP(ブラックリスト)を同時に定義し、先行評価 が適用される構成です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<AccessControl name="IPFilter"> <Allow> <IPAddress>192.168.10.0/24</IPAddress> <IPAddress>203.0.113.45</IPAddress> </Allow> <Deny> <IPAddress>10.0.0.0/8</IPAddress> </Deny> </AccessControl> <FaultRule name="IPBlockFault"> <Step><Name>HandleIpBlockError</Name></Step> </FaultRule> |
Allowが優先され、マッチしなければ次にDenyが評価されますFaultRuleと組み合わせることで、ブロック時に JSON エラーレスポンスを返せます
ヘッダー条件と環境別有効化
本番環境でのみ特定ヘッダーが必要なケースは、Flow Variable と Conditional Flow を活用すると管理が楽になります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<AssignMessage name="SetEnvVar"> <Set> <Headers> <Header name="X-Env">prod</Header> </Headers> </Set> </AssignMessage> <ConditionalFlow condition="request.header.X-Env = 'prod'"> <Step><Name>HeaderFilter</Name></Step> </ConditionalFlow> <AccessControl name="HeaderFilter"> <Condition>request.header.X-Client-Type = "internal"</Condition> </AccessControl> |
この構成により、dev 環境ではヘッダー制御が無効 となり、本番環境だけで厳格なアクセスチェックを適用できます。
Apigee Edge と Apigee X の比較
Apigee はクラウド版(Edge)と Google Cloud 上の次世代プラットフォーム(X)の2つが提供されています。選択時に迷わないよう、主要機能・運用モデルを表形式で整理しました。
| 項目 | Apigee Edge | Apigee X |
|---|---|---|
| デプロイ先 | Apigee のマネージド SaaS(オンプレミスは非対応) | Google Cloud 上の完全マネージドサービス、GKE との統合が可能 |
| ランタイム | Java ベースの旧世代ランタイム | Envoy/Go 言語ベースの新世代ランタイムで低レイテンシ |
| ポリシー互換性 | 従来の XML ポリシーがそのまま使用可能 | ほぼ同等だが、一部非推奨ポリシーは X ではサポート外 |
| セキュリティ機能 | IAM のみ、API キー・OAuth が中心 | Cloud IAM + VPC Service Controls、Secret Manager 連携が標準装備 |
| スケーラビリティ | 手動でインスタンス増減(プラン依存) | オートスケールがデフォルトで有効 |
| ロギング・モニタリング | Apigee Analytics(別料金) | Cloud Logging / Monitoring とシームレスに統合 |
選択指針
- 既存投資が多く、オンプレミスやレガシー環境を維持したい場合は Edge が適しています。
- Google Cloud エコシステムと連携し、将来的な自動スケール・高度な IAM 制御が必要なら X を選択すべきです。
CI/CD パイプラインでのデプロイとセキュリティベストプラクティス
ポリシー変更は手作業よりも自動化した方がミスを減らせます。ここでは GitHub Actions を用いたデプロイフローと、シークレット管理以外に重要な 最小権限 API キー の扱いについて解説します。
GitHub Actions による自動デプロイ手順
以下は apiproxy/ ディレクトリの変更を検知したら Apigee X(または Edge)へデプロイする最小構成です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
name: Deploy Apigee Proxy on: push: paths: - 'apiproxy/**' jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Node (for apigeetool) uses: actions/setup-node@v3 with: node-version: '20' - name: Install apigeetool run: npm install -g apigeetool - name: Deploy to Apigee env: APIGEE_USER: ${{ secrets.APIGEE_USER }} APIGEE_PASS: ${{ secrets.APIGEE_PASS }} ORG_NAME: ${{ secrets.ORG_NAME }} ENV_NAME: ${{ secrets.ENV_NAME }} run: | apigeetool deployproxy -u $APIGEE_USER -p $APIGEE_PASS \ -o $ORG_NAME -e $ENV_NAME -n my-secure-proxy -d ./apiproxy |
- シークレット管理は GitHub の
Secretsに格納し、ワークフロー内で環境変数として参照します。 - デプロイ前に
apigeetool exportで現在のバンドルを取得し、差分がある場合だけdeployproxyを実行するロジックを追加すると無駄なデプロイを防げます。
シークレット管理・最小権限 API キーの徹底
CI/CD パイプラインで扱う認証情報は 「最小権限」 の原則に基づき、必要最低限のスコープだけを付与した API キーを使用します。
- Apigee Edge/X 用 API キー: デプロイ専用ユーザーに
org_admin権限は不要。environment_adminかproxy_deployerのみ付与 - Vault / Secret Manager: キー自体も暗号化された状態で保存し、ランタイム時にだけ取得
- キーのローテーション: 毎月またはインシデント発生時に自動ローテーションスクリプトを走らせ、古いキーは即座に無効化
| 手順 | 推奨設定 |
|---|---|
| API キー権限 | proxy_deployer(環境へのデプロイのみ) |
| 有効期限 | 30 日以内の短期キー |
| ローテーション方法 | CI ジョブで apigeetool deletekey → 新規作成 → Secrets 更新 |
| アクセス監査 | Cloud Logging に API キー使用履歴を出力し、定期的にレビュー |
変更検証とロールバック戦略
自動デプロイ後の不具合は速やかに復旧できるよう、ステージング環境でのテスト と 即時ロールバック を組み込んでおくことが重要です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# ステージングへ先行デプロイ → テスト成功なら本番へ - name: Deploy to Staging env: { ... } run: apigeetool deployproxy -e staging ... - name: Run Integration Tests uses: ./scripts/run-tests.sh - name: Promote to Production (if tests pass) if: success() env: { ... } run: apigeetool deployproxy -e production ... |
| シナリオ | アクション |
|---|---|
| テスト失敗 | ステージングデプロイをロールバックし、Git のブランチで修正後再実行 |
| 本番障害検知 | apigeetool deleteproxy で直前バージョンに戻すか、rollback API を呼び出す |
| 緊急パッチ | 別ブランチで最小変更を作成し、hotfix ラベル付与後即デプロイ |
まとめ
Apigee のポリシーは 「認証 → 認可 → アクセス制御」 の流れで設計すれば、コード不要で堅牢なセキュリティ層を構築できます。OAuthV2・VerifyAPIKey・AccessControl といった主要ポリシーの実装例とキャッシュ・ローテーション戦略、さらに Apigee Edge と X の違いを踏まえた選択指針を示しました。
CI/CD では GitHub Actions + apigeetool をベースに、シークレットは GitHub Secrets に保管し、API キーは最小権限で発行・定期ローテーションすることがベストプラクティスです。ステージングテストと即時ロールバックを組み込めば、本番環境への影響を最小化できます。
これらの手順やコードはそのままコピーして利用可能ですので、ぜひ自社 API プロキシに組み込み、安全かつスピーディな API 運用基盤 を構築してください。