Flask Uygulamaları: GitHub’dan AWS ECS’ye Docker ve Docker Hub ile Dağıtım
Bu makale, Flask uygulamalarınızı GitHub’dan AWS ECS (Elastic Container Service) ortamına Docker ve Docker Hub kullanarak adım adım nasıl dağıtacağınızı detaylı bir şekilde açıklamaktadır. Modern web uygulamaları için tercih edilen bu yöntem, ölçeklenebilirlik, güvenilirlik ve kolay yönetim sağlar. Ancak, bu sürecin karmaşıklığı yeni başlayanlar için zorlayıcı olabilir. Bu nedenle, makaleyi adım adım takip ederek, konuyu adım adım kavramanızı sağlayacağız.
Temel Kavramlar: Docker, Docker Hub ve AWS ECS Nedir?
Öncelikle, bu dağıtım sürecinin temel taşlarını oluşturan Docker, Docker Hub ve AWS ECS kavramlarını anlamamız gerekmektedir. Docker, uygulamalarınızı ve bağımlılıklarını içeren kapsayıcılar (container) oluşturmanıza olanak sağlayan bir platformdur. Bu kapsayıcılar, farklı ortamlarda tutarlı bir şekilde çalışmayı garanti eder. Docker Hub ise, bu Docker kapsayıcılarını depolamak ve paylaşmak için kullanılan bir bulut tabanlı depolama hizmetidir. Son olarak, AWS ECS, Amazon Web Services’in sunmuş olduğu, kapsayıcı tabanlı uygulamalarınızı yönetmenizi ve çalıştırmanızı sağlayan bir orkestrasyon hizmetidir. Başka bir deyişle, Docker kapsayıcılarınızı AWS üzerinde yönetebilmenizi sağlar.
Bu üç teknolojinin birlikte çalışması, uygulamalarınızın geliştirme, test ve üretim ortamlarında sorunsuz bir şekilde dağıtılmasını kolaylaştırır. Örneğin, geliştirme ortamınızda çalıştırdığınız Docker kapsayıcısını, Docker Hub’a yükleyip, daha sonra AWS ECS üzerinden üretim ortamında çalıştırabilirsiniz. Bu da zamandan ve kaynaklardan tasarruf etmenizi sağlar. Bu süreç, sürekli entegrasyon ve sürekli dağıtım (CI/CD) süreçlerine uygundur ve uygulamalarınızın daha hızlı ve güvenilir bir şekilde güncellenmesini sağlar.
GitHub Deposunu Hazırlama: Nasıl Yapılır?
İlk adım, Flask uygulamanızın kodunu içeren bir GitHub deposu oluşturmaktır. Eğer henüz bir GitHub hesabınız yoksa, (https://github.com/) adresinden ücretsiz bir hesap oluşturabilirsiniz. Depoyu oluşturduktan sonra, Flask uygulamanızın tüm dosyalarını (app.py, requirements.txt, Dockerfile vb.) depoya yükleyin. requirements.txt dosyası, uygulamanızın bağımlılıklarını (örneğin, Flask, SQLAlchemy) listelemelidir. Dockerfile dosyası ise, Docker kapsayıcınızın nasıl oluşturulacağını tanımlar.
Bu adımda, kodunuzun versiyon kontrolü altında olması oldukça önemlidir. Git kullanarak düzenli olarak commitler yapmalı ve değişiklikleri takip etmelisiniz. Bu, hata ayıklama ve geri dönüş süreçlerini kolaylaştırır. Ayrıca, GitHub’ın sunduğu çeşitli özelliklerden (örneğin, pull request’ler, issue tracking) faydalanarak daha etkili bir ekip çalışması sağlayabilirsiniz. Kod kalitesi ve güvenliğine özen göstermeyi unutmayın; linting araçları ve güvenlik taramaları kullanmanız önerilir.
Dockerfile Oluşturma: Adım Adım Rehber
Uygulamanız için bir Dockerfile oluşturmanız gerekmektedir. Bu dosya, Docker kapsayıcınızın nasıl oluşturulacağını Docker’a adım adım anlatır. Aşağıda basit bir Dockerfile örneği bulunmaktadır:
# Python 3.9 tabanlı bir image kullanıyoruz
FROM python:3.9-slim-buster
# Uygulama dosyalarının kopyalanacağı çalışma dizinini belirliyoruz
WORKDIR /app
# requirements.txt dosyasını kopyalıyoruz
COPY requirements.txt .
# Bağımlılıkları kuruyoruz
RUN pip install --no-cache-dir -r requirements.txt
# Uygulama dosyalarını kopyalıyoruz
COPY . .
# Uygulamanın çalıştırılacağı komutu belirliyoruz
CMD ["python", "app.py"]
Bu Dockerfile, Python 3.9 tabanlı bir image'ı temel alır, bağımlılıkları kurar ve uygulamanızı çalıştırır. Daha gelişmiş Dockerfile örnekleri için Docker dokümanlarına (https://docs.docker.com/) bakabilirsiniz. Örneğin, multi-stage build kullanarak image boyutunu küçültmek performansı artırabilir. Ayrıca, güvenlik açıklarını minimize etmek için temel image'ınızı dikkatlice seçmeniz gerekir.
Docker Kapsayıcısını Oluşturma ve Docker Hub'a Yükleme
Dockerfile'ı oluşturduktan sonra, Docker kapsayıcınızı oluşturabilirsiniz. Bunun için, terminalinizden docker build -t / . komutunu çalıştırın. ve yerlerine kendi depo adınızı ve image adınızı yazmalısınız. Örneğin, docker build -t fatihsoysal/flask-app . komutu, fatihsoysal adlı Docker Hub deponuzda flask-app adlı bir image oluşturur.
Image'ı oluşturduktan sonra, Docker Hub hesabınıza giriş yaparak image'ı yükleyebilirsiniz. docker login komutu ile Docker Hub'a giriş yapın ve daha sonra docker push / komutu ile image'ı yükleyin. Docker Hub, image'larınızı depolamak ve paylaşmak için güvenli bir ortam sağlar. Farklı versiyonları (tags) kullanarak image'larınızı yönetebilir ve uygulamalarınızın farklı sürümlerini kolayca dağıtabilirsiniz. Image'larınızı düzenli olarak güncellemeniz ve güvenlik açıklarını gidermeniz önemlidir. Bu, uygulamanızın güvenliğini ve istikrarını sağlar.
AWS ECS Kümesi Oluşturma: Nasıl Yapılır?
Şimdi, AWS konsolunu kullanarak bir ECS kümesi (cluster) oluşturmanız gerekiyor. Bir ECS kümesi, kapsayıcılarınızın çalışacağı bir grup AWS kaynaklarını temsil eder. ECS kümesi oluştururken, örneğin, EC2 instance'ları kullanabilirsiniz (Fargate kullanımı da mümkündür). EC2 instance'ları kullanıyorsanız, instance'ların konfigürasyonunu doğru bir şekilde yapmanız ve yeterli kaynak sağlamanız gerekir. Bu, uygulamanızın performansını doğrudan etkiler. Fargate ise, sunucu yönetiminden sizi kurtaran, tamamen yönetilen bir servis sunmaktadır.
Kümeyi oluşturduktan sonra, bir servis (service) tanımlamanız gerekir. Servis, Docker image'ınızın nasıl ve kaç kopyasının çalıştırılacağını tanımlar. Servis tanımı, Docker Hub'da bulunan image'ınıza işaret etmelidir. Ayrıca, servis için port mapping'i doğru bir şekilde ayarlamanız gerekir. Bu, uygulamanızın dış dünyayla nasıl iletişim kuracağını belirler. Güvenlik duvarı kurallarını da doğru bir şekilde konfigüre etmeniz, uygulamanızın güvenliğini sağlamak açısından çok önemlidir.
AWS ECS Servis Tanımlaması: Örnek Kod
Bir AWS ECS servisi için bir JSON tanımlama dosyası aşağıdaki gibi olabilir:
{
"taskDefinition": "arn:aws:ecs:us-east-1:123456789012:task-definition/flask-app:1",
"cluster": "my-cluster",
"desiredCount": 2,
"launchType": "FARGATE" // veya "EC2"
}
Bu örnekte, taskDefinition, Docker image'ınızı ve diğer konfigürasyonları içeren bir task definition'ı tanımlar. cluster, servisin çalışacağı ECS kümesini belirtir. desiredCount, çalıştırılacak kapsayıcı sayısını belirtir. launchType, Fargate (sunucu yönetiminden sorumlu olmamanız için önerilir) veya EC2 (daha fazla özelleştirme seçeneği sunar) arasında seçim yapılmasını sağlar. Daha detaylı ECS servis tanımlamaları için AWS dokümanlarını inceleyebilirsiniz.
İleri Düzey Konular: CI/CD ve Ölçeklendirme
Uygulamanızı AWS ECS'ye başarıyla dağıttıktan sonra, sürekli entegrasyon ve sürekli dağıtım (CI/CD) süreçlerini kurarak dağıtım sürecinizi otomatikleştirebilirsiniz. GitHub Actions veya AWS CodePipeline gibi araçlar kullanarak, kod değişiklikleri her yapıldığında uygulamanızın otomatik olarak yeniden dağıtımını sağlayabilirsiniz. Bu, dağıtım sürecinizi hızlandırır ve hataları azaltır. Ayrıca, uygulamanızın ölçeklenebilirliğini artırmak için otomatik ölçeklendirme stratejileri kullanabilirsiniz. AWS ECS, uygulamanızın yüküne bağlı olarak otomatik olarak kapsayıcı sayısını artırıp azaltmanıza olanak tanır. Bu, uygulamanızın performansını ve güvenilirliğini artırır.
Ayrıca, log yönetimi ve izleme (monitoring) sistemleri kurarak uygulamanızın performansını ve sağlığını izleyebilirsiniz. Amazon CloudWatch gibi araçlar kullanarak, uygulamanızın performans metriklerini, loglarını ve diğer verilerini izleyebilirsiniz. Bu veriler, uygulamanızın performansını optimize etmenize ve olası sorunları önceden tespit etmenize yardımcı olur. Bu aşama, ileri seviyede bir bilgi birikimi gerektirir ve uygulamanızın büyüklüğü ve karmaşıklığına göre farklı yaklaşımlar kullanılabilir.
Sonuç ve Sıkça Sorulan Sorular
Bu makalede, Flask uygulamalarınızı GitHub'dan AWS ECS'ye Docker ve Docker Hub kullanarak nasıl dağıtacağınızı adım adım açıkladık. Bu süreç, uygulamalarınızın ölçeklenebilirliğini, güvenilirliğini ve yönetimini önemli ölçüde iyileştirir. Ancak, bu sürecin farklı aşamalarında karşılaşabileceğiniz zorluklar ve olası hatalar vardır. Bu nedenle, her adımı dikkatlice takip etmeli ve olası sorunlara karşı hazırlıklı olmalısınız. Daha fazla bilgi için AWS ve Docker dokümanlarını inceleyebilirsiniz.
Sıkça Sorulan Sorular
- Soru: Docker Hub'da private repo kullanmak daha güvenli midir?
- Cevap: Evet, public repo'lara kıyasla private repo'lar daha güvenlidir çünkü kodunuza erişimi yalnızca yetkilendirilmiş kişilerle sınırlar. Özellikle hassas veriler içeren uygulamalar için private repo kullanılması önerilir.
- Soru: AWS ECS'de Fargate ve EC2 arasındaki fark nedir?
- Cevap: Fargate, sunucu yönetiminden sizi kurtaran tamamen yönetilen bir hizmettir. EC2 ise, sunucularınızı kendi yönetiminize almanız gerektiği anlamına gelir. Fargate, daha basit ve hızlı bir dağıtım sağlar, ancak EC2 daha fazla özelleştirme imkanı sunar.
- Soru: CI/CD süreçlerini nasıl otomatikleştirebilirim?
- Cevap: GitHub Actions, AWS CodePipeline veya Jenkins gibi araçları kullanarak CI/CD süreçlerini otomatikleştirebilirsiniz. Bu araçlar, kod değişikliklerinizi algılar, uygulamanızı test eder ve otomatik olarak dağıtımını sağlar.
- Soru: Uygulamamın performansını nasıl izleyebilirim?
- Cevap: Amazon CloudWatch, Datadog veya Prometheus gibi araçlar kullanarak uygulamanızın performansını, loglarını ve diğer verilerini izleyebilirsiniz. Bu araçlar, performans sorunlarını tespit etmenize ve performansı optimize etmenize yardımcı olur.
Yazar: Fatih Soysal
