Yerel Bilgisayrdan AWS’de Proje Oluşturma Ve Github Reposuna Bağlama

Bu blog yazısında, yerel bilgisayarımızdan AWS’de nasıl bir proje oluşturabileceğimizi ve bu oluşturduğumuz projeyi bir GitHub reposuna nasıl bağlayabileceğimizi adım adım ele alacağız. Bu süreçte AWS SAM (Serverless Application Model) ve AWS CodeBuild servislerinin kullanımını detaylıca inceleyeceğiz. Bu rehber, AWS üzerinde uygulama geliştirme sürecinizi hızlandırmak ve GitHub entegrasyonunu kolaylaştırmak için pratik bilgiler sunmayı amaçlamaktadır.

Günümüzde, bulut tabanlı uygulama geliştirmek, özellikle de serverless mimariyi kullanmak, hızlı, maliyet etkin ve ölçeklenebilir çözümler sunmanın anahtarı haline gelmiştir. AWS SAM, serverless uygulamalarınızı kolayca tanımlamanıza ve dağıtmanıza olanak tanıyan bir framework olarak öne çıkıyor. AWS CodeBuild ise sürekli entegrasyon ve dağıtım süreçlerinizi otomatize ederek geliştirme sürecinizi hızlandırır. Bu yazıda, bu iki güçlü aracın nasıl etkili bir şekilde kullanılacağını, projenizi yerelden AWS’e nasıl taşıyacağınızı ve son olarak da bu projeyi GitHub ile nasıl entegre edeceğinizi detaylıca ele alacağız. Böylece, AWS üzerinde uygulama geliştirmeye yeni başlayanlar için de, daha deneyimli geliştiriciler için de faydalı bir kaynak oluşturmayı hedefliyoruz.

Blog sayfamızda anlattığımız AWS’de proje oluşturma ve GitHub reposuna bağlama sürecine başlamadan önce karşılanması gereken bazı temel gereksinimler bulunmaktadır. Bu işlemleri kolaylıkla gerçekleştirebilmeniz için ihtiyacınız olan araçları ve koşulları aşağıda sadece liste halinde sunuyoruz:

  • Aws hesabı oluşturma
  • AWS’de User oluşturma
  • AWS CLI (Command Line Interface) Kurulumu
  • AWS SAM CLI Kurulumu
  • GitHub Hesabı ve GitHub Repository’si Oluşturma
  • AWS servislerine erişim için gerekli izinlerinizin
  • Python (versiyon < 3.11)

Yerel Bilgisayarınızdan AWS SAM ile AWS Üzerinde Proje Oluşturma

Bu bölümde, AWS Serverless Application Model (SAM) kullanarak yerel bilgisayarınızdan AWS’ye nasıl etkili ve verimli bir şekilde proje oluşturabileceğinizi adım adım inceleyeceğiz. AWS SAM, serverless uygulamalarınızı tanımlamanıza ve hızlı bir şekilde dağıtmanıza olanak tanıyan güçlü bir araçtır. Bu süreç, uygulamanızı geliştirmeyi, test etmeyi ve AWS üzerinde kolayca yayınlamayı mümkün kılar.

Projemizin ilk adımı olarak, AWS SAM’in temel taşı olan ‘template.yaml’ dosyasının oluşturulması gerekmektedir. Bu dosya, SAM’in anlaması ve yorumlaması için projenizin yapılandırmasını içerir. Burada, uygulamanızın AWS kaynaklarını, fonksiyonlarını, izinlerini ve diğer ayarlarını tanımlayabilirsiniz. ‘template.yaml’ dosyasının doğru şekilde yapılandırılması, projenizin AWS üzerinde nasıl davranacağını ve hangi kaynakları kullanacağını belirler. Aşağıda, size örnek bir ‘template.yaml’ dosyasının yapısını göstereceğiz ve bu dosyanın detaylarını adım adım açıklayacağız.

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: Örnek SAM Uygulaması

