AWS'de Basit CI / CD Kapları


14

Yeni bir Docker kapsayıcısı oluşturmak ve ECR'ye aktarmak için AWS Code Pipeline, Code Build kullanıyorum.

Uygulamam basit, ileriye yönelik tek konteynerlidir. Mevcut çalışan Kapsayıcıyı aşağı çekmek ve ECS kayıt defterinden yeni bir Kapsayıcı yeniden başlatmak için daha az sürtünme yaklaşımı ne olacaktır (Kod Oluşturma yoluyla Kod Oluşturma çıktısı).

EC2 kullanıcı verileri ile CloudFormation, bir tarafta özel komut dosyaları ve diğer tarafta görev tanımlamalı ECS ile CloudFormation'ı denedim (henüz başarılı değil). Daha açık ve basit bir yaklaşım olması gerektiğini düşünüyorum.

Yanıtlar:


16

ECS kapsayıcı örneklerini ( Docker ana bilgisayarlarından bahsediyorum - burada AWS terminolojisini sevmiyorum) ve konuşlandırmayı iki ayrı şey olarak saklıyorum.

ECS yığınınızı hazırlayın ve çalıştırın. Bunu CloudFormation ve Auto-scaling gruplarıyla yönetebilirsiniz, sorun değil. Sadece görev yapacak bir platform olarak küme düşünmek için , size gerek yok bir şey redeploy .

Daha sonra, CD için, en kolay yöntem yeni bir görev tanımı kullanmak için hizmet tanımını güncellemek ve ECS'nin kapları sizin için güncellemesine izin vermektir.

Her görev başlattığında, ECS bu görüntünün en son sürümüne sahip olduğundan emin olmak için yerel olarak görüntüye sahip olsa bile docker pull image: tag'i çalıştırır. Bu nedenle, kullandığınız resim etiketi gerçekten önemli değil (her derlemede etiketi değiştirmeye gerek yoktur).

Bu, myimage'i oluşturabileceğiniz anlamına gelir: kolayca dağıtmak için en son tekrar tekrar.

İhtiyacınız olan şey image = myimage: latest olan bir görev tanımıdır. Bu görev tanımına sahip bir hizmet oluşturun ve ECS her bir görevi başlattığında (hizmetinizin bir örneği) bu, en son oluşturduğunuz "myimage: latest" olacaktır.

Oradan, bulmacada sadece bir parça eksik, CodeDeploy'dan, görev tanımınızda yeni bir revizyon oluşturmak ve hizmetinizi güncellemek için bir şey, belki bir lambda işlevi çağırabilirsiniz ve ECS bu revizyon için otomatik olarak yeni görevler oluşturacak ve eski görevleri kaldırın.

Bir örnek:

Diyelim ki MyService adlı bir hizmet oluşturdunuz. Bu hizmeti MyTaskDefinition: 1 (revizyon 1) görev tanımı için 2 görev çalıştıracak şekilde yapılandırdığınız. Bu görev tanımında, görüntünün "myimage: latest" olarak ayarlanmış bir kap tanımınız var.

  1. Dün Myimage'i oluşturdunuz: en son ID (SHA) 365d8f7bf565'e sahipti.
  2. Kapsayıcı örneği ABC'niz MyTaskDefinition- 1 -containerName -someLongId adlı bir görev çalıştırıyor . bu konteyneri incelediğinizde "sha256: 365d8f7bf565 .........." resmini çalıştırıyor
  3. DEF diğer kapsayıcı örneği başka bir görev çalıştırıyor. Benzer bir ada sahip (sadece kimlik farklı), ancak aynı görüntüyü çalıştırıyor.
  4. Reponuzda bir değişiklik yapıyorsunuz.
  5. CodePipeline, görüntüyü ECR'de değiştirir, derler ve yayınlar.
  6. Bu yeni Docker görüntüsü de myimage: en son, ancak kimliği (SHA) f7ec5e54ac96
  7. Şimdi Lambda işlevlerini kullanmak için boru hattınıza bir adım eklemeniz ve kümenize bazı çağrılar yapmak için AWS NodeJS SDK'yı eklemeniz gerekir:
    1. Yeni bir görev tanımı oluşturun (öncekiyle tamamen aynı olacaktır). Bu MyTaskTefinition olacak: 2
    2. MyService'inizi MyTaskDefinition: 2'yi kullanacak şekilde güncelleyin (1 yerine)
  8. ECS yeni görevler yaratacak. Kapsayıcı adları MyTaskDefinition- 2 -containerName -someLongId olacaktır. Bu kapları incelediğinizde "sha256: f7ec5e54ac96 ......." çalıştıracaklarını göreceksiniz. Kapsayıcı örneği ABC üzerinde 2 göreviniz olacak, belki de püskürtülecekler (bu, hizmetinizin yapılandırmasına bağlıdır)
  9. Bir süre sonra ECS, MyTaskDefinition-1-containerName-someLongId adlı eski görevi ABC ve DEF'den kaldırır.

Not: Aslında yeni bir görev tanımı oluşturmanız gerekmez. İsterseniz, bunun yerine hizmetin görev listesini alabilir ve bunları tek tek durdurabilirsiniz. Yenisini durdurmadan önce ECS'nin bir görevi yeniden başlatmasını beklemelisiniz (yani: ilk kabı durdurun, ECS'nin değiştirmesini bekleyin, ikinci kabı durdurun). ECS konteyneri yeniden başlattığında, daha önce açıklandığı gibi en yeni myimage: en son üretileni alır. Sadece yeni bir görev tanımı oluşturmanın daha kolay ve daha az hataya eğilimli olduğunu düşünüyorum (beklemek ve kontrol etmek için mantık gerekmez, yeni bir görev tanımınız varsa ECS sizin için güncellemeyi işleyecektir).


Şaşırtıcı - Cevabınızı docker için CI / CD'nin eksik kılavuzu olarak çağırırım. Teşekkür ederim.
Naveen Vijay

3

Açıklanan basit kullanım durumu için Docker için Elastik Beanstalk'ı kontrol etmenizi öneririm, çıplak ECS kullanımı gibi minimal bir çözüm değildir, ancak ELB, EC2 AutoScale, sağlık izleme ve çok daha fazlası gibi otomatik yönetilen ve yapılandırılmış hizmetlerden yararlanabilirsiniz.

Üst düzey özet:

  1. Elastik Beanstalk'u belirli etiket myimage kullanacak şekilde yapılandırma: test edildi
  2. "Test edilmiş" etiketi oluşturmak, test etmek ve tanıtmak için Kod Pipeline'ı / Derlemesi'ni kullanın
  3. Tanıtılan görüntü myimage'sini çekecek Elastik Beanstalk dağıtımını tetikleyin: tüm örneklerle test edildi, farklı dağıtım stratejileri mevcut.

Aynı etiketi yeniden kullanmaya dayanan bu yaklaşım, alternatif yaklaşım derleme kimliğine sahip etiket oluşturmak olacaktır, örneğin myimage: test-42, bu her seferinde yeni etiketle Elastik Fasulye Gücü'nün güncellenmesini gerektirecek, ancak konuşlandırılmış revizyon üzerinde daha ayrıntılı kontrol sağlayacaktır.


0

Ben sadeliği için ikinci elastik fasulye konuşuyorum; kurulumu ve dağıtımı çok kolaydır.

Docker-compose hakkında bilginiz varsa, başka bir yaklaşım docker-compose.yml'yi tanımlamak ve ecs-cli ile doğrudan ECS'ye dağıtmak olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.