トラブルシューティング

このページの内容は ApigeeApigee ハイブリッドに該当します。

Apigee Edge のドキュメントを表示する。

Istio 404(Not Found)エラー

Istio で 404(Not Found)エラーをデバッグする場合、時間がかかることがあります。このドキュメントは、問題の原因追及の出発点として役立つことを目的としています。

ワイルドカード ゲートウェイの競合

ホスト値にワイルドカード「*」を使用できるゲートウェイ定義は 1 つだけです。ワイルドカード ゲートウェイを含む別のものをデプロイしていると、クライアントの呼び出しが 404 ステータスで失敗します。

例:

$ istioctl get gateways
GATEWAY NAME         HOSTS     NAMESPACE   AGE
bookinfo-gateway     *         default     20s
httpbin-gateway      *         default     3s

この場合は、競合しているゲートウェイのいずれかを削除するか、変更する必要があります。

ルートの障害点を検索する

Istio は、タマネギ(もしくは、Ogre)のように複数のレイヤで構成されています。404 を体系的にデバッグするには、対象から離れるようにデバッグする必要があります。

バックエンド ワークロード

サイドカーからワークロードにアクセスできることを確認します。

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl localhost:80/headers

バックエンド サイドカー

サービス アドレスを設定して、ワークロード Pod の IP アドレスを取得します。

SERVICE=httpbin.default.svc.cluster.local:80
  POD_IP=$(kubectl get pod $WORKLOAD_POD -o jsonpath='{.status.podIP}')

サイドカーを使用してワークロードにアクセスします。

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl -v http://$SERVICE/headers --resolve "$SERVICE:$POD_IP"

Istio mTLS が有効になっている場合:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl -v https://$SERVICE/headers --resolve "$SERVICE:$POD_IP" --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem --insecure

ゲートウェイ(またはフロントエンド サイドカー)

ゲートウェイからサービスにアクセスします。

kubectl -n istio-system exec $GATEWAY_POD -- curl -v http://$SERVICE/header

Istio mTLS が有効になっている場合:

kubectl -n istio-system exec $GATEWAY_POD -- curl -v https://$SERVICE/headers --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem --insecure

分析が表示されない

Analytics UI に分析結果が表示されない場合は、次のような原因が考えられます。

  • Apigee の取り込みに数分間の遅延がある
  • Envoy gRPC アクセスログが正しく構成されていない
  • Envoy がリモート サービスに到達できない
  • リモート サービスがアップロードできない

API キーが存在しないか、不正な API キーが拒否されない

API キーの検証が正しく動作しない場合は、次の原因が考えられます。

直接プロキシ

ext-authz 構成を確認します。

サイドカー
  • インターセプト用のリスナーが構成されていることを確認します。
  • ext-authz 構成を確認します。

無効なリクエストがチェックされているが、許可されている

  • リモート サービスがフェール オープンに構成されている
  • Envoy が RBAC チェック用に構成されていない

このような問題に対処する方法については、Envoy のドキュメントで外部認証のトピックをご覧ください。また、failure_mode_allow プロパティに関する情報もご覧ください。このプロパティを使用すると、エラーに対するフィルタの動作を変更できます。

JWT が存在しないか、不正な JWT が拒否されない

原因として、Envoy JWT フィルタが構成されていないことが考えられます。

有効な API キーが失敗する

考えられる原因

  • Envoy がリモート サービスに到達できない
  • 認証情報が無効である
  • ターゲットと環境用に Apigee API プロダクトが構成されていない
  • Envoy が Apigee API プロダクトを認識していない

トラブルシューティング手順

Apigee で API サービスを確認する

  • 環境(テスト環境と本番環境)で有効になっていますか?

    このプロダクトは、リモート サービスと同じ環境にバインドする必要があります。

  • アクセスするターゲットにバインドされていますか?

    Apigee リモート サービス ターゲット セクションを確認します。サービス名は、完全修飾ホスト名にする必要があります。Istio サービスの場合、この名前は helloworld.default.svc.cluster.localcode> のようになります。これは、default 名前空間内の helloworld サービスを表します。

  • リソースパスはリクエストと一致していますか?

    //** のようなパスは、どのパスとも一致します。マッチングでは、ワイルドカードとして「*」または「**」を使用できます。

  • デベロッパー アプリがありますか?

    キーを確認するには、API プロダクトがデベロッパー アプリにバインドされている必要があります。

  • Apigee API プロダクトの operationConfigType が remoteservice に設定されていますか?

    Apigee Management API を使用して API プロダクトの構成を確認し、operationConfigTyperemoteservice に設定されていることを確認します。

リクエストを確認する

  • コンシューマ キーを x-api-key header に渡していますか?

    例:

    curl http://localhost/hello -H "x-api-key: wwTcvmHvQ7Dui2qwj43GlKJAOwmo"
  • 適切なコンシューマ キーを使用していますか?

    使用しているアプリの認証情報が、API サービスに対して承認されていることを確認します。

リモート サービスのログを確認する

  1. debug level でロギングを使用してリモート サービスを開始します。リモート サービス ログのレベルの設定をご覧ください。

    コマンドラインで -l debug オプションを使用します。例:

    apigee-remote-service-envoy -l debug
  2. ターゲットにアクセスを試みて、ログを確認します。

    ログで次のような行を確認します。

    Resolve api: helloworld.default.svc.cluster.local, path: /hello, scopes: []
    Selected: [helloworld]
    Eliminated: [helloworld2 doesn't match path: /hello]
    

リモート サービス ログレベルの設定

コマンドライン フラグを使用して、次のいずれかのデバッグモードで詳細度順にリモート サービスを開始できます。ここで、debug の詳細度が最も高く、error の詳細度が最も低くなります。

  • debug - 最も詳細なロギングモード。
  • info - デフォルトのモード。
  • warn
  • error - 詳細度が最も低いロギングモード。

たとえば、debug レベルでサービスを開始するには、次のコマンドを実行します。

apigee-remote-service-envoy -l debug