Docker Image'ı GCP'de Serverless Olarak Yayına Alma

26.03.2022 | dakika okuma

1. Giriş

Serverless yaklaşımı ile birlikte yazılım geliştiricinin sunucuyu düşünme derdi ortadan kalktı. Artık kodumuzu yazıyoruz ve sağlayıcıya bunu çalıştır diyoruz. Sunucu konfigürasyonları, ölçeklendirmeleri vs. ile uğraşmıyoruz. Bir de üstüne kullandığın kadar öde. Bu büyük bir nimet.

AWS'in Lambda, GCP'in Cloud Function, Azure'un Azure Function vs. servisleri bize bu hizmeti sağlıyor. Fakat bu sefer de şöyle bir sorun ortaya çıkıyor. Bu servisler tüm dilleri desteklemiyor. İstediğimiz dili desteklese bile istediğimiz versiyonu desteklemeyebiliyor. Mesela AWS Lambda henüz .NET Core 2.1'in üstünü desteklemiyor. Bu bir problem. Kimse bizi kısıtlayamaz :)

Google'ın Knative üzerine inşa ettiği Cloud Run servisi bu sorunu tamamen ortadan kaldırıyor. Cloud Run'a docker image'ı veriyoruz ve Cloud Run bu image'dan serverless servisimizi ayağa kaldırıyor. Dolayısıyla ister PHP'de geliştirelim ister .NET Core'da geliştirelim farketmez. Dockerize edebildiğimiz müddetçe sınır yok. Bu müthiş bir şey.

2. Geliştirme Ortamının Hazırlanması

Bu bölümde geliştirme ortamımızı ayarlayacağız. ASP.NET Core Uygulamasını GCP Kubernetes'de Yayınlama yazımdaki 2. bölümü aynen uygulayabilirsiniz.

3. GCP'nin Hazırlanması

3.1. Projenin Oluşturulması

Google Cloud hizmetlerini kullanabilmemiz için öncelikle proje oluşturmamız gerekli. Terminalden aşağıdaki komutu çalıştırmalısınız. PROJECT_ID ve PROJECT_NAME alanlarını kendinize göre güncelleyebilirsiniz.

    gcloud projects create [PROJECT_ID] --name=[PROJECT_NAME]
gcloud projects create my-cloud-run-api-project-1 --name="My Cloud Run API Project"
gcloud project create
gcloud project create

Oluşturulan projeyi görmek için aşağıdaki komutu çalıştırabilirsiniz.

    gcloud projects list
3.2. Projenin Seçilmesi

Local makinemizde google cloud config'e oluşturduğumuz projeyi tanımlamamız gerekiyor. Terminalden aşağıdaki komutu çalıştırmalısınız. PROJECT_ID alanını kendi bilginize göre güncellemeyi unutmayın.

    gcloud config set project [PROJECT_ID]
gcloud config set project my-cloud-run-api-project-1
gcloud config set project
gcloud config set project
3.3. Faturalandırmanın Etkinleştirilmesi

Uygulamayı yayına almadan önce oluşturduğumuz projeye fatura hesabı bağlamalıyız. Account Id'nizi öğrenmeniz için terminalden aşağıdaki komutu çalıştırmalısınız.

    gcloud beta billing accounts list

Google SDK'nın alpha komutlarını yüklemek için aşağıdaki komutu çalıştırmalısınız.

    gcloud components install alpha
gcloud components install alpha
gcloud components install alpha

İşlem tamamlandığında Account Id'yi projenize bağlamak için aşağıdaki komutu çalıştırmalısınız. PROJECT_ID ve ACCOUNT_ID alanlarını kendi bilgilerinize göre güncellemeyi unutmayın.

    gcloud alpha billing projects link [PROJECT_ID] --billing-account [ACCOUNT_ID]

Projenize faturanın başarılı şekilde bağlandığını görmek için aşağıdaki komutu çalıştırabilirsiniz. ACCOUNT_ID alanını kendi bilginize göre güncellemeyi unutmayın.

    gcloud beta billing projects list --billing-account=[ACCOUNT_ID]
3.4. Cloud Run API'nin Aktifleştirilmesi