Resources:
  SunumApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Name: SunumApi


  LambdaUpload:
    Type: 'AWS::Serverless::Function'
    Properties:
      FunctionName: Sunum-upload
      Handler: lambda_function.lambda_handler
      Runtime: python3.11
      CodeUri: ./LambdaUpload/
      MemorySize: 128
      Timeout: 30
      Layers:
        - arn:aws:lambda:eu-central-1:************:layer:samlast:1
      Role: arn:aws:iam::************:role/cagdas-lambda
      Events:
        ApiEvent2:
          Type: Api
          Properties:
            Path: /Sunum-upload
            Method: any
            RestApiId: !Ref SunumApi


  LambdaWebhook:
    Type: 'AWS::Serverless::Function'
    Properties:
      FunctionName: Sunum-webhook-handler
      Handler: lambda_function.lambda_handler
      Runtime: python3.11
      CodeUri: ./LambdaWebhook/
      MemorySize: 128
      Timeout: 30
      Layers:
        - arn:aws:lambda:eu-central-1:************:layer:samlast:1
      Role: arn:aws:iam::************:role/cagdas-lambda
      Events:
        ApiEvent:
          Type: Api
          Properties:
            Path: /Sunum-webhook-handler
            Method: any
            RestApiId: !Ref SunumApi

AWSTemplateFormatVersion ve Transform:

  • AWSTemplateFormatVersion: '2010-09-09': Bu satır, dosyanın AWS CloudFormation şablonu formatının sürümünü belirtir.
  • Transform: 'AWS::Serverless-2016-10-31': Bu, AWS SAM’in kullanılacağını belirten özel bir CloudFormation direktifidir.

Description:

  • Description: Örnek SAM Uygulaması: Bu, şablonunuzun genel bir açıklamasını içerir.

Resources – SunumApi:

  • Resources: AWS kaynaklarının tanımlandığı bölüm.
  • SunumApi: API Gateway tanımı. Bu bölüm, API Gateway’in nasıl yapılandırılacağını belirtir.
  • Type: AWS::Serverless::Api: Kaynağın tipi.
  • Properties: Kaynağın özellikleri.
    • StageName: Prod: API’nin aşaması
    • Name: SunumApi: API’nin adı.

Resources – Lambda Fonksiyonları:

  • LambdaUpload ve LambdaWebhook: İki Lambda fonksiyonu tanımı.
  • Type: 'AWS::Serverless::Function': Fonksiyonun tipi.
  • Properties: Fonksiyonun özellikleri
    • FunctionName: Fonksiyonun adı.
    • Handler: Lambda fonksiyonunun giriş noktası.
    • Runtime: Lambda fonksiyonunun çalışma zamanı (örn. python3.11).
    • CodeUri: Fonksiyon kodunun bulunduğu yer.
    • MemorySize: Fonksiyonun kullanacağı maksimum bellek miktarı.
    • Timeout: Fonksiyonun maksimum çalışma süresi (saniye).
    • Layers: Lambda katmanları.
    • Role: Fonksiyonun kullanacağı IAM rolünün ARN’i.
  • Events: Fonksiyonu tetikleyecek olaylar
    • Type: Olay tipi (örneğin, Api).
    • Properties: Olayın özellikleri.

Bu template.yaml dosyasıyla, AWS SAM kullanarak serverless mimaride iki önemli bileşen oluşturduk: LambdaUpload ve LambdaWebhook adında iki Lambda fonksiyonu ve bu fonksiyonları tetikleyecek SunumApi adında bir API Gateway. LambdaUpload fonksiyonu, /Sunum-upload yolu üzerinden gelen isteklere yanıt verirken, LambdaWebhook fonksiyonu ise /Sunum-webhook-handler yolundaki istekleri işlemek üzere tasarlandı. Her iki Lambda fonksiyonu da Python 3.11’de çalışacak şekilde yapılandırıldı ve AWS’nin belirli kaynaklarını kullanmak üzere ayarlandı. SunumApi ile bu fonksiyonları bir araya getirerek, uygulamamızın dış dünyadan gelen isteklere dinamik ve etkin bir şekilde yanıt vermesini sağladık.

