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.
- Dün Myimage'i oluşturdunuz: en son ID (SHA) 365d8f7bf565'e sahipti.
- 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
- 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.
- Reponuzda bir değişiklik yapıyorsunuz.
- CodePipeline, görüntüyü ECR'de değiştirir, derler ve yayınlar.
- Bu yeni Docker görüntüsü de myimage: en son, ancak kimliği (SHA) f7ec5e54ac96
- Ş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:
- Yeni bir görev tanımı oluşturun (öncekiyle tamamen aynı olacaktır). Bu MyTaskTefinition olacak: 2
- MyService'inizi MyTaskDefinition: 2'yi kullanacak şekilde güncelleyin (1 yerine)
- 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)
- 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).