Google Cloud API'lerinden Cloud Run API'nin aktifleştirilmesi gerekli. Terminalden aşağıdaki komutu çalıştırmalısınız.

    gcloud services enable run.googleapis.com
3.5. Container Registry API'nin Aktifleştirilmesi

Google Cloud API'lerinden Container Registry API'nin aktifleştirilmesi gerekli. Terminalden aşağıdaki komutu çalıştırmalısınız.

    gcloud services enable containerregistry.googleapis.com

4. Uygulamanın Yayınlanması

Basit bir API oluşturdum. Bu API'yi aşağıdaki komut ile Github'dan çekebilirsiniz.

    git clone https://github.com/ahmetkucukoglu/aspnetcore-gcloud-run-sample.git

Burada dikkat etmemiz gereken bir husus var o da şu; Cloud Run docker image'dan servis ayağa kaldırırken port'u kendi atıyor. Bu port'u environment variable'a yazıyor. Yazdığımız uygulamayı da bu port'u dinleyecek şekilde ayağa kaldırmamızı istiyor. Bunu yapmazsak Cloud Run healthcheck yaptığında yanıt alamazsa servisi durduruyor.

11. ve 12. satırda nasıl ayarlandığını görebilirsiniz.

4.1. Image'ın Oluşturulması ve Image'ın GCR'ye Gönderilmesi

Projenin içerisinde Dockerfile bulunuyor. Aşağıdaki komut ile docker'da image oluşturmalıyız. IMAGE_ID alanını kendinize göre belirleyebilirsiniz.

    docker build -t [IMAGE_ID] -f CloudRunSampleAPI/Dockerfile .
docker build -t my-cloud-run-api-image:1.0 -f CloudRunSampleAPI/Dockerfile .

Oluşturduğumuz bu image'ı GCR'ye göndermek için öncelikle tag oluşturalım. LOCAL_IMAGE_ID, PROJECT_ID ve IMAGE_ID alanlarını kendi bilgilerinize göre güncellemeyi unutmayın.

    docker tag [LOCAL_IMAGE_ID] gcr.io/[PROJECT_ID]/[IMAGE_ID]
docker tag my-cloud-run-api-image:1.0 gcr.io/my-cloud-run-api-project-1/my-cloud-run-api-image:1.0

Şimdi bu tag'i kullanarak image'ı GCR'ye gönderelim.

    docker push gcr.io/[PROJECT_ID]/[IMAGE_ID]
docker push gcr.io/my-cloud-run-api-project-1/my-cloud-run-api-image:1.0
docker push gcr.io
docker push gcr.io

GCR'ye gönderilen image'ı görmek için aşağıdaki komutu terminalden çalıştırabilirsiniz.

    gcloud container images list
4.2. Uygulamanın Deploy Edilmesi

Yukarıda oluşturduğumuz image'ı kullanarak uygulamamızı deploy etmemiz kaldı. Terminalden aşağıdaki komutu çalıştırmalısınız. SERVICE_NAME ve IMAGE_ID alanlarını kendi bilgilerinize göre güncellemeyi unutmayın.

    gcloud beta run deploy [SERVICE_NAME] --image [IMAGE_ID] --platform managed --region europe-west1 --update-env-vars APIKey=Key123,APISecret=Secret456
gcloud beta run deploy my-cloud-run-api --image gcr.io/my-cloud-run-api-project-1/my-cloud-run-api-image:1.0 --platform managed --region europe-west1 --update-env-vars APIKey=Key123,APISecret=Secret456
gcloud beta run deploy
gcloud beta run deploy

Terminalde endpoint'i gördük. Artık test edebilirsiniz.

GET
GET

Projenin son haline Github’dan erişebilirsiniz.

ahmetkucukoglu/aspnetcore-gcloud-run-sample

C#
2
1

Kolay gelsin.

Yazıyı Paylaş

Yorum bırak

Yanıtla

Yanıtlamayı iptal et
Bu site reCAPTCHA tarafından korunmaktadır ve Google Gizlilik Politikası ve Hizmet Şartları geçerlidir. Yorumunuz başarılı şekilde gönderildi reCaptcha doğrulanamadı
Muhabbetle ASP.NET Core ile geliştirildi.