Questa pagina si applica ad Apigee, ma non ad Apigee hybrid.
Visualizza la documentazione di
Apigee Edge.
Questa pagina descrive come aggiungere criteri di runtime Apigee e un criterio di inserimento token al gateway Google Kubernetes Engine (GKE) con l'operatore APIM Apigee per Kubernetes. Google L'aggiunta di un insieme di policy disponibili al gateway consente di estendere la funzionalità del gateway oltre l'applicazione del prodotto API per includere regole aziendali e di sicurezza aggiuntive.
L'operatore Apigee APIM per Kubernetes può essere utilizzato per aggiungere i seguenti criteri al gateway:
- Norme SpikeArrest
- Norme JavaScript
- Norme di inserimento dei tokenGoogle
- Norme GenerateJWT
- Norme KVM
- Norme OASValidation
- Norme ServiceCallout
- Norme OAuthv2
- Norme ResponseCache
- Norme VerifyAPIKey
Panoramica
Nelle sezioni seguenti viene descritto come:
- Aggiungi policy al gateway GKE.
- Crea una regola del modello per applicare l'utilizzo delle norme.
- Crea un modello Apigee per utilizzare la regola del modello.
- Esegui il deployment del criterio Apigee Gateway con il modello.
- Convalida l'applicazione delle norme.
Prima di iniziare
Per modificare il gateway GKE con il set completo di criteri utilizzato come esempio in questa guida, devi disporre di un account di servizio con i ruoli necessari per creare token in Apigee e implementare proxy ed estensioni. Se scegli di non creare token Google , non devi aggiungere i ruoli aggiuntivi al account di servizio e puoi passare alla sezione successiva.
Per creare un account di servizio con le autorizzazioni richieste:
- Se hai creato un account di servizio denominato
apigee-apim-gsa
nella guida all'installazione di Apigee APIM Operator per Kubernetes, puoi saltare questo passaggio e procedere al successivo. In caso contrario, crea il account di servizio:gcloud iam service-accounts create apigee-apim-gsa --project=$PROJECT_ID
- Concedi al account di servizio il ruolo necessario per creare token:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:apigee-apim-gsa@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/iam.serviceAccountTokenCreator"
- Concedi al account di servizio
apigee-apim-gsa
il ruolo necessario per il deployment di proxy ed estensioni:gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:apigee-apim-gsa@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/iam.serviceAccountUser"
Modifica il gateway GKE con le policy
Puoi scegliere di modificare il gateway GKE con uno o più criteri per estenderne la funzionalità. Questo esempio
applica un file yaml
al gateway che include le
specifiche per due criteri Apigee e un criterio di inserimento di token Google .
Ognuna delle policy applicate al gateway utilizzando il seguente file yaml
svolge un ruolo diverso durante la valutazione delle richieste inviate al gateway:
- Il criterio Spike Arrest controlla la frequenza massima dei messaggi definendo una frequenza massima di richieste consentite in un'unità di tempo. In questo esempio, la frequenza massima è impostata su cinque al minuto. Per scoprire di più su come viene utilizzato il criterio SpikeArrest per smussare i picchi improvvisi di traffico, consulta Criterio SpikeArrest.
- Il criterio JavaScript consente di aggiungere codice JavaScript personalizzato alle richieste del gateway. In questo esempio, il criterio viene utilizzato per aggiungere un'intestazione personalizzata alla richiesta. Per saperne di più su come vengono utilizzati i criteri JavaScript per aggiungere codice personalizzato, consulta la sezione Criteri JavaScript.
- Il criterio di inserimento del token Google viene utilizzato per inserire un token di accesso di autenticazione Google nelle richieste del gateway utilizzando il criterio AssignMessage. Apigee supporta l'utilizzo di token OAuth o OpenID Connect per l'autenticazione con i servizi Google . Google Per scoprire di più sui token di autenticazione, consulta Utilizzo dell'autenticazione Google.
Aggiungi le policy al gateway:
- Crea un nuovo file denominato
apigee-policies.yaml
nello spazio dei nomiapim
. - Copia i contenuti del seguente file nel nuovo file che hai creato:
# apigee-policies.yaml apiVersion: apim.googleapis.com/v1 kind: SpikeArrest metadata: name: spike-arrest namespace: apim spec: identifier: ref: request.header.name useEffectiveCount: true peakMessageRate: value: "5pm" --- apiVersion: apim.googleapis.com/v1 kind: Javascript metadata: name: js-add-headers namespace: apim spec: timeLimit: 2000 source: | var sum = 1+1; context.setVariable("request.header.first", 1); context.setVariable("request.header.second", 1); context.setVariable("request.header.sum", sum); --- apiVersion: apim.googleapis.com/v1 kind: AssignMessage metadata: name: google-token-policy namespace: apim spec: setActions: - authentication: googleAccessToken: scopes: - 'https://www.googleapis.com/auth/cloud-platform' AssignTo: createNew: false type: request --- apiVersion: apim.googleapis.com/v1 kind: KVM metadata: name: kvm-1 namespace: apim spec: delete: - keys: - value: mykey exclusiveCache: true expiryTimeInSecs: 3600 get: - assignTo: response.header.mykvm keys: - value: mykey initialEntries: - keys: - key1 values: - val1 - keys: - mykey values: - initvalue isEncrypted: false put: - keys: - value: mykey values: - value: request.header.mykvm scope: environment --- apiVersion: apim.googleapis.com/v1 kind: OASValidation metadata: name: oas-validation-1 namespace: apim spec: openApiSpec: | openapi: 3.0.4 info: title: Sample API description: Optional multi/single line description. version: 0.1.9 servers: - url: http://apigee-apim-operator-test.apigee.net description: Optional server description, our main host in httproute paths: /get: get: summary: just for test description: Optional extended description in CommonMark or HTML. parameters: - name: X-Request-Type in: header description: Must be 'internal' or 'external'. required: true schema: type: string enum: - internal - external responses: '200': # status code description: A JSON object content: application/json: schema: type: object properties: headers: type: object source: request --- apiVersion: apim.googleapis.com/v1 kind: ServiceCallout metadata: name: service-callout-1 namespace: apim spec: request: clearPayload: true variable: myRequest ignoreUnresolvedVariables: true removeActions: - payload: true - queryParams: - name: rq-param1 - name: rq-param2 copyActions: - version: true - verb: true addActions: - headers: - name: X-header1 value: value1 - name: X-header2 value: value2 - queryParams: - name: q-param1 value: value1 - name: q-param2 value: value2 setActions: - verb: PUT - formParams: - name: f-param1 value: value1 - name: f-param2 value: value2 response: calloutResponse timeout: 30000 httpTargetConnection: URL: https://httpbin.org/put properties: - name: success.codes value: 1xx,2xx,3xx,400 - name: supports.http11 value: "true"
- Applica il file
yaml
al gateway utilizzando il seguente comando:kubectl -n apim apply -f apigee-policies.yaml
Crea una TemplateRule come modello SharedFlow
In questo passaggio creerai un TemplateRule
per applicare le policy che hai aggiunto al gateway.
Una regola modello è una regola per SharedFlows creata dagli amministratori dell'organizzazione per garantire che
solo le norme approvate vengano applicate al traffico del gateway dagli sviluppatori di servizi. Una regola del modello
garantisce che gli sviluppatori comprendano quali norme sono a loro disposizione, quali sono necessarie per casi d'uso specifici
e quali non possono essere utilizzate dagli sviluppatori di servizi.
Creare una regola di modello
Crea una regola di modello per applicare l'utilizzo del criterio AssignMessage:
- Crea un nuovo file
yaml
denominatotemplate-rule.yaml
nello spazio dei nomiapim
. - Copia i contenuti del seguente file nel nuovo file che hai creato:
# template-rule.yaml apiVersion: apim.googleapis.com/v1 kind: ApimTemplateRule metadata: name: template-rule namespace: apim spec: allowList: [SpikeArrest, Javascript, GenerateJWT, KVM, OASValidation, OAuthv2, ServiceCallout] requiredList: [AssignMessage] denyList: []
In questo esempio, la regola del modello indica agli sviluppatori che è obbligatoria la norma AssignMessage che descrive la norma di inserimento del token Google . Inoltre, indica agli sviluppatori che possono utilizzare i criteri SpikeArrest, JavaScript, GenerateJWT, KVM, OASValidation, OAuthv2 e ServiceCallout nella gestione delle API. Non sono specificate policy nell'elenco di negazione.
Applicare la regola del modello
Applica la regola del modello utilizzando il seguente comando:
kubectl apply -f template-rule.yaml
Crea un modello Apigee per utilizzare la regola del modello
Crea un modello Apigee per includere la regola del modello creata nella sezione precedente:
- Crea un nuovo file
yaml
denominatonew-admin-template.yaml
nello spazio dei nomiapim
. - Copia i contenuti del seguente file nel nuovo file che hai creato:
# new-admin-template.yaml apiVersion: apim.googleapis.com/v1 kind: ApimTemplate metadata: name: new-admin-template namespace: apim spec: apimTemplateRule: group: apim.googleapis.com kind: ApimTemplateRule name: template-rule namespace: apim templates: - mode: REQUEST flows: - name: preflow policies: - group: apim.googleapis.com kind: OASValidation name: oas-validation-1 namespace: apim - group: apim.googleapis.com kind: SpikeArrest name: spike-arrest namespace: apim - name: ConditionalGetFlow policies: - group: apim.googleapis.com kind: Javascript name: js-add-headers namespace: apim condition: request.verb="GET" - name: postflow policies: - group: apim.googleapis.com kind: AssignMessage name: google-token-policy namespace: apim - group: apim.googleapis.com kind: ServiceCallout name: service-callout-1 namespace: apim - mode: RESPONSE flows: - name: postflow policies: - group: apim.googleapis.com kind: KVM name: kvm-1 namespace: apim
- Applica il nuovo modello utilizzando il seguente comando:
kubectl apply -f new-admin-template.yaml
Esegui il deployment del criterio del gateway Apigee
In questo passaggio, applicherai a Gateway un nuovo file che include le specifiche per un ApigeeGatewayPolicy
.
Questo criterio viene utilizzato per eseguire il deployment del modello Apigee sul gateway.
Esegui il deployment del criterio del gateway Apigee:
- Crea un nuovo file
yaml
denominatoapigee-gateway-policy-withSA.yaml
nello spazio dei nomiapim
. - Copia i contenuti del seguente file nel nuovo file che hai creato:
# apigee-gateway-policy-withSA.yaml apiVersion: apim.googleapis.com/v1 kind: ApigeeGatewayPolicy metadata: name: apim-template-injection namespace: apim spec: serviceAccount: apigee-apim-gsa@PROJECT_ID.iam.gserviceaccount.com ref: group: apim.googleapis.com kind: ApimTemplate name: new-admin-template namespace: apim targetRef: group: apim.googleapis.com kind: APIMExtensionPolicy name: global-ext-lb1-apim-policy namespace: apim
- Applica la norma:
kubectl apply -f apigee-gateway-policy-withSA.yaml
- Verifica lo stato del deployment della nuova norma del gateway:
kubectl -n apim get ApigeeGatewayPolicy
Una volta implementato, il criterio
STATUS
dovrebbe mostrareCREATED
.
Dopo il deployment del nuovo criterio del gateway, attendi due minuti prima di inviare una richiesta al gateway per consentire la propagazione del criterio al cluster.
Convalida l'applicazione dei criteri
Per verificare che le norme del gateway Apigee funzionino come previsto, invia richieste al gateway come descritto nelle sezioni seguenti.
Applicazione del criterio AssignMessage
Per verificare che il token {company_name} venga inserito nella richiesta utilizzando il criterio AssignMessage, invia una richiesta al gateway utilizzando il seguente comando:
curl http://GATEWAY_IP_ADDRESS/get -H "Host: HOST_NAME" -H "x-api-key: API_KEY"
Dove:
GATEWAY_IP_ADDRESS
è l'indirizzo IP del gateway. Puoi recuperare l'indirizzo IP del gateway utilizzando il seguente comando:kubectl get gateway GATEWAY_NAME
HOST_NAME
è il nome dell'host.API_KEY
è il valore della chiave API.
Una risposta corretta deve includere un'intestazione Authorization
con il token di autenticazione generato,
simile alla seguente:
{ "args": {}, "headers": { "Accept": "*/*", "Authorization": "Bearer ya29.c.c0ASRK0Gbw03y9cfvxL11DxaRYBQUU18SmUP4Vu63OckHI5cX7wJ4DmGMG2vbDDS69HXJHqMj-lak4tcqOsJGmE65crn2gNuJLanXidwM8", "First": "1.0", "Host": "apigee-apim-operator-test.apigee.net", "Second": "1.0", "Sum": "2", "User-Agent": "curl/8.7.1", "X-Api-Key": "McYcHGR3PTSGLXExvKADwQ1JJeCjgPDUvAakCl0rJKCFaX0Y", "X-Cloud-Trace-Context": "0fd3dadc2a3c328fa968d5f5f1434c29/18300783092696918345" }, "origin": "34.54.108.129", "url": "apigee-apim-operator-test.apigee.net/get" }
Applicazione del criterio SpikeArrest
Puoi testare l'applicazione della norma Spike Arrest inviando una richiesta al gateway dieci volte nell'arco di un minuto.
Puoi eseguire lo script seguente per generare le richieste:
#!/bin/sh for i in $(seq 1 11); do curl http://GATEWAY_IP_ADDRESS/get -H "Host: HOST_NAME" -H "x-api-key: API_KEY" sleep 1 done
Dove:
GATEWAY_IP_ADDRESS
è l'indirizzo IP del gateway. Puoi recuperare l'indirizzo IP del gateway utilizzando il seguente comando, doveGATEWAY_NAME
è il nome del gateway:kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
HOST_NAME
è il nome host definito inHTTPRoute
del gateway.API_KEY
è il valore della chiave API ottenuto in Configurazione del test.
La risposta sarà simile alla seguente:
"fault":{"faultstring":"Spike arrest violation. Allowed rate : MessageRate{capacity=5, period=Minutes}","detail":{"errorcode":"policies.ratelimit.SpikeArrestViolation"}}}
Applicazione delle norme JavaScript
Per verificare che la policy JavaScript funzioni come previsto, invia una richiesta al gateway utilizzando il seguente comando:
curl http://GATEWAY_IP_ADDRESS/get \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: external" -i
Dove:
GATEWAY_IP_ADDRESS
è l'indirizzo IP del gateway. Puoi recuperare l'indirizzo IP del gateway utilizzando il seguente comando, doveGATEWAY_NAME
è il nome del gateway:kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
HOST_NAME
è il nome host definito inHTTPRoute
del gateway.API_KEY
è il valore della chiave API ottenuto in Configurazione del test.
La policy JavaScript imposta tre intestazioni delle richieste: First
, Second
e Sum
, come mostrato
nella risposta:
HTTP/1.1 200 OK ... { "args": {}, "headers": { ... "First": "1.0", ... "Second": "1.0", "Sum": "2", ... }, ... }
Applicazione delle norme OASValidation
Per verificare che la policy OASValidation funzioni come previsto, invia una richiesta al gateway utilizzando il seguente comando:
curl "http://GATEWAY_IP_ADDRESS/get" \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: badvalue"
Dove:
GATEWAY_IP_ADDRESS
è l'indirizzo IP del gateway. Puoi recuperare l'indirizzo IP del gateway utilizzando il seguente comando, doveGATEWAY_NAME
è il nome del gateway:kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
HOST_NAME
è il nome host definito inHTTPRoute
del gateway.API_KEY
è il valore della chiave API ottenuto in Configurazione del test.
Il comando include un valore non valido per l'intestazione X-Request-Type
. La richiesta non andrà a buon fine
e verrà restituita una risposta simile alla seguente:
{"fault":{"faultstring":"OASValidation oas-validation-1 with resource \"oas:\/\/oas-validation-1.yaml\": failed with reason: \"[ERROR - Instance value (\"badvalue\") not found in enum (possible values: [\"internal\",\"external\"]): []]\"","detail":{"errorcode":"steps.oasvalidation.Failed"}}}
L'invio della stessa richiesta con un valore valido per l'intestazione X-Request-Type
andrà a buon fine. Ad esempio:
curl "http://GATEWAY_IP_ADDRESS/get" \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: external" -i
Dove:
GATEWAY_IP_ADDRESS
è l'indirizzo IP del gateway. Puoi recuperare l'indirizzo IP del gateway utilizzando il seguente comando, doveGATEWAY_NAME
è il nome del gateway:kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
HOST_NAME
è il nome host definito inHTTPRoute
del gateway.API_KEY
è il valore della chiave API ottenuto in Configurazione del test.
Applicazione del criterio ServiceCallout
Puoi verificare l'applicazione delle norme ServiceCallout aprendo una sessione di debug e inviando alcune richieste valide al proxy.
Per aprire una sessione di debug:
- Nella console Google Cloud , vai alla pagina Proxy API.
- Seleziona il proxy
global-ext-lb1-apim-policy
di cui hai eseguito il deployment nell'ambiente creato per l'operatore Apigee APIM per Kubernetes. - Fai clic sulla scheda Debug.
- Nella finestra Sessione di debug, fai clic su Avvia sessione di debug.
- Nel riquadro Sessione di debug, seleziona quanto segue:
- Ambiente: seleziona l'ambiente che hai creato per l'operatore APIM dall'elenco degli ambienti disponibili.
- Filtro: seleziona Nessuno (tutte le transazioni).
- Fai clic su Avvia.
Una volta avviata la sessione, puoi inviare richieste valide al proxy:
curl "GATEWAY_IP_ADDRESSget" \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: external" -i
Dove:
GATEWAY_IP_ADDRESS
è l'indirizzo IP del gateway. Puoi recuperare l'indirizzo IP del gateway utilizzando il seguente comando, doveGATEWAY_NAME
è il nome del gateway:kubectl get gateway GATEWAY_NAME
HOST_NAME
è il nome host definito inHTTPRoute
del gateway.API_KEY
è il valore della chiave API ottenuto in Configurazione del test.
Le transazioni di richiesta e risposta vengono visualizzate nel riquadro Transazioni. Seleziona una transazione riuscita dall'elenco
per visualizzare il flusso. Dovresti essere in grado di vedere che le norme ServiceCallout
sono state eseguite correttamente.
Applicazione dei criteri KVM
Quando il criterio KVM viene eseguito correttamente, inizializza KVM con un valore iniziale per la chiave mykey
.
Quando è presente una transazione di risposta, la norma KVM recupera il valore di mykey
e lo memorizza nell'intestazione della risposta mykvm
.
Quando il criterio KVM viene eseguito di nuovo, inserisce il nuovo valore per mykey
ottenuto dall'intestazione della richiesta mykvm
.
Puoi controllare le intestazioni di ogni transazione per verificare che il criterio memorizzi un valore nel KVM in una transazione e recuperi lo stesso valore nella transazione successiva, come mostrato nell'esempio seguente.
Testa il criterio KVM:
- Invia una richiesta al gateway:
curl -i "http://GATEWAY_IP_ADDRESS/get" \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: external" \ -H "KVM_NAME: next-value1" -i
Dove:
GATEWAY_IP_ADDRESS
è l'indirizzo IP del gateway. Puoi recuperare l'indirizzo IP del gateway utilizzando il seguente comando, doveGATEWAY_NAME
è il nome del gateway:kubectl get gateway GATEWAY_NAME
HOST_NAME
è il nome host definito inHTTPRoute
del gateway.API_KEY
è il valore della chiave API ottenuto in Configurazione del test.KVM_NAME
è il nome del KVM.
- Controlla le intestazioni della risposta per verificare che la policy KVM sia stata eseguita correttamente e che sia stato memorizzato un valore iniziale
per
mykvm
. La risposta dovrebbe essere simile alla seguente:HTTP/1.1 200 OK access-control-allow-credentials: true access-control-allow-origin: * Content-Length: 517 content-type: application/json date: ... server: gunicorn/19.9.0 mykvm: initvalue via: 1.1 google { "args": { ... "url": "http://apigee-apim-operator-test.apigee.net/get" } }
- Invia un'altra richiesta al gateway:
curl -i "http://GATEWAY_IP_ADDRESS/get" \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "mykvm: next"X-Request-Type: external" -H "mykvm: next-value2" -i
La risposta dovrebbe essere simile alla seguente:
HTTP/1.1 200 OK access-control-allow-credentials: true access-control-allow-origin: * Content-Length: 517 content-type: application/json date: ... server: gunicorn/19.9.0 mykvm: next-value2 via: 1.1 google { "args": { ... "url": "http://apigee-apim-operator-test.apigee.net/get?rq-param2=rq-val1&x-param1=xval1" } }
Puoi vedere che il criterio KVM è stato eseguito correttamente perché il valore dell'intestazione
mykvm
è stato aggiornato al valore dell'intestazione della richiestamykvm
. - Invia un'altra richiesta:
curl -i "http://GATEWAY_IP_ADDRESS/get" \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: external" -H "mykvm: next-value3" -i
La risposta dovrebbe essere simile alla seguente:
HTTP/1.1 200 OK access-control-allow-credentials: true access-control-allow-origin: * Content-Length: 517 content-type: application/json date: ... server: gunicorn/19.9.0 mykvm: next-value2 via: 1.1 google { "args": { ... "url": "http://apigee-apim-operator-test.apigee.net/get?rq-param2=rq-val1&x-param1=xval1" } }
Il valore dell'intestazione
mykvm
viene aggiornato di nuovo, mostrando che il valore visualizzato nella risposta è quello memorizzato nella transazione precedente.
Risoluzione dei problemi
Se riscontri problemi durante l'aggiunta di policy al gateway GKE, consulta la sezione Risoluzione dei problemi dell'operatore APIM per trovare soluzioni agli errori comuni.
Passaggi successivi
- Scopri di più sulle norme SpikeArrest.
- Scopri di più sulle norme JavaScript.