Task 1 Hakkında
Burada Go dilinde Echo kütüphanesini kullanarak basit bir http serverı yazdım.
Sadece 2 adet endpoint var.; Get istekleri olduklari icin browser ile istekler atarak response'lara bakalım;
GET /
GET /temperature?city=
Temperature bilgisi icin bir Weather API kullandım, orada gerekli olan api keyi containeri ayağa kaldırırken environment variable olarak veriyoruz, ikinci kısımda değineceğim.
Task 2 Hakkında
Burada Go ile yazdığım uygulamamı containerize etmeye çalıştım.
Base image olarak dockerhub da bulduğum golang:1.17 image'ını kullanacağım.
FROM golang:1.17
Container içindeyken ana çalışma dizini olarak /app klasörünü seçtim.
WORKDIR /app
Projenin dependencylerini indirmek için go mod ve go sum dosyalarımızı içeriye kopyalıyoruz.
COPY go.mod go.sum ./
RUN go mod download
Bu sefer proje dizinindeki dosyaların hepsini kodluyoruz. (Hatırladığım kadarıyla burada multi stage build yapmış oluyoruz. Daha performanslı bir yol oluyor. Dependencylerden biri değişse bile koca projeyi yeniden build etmiyordu biz yeniden build işlemi yaptığımızda.)
COPY . .
Daha sonra dışarıdan erişebilmemiz için http portunu açıyoruz.
EXPOSE 8080
Dependencylerimizi indirik ve projenin bütün dosyaları dizinde mevcut. Artık projeyi build edip giriş komutunu belirleyebiliriz. main adı altında build edip giriş komutuna ./main komutunu veriyoruz.
RUN go build -o main cmd/main/main.go
CMD ./main
Şimdi Dockerfile'ımız hazır olduğuna göre projemizi build edebiliriz. Projemizi bcfmstudycase tagi ile build ediyoruz.
docker build -t bcfmstudycase .
Daha sonra docker run ile build ettigimiz image'ı ayağa kaldırıyoruz. Ben run ederken kendi APIKEY değerimi environment variable olarak veriyorum.
docker run -p 8080:8080 -e APIKEY=XXXXXXXXXXXXXX bcfmstudycase
Ve sonuç ;
Task 3 Hakkında
Daha önce birkaç kez adını duymuş olduğum bir CI/CD platformu olan Travis ile bir deployment pipeline kurmaya çalıştım. Her code pushundan sonra yeni code yapısı ile beraber tekrar build edip Dockerhub'a pushlayıp AWS Elasticbeanstalk ile beraber otomatik deployment yapacak şekilde bir sistem kurmak istemiştim fakat aradaki bağı kuramadım. Github hesabımı Travis ile eşleştirip Travis konfigürasyon dosyasını oluşturdum fakat Travis tarafında yeni buildler görülmüyordu.
Daha sonra direkt olarak bir AWS EC2 instance alarak onun üzerine docker kurarak containerimi manuel olarak çalıştırmayı düşündüm ve bu şekilde gerçekleştirdim.
Aşağıdaki komut dizisi ile githubdan projeyi EC2 instance'ına klonlayıp, build alıp lokalde run ettiğimiz gibi gerekli port mappingleri yaparak run ettim.
git clone https://github.com/canergulay/bcfm-study-case
cd bcfm-study-case
docker build -t bcfmstudycase .
docker run -p 8080:8080 -e APIKEY=XXXXXXX bcfmstudycase
Burada daha önce aşina olmadığım bir problem ile karşılaştım ; Port mappingin yapılmasına rağmen browserden public ip ile get isteği attığımda port connection refused hatası alıyordum, biraz araştırınca gördüm ki security groups ayarı yapılarak AWS tarafında ayrıca bir port konfigurasyonu yapmamız gerekiyormuş. Onunla beraber 8080 portundan istek kabul etmeye başladı.
GET / http://ec2-54-245-169-31.us-west-2.compute.amazonaws.com:8080/
GET /temperature - http://ec2-54-245-169-31.us-west-2.compute.amazonaws.com:8080/temperature?city=istanbul