Halaman ini berlaku untuk Apigee, tetapi tidak untuk Apigee Hybrid.
Lihat dokumentasi
Apigee Edge.
Halaman ini menjelaskan cara menambahkan kebijakan runtime Apigee dan Google kebijakan penyisipan token ke Gateway Google Kubernetes Engine (GKE) dengan Apigee APIM Operator untuk Kubernetes. Dengan menambahkan kumpulan kebijakan yang tersedia ke Gateway, Anda dapat memperluas fungsi Gateway di luar penerapan produk API untuk menyertakan aturan bisnis dan keamanan tambahan.
Operator APIM Apigee untuk Kubernetes dapat digunakan untuk menambahkan kebijakan berikut ke Gateway:
- Kebijakan SpikeArrest
- Kebijakan JavaScript
- Google kebijakan injeksi token
- Kebijakan GenerateJWT
- Kebijakan KVM
- Kebijakan OASValidation
- Kebijakan ServiceCallout
- Kebijakan OAuthv2
- Kebijakan ResponseCache
- Kebijakan VerifyAPIKey
Ringkasan
Bagian berikut menjelaskan cara:
- Tambahkan kebijakan ke Gateway GKE.
- Buat aturan template untuk menerapkan penggunaan kebijakan.
- Buat template Apigee untuk menggunakan aturan template.
- Deploy kebijakan Apigee Gateway dengan template.
- Memvalidasi penegakan kebijakan.
Sebelum memulai
Untuk mengubah GKE Gateway dengan kumpulan lengkap kebijakan yang digunakan sebagai contoh dalam panduan ini, Anda harus memiliki akun layanan dengan peran yang diperlukan untuk membuat token dalam Apigee dan men-deploy proxy serta ekstensi. Jika Anda memilih tidak membuat token, Anda tidak perlu menambahkan peran tambahan ke akun layanan dan Anda dapat melanjutkan ke bagian berikutnya. Google
Untuk membuat akun layanan dengan izin yang diperlukan:
- Jika Anda membuat akun layanan bernama
apigee-apim-gsa
di panduan penginstalan Apigee APIM Operator untuk Kubernetes, Anda dapat melewati langkah ini dan melanjutkan ke langkah berikutnya. Jika tidak, buat akun layanan:gcloud iam service-accounts create apigee-apim-gsa --project=$PROJECT_ID
- Berikan peran yang diperlukan kepada akun layanan untuk membuat token:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:apigee-apim-gsa@$PROJECT_ID." \ --role "roles/iam.serviceAccountTokenCreator"
- Berikan peran yang diperlukan kepada akun layanan
apigee-apim-gsa
untuk men-deploy proxy dan ekstensi:gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:apigee-apim-gsa@$PROJECT_ID." \ --role "roles/iam.serviceAccountUser"
Mengubah Gateway GKE dengan kebijakan
Anda dapat memilih untuk mengubah GKE Gateway dengan satu atau beberapa kebijakan untuk memperluas fungsinya. Panduan contoh ini menerapkan file yaml
ke Gateway yang mencakup spesifikasi untuk dua kebijakan Apigee dan kebijakan penyisipan token Google .
Setiap kebijakan yang diterapkan ke Gateway menggunakan file yaml
berikut menjalankan peran yang berbeda saat mengevaluasi permintaan yang dikirim ke Gateway:
- Kebijakan SpikeArrest mengontrol tingkat pesan puncak dengan menentukan tingkat maksimum permintaan yang diizinkan selama jangka waktu tertentu. Dalam contoh ini, kecepatan maksimum ditetapkan ke lima per menit. Untuk mempelajari lebih lanjut cara kebijakan SpikeArrest digunakan untuk meratakan lonjakan traffic yang tiba-tiba, lihat Kebijakan SpikeArrest.
- Kebijakan JavaScript memungkinkan Anda menambahkan kode JavaScript kustom ke permintaan Gateway. Dalam contoh ini, kebijakan digunakan untuk menambahkan header kustom ke permintaan. Untuk mengetahui lebih lanjut cara kebijakan JavaScript digunakan untuk menambahkan kode kustom, lihat Kebijakan JavaScript.
- Kebijakan penyisipan token Google digunakan untuk menyisipkan token akses autentikasi Google ke dalam permintaan Gateway, menggunakan kebijakan AssignMessage. Apigee mendukung penggunaan token OAuth atau token OpenID Connect untuk mengautentikasi dengan Google layanan. Google Untuk mempelajari token autentikasi lebih lanjut, lihat Menggunakan autentikasi Google.
Tambahkan kebijakan ke Gateway:
- Buat file baru bernama
apigee-policies.yaml
dalam namespaceapim
. - Salin konten file berikut ke dalam file baru yang Anda buat:
# 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"
- Terapkan file
yaml
ke Gateway menggunakan perintah berikut:kubectl -n apim apply -f apigee-policies.yaml
Membuat TemplateRule sebagai template SharedFlow
Pada langkah ini, Anda akan membuat TemplateRule
untuk menerapkan kebijakan yang telah ditambahkan ke Gateway.
Aturan template adalah aturan untuk SharedFlows yang dibuat oleh administrator organisasi untuk memastikan bahwa hanya kebijakan yang disetujui yang diterapkan ke traffic Gateway oleh developer layanan. Aturan template
memastikan bahwa developer memahami kebijakan mana yang tersedia bagi mereka, kebijakan mana yang diperlukan untuk kasus penggunaan tertentu,
dan kebijakan mana yang tidak dapat digunakan oleh developer layanan.
Membuat aturan template
Buat aturan template untuk menerapkan penggunaan kebijakan AssignMessage:
- Buat file
yaml
baru bernamatemplate-rule.yaml
di namespaceapim
. - Salin konten file berikut ke dalam file baru yang Anda buat:
# 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: []
Dalam contoh ini, aturan template memberi tahu developer bahwa kebijakan AssignMessage yang menjelaskan kebijakan penyisipan token Google diperlukan. Kebijakan ini juga memberi tahu developer bahwa mereka dapat menggunakan kebijakan SpikeArrest, JavaScript, GenerateJWT, KVM, OASValidation, OAuthv2, dan ServiceCallout dalam pengelolaan API mereka. Tidak ada kebijakan yang ditentukan dalam daftar penolakan.
Menerapkan aturan template
Terapkan aturan template menggunakan perintah berikut:
kubectl apply -f template-rule.yaml
Buat template Apigee untuk menggunakan aturan template
Buat template Apigee untuk menyertakan aturan template yang Anda buat di bagian sebelumnya:
- Buat file
yaml
baru bernamanew-admin-template.yaml
di namespaceapim
. - Salin konten file berikut ke dalam file baru yang Anda buat:
# 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
- Terapkan template baru menggunakan perintah berikut:
kubectl apply -f new-admin-template.yaml
Deploy kebijakan Apigee Gateway
Pada langkah ini, Anda akan menerapkan file baru ke Gateway yang mencakup spesifikasi untuk ApigeeGatewayPolicy
.
Kebijakan ini digunakan untuk men-deploy template Apigee ke Gateway.
Deploy kebijakan Apigee Gateway:
- Buat file
yaml
baru bernamaapigee-gateway-policy-withSA.yaml
di namespaceapim
. - Salin konten file berikut ke dalam file baru yang Anda buat:
# 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. 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
- Terapkan kebijakan:
kubectl apply -f apigee-gateway-policy-withSA.yaml
- Verifikasi status deployment kebijakan Gateway baru:
kubectl -n apim get ApigeeGatewayPolicy
Setelah di-deploy, kebijakan
STATUS
akan menampilkanCREATED
.
Setelah kebijakan Gateway baru di-deploy, tunggu dua menit sebelum mengirim permintaan ke Gateway agar kebijakan tersebut dapat diterapkan ke cluster.
Memvalidasi penegakan kebijakan
Untuk mengonfirmasi bahwa kebijakan Apigee Gateway berfungsi seperti yang diharapkan, kirim permintaan ke Gateway seperti yang dijelaskan di bagian berikut.
Penerapan kebijakan AssignMessage
Untuk mengonfirmasi bahwa token {company_name} disisipkan ke dalam permintaan menggunakan kebijakan AssignMessage, kirim permintaan ke Gateway menggunakan perintah berikut:
curl http://GATEWAY_IP_ADDRESS/get -H "Host: HOST_NAME" -H "x-api-key: API_KEY"
Dengan:
GATEWAY_IP_ADDRESS
adalah alamat IP Gateway. Anda dapat mengambil alamat IP Gateway menggunakan perintah berikut:kubectl get gateway GATEWAY_NAME
HOST_NAME
adalah nama host.API_KEY
adalah nilai kunci API.
Respons yang berhasil harus menyertakan header Authorization
dengan token pembawa yang dibuat,
mirip dengan berikut ini:
{ "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" }
Penerapan kebijakan SpikeArrest
Anda dapat menguji penerapan kebijakan SpikeArrest dengan mengirimkan permintaan ke Gateway sepuluh kali dalam rentang waktu satu menit.
Anda dapat menjalankan skrip berikut untuk membuat permintaan:
#!/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
Dengan:
GATEWAY_IP_ADDRESS
adalah alamat IP Gateway. Anda dapat mengambil alamat IP Gateway menggunakan perintah berikut, denganGATEWAY_NAME
adalah nama Gateway:kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
HOST_NAME
adalah nama host yang ditentukan dalamHTTPRoute
Gateway.API_KEY
adalah nilai kunci API yang diperoleh di Pengujian penyiapan.
Respons akan muncul seperti berikut:
"fault":{"faultstring":"Spike arrest violation. Allowed rate : MessageRate{capacity=5, period=Minutes}","detail":{"errorcode":"policies.ratelimit.SpikeArrestViolation"}}}
Penegakan kebijakan JavaScript
Untuk mengonfirmasi bahwa kebijakan JavaScript berfungsi seperti yang diharapkan, kirim permintaan ke Gateway menggunakan perintah berikut:
curl http://GATEWAY_IP_ADDRESS/get \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: external" -i
Dengan:
GATEWAY_IP_ADDRESS
adalah alamat IP Gateway. Anda dapat mengambil alamat IP Gateway menggunakan perintah berikut, denganGATEWAY_NAME
adalah nama Gateway:kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
HOST_NAME
adalah nama host yang ditentukan dalamHTTPRoute
Gateway.API_KEY
adalah nilai kunci API yang diperoleh di Pengujian penyiapan.
Kebijakan JavaScript menetapkan tiga header permintaan: First
, Second
, dan Sum
, seperti yang terlihat dalam respons:
HTTP/1.1 200 OK ... { "args": {}, "headers": { ... "First": "1.0", ... "Second": "1.0", "Sum": "2", ... }, ... }
Penerapan kebijakan OASValidation
Untuk mengonfirmasi bahwa kebijakan OASValidation berfungsi seperti yang diharapkan, kirim permintaan ke Gateway menggunakan perintah berikut:
curl "http://GATEWAY_IP_ADDRESS/get" \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: badvalue"
Dengan:
GATEWAY_IP_ADDRESS
adalah alamat IP Gateway. Anda dapat mengambil alamat IP Gateway menggunakan perintah berikut, denganGATEWAY_NAME
adalah nama Gateway:kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
HOST_NAME
adalah nama host yang ditentukan dalamHTTPRoute
Gateway.API_KEY
adalah nilai kunci API yang diperoleh di Pengujian penyiapan.
Perintah menyertakan nilai yang tidak valid untuk header X-Request-Type
. Permintaan akan gagal
dengan respons yang mirip dengan berikut ini:
{"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"}}}
Mengirim permintaan yang sama dengan nilai yang valid untuk header X-Request-Type
akan berhasil. Contoh:
curl "http://GATEWAY_IP_ADDRESS/get" \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: external" -i
Dengan:
GATEWAY_IP_ADDRESS
adalah alamat IP Gateway. Anda dapat mengambil alamat IP Gateway menggunakan perintah berikut, denganGATEWAY_NAME
adalah nama Gateway:kubectl get gateways.gateway.networking.k8s.io GATEWAY_NAME -o=jsonpath="{.status.addresses[0].value}"
HOST_NAME
adalah nama host yang ditentukan dalamHTTPRoute
Gateway.API_KEY
adalah nilai kunci API yang diperoleh di Pengujian penyiapan.
Penerapan kebijakan ServiceCallout
Anda dapat memverifikasi penegakan kebijakan ServiceCallout dengan membuka sesi debug dan mengirim beberapa permintaan yang valid ke proxy.
Untuk membuka sesi debug, ikuti langkah-langkah berikut:
- Di konsol Google Cloud , buka halaman API Proxies.
- Pilih proxy
global-ext-lb1-apim-policy
yang Anda deploy ke lingkungan yang dibuat untuk Apigee APIM Operator for Kubernetes. - Klik tab Debug.
- Di jendela Debug session, klik Start Debug Session.
- Di panel Debug session, lakukan pilihan berikut:
- Lingkungan: Pilih lingkungan yang Anda buat untuk Operator APIM dari daftar lingkungan yang tersedia.
- Filter: Pilih Tidak Ada (Semua transaksi).
- Klik Mulai.
Setelah sesi dimulai, Anda dapat mengirim permintaan yang valid ke proxy:
curl "GATEWAY_IP_ADDRESSget" \ -H "Host: HOST_NAME" \ -H "x-api-key: API_KEY" \ -H "X-Request-Type: external" -i
Dengan:
GATEWAY_IP_ADDRESS
adalah alamat IP Gateway. Anda dapat mengambil alamat IP Gateway menggunakan perintah berikut, denganGATEWAY_NAME
adalah nama Gateway:kubectl get gateway GATEWAY_NAME
HOST_NAME
adalah nama host yang ditentukan dalamHTTPRoute
Gateway.API_KEY
adalah nilai kunci API yang diperoleh di Pengujian penyiapan.
Transaksi permintaan dan respons ditampilkan di panel Transactions. Pilih transaksi yang berhasil dari daftar untuk menampilkan alurnya. Anda akan dapat melihat bahwa kebijakan ServiceCallout
berhasil dieksekusi.
Penegakan kebijakan KVM
Jika kebijakan KVM berhasil dijalankan, KVM akan diinisialisasi dengan nilai awal untuk kunci mykey
.
Saat ada transaksi respons, kebijakan KVM akan mengambil nilai mykey
dan menyimpannya di header respons mykvm
.
Saat kebijakan KVM dieksekusi lagi, kebijakan tersebut akan menyisipkan nilai baru untuk mykey
yang diperoleh dari header permintaan mykvm
.
Anda dapat memeriksa header untuk setiap transaksi guna mengonfirmasi bahwa kebijakan menyimpan nilai di KVM dalam satu transaksi dan mengambil nilai yang sama dalam transaksi berikutnya, seperti yang ditunjukkan dalam contoh berikut.
Uji kebijakan KVM:
- Kirim permintaan ke 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
Dengan:
GATEWAY_IP_ADDRESS
adalah alamat IP Gateway. Anda dapat mengambil alamat IP Gateway menggunakan perintah berikut, denganGATEWAY_NAME
adalah nama Gateway:kubectl get gateway GATEWAY_NAME
HOST_NAME
adalah nama host yang ditentukan dalamHTTPRoute
Gateway.API_KEY
adalah nilai kunci API yang diperoleh di Pengujian penyiapan.KVM_NAME
adalah nama KVM.
- Periksa header respons untuk mengonfirmasi bahwa kebijakan KVM berhasil dieksekusi dan nilai awal
disimpan untuk
mykvm
. Responsnya akan terlihat seperti berikut: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" } }
- Kirim permintaan lain ke 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
Responsnya akan mirip dengan berikut ini:
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" } }
Anda dapat melihat bahwa kebijakan KVM berhasil dieksekusi karena nilai header
mykvm
diperbarui ke nilai header permintaanmykvm
. - Kirim satu permintaan lagi:
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
Responsnya akan mirip dengan berikut ini:
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" } }
Nilai header
mykvm
diperbarui lagi, yang menunjukkan bahwa nilai yang ditampilkan dalam respons adalah nilai yang disimpan dalam transaksi sebelumnya.
Memecahkan masalah
Jika Anda mengalami masalah saat menambahkan kebijakan ke GKE Gateway, lihat Memecahkan masalah Operator APIM untuk mengetahui solusi atas error umum.
Langkah berikutnya
- Pelajari lebih lanjut kebijakan SpikeArrest.
- Pelajari lebih lanjut kebijakan JavaScript.