Projemizi AWS üzerinde çalıştırmak için ilk adım, yerel geliştirme ortamımızda “sam build” komutunu kullanarak projemizi derlemektir. Bu komut, template.yaml dosyasında tanımlanan yapıya göre uygulamamızı derler ve AWS’ye yüklemek üzere bir paket oluşturur. Bu derleme işlemi sırasında, SAM otomatik olarak gerekli tüm bağımlılıkları yükler ve Lambda fonksiyonlarınız için bir çalışma ortamı hazırlar. Derleme işlemi tamamlandığında, projemizi AWS’ye dağıtmaya hazır hale geliriz.

Dağıtım süreci, sam deploy --guided komutu ile başlar. Bu komut, AWS üzerinde projenizi dağıtmak ve gerekli kaynakları oluşturmak için interaktif bir rehber sağlar. Komutu çalıştırdığınızda, SAM sizden çeşitli yapılandırma bilgileri (örneğin, projenin adı, dağıtım bölgesi, kaynakların izinleri gibi) isteyecektir. Bu bilgiler, projenizin AWS üzerinde nasıl yapılandırılacağını ve hangi kaynakların kullanılacağını belirler. Yapılandırma adımlarını tamamladıktan sonra, SAM, template.yaml dosyasında tanımladığınız kaynakları otomatik olarak oluşturur ve uygulamanızı belirlediğiniz AWS ortamında çalıştırır. Bu süreç, projenizin AWS üzerinde sorunsuz bir şekilde çalışmasını sağlamak için gerekli tüm adımları içerir.

NOT: Projeyi AWS SAM ile başarıyla dağıttıktan sonra, oluşturulan kaynakları ve yapılandırmaları AWS CloudFormation konsolunda izleyebilirsiniz. Projeyi, CloudFormation konsolunda, dağıtım sırasında belirlediğiniz proje adı ile bulabilirsiniz.

GitHub Reposu ile Entegrasyon: AWS CodeBuild ile Projeyi Otomatik Olarak Yapılandırma ve Dağıtma

Bu bölümde, AWS’de oluşturduğumuz projeyi nasıl AWS CodeBuild servisi ile bir GitHub reposuna bağlayacağımızı adım adım ele alacağız. AWS CodeBuild, kodunuzu otomatik olarak derleyen, test eden ve dağıtan bir servistir ve bu özellikleriyle, sürekli entegrasyon ve sürekli dağıtım (CI/CD) süreçlerini kolaylaştırır. GitHub ile entegrasyon ise, projeniz üzerindeki herhangi bir değişikliğin otomatik olarak AWS’ye yansıtılmasını sağlar. Bu entegrasyon, geliştirme sürecinizi daha verimli hale getirirken, kod değişikliklerinin hızlı ve sorunsuz bir şekilde canlı ortama aktarılmasına olanak tanır.

GitHub reposu ile projemizi eşleştirmek için ilk adım, AWS CodeBuild konsolunda bir ‘Build Project’ oluşturmak. Bu süreci başlatmak üzere konsolda yer alan ‘Create build project’ butonuna tıklıyoruz. Burada, projenizin ismini ve diğer temel ayarlarını belirliyoruz. Özellikle ‘source’ olarak GitHub’ı seçmemiz kritik, çünkü bu adım projemizi GitHub reposu ile entegre edecek. ‘Source’ seçtikten sonra entegre etmemiz gereken repository’i seçmemiz gerekir. ‘Source version – optional’ kutusuna ‘main’ yazarak, yalnızca ‘main’ branch’indeki değişikliklerin projemizi etkilemesini sağlayabiliriz. Bu, projenin belirli bir dal üzerinden sürekli olarak güncellenmesini ve bu dala yapılan her commit’in otomatik olarak derlenmesini sağlar.

Şekil-1: Build project oluşturulurken CI/CD seçeneği olarak GitHub’ın nasıl seçileceğini göstermektedir. Ayrıca, bu şekil hangi GitHub reposunun seçileceği gibi bilgileri göstermektedir.

