Penyebaran Biru / Hijau dengan CloudFront

16

Saya mencari cara untuk melakukan penyebaran Biru / Hijau dengan CloudFront .

Adakah yang punya solusi yang baik untuk pindah dari satu distribusi CloudFront ke yang lain atau apakah semua orang benar-benar hanya membuat distribusi mereka dan kemudian tidak pernah menyentuhnya lagi?

Distribusi CloudFront saya terdiri dari satu asal S3 untuk konten statis (javascript, dll) dan asal kustom yang menunjuk ke AWS ELB.

Tidak Ada Perubahan Ke CloudFront

Dalam keadaan normal, kami tidak melakukan perubahan apa pun pada distribusi CloudFront kami sama sekali. Kami versi konten statis kami di asal S3 dengan mengubah nama file konten statis di S3 dan melakukan penggelaran penyebaran ke contoh EC2 di bawah Elastic Load Balancer (ELB). Namun, ada saatnya kita perlu menguji dan membuat perubahan pada distribusi CloudFront sendiri atau memiliki perubahan yang cukup signifikan pada lingkungan kita sehingga kita perlu menunjuk ke ELB baru di lingkungan yang baru.

Dua Distribusi CloudFront

Opsi pertama yang saya coba adalah memiliki dua Distribusi Web CloudFront yang terpisah , satu untuk lingkungan saya saat ini, atau A, dan satu untuk lingkungan saya yang baru, atau B,. Saya mencoba menggunakan kebijakan rute Route53 yang berbobot di mana saya menambahkan dua catatan untuk catatan Route53 www.domain.com saya, satu menunjuk ke CloudFront Distribution A dengan bobot 1 dan yang lainnya menunjuk ke CloudFront Distribution B dengan bobot 0. The rencananya adalah mengubah bobot ketika saya ingin pindah dari distribusi A ke distribusi B. Namun, hanya satu distribusi CloudFront pada suatu waktu yang dapat mendaftarkan www.domain.com Nama Domain Alternatif (CNAME) atau Anda mendapatkan kesalahan berikut:

com.amazonaws.services.cloudfront.model.CNAMEAlreadyExistsException: One or more of the CNAMEs you provided are already associated with a different resource. (Service: AmazonCloudFront; Status Code: 409; Error Code: CNAMEAlreadyExists; Request ID: ef84a5f0-44e7-11e5-9315-0ba167bb108a)

Satu Distribusi CloudFront

Opsi kedua adalah mempertahankan satu distribusi web CloudFront. Saya memiliki S3 dan asal kustom yang menunjuk ke kedua lingkungan A dan B saya dan kemudian saya memperbarui Perilaku Cache CloudFront untuk menunjuk ke asal lainnya ketika saya ingin pindah dari satu lingkungan ke yang lain. Ini sangat berantakan karena pembaruan ini memakan waktu 15-60 menit, tidak ada visibilitas ke kemajuan pembaruan dan tergantung pada sifat perubahan Anda, Anda mungkin perlu menindaklanjutinya dengan CloudFront Invalidation sehingga Anda tidak menyajikan konten yang di-cache dari lingkungan lama bersama dengan konten baru.

Terima kasih atas saranmu!

Peter M
sumber
Apakah Anda menemukan solusi? Kami memiliki masalah yang sama dalam proyek kami dan cara kami melakukannya sekarang - kami mengubah titik akhir cloudfront secara manual dalam proyek kami.
Dmytriy Voloshyn
1
sayangnya tidak - saya pikir tidak ada yang bagus. Praktik terbaik adalah dengan menggunakan satu distribusi cloudfront, versi setiap konten dalam ember s3 dan menggunakan catatan dns route53 tertimbang untuk asal menunjuk ke konten dinamis. maka Anda cukup memperbarui route53 untuk mengubah konten dinamis dan Anda tidak perlu menyentuh cloudfront. Kami mempertahankan distribusi cloudfront terpisah untuk dev dan qa. EX: stackoverflow.com/questions/9130555/…
Peter M

Jawaban:

9

Dua Distribusi Cloudfront

Karena AWS memungkinkan tumpang tindih antara CNAME pengganti wildcard di akun AWS yang sama, Anda dapat beralih di antara dua distribusi cloudfront dengan cara berikut:

  • Gunakan www.domain.com sebagai CNAME Alternatif untuk distribusi Prod 1
  • Gunakan * .domain.com sebagai CNAME Alternatif untuk distribusi Prod 2
  • Arahkan DNS CNAME Anda www.domain.com ke distribusi 1 atau distribusi 2. (* .cloudfront.net).
  • Hapus CNAME alternatif dari distribusi yang tidak Anda inginkan untuk menyajikan konten lagi.

Namun, dua DNS distribusi yang berbeda (* .cloudfront.net) dapat menunjuk ke node tepi yang sama, yang berarti bahwa cara konten Anda dilayani adalah dengan mencocokkan CNAME cloudfront.net dengan node Edge yang menyajikannya dan kemudian cocok dengan nama host. Dalam hal ini, jika kedua distribusi Anda menggunakan node tepi yang sama (dapat diperiksa misalnya dengan dig) potongan tidak akan bersih.

