Apigee ハイブリッドでの Apigee Adapter for Envoy の使用

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

Apigee Edge のドキュメントはこちらをご覧ください。

この例では、Apigee ハイブリッド デプロイで Apigee Adapter for Envoy を使用する方法を示します。

前提条件

始める前に、次のことを行います。

概要

この例では、Apigee ハイブリッドで Apigee Adapter for Envoy を使用する方法について説明します。この例では、Apigee ハイブリッドがデプロイされているクラスタと同じ Kubernetes クラスタに、シンプルな HTTP サービスをデプロイします。次に、Apigee でこのサービスに対する API 呼び出しを管理するように、Apigee Adapter for Envoy を構成します。

次の図は、Apigee ハイブリッド インテグレーションの基本アーキテクチャを示しています。

管理プレーン、ランタイム プレーン、GCP サービスなどの Apigee ハイブリッド環境に統合された Envoy Adapter の概要図

Istio サービス メッシュ内の Istio サイドカーとして、対象の HTTP サービスで Envoy プロキシがデプロイされます。サイドカーは対象のサービスとの間の API トラフィックを処理し、Remote Service と通信します。Remote Service は、ハイブリッド管理プレーンとも通信して、API プロダクトとプロキシ情報を取得します。

gcloud の構成を確認する

  1. gcloud 構成が、ハイブリッド組織に関連付けられた GCP プロジェクトに設定されていることを確認します。

    現在の設定を一覧表示するには:

    gcloud config list

    必要に応じて、次のコマンドを使用して正しい GCP プロジェクト ID を設定します。

    gcloud config set project project-id
  2. GCP プロジェクトの Google Cloud SDK(gcloud)で認証する必要があります。
    gcloud auth login

Apigee ハイブリッドのプロビジョニング

このステップでは、Remote Service CLI を使用して remote-service API プロキシとともにハイブリッドをプロビジョニングします。また、プロビジョニング コマンドは Apigee に証明書を設定し、リモート サービスが Apigee に安全に接続するために使用する認証情報を生成します。

  1. $CLI_HOME ディレクトリに移動します。
    cd $CLI_HOME
  2. Apigee ハイブリッド組織に関連付けられた GCP プロジェクトのオーナーでない場合は、GCP ユーザー アカウントに Apigee Organization Admin ロールが含まれていることを確認してください。リソースに対するアクセス権の付与、変更、取り消しをご覧ください。
  3. 次のコマンドを実行して、アクセス トークンを取得します。
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. 次の環境変数を作成します。これらの変数は、プロビジョニング スクリプトのパラメータとして使われます。
    export ORG=organization_name
    export ENV=environment_name
    export RUNTIME=host_alias_url
    export NAMESPACE=hybrid_runtime_namespace

    ここで

    変数 説明
    organization_name Apigee ハイブリッド インストールのための Apigee 組織の名前。
    environment_name Apigee ハイブリッド組織内の環境の名前。
    host_alias_url ハイブリッド構成で定義された仮想ホストの hostAlias が含まれる URL。先頭は https:// でなければなりません。例: https://apitest.apigee-hybrid-docs.net
    hybrid_runtime_namepace ハイブリッド ランタイム コンポーネントがデプロイされる名前空間。注: ハイブリッド デプロイのデフォルトの名前空間は apigee です。
  5. 次のコマンドを実行して、リモート サービス プロキシを Apigee ハイブリッドにプロビジョニングします。

    アップグレードしない場合は、このコマンドを使用して Apigee をプロビジョニングします。

    ./apigee-remote-service-cli provision --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml

    アップグレードする場合は、--force-proxy-install フラグを指定したこのコマンドを使用して Apigee をプロビジョニングします。

    ./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml
  6. config.yaml ファイルの内容を確認します。次のようになります。
    # Configuration for apigee-remote-service-envoy
    # generated by apigee-remote-service-cli provision on 2020-07-06 18:03:58
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        tenant:
          remote_service_api: https://apitest.apigee-hybrid-docs.net/remote-service
          org_name: hybrid-docs
          env_name: envoy
          allow_unverified_ssl_cert: true
        analytics:
          collection_interval: 10s
          fluentd_endpoint: apigee-udca-hybrid-docs-envoy.apigee:20001
          tls:
            ca_file: /opt/apigee/tls/ca.crt
            key_file: /opt/apigee/tls/tls.key
            cert_file: /opt/apigee/tls/tls.crt
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: hybrid-docs-envoy-policy-secret
      namespace: apigee
    type: Opaque
    data:
      remote-service.crt: eyJrZXlzIjpbeyJrdHkiOiJSU0EiLCJhbGci...
      remote-service.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURS...
      remote-service.properties: a2lkPTIwMjAtMDctMDZ...
  7. サービス構成(プロビジョニング コマンドによるファイル出力)をクラスタに適用します。
    kubectl apply -f $CLI_HOME/config.yaml
  8. プロキシと証明書を検証します。次のように有効な JSON が返されます。
    curl -i $RUNTIME/remote-service/certs

    出力は次のようになります。

    {
        "keys": [
            {
                "alg": "RS256",
                "e": "AQAB",
                "kid": "2020-05-11T11:32:26-06:00",
                "kty": "RSA",
                "n": "0v-nbTQyAmtVZ-wZRP0ZPIbrVaX91YO9JZ9xCQPb4mOdOSS7yKfTDJGg0KM130sGVYBvR76alN8
                fhrrSDEG5VXG8YYMqPXarwRC7MRJWocCQ_ECYrjDD0_Q018M2HyXZYSd8fhAogi9mVUYsEmCKqJH53Dh1
                jqsHOQzBLKsX0iDO9hEZNFtjbX0UCbSxsUlmBCub7Uj2S-PahA6DEQOMhQjZM7bBMtkTMpFmaJ_RZTmow
                BHP57qMna17R8wHD4kUsO2u_-3HHs5PSj1NrEYoVU2dwLQw0GlkB__ZWeFgXTqot81vb-PmoM9YxwoZrm
                TcHdljugWy_s7xROPzTod0uw"
            }
        ]
    }

