Menghosting target webhook

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

Penayangan Cloud Functions vs Knative

Penayangan Cloud Functions dan Knative menyediakan solusi yang baik untuk menghosting target webhook Anda. Umumnya, Cloud Functions dapat disiapkan dengan cepat, cocok untuk pembuatan prototipe, dan ideal untuk alur kerja dengan volume yang lebih rendah. Penyajian Knative memberikan fleksibilitas lebih dan dapat menangani volume yang lebih besar dengan serentak.

Gunakan penayangan Knative jika:

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

Membuat target webhook di penayangan Knative

Dengan penayangan Knative, Anda dapat menentukan target webhook dalam bahasa apa pun yang dipilih. 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 harus menyimpan salinan secret tersebut sebagai variabel lingkungan atau menggunakan semacam sistem pengelolaan kunci. Setiap permintaan harus memiliki secret atau token dalam header permintaan atau payload JSON, dan Anda harus memeriksanya untuk memastikan 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

Penayangan Knative dan penyedia webhook memiliki waktu tunggu. Yang lebih singkat dari keduanya akan berlaku untuk aplikasi Anda. Jika pemrosesan data Anda melebihi waktu yang dialokasikan oleh penayangan Knative atau penyedia webhook, Anda harus menggunakan produk yang memungkinkan Anda menyelesaikan pemrosesan secara asinkron, seperti Pub/Sub atau Cloud Tasks. Produk ini memungkinkan Anda menyerahkan data dengan cepat, segera menampilkan respons berhasil 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