Menghosting target webhook

Panduan ini menunjukkan cara menghosting target webhook di layanan penayangan Knative.

Fungsi Cloud Run vs. inferensi Knative

Fungsi Cloud Run dan layanan Knative memberikan solusi yang baik untuk menghosting target webhook Anda. Umumnya, fungsi Cloud Run dapat disiapkan dengan cepat, bagus untuk pembuatan prototipe, dan ideal untuk alur kerja dengan volume lebih rendah. Penyajian Knative memberikan fleksibilitas lebih dan mampu menangani volume yang lebih besar dengan konkurensi.

Gunakan penayangan Knative jika:

  • Anda menggunakan bahasa atau runtime yang tidak didukung dalam fungsi Cloud Run
  • Anda menginginkan waktu tunggu permintaan yang lebih lama (hingga 15 menit)
  • Anda mengharapkan volume besar dan memerlukan konkurensi (80 permintaan serentak atau lebih per instance container)

Membuat target webhook dalam inferensi Knative

Dengan menggunakan penyaluran Knative, Anda dapat menentukan target webhook dalam bahasa apa pun yang pilih. Anda hanya perlu membuat endpoint HTTP yang dapat menerima data. Biasanya ini dilakukan dengan POST, misalnya:

@app.route('/', methods=['POST'])
def index():
    data = request.get_json()

Pada contoh di atas, halaman indeks URL dikonfigurasi untuk hanya menerima permintaan POST dan mengharapkan data dikirim melalui payload JSON.

Melakukan integrasi dengan penyedia webhook

Sebagian besar layanan yang menyediakan callback HTTP mengharuskan Anda memverifikasi kepemilikan URL. Hal ini biasanya dilakukan dengan mengirimkan semacam token, pesan, atau secret dan mengharapkan respons yang valid. Anda harus mendapatkan persyaratan ini dari penyedia layanan. Dengan menggunakan contoh yang sama di atas, akan terlihat seperti ini:

def index():
    data = request.get_json()
    return data['challenge']

Setelah penyedia memverifikasi kepemilikan, Anda juga harus menambahkan otorisasi di pihak Anda.

Memberi otorisasi permintaan

Target webhook adalah URL terbuka dan publik. Sebagian besar layanan menyediakan token atau secret untuk memastikan bahwa permintaan yang masuk berasal dari layanan yang diotorisasi. Karena URL ini bersifat publik, Anda tidak dapat mencegah upaya berbahaya yang akan mengirim data ke target webhook. Namun, menggunakan token atau secret akan memastikan Anda hanya memproses data dari sumber yang diotorisasi.

Untuk memverifikasi permintaan, Anda dapat mengonfigurasi secret, atau untuk menyimpan salinan secret baik sebagai variabel lingkungan atau menggunakan semacam sistem manajemen kunci.

Saat menyimpan salinan secret Anda sebagai variabel lingkungan, setiap permintaan harus memiliki secret atau token di header permintaan atau JSON {i>payload<i}, dan Anda harus memeriksanya untuk memastikan bahwa sumbernya valid.

def index():
    request_secret = request.headers['Secret']
    if request_secret != os.environ['SECRET']:
        return ('Unauthorized', 401)

Jika penyedia webhook tidak mendukung secret atau mekanisme autentikasi lainnya, siapa pun yang memiliki URL target webhook Anda akan dapat mengirim pesan. Dalam kasus ini, implementasi webhook Anda harus aman untuk diekspos ke internet publik.

Merespons permintaan

Sebagian besar layanan mengharuskan Anda merespons permintaan dalam jangka waktu tertentu, seperti yang ditentukan oleh layanan. Beberapa webhook memiliki metode percobaan ulang bawaan jika terjadi respons error, seperti kode status HTTP 4xx atau 5xx, sehingga Anda harus menampilkan kode status yang berhasil (2xx) agar layanan dapat tahu bahwa peristiwa tersebut telah diproses dengan benar.

def index():
    data = request.get_json()
    return ('', 200)

Waktu tunggu

Penyajian Knative dan penyedia webhook memiliki waktu tunggu. Tujuan yang lebih pendek akan berlaku untuk aplikasi Anda. Jika pemrosesan data Anda melebihi waktu yang dialokasikan oleh penayangan Knative atau webhook Anda harus menggunakan produk yang memungkinkan Anda menyelesaikan pemrosesan data secara asinkron, seperti Pub/Sub atau Cloud Tasks. Produk-produk ini memungkinkan Anda untuk menyerahkan data dengan cepat, segera mengembalikan respons sukses ke penyedia webhook, dan melanjutkan pemrosesan tanpa masalah waktu tunggu. Produk ini juga merupakan opsi yang bagus untuk menangani kegagalan dan upaya coba lagi.

Pola webhook umum

Jenis Contoh
Menyampaikan Data Mengirim notifikasi melalui Firebase Cloud Messaging setiap kali webhook dipanggil.
Menyimpan Data Menyimpan data di BigQuery untuk kemudian dianalisis.
Memicu Tindakan Memenuhi tindakan di Dialogflow, memposting balasan di Twitter, atau mengirim ke lingkungan staging Anda setiap kali kode baru di-commit di GitHub.

Langkah selanjutnya