サンプル構成ファイルを作成する

apigee-remote-service-cli samples create コマンドを使用してサンプル構成ファイルを生成します。

この例では、次の生成ファイルが必要です。

  • httpbin.yaml - HTTP サービスのデプロイ構成。
  • apigee-envoy-adapter.yaml - Remote Service for Envoy のデプロイ構成。
  • envoyfilter-sidecar.yaml - EnvoyFilter をインストールする構成。デフォルトの名前空間にインストールする構成。

サンプルを生成するには:

  1. $CLI_HOME ディレクトリに移動します。
  2. 次のコマンドを実行してファイルを生成します。

    ./apigee-remote-service-cli samples create -c ./config.yaml

    次のファイルは ./samples ディレクトリを出力します。

    ls samples
    apigee-envoy-adapter.yaml envoyfilter-sidecar.yaml httpbin.yaml request-authentication.yaml
    

詳しくは、サンプル コマンドをご覧ください。

クラスタにテストサービスをデプロイする

このステップでは、Apigee ハイブリッドがデプロイされているクラスタと同じクラスタに、シンプルな HTTP リクエスト / レスポンス テストサービスをデプロイします。

  1. クラスタの default 名前空間で Istio インジェクションを有効にします。後のステップで、同じクラスタに Envoy サイドカーをデプロイします。Istio インジェクションを有効にすると、サイドカーのデプロイが可能になります。この例では、default Namespace を使用しています。後続の手順はすべて、このことを前提としています。
    kubectl label namespace default istio-injection=enabled
  2. シンプルな httpbin サービスをデフォルトの名前空間のクラスタに適用します。
    kubectl apply -f $CLI_HOME/samples/httpbin.yaml
  3. ここで、サービスをテストします。クラスタで動作している curl サービスを起動し、ターミナルを開きます。
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  4. クラスタ内からサービスを呼び出してテストします。
    curl -i httpbin.default.svc.cluster.local/headers

    成功すると、ステータス 200 が表示され、サービスはヘッダーのリストを返します。次に例を示します。

    HTTP/1.1 200 OK
    server: envoy
    date: Tue, 12 May 2020 17:09:01 GMT
    content-type: application/json
    content-length: 328
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 7
    
    {
      "headers": {
        "Accept": "*/*",
        "Content-Length": "0",
        "Host": "httpbin.default.svc.cluster.local",
        "User-Agent": "curl/7.70.0-DEV",
        "X-B3-Parentspanid": "69f88bc3e322e157",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "8dd725f30e393d8b",
        "X-B3-Traceid": "38093cd817ad30a569f88bc3e322e157"
      }
    }

