デフォルトの 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