mis. Jika kedua distribusi berbagi satu atau lebih tepi node, distribusi 1 dengan Alt CNAME www.domain.com akan diutamakan daripada distribusi 2 dengan yang lebih umum * .domain.com sampai CNAME dihapus dari konfigurasi distribusi 1 di semua tepi node . Jadi versi yang diambil dari satu permintaan mungkin berbeda dari yang lain selama periode transisi.

mpaf
sumber
Karena waktu proliferasi perubahan yang diperpanjang di CloudFront, ini adalah satu-satunya pilihan Anda.
CloudWalker
Terima kasih - ini adalah jawaban yang sangat menarik. Saya tidak pernah berpikir untuk melakukannya dengan cara ini. Saya akan menandainya dengan benar karena tidak berpindah dari satu distribusi ke distribusi lain, namun, saya perlu menghindari waktu proliferasi yang diperpanjang dan risiko penyajian konten yang salah selama masa transisi, jadi saya tidak dapat menggunakannya dalam kasus saya . Saya setuju dengan @CloudWalker bahwa tidak ada opsi lain.
Peter M
3

Agak terlambat dalam permainan di sini, tetapi untuk orang lain yang mencari ini. Saya percaya ini bisa dilakukan menggunakan lambda @ edge. Mirip dengan tes A / B. https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html . Anda dapat mengimplementasikan fungsi lambda yang dipicu ketika pengguna meminta url. Pilih untuk menyajikan konten biru / hijau dari asal yang berbeda atau awalan url. Nilai cookie akan menentukan penyebaran mana yang akan dilayani. Ketika permintaan pertama tiba (tidak ada cookie) set cookie secara acak mengatakan 95% biru 5% hijau.

Gary H
sumber
1

Memotret dari pinggul, berapa lama untuk beralih asal dalam distribusi depan cloud? 1) gunakan kode baru di belakang ELB, hangatkan 2) tambahkan ELB ini sebagai asal baru ke distribusi depan cloud Anda sambil menghapus asal lama 3) sekali cutover, hancurkan kode lama di belakang ELB lama.

Untuk menghindari penundaan yang terkait dengan pembaruan CloudFront atau pembaruan DNS, Anda dapat menukar grup skala otomatis di belakang ELB Anda. 1) sebarkan kode baru di ASG baru, hangatkan 2) daftarkan ELB yang ada dengan ASG baru ini 3) hapus registrasi ASG lama dari ELB Anda 4) sekali cutover, hancurkan ASG lama.

Ken Krueger
sumber
0

Saya juga telah melakukan penelitian tentang topik ini dan memiliki solusi (lihat di bawah).

Latar Belakang:

CloudFront membutuhkan CNAME dalam konfigurasi distribusi untuk menjadi unik di seluruh akun Anda. Jadi mengendalikan biru / hijau melalui DNS ke distribusi yang berbeda tidak akan berfungsi. Ada hack yang berputar-putar yang akan menggunakan kartu liar tapi itu tidak menjamin bahwa file yang benar disajikan. Mengontrol biru / hijau melalui DNS dan CloudFront tidak layak.

Lebih lanjut, mengubah konfigurasi apa pun di CloudFront (termasuk CNAME) menghasilkan 15-60 menit menunggu sementara perubahan disebarkan ke server tepi. Juga, bukan pengaturan yang ideal.

Bekerja di sekitar:

Untuk aplikasi satu halaman, konfigurasi ini yang dapat melakukan trik:

  • URL Aplikasi: app.mydomain.com/app
  • Struktur S3:
    • app / (situs langsung Anda)
    • app2 / (situs Anda tidak begitu hidup)

Sekarang konfigurasikan CloudFront untuk menggunakan ember Anda untuk melayani file. Pada titik ini, semuanya bermuara pada pengaturan cache Anda. Karena CloudFront membutuhkan waktu lama, atur header CacheControl pada objek S3 kami. Untuk index.html, kami menggunakan 5 menit, yang lainnya, 1 hari. Ketika tiba saatnya untuk beralih, tukar nama direktori S3. Dalam 5 menit, aplikasi akan tayang untuk semua maksud dan tujuan.

Untuk aplikasi yang sudah berjalan, kami memiliki versi build yang dibangun ke dalam kode dan file build config json di root aplikasi. Kemudian aplikasi akan sesekali meminta file json, memeriksa versinya, jika sudah ketinggalan zaman, meminta refresh.

Keterbatasan

Anda tidak dapat melakukan tes rendam dengan sangat baik. Saya kira itu mungkin untuk meningkatkan TTL dari index.html ke beberapa jam atau hari (tergantung pada kebutuhan Anda), yang akan membantu memastikan klien akan mendapatkan versi baru ketika cache lokal mereka berakhir.

vangorra
sumber
0

Dalam posting blog ini penulis mengimplementasikan pengujian ab melalui Lambda @ Edge bekerja dari kode dalam dokumentasi AWS (Anda dapat melihat contoh mereka di sini: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda- example.html ).

Pada dasarnya yang Anda lakukan adalah membuat distribusi Cloudfront tunggal yang menunjuk ke dua asal yang berbeda. Kemudian Anda dapat menggunakan Lambda @ Edge untuk mengarahkan lalu lintas ke asal (melalui Cookie), dan tentu saja Anda dapat menerapkan hal-hal lain melalui Lambda seperti menimbang lalu lintas atau membalikkannya, dll. Juga mudah untuk menambahkan asal dan logika lebih lanjut .

pengguna3399551
sumber