Remote Service for Envoy を実行する

このステップでは、Apigee ハイブリッドがインストールされているサービス メッシュ内で Remote Service for Envoy のクライアントを起動します。このサービスは、ターゲット サービスにインストールされている Istio サイドカーにエンドポイントを提供します。また、httpbin サービスを使用してサイドカーをインストールします。

  1. Apigee Remote Service をサービス メッシュに適用します。
    kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  2. EnvoyFilter をデフォルトの名前空間の Istio サイドカーに適用します。EnvoyFilter は、httpbin サイドカーが Apigee Remote Service と通信できるようにします。
    kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml

インストールをテストする

  1. クラスタへのテストサービスのデプロイのステップで開いた curl シェルに戻り、httpbin サービスを呼び出します。
    curl -i httpbin.default.svc.cluster.local/headers
    

    現在、サービスは Apigee によって管理されており、API キーが指定されていないため、次のエラーが返されます。

    curl -i httpbin.default.svc.cluster.local/headers
    HTTP/1.1 403 Forbidden
    date: Tue, 12 May 2020 17:51:36 GMT
    server: envoy
    content-length: 0
    x-envoy-upstream-service-time: 11
  2. API キーを取得する方法に説明されているとおりに、API プロダクトを構成し、API キーを取得します。
  3. キーを使用して API 呼び出しを行います。
    export APIKEY=YOUR_API_KEY
    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: $APIKEY"

    呼び出しはステータス 200 で成功となり、レスポンスでヘッダーのリストを返します。次に例を示します。

    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS"
    HTTP/1.1 200 OK
    server: envoy
    date: Tue, 12 May 2020 17:55:34 GMT
    content-type: application/json
    content-length: 828
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 301
    
    {
      "headers": {
        "Accept": "*/*",
        "Content-Length": "0",
        "Host": "httpbin.default.svc.cluster.local",
        "User-Agent": "curl/7.70.0-DEV",
        "X-Api-Key": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS",
        "X-Apigee-Accesstoken": "",
        "X-Apigee-Api": "httpbin.default.svc.cluster.local",
        "X-Apigee-Apiproducts": "httpbin",
        "X-Apigee-Application": "httpbin",
        "X-Apigee-Authorized": "true",
        "X-Apigee-Clientid": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS",
        "X-Apigee-Developeremail": "jdoe@example.com",
        "X-Apigee-Environment": "envoy",
        "X-Apigee-Organization": "acme-org",
        "X-Apigee-Scope": "",
        "X-B3-Parentspanid": "1476f9a2329bbdfa",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "1ad5c19bfb4bc96f",
        "X-B3-Traceid": "6f329a34e8ca07811476f9a2329bbdfa"
      }
    }

次のステップ

現在、httpbin サービスへの API トラフィックは Apigee で管理されています。次のような機能を探して試すことができます。

  • API キーを取得する方法の説明に沿って API プロダクトを構成した場合、割り当て上限は 1 分あたり 5 件のリクエストに設定されています。httpbin サービスを複数回呼び出して割り当てをトリガーするようにします。割り当てが枯渇すると、HTTP ステータス 403 エラーが返されます。
  • Apigee UI で Apigee Analytics にアクセスします。[Analyze] > [API Metrics] > [API Proxy Performance] に移動します。
  • API 呼び出しを認証するために、JWT トークンを生成して使用します。
  • CLI を使用して、トークンの管理、作成し、バインディングを制御します。CLI の詳細については、リファレンスをご覧ください。