デフォルトの 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 キーやトークンの必要性をなくす一方で、分析を維持する必要がある場合は、認可の行を削除してからルールを再適用できます。
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
ルールを再適用します。
kubectl apply -f samples/apigee/rule.yaml
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