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 /

Alt text

GET /temperature?city=

Alt text

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ç ;

Alt text

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

GitHub

View Github