Halaman ini berlaku untuk Apigee dan Apigee hybrid.
Lihat dokumentasi Apigee Edge.
Apa
Kebijakan ExternalCallout memungkinkan Anda 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 alur 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 tentukan dalam XML kebijakan.
Jika Anda mengonfigurasi server gRPC dengan Apigee dan menyertakan kebijakan ini dalam proxy, Apigee akan menangani permintaan API sebagai berikut:
- Apigee mengirimkan pesan yang berisi variabel alur ke server gRPC Anda.
- Kode server gRPC Anda mengeksekusi, mengakses, dan mengubah variabel seperti yang ditentukan dalam kode. Server gRPC kemudian mengirim respons yang berisi semua variabel alur kembali ke Apigee.
- Apigee membaca respons dari server gRPC Anda. Jika variabel ditambahkan atau variabel alur yang dapat diubah diubah, variabel tersebut akan diperbarui di Apigee.
Kebijakan ini adalah Kebijakan standar dan dapat di-deploy ke jenis lingkungan apa pun. Untuk mengetahui informasi tentang jenis kebijakan dan ketersediaan dengan 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 dari
<ExternalCallout>
.
Elemen Turunan | Wajib | Deskripsi |
---|---|---|
<TimeoutMs> |
Wajib | Waktu tunggu permintaan dalam milidetik untuk permintaan gRPC. |
<GrpcConnection> |
Wajib | Menentukan nama TargetServer yang ada sebagai server gRPC yang akan menerima permintaan.
|
<Configurations> |
Opsional | Memungkinkan Anda mengonfigurasi berbagai aspek kebijakan ExternalCallout,
termasuk elemen <Property> dan <FlowVariable> . |
Contoh 1
Contoh kerja ExternalCallout tersedia di Contoh Callout 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 mengirim permintaan ke server gRPC eksternal yang diwakili oleh
TargetServer bernama external-target-server
, dengan konfigurasi berikut:
<Property>
: Menyertakan konten permintaan dan respons, tetapi tidak menyertakan header permintaan dan respons, dalam permintaan yang dikirim ke server gRPC.<FlowVariable>
: Menyertakan variabel alur tambahanexample1.flow.variable
danexample2.flow.variable
, yang ditentukan oleh elemenFlowVariable
, dalam permintaan yang dikirim ke server gRPC.
Contoh 2
Dalam contoh berikut, atribut useTargetUrl
dari elemen Audience
disetel 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 akan menjadi 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 berupa
bilangan positif.
<GrpcConnection>
Elemen <GrpcConnection>
menetapkan server gRPC menjadi TargetServer
yang 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 bernama
external-target-server
.
Gunakan elemen <Authentication>
(dijelaskan nanti di bagian ini) untuk membuat token OpenID Connect yang dikeluarkan Google untuk melakukan panggilan terautentikasi ke layanan berbasis gRPC, seperti layanan kustom yang dihosting di Cloud Run.
Tabel berikut menjelaskan elemen turunan dari
<GrpcConnection>
.
Elemen Turunan | Wajib? | Deskripsi |
---|---|---|
Elemen <Server> |
Wajib | Menentukan server gRPC. |
Elemen <Authentication> |
Opsional | Membuat token OpenID Connect yang dikeluarkan 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 | Wajib | String |
Elemen <Authentication>
Membuat 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 Menggunakan autentikasi Google. Dengan penyiapan yang tepat, 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. |
Jenis | Jenis kompleks |
Elemen Induk | <GrpcConnection> |
Elemen Turunan |
<GoogleIDToken> |
Elemen Authentication
menggunakan sintaksis berikut:
Sintaks
<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 menunjukkan 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, jika konfigurasi Autentikasi ada, Apigee akan membuat token
pembawa 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 |
Jenis | String |
Elemen Induk | <Authentication> |
Elemen Turunan | Tidak ada |
Elemen HeaderName
menggunakan sintaksis berikut:
Sintaks
<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,
bukan 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? | Wajib |
Jenis | String |
Elemen Induk | <Authentication> |
Elemen Turunan | <Audience> <IncludeEmail> |
Elemen GoogleIDToken
menggunakan sintaksis berikut:
Sintaks
<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 menunjukkan 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 diberi akses oleh token.
Jika nilai Audience
kosong, ref
kosong atau me-resolve ke
nilai kosong, dan useTargetUrl
adalah true
, maka "https://" +
(nama host server target gRPC) akan digunakan sebagai audiens.
Misalnya, jika host server adalah my-grpc-server-java.a.run.app
, audiens yang digunakan akan menjadi https://my-grpc-server-java.a.run.app
.
Secara default, useTargetUrl
adalah 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? | Wajib |
Jenis | 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 |
Jenis | 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 dari
<Configurations>
.
Elemen Turunan | Wajib? | Deskripsi |
---|---|---|
<Property> |
Wajib | Menentukan apakah header permintaan/respons dan/atau konten akan dikirim ke
server. Kemungkinan nilainya adalah |
<FlowVariable> |
Wajib | Menentukan variabel alur tambahan yang harus dikirim ke server. |
<Property>
Elemen <Property>
menentukan apakah header permintaan/respons dan/atau konten akan dikirim ke server. Kemungkinan nilainya 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. Kemungkinan nilai untuk
|
T/A | Wajib | String |
<FlowVariable>
Elemen <FlowVariable>
menentukan variabel alur tambahan 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 dengan akun layanan jika proxy dikonfigurasi dengan tag <Authentication>. Kemungkinan penyebab:
|
Error runtime
Tabel di bawah menjelaskan error runtime, yang dapat terjadi saat kebijakan dieksekusi.
Kode kerusakan | Status HTTP | Penyebab |
---|---|---|
GrpcTlsInitFailed |
500 |
Error ini akan terjadi jika ada masalah saat melakukan inisialisasi 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 eksekusi kebijakan ini. Pengecualian yang mendasarinya akan ditampilkan 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 petunjuk proses debug lebih lanjut. |
googletoken.EmptyIDTokenAudience |
500 |
|
steps.externalcallout.ExecutionError
dengan string error:
|
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 lainnya
Tabel di bawah menjelaskan error lainnya. Lihat penyebabnya untuk mengetahui detail selengkapnya.
Kode kerusakan | Penyebab |
---|---|
ReferencesExistToGrpcServer |
Error ini akan terjadi jika pengguna mencoba menghapus server target gRPC, tetapi server tersebut masih digunakan oleh kebijakan lain. |
Fault
Variabel error 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 error, seperti yang tercantum dalam tabel Runtime errors
di atas. Nama kerusakan adalah bagian terakhir dari kode kerusakan. |
fault.name cocok dengan "ExecutionError". |
externalcallout.[policy_name].failed |
policy_name adalah nama kebijakan yang ditentukan pengguna yang menampilkan error. |
externalcallout.ExternalCallout-1.failed = true |