Bagaimana cara mengatur pemeriksaan kesehatan ELB dengan beberapa aplikasi yang berjalan pada setiap instance EC2?

11

Di AWS kami ingin menggunakan ELB untuk memuat instance EC2 saldo yang menampung banyak aplikasi. Idealnya kami ingin pemeriksaan kesehatan untuk aplikasi.

Namun, AWS Elastic Load Balancers saat ini hanya memungkinkan Anda melakukan ping ke satu lokasi untuk pemeriksaan kesehatan.

Apa cara terbaik untuk mengimplementasikan pemeriksaan kesehatan dengan ELB yang memperhitungkan keadaan beberapa aplikasi yang digunakan pada setiap instance EC2?

Andrei Fierbinteanu
sumber
4
Salah satu caranya adalah dengan menerapkan pemeriksaan kesehatan Anda sendiri dengan membuat skrip mengembalikan status berdasarkan pemeriksaan kedua aplikasi tersebut.
Nathan C
1
ELB adalah layanan yang dikelola. Buat ELB lain untuk aplikasi kedua dengan pemeriksaan kesehatan sendiri. Sebagian besar biaya adalah per permintaan, oleh karena itu akan dikenakan biaya hampir sama untuk mengoperasikan 2 ELB.
Guy
Saya pikir jawaban NathanC adalah solusi terbaik; Saya memiliki kasus serupa di mana jika salah satu dari dua kondisi gagal, pemeriksaan kesehatan harus gagal. Menambahkan ELB lain akan memungkinkan Anda melakukan pemeriksaan kesehatan lagi, tetapi AFAIK hanya satu ELB yang dapat digunakan untuk merutekan lalu lintas (atau tidak)
Tom Harrison Jr
@Beli sebenarnya, mengingat bahwa ELB-jam dibebankan terlepas dari permintaan, itu ~ 20 USD per bulan (tergantung pada wilayah), jadi sebagian besar biaya adalah per permintaan hanya jika Anda sudah melayani lebih dari 2,5 TB data per bulan ( pada $ 0,008 / GB)
Josip Rodin

Jawaban:

10

Berikut adalah dua cara untuk mengatasi ini;

Opsi pertama adalah menambahkan pemeriksaan kesehatan lain pada host yang memvalidasi kesehatan dan mengembalikan HTTP 200 ke ELB jika logika mengatakan bahwa Anda ingin menjaga host online. Logikanya, tentu saja, terserah Anda. Kerugian di sini adalah bahwa jika App 2 berhasil digunakan pada beberapa host, semua host masih 'sehat' dan menerima lalu lintas.

Pilihan lain adalah menggunakan ELB tambahan untuk setiap aplikasi. Anda dapat mengarahkan beberapa ELB ke instance EC2 backend yang sama dan biayanya cukup kecil untuk melakukannya. Dengan cara itu Anda dapat memeriksa kesehatan per aplikasi dan menjatuhkan host dengan masalah pada tingkat per aplikasi daripada pendekatan semua atau tidak sama sekali.

Sunting: Harap perhatikan bahwa ini adalah jawaban yang lebih lama dan khusus untuk ELB, bukan ALB. ALB mendukung target terpisah pada satu host secara asli.

Nathan V
sumber
7

Menggunakan satu ELB per aplikasi adalah cara untuk pergi ke sini.

Pertama, Anda mungkin tetap membutuhkannya jika setiap aplikasi menggunakan domainnya sendiri dan Anda perlu mendukung SSL. ELB Amazon saat ini hanya memperbolehkan satu sertifikat SSL untuk setiap domain, membutuhkan ELB terpisah untuk setiap domain yang mendukung SSL. (Sertifikasi Wildcard SSL menjadi pengecualian).

Tantangannya di sini adalah bahwa pemeriksaan kesehatan ELB saat ini tidak dapat diarahkan ke domain virtual tertentu yang dihosting pada instance EC2. (Tidak ada "Host:" header dikirim). Ping kesehatan ELB selalu pergi ke domain default, seolah-olah Anda telah memuat alamat IP untuk instance EC2 di browser Anda. Jadi diperlukan beberapa lem untuk menerima cek kesehatan pada domain default dan kemudian membalas dengan status kesehatan aplikasi tertentu.

Berikut adalah contoh konfigurasi yang berfungsi yang dapat ditambahkan ke serverdirektif Nginx . Ini akan diinstal pada setiap instance EC2 yang memuat secara seimbang.

    # This goes in the `server` block noted by 'default_server', often /etc/nginx/sites-enabled/default

    # All AWS Health Checks from the ELBs arrive at the default server.
    # Forward these requests on the appropriate configuration on this host.
    location /health-check/ {
      rewrite ^/health-check/(?<domain>[a-zA-Z0-9\.]+) /api/v1/status break;
      # Lie about incoming protocol, to avoid the backend issuing a 301 redirect from insecure->secure,
      #  which would not be considered successful.
      proxy_set_header X-Forwarded-Proto 'https';
      proxy_set_header "Host" $domain;
      proxy_pass http://127.0.0.1;
    }

Dalam pengaturan "Pemeriksaan Kesehatan" pada ELB untuk "first-application.com", Anda akan memilih "HTTP" dan Port 80 dan masukkan path seperti:

/health-check/first-application.com

Dengan konfigurasi Nginx di atas yang berjalan di host, permintaan akan diterima di domain default dan proksi respons dari konfigurasi Nginx di host yang sama untuk https://first-application.com/api/v1/status

Dengan pendekatan ini tidak ada konfigurasi per-aplikasi di Nginx. Selama setiap aplikasi memiliki nama domain yang unik, Anda hanya perlu memastikan bahwa Anda mengatur ELB untuk setiap aplikasi dengan tepat.

Mark Stosberg
sumber
3
Terima kasih. Ini tampaknya melakukan trik. Saya berharap untuk tidak perlu memiliki banyak saldo beban dengan ini.
tourdownunder
6

Pada 11 Agustus 2016, Amazon memperkenalkan Application Load Balancers . Ini memungkinkan Anda menentukan beberapa Grup Target, masing-masing dengan jenis pemeriksaan kesehatannya sendiri. Jadi sekarang ini mungkin menggunakan penyeimbang beban tunggal!

Thomas
sumber