Apa pendekatan yang tepat untuk membuat tugas Amazon ECS saya memperbarui gambar Docker mereka, setelah gambar tersebut diperbarui di registri yang sesuai?
docker
docker-registry
amazon-ecs
aknuds1
sumber
sumber
Jawaban:
Jika tugas Anda berjalan di bawah layanan, Anda dapat memaksa penerapan baru. Ini memaksa definisi tugas untuk dievaluasi ulang dan gambar container baru ditarik.
sumber
Setiap kali Anda memulai tugas (baik melalui panggilan
StartTask
danRunTask
API atau yang dimulai secara otomatis sebagai bagian dari Layanan), Agen ECS akan melakukandocker pull
hal yangimage
Anda tentukan dalam definisi tugas Anda. Jika Anda menggunakan nama gambar yang sama (termasuk tag) setiap kali Anda mendorong ke registri, Anda seharusnya dapat menjalankan gambar baru dengan menjalankan tugas baru. Perhatikan bahwa jika Docker tidak dapat mencapai registri karena alasan apa pun (misalnya, masalah jaringan atau masalah otentikasi), Agen ECS akan mencoba menggunakan gambar yang di-cache; jika Anda ingin menghindari gambar yang di-cache agar tidak digunakan saat Anda memperbarui gambar, Anda harus memasukkan tag yang berbeda ke registri Anda setiap kali dan memperbarui definisi tugas Anda secara bersamaan sebelum menjalankan tugas baru.Pembaruan: Perilaku ini sekarang dapat disetel melalui
ECS_IMAGE_PULL_BEHAVIOR
variabel lingkungan yang disetel pada agen ECS. Lihat dokumentasi untuk detailnya. Pada saat penulisan, pengaturan berikut ini didukung:sumber
/var/log/ecs
.Mendaftarkan definisi tugas baru dan memperbarui layanan untuk menggunakan definisi tugas baru adalah pendekatan yang direkomendasikan oleh AWS. Cara termudah untuk melakukannya adalah dengan:
Tutorial ini memiliki lebih banyak detail dan menjelaskan bagaimana langkah-langkah di atas cocok dengan proses pengembangan produk ujung ke ujung.
Pengungkapan penuh: Tutorial ini menampilkan wadah dari Bitnami dan saya bekerja untuk Bitnami. Namun pemikiran yang diungkapkan di sini adalah milik saya sendiri dan bukan pendapat Bitnami.
sumber
Ada dua cara untuk melakukannya.
Pertama, gunakan AWS CodeDeploy. Anda dapat mengonfigurasi bagian penerapan Biru / Hijau dalam definisi layanan ECS. Ini termasuk CodeDeployRoleForECS, TargetGroup lain untuk switch, dan Test Listener (opsional). AWS ECS akan membuat aplikasi CodeDeploy dan grup penerapan dan menautkan sumber daya CodeDeploy ini dengan ECS Cluster / Layanan dan ELB / TargetGroup untuk Anda. Kemudian Anda dapat menggunakan CodeDeploy untuk memulai penerapan, di mana Anda perlu memasukkan AppSpec yang menentukan penggunaan tugas / penampung apa untuk memperbarui layanan apa. Di sinilah Anda menentukan tugas / wadah baru Anda. Kemudian, Anda akan melihat instance baru berputar di TargetGroup baru dan TargetGroup lama terputus ke ELB, dan segera instance lama yang terdaftar ke TargetGroup lama akan dihentikan.
Ini terdengar sangat rumit. Sebenarnya, karena / jika Anda telah mengaktifkan penskalaan otomatis pada layanan ECS Anda, cara sederhana untuk melakukannya adalah dengan memaksa penerapan baru menggunakan konsol atau cli, seperti yang ditunjukkan oleh seorang pria di sini:
aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment
Dengan cara ini, Anda masih dapat menggunakan jenis penerapan "pembaruan berkelanjutan", dan ECS akan menjalankan instans baru dan menguras instans lama tanpa downtime layanan Anda jika semuanya baik-baik saja. Sisi buruknya adalah Anda kehilangan kendali yang baik pada penerapan dan Anda tidak dapat memutar kembali ke versi sebelumnya jika ada kesalahan dan ini akan merusak layanan yang sedang berjalan. Tapi ini adalah cara yang sangat sederhana untuk pergi.
BTW, jangan lupa untuk menetapkan angka yang tepat untuk persen sehat Minimum dan persen Maksimum, seperti 100 dan 200.
sumber
saya menciptakan skrip untuk menerapkan image Docker yang diperbarui ke layanan staging di ECS, sehingga definisi tugas yang sesuai mengacu pada versi image Docker saat ini. Saya tidak tahu pasti apakah saya mengikuti praktik terbaik, jadi masukan akan kami terima.
Agar skrip berfungsi, Anda memerlukan instans ECS cadangan atau file
deploymentConfiguration.minimumHealthyPercent
nilai sehingga ECS dapat mencuri instans untuk menerapkan definisi tugas yang diperbarui.Algoritme saya seperti ini:
Kode saya ditempel di bawah ini:
deploy-ecs
_common.py
sumber
AWS CodePipeline.
Anda dapat menetapkan ECR sebagai sumber, dan ECS sebagai target untuk diterapkan.
sumber
Berikut ini berfungsi untuk saya jika tag gambar buruh pelabuhan sama:
sumber
Mengalami masalah yang sama. Setelah menghabiskan berjam-jam, telah menyimpulkan langkah-langkah yang disederhanakan ini untuk penerapan otomatis dari gambar yang diperbarui:
1. Perubahan definisi tugas ECS: Untuk pemahaman yang lebih baik, anggaplah Anda telah membuat definisi tugas dengan detail di bawah ini (catatan: angka-angka ini akan berubah sesuai definisi tugas Anda):
Maka Anda perlu melakukan perubahan berikut:
2. Beri tag gambar Anda sebagai < your-image-name>: terbaru . Kunci terbaru menangani penarikan oleh tugas ECS masing-masing.
3. Dorong gambar ke ECR
4. menerapkan penerapan paksa
Catatan: Saya telah menulis semua perintah dengan asumsi wilayah menjadi us-east-1 . Cukup ganti dengan wilayah Anda masing-masing saat menerapkan.
sumber
Menggunakan AWS cli, saya mencoba layanan pembaruan aws ecs seperti yang disarankan di atas. Tidak mengambil buruh pelabuhan terbaru dari ECR. Pada akhirnya, saya menjalankan kembali buku pedoman Yang Mungkin saya yang membuat kluster ECS. Versi definisi tugas diganti saat ecs_taskdefinition dijalankan. Maka semuanya baik-baik saja. Gambar buruh pelabuhan baru diambil.
Benar-benar tidak yakin apakah perubahan versi tugas memaksa penerapan ulang, atau jika pedoman yang menggunakan ecs_service menyebabkan tugas dimuat ulang.
Jika ada yang tertarik, saya akan mendapatkan izin untuk menerbitkan versi buku pedoman saya yang sudah dibersihkan.
sumber
Saya juga mencoba menemukan cara otomatis untuk melakukannya, yaitu mendorong perubahan ke ECR dan kemudian tag terbaru harus diambil oleh layanan. Benar, Anda dapat melakukannya secara manual dengan Menghentikan tugas untuk layanan Anda dari cluster Anda. Tugas baru akan menarik kontainer ECR yang diperbarui.
sumber
Perintah berikut berhasil untuk saya
sumber