Build Project ayarlarımıza devam ederken, ‘Primary source webhook events’ bölümüne ulaşıyoruz. Burada, ‘Rebuild every time a code change is pushed to this repository’ seçeneğini işaretlememiz gerekiyor. Bu, projemizin GitHub reposunda herhangi bir kod değişikliği yapıldığında otomatik olarak yeniden derlenmesini sağlar. Ayrıca, ‘Event type’ seçeneklerinden ‘PUSH’ ve ‘PULL_REQUEST_MERGED’ seçeneklerini işaretleyerek, bu tür olayların tetiklenmesini istediğimizi belirtiyoruz. Bu ayarlamalar, GitHub’daki main branch’inde gerçekleşen push ve merge işlemleri sırasında kodlarımızın otomatik olarak güncellenmesini sağlar. Bu şekilde, sürekli entegrasyon sürecimizi daha da otomatize ediyor ve projemizin her zaman güncel kalmasını sağlıyoruz.

Şekil-2: Webhook kullanılarak projenin hangi durumlarda ve nasıl kod güncellemeleri alacağının gösterildiği bir ekran görüntüsüdür.

Build Project ayarlarımızı yapmaya devam ederken, ‘Environment’ bölümüne ulaşıyoruz. Bu kısımda, projemizin derleme ortamını yapılandırıyoruz. İlk olarak, ‘Compute’ seçeneğinde, projemizin AWS Lambda üzerinde çalıştırılacağını belirten ‘Lambda’ seçeneğini tercih ediyoruz. Daha sonra ‘Runtime’ bölümünde, projemizin hangi programlama dilinde yazıldığını belirleyen ‘python’ seçeneğini işaretliyoruz. Ayrıca, ‘Image’ seçeneğinde, derleme işlemi için kullanılacak sanal makine tipini belirten ‘x86_64’ seçeneğini seçiyoruz. Son olarak, ‘Service role’ kısmında, AWS CodeBuild’in projemiz adına kaynakları yönetmesine izin veren ‘New service role’ seçeneğini işaretliyoruz. Bu adımlar, projemizin AWS CodeBuild ortamında doğru şekilde derlenmesi ve çalıştırılması için gerekli yapılandırmaları içerir.

Şekil-3: projedeki kodların lambda aracılığı ile güncellenecği ve projedeki diğer gereksinimleri gösteren ekran görüntüsüdür.

Environment bölümünün yapılandırılmasını tamamladıktan sonra, son adıma geçiyoruz. Bu aşamada, ‘Create build project’ butonuna basarak WS CodeBuild’de ‘Build Project’i oluşturuyoruz.

‘Build Project’ servisini başarıyla oluşturup GitHub reposu ile entegre ettikten sonra, bir sonraki adım AWS servislerimizden elde ettiğimiz bilgileri bu projeye atanan role eklemektir. Bu, özellikle AWS Lambda gibi servislerin ARN (Amazon Resource Name) bilgilerini içerir. ‘Build Project’ servisine atanan IAM (Identity and Access Management) rolünün izinlerinde, bu servislerin kaynaklarına erişim sağlayacak şekilde güncellemeler yapmamız gerekiyor.

Yapacağımız güncellemeler için öncelikle AWS CodeBuild konsoluna gidip, daha önce oluşturduğumuz ‘Build Project’ üzerine tıklamamız gerekiyor. Bu adım, bizi projenin detaylarına götürecek. Projemizin detaylarına ulaştığımızda, gerekli güncellemeleri yapmak üzere ‘Build details’ sekmesini açmalıyız.

Şekil-4, güncellenecek servis rolüne ulaşmak için kullanılacak ‘Build details’ butonunu göstermektedir.

Build details’ sekmesine geçtikten sonra, ‘Environment’ bölümünde yer alan ‘Service role’ seçeneğine erişmemiz gerekiyor. Bu role yeni izinler eklememiz gerekiyorsa, bu aşamada bu ekleme işlemini gerçekleştirebiliriz. Özellikle, ‘CodeBuildBasePolicy’ ile başlayan izinlere odaklanarak, bu izinlerin içine girip ‘Düzenle’ seçeneğini kullanmalıyız. Bu sayede, ‘Resource’ bölümüne, projemize erişim izni vermek istediğimiz AWS servislerinin ARN (Amazon Resource Name) bilgilerini ekleyebiliriz. Bu işlem, CodeBuild’in belirlediğimiz AWS servislerine erişmesine ve bu servisler üzerinde gerekli işlemleri gerçekleştirmesine olanak tanır.

