デフォルトの Apigee 機能の変更

このルール定義は samples/apigee/rule.yaml にあるデフォルトの定義ですが、これについて考えてみましょう。

apiVersion: config.istio.io/v1alpha2
    kind: rule
    metadata:
      name: apigee-rule
      namespace: istio-system
    spec:
      match: context.reporter.kind == "inbound" && destination.namespace == "default"
      actions:
      - handler: apigee-handler.apigee.istio-system
        instances:
        - apigee.authorization
        - apigee.analytics
    

この定義は、分析機能と認可機能を適用します。認可を削除し、それに伴って API キーやトークンの必要性をなくす一方で、分析を維持する必要がある場合は、認可の行を削除してからルールを再適用できます。

  1. rule.yaml ファイルから apigee.authorization 行を削除します。

    apiVersion: config.istio.io/v1alpha2
        kind: rule
        metadata:
          name: apigee-rule
          namespace: istio-system
        spec:
          match: context.reporter.kind == "inbound" && destination.namespace == "default"
          actions:
          - handler: apigee-handler.apigee.istio-system
            instances:
            - apigee.analytics
        
  2. ルールを再適用します。

    kubectl apply -f samples/apigee/rule.yaml
        
  3. API キーなしで /hello API を呼び出すと、次のように動作します。

    curl http://$HELLOWORLD_URL/hello
        Hello version: v2, instance: helloworld-v2-56666fdd58-7t4s2
        

クエリ パラメータとしての API キー

デフォルトでは、ヘッダー x-api-key で API キーを渡す必要があります。次に例を示します。

curl http://$HELLOWORLD_URL/hello -H "x-api-key: XsU1R4zGXz2ERxa0ilYQ5szwuljr5bB"
    

サービス メッシュに samples/apigee/httpapispec.yaml 構成を適用すると、この動作を変更できます。このファイルを見てみると、apiKeys エントリにクエリ パラメータ apikey と、ヘッダー x-api-key が含まれていることがわかります。この構成を適用すると、どちらかを使用できます。

kubectl apply -f samples/apigee/httpapispec.yaml
    

これで、次のようにクエリ パラメータで API キーを使用して API を呼び出すことができるようになりました。

curl http://$HELLOWORLD_URL/hello?apikey=XsU1R4zGXz2ERxa0ilYQ5szwuljr5bB
    

HTTPAPISpec は、サービス API の特定の属性を定義します。デフォルトの Apigee 仕様では、Mixer に API キー(クエリ パラメータまたはヘッダー)を探す状況を指示し、サービス(helloworld.default.svc.cluster.local)の公開名を指定して、受信 HTTP リクエストと照合するパターンを指定します。たとえば、デフォルトの Apigee 仕様では、GET /hello が一致すると /hello オペレーション属性を生成します。

apiVersion: config.istio.io/v1alpha2
    kind: HTTPAPISpec
    metadata:
      creationTimestamp: null
      name: helloworldapi
      namespace: default
    spec:
      apiKeys:
      - query: apikey
      - header: x-api-key
      attributes:
        attributes:
          api.service:
            stringValue: helloworld.default.svc.cluster.local
          api.version:
            stringValue: v1
      patterns:
      - attributes:
          attributes:
            api.operation:
                stringValue: /hello
        httpMethod: GET
        uriTemplate: /hello