Halaman ini berlaku untuk Apigee dan Apigee Hybrid.
Baca dokumentasi Apigee Edge.
Apa
Dengan kebijakan ExternalCallout, Anda dapat mengirim permintaan gRPC ke server gRPC untuk menerapkan perilaku kustom yang tidak didukung oleh kebijakan Apigee. Dalam kode server, Anda dapat dengan mudah mengakses dan mengubah variabel alur dalam alur proxy.
Apigee berkomunikasi dengan server gRPC melalui kebijakan ExternalCallout melalui API. Apigee menggunakan API untuk mengirim variabel flow ke server gRPC. Dalam server gRPC, Anda dapat membaca—dan bergantung pada variabel, mengubah—variabel alur yang tercantum di halaman referensi Variabel alur, serta variabel tambahan yang Anda tetapkan dalam XML kebijakan.
Jika Anda mengonfigurasi server gRPC dengan Apigee dan menyertakan kebijakan ini dalam proxy, Apigee akan menangani permintaan API sebagai berikut:
- Apigee mengirim pesan yang berisi variabel alur ke server gRPC Anda.
- Kode server gRPC Anda dieksekusi, mengakses, dan memodifikasi variabel seperti yang ditetapkan dalam kode. Selanjutnya, server gRPC akan mengirimkan respons yang berisi semua variabel alur kembali ke Apigee.
- Apigee membaca respons dari server gRPC Anda. Jika ada variabel yang ditambahkan atau variabel alur yang dapat diubah dimodifikasi, variabel tersebut akan diperbarui di Apigee.
Kebijakan ini adalah Kebijakan standar dan dapat di-deploy ke jenis lingkungan apa pun. Tidak semua pengguna perlu mengetahui tentang kebijakan dan jenis lingkungan. Untuk mengetahui informasi tentang jenis kebijakan dan ketersediaan untuk setiap jenis lingkungan, lihat Jenis kebijakan.
Untuk mempelajari lebih lanjut cara mengirim permintaan gRPC, lihat link berikut:
<ExternalCallout>
Menentukan kebijakan ExternalCallout.
<ExternalCallout async="true" continueOnError="true" enabled="true" name="EC">
Elemen ini memiliki atribut berikut yang sama untuk semua kebijakan:
Atribut | Default | Wajib? | Deskripsi |
---|---|---|---|
name |
T/A | Wajib |
Nama internal kebijakan. Nilai atribut Atau, gunakan elemen |
continueOnError |
false | Opsional | Setel ke false untuk menampilkan error jika kebijakan gagal. Ini adalah perilaku yang wajar untuk sebagian besar kebijakan. Setel ke true agar eksekusi alur tetap berlanjut bahkan setelah kebijakan gagal. Lihat juga:
|
enabled |
true | Opsional | Setel ke true untuk menerapkan kebijakan. Setel ke false untuk menonaktifkan kebijakan. Kebijakan tidak akan diterapkan meskipun tetap melekat pada alur. |
async |
false | Tidak digunakan lagi | Atribut ini sudah tidak digunakan lagi. |
Tabel berikut menjelaskan elemen turunan <ExternalCallout>
.
Elemen Turunan | Diperlukan | Deskripsi |
---|---|---|
<TimeoutMs> |
Diperlukan | Waktu tunggu permintaan dalam milidetik untuk permintaan gRPC. |
<GrpcConnection> |
Diperlukan | Menentukan nama TargetServer yang ada untuk menjadi server gRPC yang akan
dikirimi permintaan.
|
<Configurations> |
Opsional | Memungkinkan Anda mengonfigurasi berbagai aspek kebijakan ExternalCallout,
termasuk elemen <Property> dan
<FlowVariable> . |
Contoh 1
Contoh penggunaan ExternalCallout tersedia di Contoh Info Eksternal di GitHub.
Contoh berikut mengilustrasikan konfigurasi kebijakan ExternalCallout.
<ExternalCallout enabled="true" continueOnError="false" name="ExternalCallout-1"> <DisplayName>External Callout 1</DisplayName> <TimeoutMs>5000</TimeoutMs> <GrpcConnection> <Server name="external-target-server"/> </GrpcConnection> <Configurations> <Property name="with.request.content">true</Property> <Property name="with.request.headers">false</Property> <Property name="with.response.content">true</Property> <Property name="with.response.headers">false</Property> <FlowVariable>example1.flow.variable</FlowVariable> <FlowVariable>example2.flow.variable</FlowVariable> </Configurations> <ExternalCallout>
Contoh ini mengirimkan permintaan ke server gRPC eksternal yang diwakili oleh
TargetServer bernama external-target-server
, dengan konfigurasi berikut:
<Property>
: Menyertakan konten permintaan dan respons, tetapi bukan header permintaan dan respons, dalam permintaan yang dikirim ke server gRPC.<FlowVariable>
: Menyertakan variabel flowexample1.flow.variable
danexample2.flow.variable
tambahan, yang ditentukan oleh elemenFlowVariable
, dalam permintaan yang dikirim ke server gRPC.
Contoh 2
Dalam contoh berikut, atribut useTargetUrl
dari elemen Audience
ditetapkan ke true
. Jika useTargetUrl
adalah true
,
nama host server target gRPC akan digunakan sebagai audiens. Misalnya, jika host server adalah my-grpc-server-java.a.run.app
, audiens
yang digunakan adalah https://my-grpc-server-java.a.run.app
.
<ExternalCallout continueOnError="false" enabled="true" name="External-Callout-1"> <DisplayName>External-Callout-1</DisplayName> <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <GoogleIDToken> <Audience useTargetUrl="true"/> </GoogleIDToken> </Authentication> </GrpcConnection> <TimeoutMs>5000</TimeoutMs> <Configurations> <Property name="with.request.content">true</Property> <Property name="with.request.headers">true</Property> <Property name="with.response.content">true</Property> <Property name="with.response.headers">true</Property> <FlowVariable>example.flow.variable</FlowVariable> <FlowVariable>another.flow.variable</FlowVariable> </Configurations> </ExternalCallout>
Referensi elemen turunan
Bagian berikut menjelaskan elemen turunan ExternalCallout
.
<TimeoutMs>
Waktu tunggu permintaan dalam milidetik untuk permintaan gRPC. <TimeoutMs>
harus
bilangan positif.
<GrpcConnection>
Elemen <GrpcConnection>
menetapkan server gRPC menjadi TargetServer
yang sudah ada, yang ditentukan oleh atribut name
. Lihat halaman referensi resource
TargetServer
.
Catatan:
Protokol untuk TargetServer
harus GRPC
.
Misalnya, kode berikut
<GrpcConnection> <Server name="external-target-server"/> </GrpcConnection>
menentukan server gRPC menjadi TargetServer
yang ada yang bernama
external-target-server
.
Gunakan elemen <Authentication>
(dijelaskan nanti di bagian ini) untuk membuat token
OpenID Connect yang dikeluarkan Google
guna melakukan panggilan terautentikasi ke layanan berbasis gRPC, seperti layanan kustom yang dihosting di
Cloud Run.
Tabel berikut menjelaskan elemen turunan <GrpcConnection>
.
Elemen Turunan | Wajib? | Deskripsi |
---|---|---|
Elemen <Server> |
Wajib | Menentukan server gRPC. |
Elemen <Authentication> |
Opsional | Menghasilkan token OpenID Connect yang diterbitkan Google untuk melakukan panggilan terautentikasi ke layanan berbasis gRPC, seperti Cloud Run. |
Elemen <Server>
Menentukan server gRPC.
Tabel berikut menjelaskan atribut elemen <Server>
.
Atribut | Deskripsi | Default | Kehadiran | Jenis |
---|---|---|---|---|
name |
Nama |
T/A | Diperlukan | String |
Elemen <Authentication>
Menghasilkan token OpenID Connect yang diterbitkan Google untuk melakukan panggilan terautentikasi ke layanan berbasis gRPC, seperti layanan kustom yang dihosting di Cloud Run. Penggunaan elemen ini memerlukan langkah-langkah penyiapan dan deployment yang dijelaskan dalam artikel Menggunakan autentikasi Google. Dengan penyiapan yang benar, kebijakan akan membuat token autentikasi untuk Anda dan menambahkannya ke permintaan layanan.
Elemen ini memiliki satu elemen turunan yang diperlukan: GoogleIDToken
.
Default | T/A |
Wajib? | Opsional. |
Type | Jenis kompleks |
Elemen Induk | <GrpcConnection> |
Elemen Turunan |
<GoogleIDToken> |
Elemen Authentication
menggunakan sintaksis berikut:
Sintaksis
<ExternalCallout> ... <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <HeaderName ref="FLOW_VARIABLE">STRING</HeaderName> <GoogleIDToken> <Audience ref="variable-1">STRING</Audience> <IncludeEmail ref="variable-2">BOOLEAN</IncludeEmail> </GoogleIDToken> </Authentication> </GrpcConnection> </ExternalCallout>
Contoh
Contoh berikut menampilkan elemen GoogleIDToken
:
<ExternalCallout continueOnError="false" enabled="true" name="External-Callout-1"> <DisplayName>External-Callout-1</DisplayName> <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <HeaderName ref='my-variable'>X-Serverless-Authorization</HeaderName> <GoogleIDToken> <Audience>https://cloudrun-hostname.a.run.app</Audience> </GoogleIDToken> </Authentication> </GrpcConnection> <TimeoutMs>5000</TimeoutMs> <Configurations> <Property name="with.request.content">true</Property> <Property name="with.request.headers">true</Property> <Property name="with.response.content">true</Property> <Property name="with.response.headers">true</Property> <FlowVariable>example.flow.variable</FlowVariable> <FlowVariable>another.flow.variable</FlowVariable> </Configurations> </ExternalCallout>
Atribut
Tidak ada.
Elemen turunan <HeaderName>
Secara default, ketika ada konfigurasi Authentication, Apigee akan menghasilkan token pemilik dan memasukkannya ke header Authorization
dalam pesan yang dikirim ke sistem target.
Elemen HeaderName
memungkinkan Anda menentukan nama header yang berbeda untuk menyimpan token pembawa tersebut. Fitur ini sangat berguna jika targetnya adalah layanan Cloud Run yang menggunakan header X-Serverless-Authorization
. Header Authorization
, jika ada, tidak diubah dan juga dikirim dalam permintaan.
Default | T/A |
Wajib? | Tidak |
Type | String |
Elemen Induk | <Authentication> |
Elemen Turunan | Tidak ada |
Elemen HeaderName
menggunakan sintaksis berikut:
Sintaksis
<ExternalCallout> ... <Authentication> <HeaderName ref="FLOW_VARIABLE">STRING</HeaderName> <GoogleIDToken> ... </GoogleIDToken> </Authentication> ... </ExternalCallout>
Dengan string statis
Dalam contoh ini, token pembawa yang dihasilkan ditambahkan secara default ke header bernama X-Serverless-Authorization
yang dikirim ke sistem target. Header Authorization
, jika ada, tidak diubah dan juga dikirim dalam permintaan.
<Authentication> <HeaderName>X-Serverless-Authorization</HeaderName> <GoogleIDToken> <Audience>https://cloudrun-hostname.a.run.app</Audience> </GoogleIDToken> </Authentication>
Dengan referensi variabel
Dalam contoh ini, token pembawa yang dihasilkan ditambahkan secara default ke header bernama X-Serverless-Authorization
yang dikirim ke sistem target. Jika my-variable
memiliki nilai, nilai tersebut akan digunakan sebagai ganti string default. Header Authorization
, jika ada, tidak diubah dan juga dikirim dalam permintaan.
<Authentication> <HeaderName ref='my-variable'>X-Serverless-Authorization</HeaderName> <GoogleIDToken> <Audience>https://cloudrun-hostname.a.run.app</Audience> </GoogleIDToken> </Authentication>
Elemen turunan <GoogleIDToken>
Menghasilkan token OpenID Connect yang diterbitkan Google untuk melakukan panggilan terautentikasi ke layanan Google, seperti layanan kustom yang dihosting di Cloud Run.
Default | T/A |
Wajib? | Diperlukan |
Type | String |
Elemen Induk | <Authentication> |
Elemen Turunan | <Audience> <IncludeEmail> |
Elemen GoogleIDToken
menggunakan sintaksis berikut:
Sintaksis
<ExternalCallout> ... <GrpcConnection> <Server name="cloud_run_server_name"/> <Authentication> <GoogleIDToken> <Audience ref="context-variable" useTargetUrl='BOOLEAN'>STRING</Audience> <IncludeEmail ref="context-variable">BOOLEAN</IncludeEmail> </GoogleIDToken> </Authentication> </GrpcConnection> </ExternalCallout>
Contoh
Contoh berikut menampilkan elemen GoogleIDToken
:
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> <IncludeEmail>true</IncludeEmail> </GoogleIDToken> </Authentication>
Elemen turunan <Audience>
Audiens untuk token autentikasi yang dihasilkan, seperti API atau akun yang dapat diakses oleh token tersebut.
Jika nilai Audience
kosong, ref
kosong atau ditetapkan ke nilai kosong, dan useTargetUrl
adalah true
, maka "https://" + (nama host server target gRPC) digunakan sebagai audience.
Misalnya, jika host server adalah my-grpc-server-java.a.run.app
, audiens
yang digunakan adalah https://my-grpc-server-java.a.run.app
.
Secara default, useTargetUrl
bernilai false
.
<Audience>explicit-audience-value-here</Audience> or: <Audience ref='variable-name-here'/> or: <Audience ref='variable-name-here' useTargetUrl='true'/> or: <Audience useTargetUrl='true'/>
Default | T/A |
Wajib? | Diperlukan |
Type | String |
Elemen Induk | <GoogleIDToken> |
Elemen Turunan | Tidak ada. |
Elemen turunan <IncludeEmail>
Jika ditetapkan ke true
, token autentikasi yang dihasilkan akan berisi klaim email
dan email_verified
akun layanan.
Default | false |
Wajib? | Opsional |
Type | Boolean |
Elemen Induk | <GoogleIDToken> |
Elemen Turunan | Tidak ada. |
<Configurations>
Elemen <Configurations>
memungkinkan Anda mengonfigurasi berbagai aspek
kebijakan ExternalCallout,
termasuk <Property>
dan <FlowVariable>
.
Tabel berikut menjelaskan elemen turunan <Configurations>
.
Elemen Turunan | Wajib? | Deskripsi |
---|---|---|
<Property> |
Wajib | Menentukan apakah header dan/atau konten permintaan/respons akan dikirim ke server. Nilai yang mungkin adalah |
<FlowVariable> |
Wajib | Menentukan variabel alur tambahan yang harus dikirim ke server. |
<Property>
Elemen <Property>
menentukan apakah header dan/atau konten permintaan/respons akan dikirim ke server. Nilai yang mungkin adalah true
(item akan dikirim) atau false
(item tidak akan dikirim). Nilai defaultnya
adalah false
.
Tabel berikut menjelaskan atribut elemen <Property>
.
Atribut | Deskripsi | Default | Kehadiran | Jenis |
---|---|---|---|---|
name |
Menentukan konten yang akan dikirim ke server. Nilai yang memungkinkan untuk
|
T/A | Diperlukan | String |
<FlowVariable>
Elemen <FlowVariable>
menentukan variabel alur tambahan apa saja yang akan dikirim ke server. Nilai
<FlowVariable>
adalah awalan variabel, bukan nama variabel lengkap.
Misalnya , jika elemen a.b.c
, nilai variabel bernama a.b.c
akan dikirim ke server. Demikian pula, nilai variabel bernama a.b.c.my-variable
akan dikirim ke server. Namun, nilai variabel bernama a.x.another-variable
tidak akan dikirim karena tidak memiliki awalan a.b.c
. Berikut beberapa contohnya
<Configurations> <FlowVariable>a.b.c</FlowVariable> <FlowVariable>d.e.f</FlowVariable> </Configurations>
Referensi Error
Error saat deployment
Nama error | Penyebab |
---|---|
FAILED_PRECONDITION |
Error ini terjadi jika akun layanan tidak ada saat proxy dikonfigurasi dengan tag <Authentication> .
Contoh: Deployment of \"organizations/foo/apis/apiproxy/revisions/1\" requires a service account identity, but one was not provided with the request. |
PERMISSION_DENIED |
Error ini terjadi jika ada masalah izin pada akun layanan jika proxy dikonfigurasi dengan tag <Authentication>. Kemungkinan penyebab:
|
Error runtime
Tabel di bawah ini menjelaskan error runtime, yang dapat terjadi saat kebijakan dieksekusi.
Kode kesalahan | Status HTTP | Penyebab |
---|---|---|
GrpcTlsInitFailed |
500 |
Error ini akan terjadi jika ada masalah saat menginisialisasi TLS dengan server gRPC (seperti masalah Keystore atau truststore). |
steps.externalcallout.[error_code] |
500 |
|
steps.externalcallout.ExecutionError |
500 |
Error ini akan terjadi jika ada pengecualian lain yang terjadi selama pelaksanaan kebijakan ini. Pengecualian yang mendasarinya akan diekspos dalam faultstring. Jika ada masalah dengan kredensial ke server gRPC, error akan terlihat seperti ini: { "fault": { "faultstring": "Encountered the following exception while sending the gRPC request or processing the response: [io.grpc.StatusRuntimeException: UNAVAILABLE: Credentials failed to obtain metadata].", "detail": { "errorcode": "steps.externalcallout.ExecutionError" } } } Anda dapat melihat log MP untuk mengetahui pointer proses debug lebih lanjut. |
googletoken.EmptyIDTokenAudience |
500 |
|
steps.externalcallout.ExecutionError
dengan string fault:
|
500 |
Error ini terjadi jika proxy API dikonfigurasi dengan elemen
|
steps.externalcallout.ExecutionError dengan faultstring yang berisi PERMISSION DENIED .
Misalnya, faultstring akan terlihat seperti berikut untuk Cloud Run:
|
500 |
Error ini terjadi jika proxy API dikonfigurasi dengan elemen
|
Error lain-lain
Tabel di bawah menjelaskan error lainnya. Lihat penyebabnya untuk detail selengkapnya.
Kode kesalahan | Penyebab |
---|---|
ReferencesExistToGrpcServer |
Error ini akan terjadi jika pengguna mencoba menghapus server target gRPC, tetapi server tersebut masih digunakan oleh kebijakan lain. |
Retakan
Variabel kesalahan dalam tabel berikut ditetapkan untuk semua kebijakan secara default. Lihat Variabel khusus untuk error kebijakan.
Variabel | Dari mana | Contoh |
---|---|---|
fault.name="fault_name" |
fault_name adalah nama kesalahannya, seperti yang tercantum dalam tabel Error runtime di atas. Nama kesalahan adalah bagian terakhir dari kode kesalahan. |
fault.name cocok dengan "ExecutionError". |
externalcallout.[policy_name].failed |
policy_name adalah nama kebijakan yang ditentukan pengguna yang menampilkan kesalahan. |
externalcallout.ExternalCallout-1.failed = true |