Şekil-5: Güncellenmesi gereken servis rolüne erişmek için tıklanması gereken alan gösterilmektedir.

CodeBuildBasePolicy’ ile başlayan izni düzenlemek için, öncelikle bu iznin üzerine tıklayarak ilgili sayfayı açmamız gerekiyor. Sayfa açıldığında, izin detaylarını düzenlemek üzere ‘Edit’ butonuna basmamız gerekmektedir. Bu adım, ilgili politikaya eklemeler yapabilmemiz veya mevcut izinleri değiştirebilmemiz için gereklidir.

Şekil-6: Bu ekran görüntüsü, Servis Rolü’ne eklediğimiz izinleri ve GitHub tarafından güncellenecek olan Lambda servislerinin ARN bilgilerinin nereye girileceğini göstermektedir.

“‘Edit’ butonuna tıkladıktan sonra, karşımıza çıkan JSON dosyasında önemli bir düzenleme yapmamız gerekiyor. Bu dosyada, ‘Resource’ bölümünü bulup, bu kısma sırasıyla eklemek istediğimiz AWS servisleri ve fonksiyonlarının ARN (Amazon Resource Name) bilgilerini eklememiz gerekmektedir. Bu işlem, CodeBuild projesinin belirlediğimiz AWS kaynaklarına erişim iznine sahip olmasını sağlar ve bu kaynaklar üzerinde gerekli işlemleri yapabilmesi için gereklidir.”

Şekil-7: İzinler bölümüne eklenen güncellenecek lambda servislerinin ARN bilgilerini içeren ekran görüntüsü.

Artık AWS CodeBuild ile GitHub entegrasyonumuzun AWS tarafındaki ayarlarını başarıyla tamamladık. Bu aşamadan sonra, projemizin GitHub reposuna odaklanmamız gerekiyor. AWS CodeBuild, GitHub reposundan kodları alıp derlemek ve test etmek için buildspec.yml adında bir yapılandırma dosyasına ihtiyaç duyar. Bu dosya, AWS CodeBuild’e projenizin nasıl derleneceğini ve testlerin nasıl çalıştırılacağını söyler. Örneğin, hangi komutların çalıştırılacağı, hangi dosyaların dikkate alınacağı ve derleme sırasında hangi aşamaların izleneceği gibi bilgileri içerir. Projemizin kök dizininde bulunan buildspec.yml dosyası, AWS CodeBuild’in GitHub’dan alacağı kodlarla neler yapması gerektiğini belirleyen rehber niteliğindedir. Bu dosyanın varlığı ve doğru bir şekilde yapılandırılması, projemizin AWS CodeBuild tarafından sorunsuz bir şekilde derlenip dağıtılmasını sağlar.

Yukarıda bahsedilen buildspec.yml dosyasının önemi ve işlevselliği göz önünde bulundurularak, Aşağıdak örnek bir buildspec.yml dosyası oluşturacağız. Bu örnekte, AWS CodeBuild tarafından kullanılacak temel komutlar ve yapılandırmalar yer alacak. Örneğimiz, derleme sürecinin nasıl yapılandırılacağını, hangi komutların çalıştırılacağını ve derleme sırasında hangi dosyaların dikkate alınacağını gösterecek. Bu örnek dosya üzerinden, buildspec.yml dosyasının yapısını ve her bir bölümünün projenizin derleme ve dağıtım sürecine nasıl katkıda bulunduğunu adım adım inceleyeceğiz. Bu şekilde, kendi projeniz için buildspec.yml dosyasını nasıl hazırlayabileceğiniz konusunda net bir rehberiniz olacak.

