Kebijakan ExternalInfo

Halaman ini berlaku untuk Apigee dan Apigee Hybrid.

Baca dokumentasi Apigee Edge.

ikon kebijakan

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:

  1. Apigee mengirim pesan yang berisi variabel alur ke server gRPC Anda.
  2. 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.
  3. 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 name dapat berisi huruf, angka, spasi, tanda hubung, garis bawah, dan titik. Nilai ini tidak boleh melebihi 255 karakter.

Atau, gunakan elemen <DisplayName> untuk memberi label kebijakan di editor proxy UI pengelolaan dengan nama natural-language yang berbeda.

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 flow example1.flow.variable dan example2.flow.variable tambahan, yang ditentukan oleh elemen FlowVariable, 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 TargetServer yang ada yang akan menjadi server gRPC yang akan dikirimi permintaan.

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 true atau false. Defaultnya adalah false.

<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 name adalah:

  • with.request.content
  • with.request.headers
  • with.response.content
  • with.response.headers
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 adalah 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:
  • Akun layanan tidak ada.
  • Akun layanan tidak dibuat dalam project Google Cloud yang sama dengan organisasi Apigee.
  • Deployer memiliki izin iam.serviceAccounts.actAs di akun layanan. Untuk mengetahui detailnya, lihat Tentang izin akun layanan.

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

[error_code] ditentukan oleh kolom errorCode pesan Fault. String kesalahan error akan berupa kolom faultstring pesan kesalahan.

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

<GoogleIDToken> diaktifkan, tetapi useTargetUrl disetel ke salah (false) dan tidak ada nilai yang diberikan ke <Audience> baik secara langsung atau melalui referensi pada saat error terjadi.

steps.externalcallout.ExecutionError

dengan string fault:

Encountered the following exception while sending the gRPC request or processing the response: [io.grpc.StatusRuntimeException: UNAVAILABLE: Credentials failed to obtain metadata]

500

Error ini terjadi jika proxy API dikonfigurasi dengan elemen <Authentication>. Penyebab yang mungkin:

  • Akun layanan yang di-deploy dengan proxy:
    • tidak ada pada project Anda (ada saat di-deploy, tetapi dihapus setelah deployment)
    • telah dinonaktifkan
    • (Khusus Apigee Hybrid) belum memberikan peran roles/iam.serviceAccountTokenCreator di akun layanan apigee-runtime.
  • (Khusus Apigee Hybrid) IAMCredentials API dinonaktifkan di project sumber akun layanan apigee-runtime.

    Catatan: Khusus untuk Apigee Hybrid, periksa log container runtime dan telusuri externalcallout.ExecutionError untuk menemukan pesan error lebih mendetail yang mungkin membantu men-debug masalah.

steps.externalcallout.ExecutionError dengan faultstring yang berisi PERMISSION DENIED.

Misalnya, faultstring akan terlihat seperti berikut untuk Cloud Run:

Encountered the following exception while sending the gRPC request or processing the response: [io.grpc.StatusRuntimeException: PERMISSION_DENIED: HTTP status code 403 …]

500

Error ini terjadi jika proxy API dikonfigurasi dengan elemen <Authentication>. Penyebab yang mungkin:

  • Akun layanan proxy ada dan diaktifkan, tetapi tidak memiliki izin yang tepat untuk mengakses layanan.
  • Layanan memerlukan autentikasi, tetapi permintaannya tidak memiliki header autentikasi (Misalnya: XML autentikasi tidak disertakan dalam XML kebijakan).

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

Topik terkait