アンチパターン: API プロキシから Apigee API を呼び出す

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントを表示する。

Apigee には Apigee API と呼ばれる高機能なユーティリティがあり、次のようなサービスが提供されています。

  • API プロキシのデプロイまたはデプロイ解除
  • 仮想ホスト、キーストア、トラストストアなどの構成
  • Key-Value マップ(KVM)、API プロダクト、デベロッパー アプリ、デベロッパー、コンシューマ キーなどのエンティティの作成、削除、更新
  • これらのエンティティに関する情報の取得

これらのサービスには、Apigee プラットフォームの Management Server と呼ばれるコンポーネントを通じてアクセス可能です。これらのサービスはシンプルな API 呼び出しで簡単に呼び出せます。

ランタイム時に、API プロキシからこれらのサービスのいくつかを使用しなければならない場合があります。これは、KVM、OAuth アクセス トークン、API プロダクト、デベロッパー アプリ、デベロッパー、コンシューマ キーなどのエンティティに、Key-Value ペアやカスタム属性の形式で、またはプロファイルの一部として有益な情報が含まれているためです。

たとえば、KVM に次の情報を格納すると、ランタイム時にセキュリティを確保しながらアクセス可能になります。

  • バックエンドのターゲット URL
  • 環境プロパティ
  • バックエンドまたはサードパーティ システムのセキュリティ認証情報

同様に、ランタイム時に API プロダクトやデベロッパーのメールアドレスのリストを取得する必要が生じることもあります。これらの情報は、デベロッパー アプリ プロファイルの一部として利用できます。

これらすべての情報をランタイム時に効果的に使用することによって、Apigee 内のポリシーやカスタムコードで動的な動作を実現できます。

アンチパターン

Apigee API は管理タスクを行うのに便利であり、推奨される方法です。しかし、API プロキシのフロー内でランタイム ロジックを実行するために使用すべきではありません。理由は次のとおりです。

  • KVM、OAuth アクセス トークンなどのエンティティに関する情報へのアクセス、または API プロキシから他の目的で Apigee API を使用することは、Management Server への依存につながります。
  • Management Server は Apigee ランタイム コンポーネントに含まれないため、高可用性ではない場合があります。
  • Management Server は、同じネットワークやデータセンター内にプロビジョニングされないことがあるため、ランタイム時にネットワークのレイテンシが発生する場合もあります。
  • Management Server 内のエントリがキャッシュされる期間がこれより長いため、短期間に書き込みと読み取りを行った場合、API プロキシで最新のデータをすぐに表示できない場合があります。
  • ランタイム時にネットワーク ホップ数が増加します。

次のコードサンプルでは、カスタム JavaScript コード使用して Apigee API 呼び出しを行い、KVM から情報を取得します。

var response = httpClient.send('https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/keyvaluemaps')

Management Server が利用不可の場合、Apigee API を呼び出す JavaScript コードは失敗します。これにより、以降の API リクエストも失敗することになります。

影響

  • ランタイム時に Management Server への依存関係が追加されます。Management Server で障害が発生すると、API 呼び出しに影響が出ます。
  • Apigee API のユーザー認証情報は、ローカルに保存するか、暗号化された KVM などの安全な保管場所に保存する必要があります。
  • ネットワーク経由で管理サービスを呼び出すことによりパフォーマンスに影響します。
  • Management Server ではキャッシュの保存期間が長いため、更新された値がすぐに表示されない場合があります。

ベスト プラクティス

ランタイム時に KVM、API プロダクト、デベロッパー アプリ、デベロッパー、コンシューマ キーなどのエンティティから情報を取得する方法には、より効率的な方法があります。いくつか例を挙げましょう。

  • KeyValueMapOperations ポリシーを使用して、KVM の情報にアクセスします。次のサンプルコードは、KVM から情報を取得する方法を示しています。
    <!-- /antipatterns/examples/2-6.xml -->
    <KeyValueMapOperations mapIdentifier="urlMap" async="false"
        continueOnError="false" enabled="true" name="GetURLKVM">
      <DisplayName>GetURLKVM</DisplayName>
      <ExpiryTimeInSecs>86400</ExpiryTimeInSecs>
      <Scope>environment</Scope>
      <Get assignTo="urlHosti" index="2">
        <Key>
          <Parameter>urlHost_1</Parameter>
        </Key>
      </Get>
    </KeyValueMapOperations>
  • API プロダクト、デベロッパー アプリ、デベロッパー、コンシューマ キーなどの情報に API プロキシ内でアクセスするには、次のいずれかの方法を利用します。
    • API プロキシフローに VerifyAPIKey ポリシーが含まれている場合は、このポリシーの一部として設定されたフロー変数を使用して情報にアクセスできます。以下のサンプルコードは、JavaScript を使用してデベロッパー アプリの名前と created_by の情報を取得する方法を示しています。
      <!-- /antipatterns/examples/2-7.xml -->
      print("Application Name ", context.getVariable(""verifyapikey. VerifyAPIKey.app.name"));
      print("Created by:", context.getVariable("verifyapikey. VerifyAPIKey.app.created_by"));
    • API プロキシのフローに VerifyAPIKey ポリシーが含まれていない場合は、AccessEntity ポリシーと ExtractVariables ポリシーを使用して、API プロダクトやデベロッパー アプリなどのプロファイルにアクセスできます。
      1. AccessEntity ポリシーを使用してデベロッパー アプリのプロファイルを取得します。
        <!-- /antipatterns/examples/2-8.xml -->
        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <AccessEntity async="false" continueOnError="false" enabled="true" name="GetDeveloperApp">
          <DisplayName>GetDeveloperApp</DisplayName>
          <EntityType value="app"></EntityType>
          <EntityIdentifier ref="developer.app.name" type="appname"/>
          <SecondaryIdentifier ref="developer.id" type="developerid"/>
        </AccessEntity>
      2. ExtractVariables ポリシーを使用して、デベロッパー アプリから appId を抽出します。
        <!-- /antipatterns/examples/2-9.xml -->
        <ExtractVariables name="Extract-Developer App-Info">
          <!--
            The source element points to the variable populated by AccessEntity policy.
            The format is <policy-type>.<policy-name>
            In this case, the variable contains the whole developer profile.
          -->
          <Source>AccessEntity.GetDeveloperApp"</Source>
          <VariablePrefix>developerapp</VariablePrefix>
          <XMLPayload>
            <Variable name="appld" type="string">
              <!-- You parse elements from the developer profile using XPath. -->
              <XPath>/App/AppId</XPath>
            </Variable>
          </XMLPayload>
        </ExtractVariables>

関連情報