version: 0.2
phases:
  install:
    runtime-versions:
      python: 3.11
    commands:
      - echo "Python environment setup"

  build:
    commands:
      - echo "Zipping deployment package..."
      - cd LambdaUpload
      - zip -r9 LambdaUpload.zip lambda_function.py
      - cd ..

      - cd LambdaWebhook
      - zip -r9 LambdaWebhook.zip lambda_function.py
      - cd ..

      - echo "Deployment package ready"

  post_build:
    commands:
      - echo "Updating lambda Function..."

      - aws lambda update-function-code --function-name App-upload --zip-file fileb://LambdaUpload/LambdaUpload.zip
      - aws lambda update-function-code --function-name App-webhook-handler --zip-file fileb://LambdaWebhook/LambdaWebhook.zip


      - echo "Lambda function configuration updated"
      - echo "DONE!!"

Blog sayfamızda yer alan buildspec.yml dosyası, AWS CodeBuild tarafından projemizin nasıl derleneceğini ve testlerin nasıl yapılacağını belirten bir yapılandırma dosyasıdır. Bu dosyanın her bir bölümü, derleme sürecinin farklı aşamalarını yönetir.
Örneğin:

  • version: Bu bölüm, buildspec dosyasının hangi versiyonunu kullandığımızı belirtir.
  • phases: Derleme sürecinin farklı aşamalarını tanımlar.
    • install: Gerekli araçların ve bağımlılıkların yüklenmesi için kullanılır.
    • pre_build: Derleme işleminden önce gerçekleştirilmesi gereken komutlar için kullanılır, örneğin yapılandırma ayarları veya bağımlılık kontrolü.
    • build: Asıl derleme işleminin gerçekleştirildiği kısım. Kaynak kodun derlenmesi, testlerin çalıştırılması vb. işlemler bu aşamada tanımlanır.
    • post_build: Derleme işlemi tamamlandıktan sonra yapılması gereken işlemler, örneğin derleme çıktılarının belirli bir depolama alanına yüklenmesi.

Yukarıda belirtilen buildspec.yml dosya örneği, GitHub reposundaki LambdaUpload ve LambdaWebhook klasörlerinde bulunan lambda_function.py dosyalarının AWS Lambda servisinde yer alan App-upload ve App-webhook-handler Lambda fonksiyonlarını güncellemek için kullanılmıştır. Bu yapılandırma, AWS CodeBuild’in GitHub’daki değişiklikleri otomatik olarak algılamasını ve bu değişiklikleri AWS Lambda servisindeki ilgili fonksiyonlara yansıtmasını sağlar. Örneğin, LambdaUpload klasöründeki lambda_function.py dosyasında yapılan bir değişiklik, buildspec.yml dosyasındaki tanımlamalar doğrultusunda AWS’deki App-upload Lambda fonksiyonunu günceller. Benzer şekilde, LambdaWebhook klasöründeki değişiklikler de App-webhook-handler Lambda fonksiyonunu güncellemek için kullanılır.

Bu işlemlerin tamamlanmasıyla, GitHub reposu ile AWS servisleri arasında tam bir entegrasyon sağlanmış olur. Artık, GitHub reposunda yapılan herhangi bir değişiklik, AWS servislerindeki ilgili fonksiyonları ve kodları otomatik olarak güncelleyecektir. Bu entegrasyon sayesinde, geliştirme sürecimiz daha verimli ve sorunsuz hale gelir; kod değişiklikleri hızlı ve etkili bir şekilde canlı ortama aktarılır.

Sonuç

bu blog yazısında, yerel bilgisayarınızdan AWS’ye proje taşıma ve GitHub ile entegrasyon sürecini başarılı bir şekilde tamamlamanın adımlarını detaylıca ele aldık. AWS SAM ve AWS CodeBuild gibi önemli servislerin kullanımını öğrenmek, serverless uygulama geliştirme sürecinizi hem kolaylaştıracak hem de hızlandıracaktır. Bu rehberin, bulut tabanlı uygulama geliştirmeye yeni başlayanlar için olduğu kadar, daha deneyimli geliştiriciler için de pratik ve yararlı bilgiler sunduğunu umuyoruz.

Çağdaş Yılmaz
cagdas.yilmaz@golive.com.tr