Ana içeriğe geç

İlk AWS CDK Yığınınızı Oluşturun: Yeni Başlayanlar İçin Rehber

Python kullanarak ilk AWS CDK yığınınızı nasıl oluşturup dağıtacağınızı öğrenin. Bu yeni başlayan dostu rehber; kurulum, construct’lar, dağıtım, test ve CI/CD’yi kapsar.
· 15 dk. oku

Yapay Zeka ile Keşfedin

Ham JSON veya YAML şablonlarıyla bulut altyapısını yönetmek zahmetli ve hataya açık olabilir. AWS Cloud Development Kit (CDK), Python, TypeScript, Java ve C# gibi modern programlama dilleriyle bulut kaynaklarını tanımlamanıza olanak tanıyarak bunu değiştirir.

CDK ile altyapı; tekrar kullanılabilir, test edilebilir ve sürüm kontrollü koda dönüşür. Bu sayede karmaşık bulut sistemlerini hazırlarken bile bir geliştirici gibi düşünebilirsiniz.

Bu eğitimde, Python kullanarak bir AWS CDK projesini nasıl kuracağınızı öğreneceksiniz. İlk yığını yazma, temel bir AWS kaynağı ekleme ve bunu AWS hesabınıza dağıtma sürecini adım adım işleyeceğiz. Sonunda, CDK’nın nasıl çalıştığını ve geliştirici dostu bir şekilde, kodla altyapıyı yönetmek için nasıl kullanılacağını açıkça anlayacaksınız.

AWS CDK gibi araçların ardındaki uygulamaları daha iyi anlamak için, DevOps Kavramları kursumuzu inceleyin.

Önkoşullar

AWS CDK ile kod yazmaya başlamadan önce, ortamınızın doğru şekilde kurulduğundan emin olun. İhtiyacınız olanlar:

Deney için AWS hesabı

Oluşturacağımız uygulamayı dağıtmak için bir AWS hesabına erişmeniz gerekir. Sisteminize halihazırda yönetici düzeyinde bir kullanıcı kimlik bilgileri tanımlıysa, bu adımı atlayabilirsiniz.

Henüz bir AWS hesabınız yoksa, buradan oluşturun.

AWS temellerini kapsayan yapılandırılmış bir öğrenme yolu için, AWS Cloud Practitioner yolu harika bir başlangıçtır.

Yönetici kullanıcısı

Takip edebilmek için programatik erişimi ve tam yetkileri olan bir kullanıcıya ihtiyacınız olacak.

  1. AWS hesabınıza giriş yapın.
  2. Açın IAM Konsolu.
  3. Yeni bir kullanıcı oluşturun — örneğin “datacamp-cdk” gibi bir ad verebilirsiniz
  4. Şunu seçin: Programmatic access.
  5. Tıklayın: Next: Permissions.
  6. Şunu seçin: Attach existing policies directly ve AdministratorAccess ilkesini işaretleyin.
  7. Şunları geçerek ilerleyin: Next: Tags, Next: Review ve ardından Create User.

Son ekranda Access key ID ve Secret access key bilgilerinizi not edin. Bir sonraki adımda bunlara ihtiyacınız olacak.

AWS kimlik bilgilerinizi yapılandırın

Bir terminal açın ve şunu çalıştırın:

aws configure

IAM konsolundaki kimlik bilgilerini girmeniz istenecektir:

AWS Access Key ID [None]: <your access key ID>
AWS Secret Access Key [None]: <your secret access key>
Default region name [None]: us-east-1
Default output format [None]: 

Geliştirme için bir IDE seçin

AWS CDK, geliştiricilerin YAML veya JSON şablonları yerine eksiksiz bir programlama ortamında çalışmasına olanak tanır. Bu tam özellikli ortam, tercih ettiğiniz IDE’yi kullanırken kod tamamlama, gerçek zamanlı linting ve yeniden düzenleme araçlarından yararlanarak altyapı kodunu verimli biçimde yönetmenizi sağlar.

Python CDK ile en iyi geliştirme deneyimi için aşağıdakileri destekleyen bir IDE kullanmanızı öneririm:

  • Sözdizimi vurgulama
  • Kod tamamlama
  • Akıllı gezinme ve öneriler
  • Sanal ortam desteği

Python ve pip’i yükleyin

AWS CDK’yi Python ile kullanmak için sisteminizde 3.8 veya üzeri Python sürümü yüklü olmalıdır. Henüz yoksa, en son sürümü resmi Python sitesinden indirebilirsiniz.

Windows kullanıyorsanız, Python’un sisteminizin PATH ortam değişkenine eklendiğinden emin olun. Kontrol etmek için bir terminal veya komut istemi açıp şunu çalıştırın:

python --version

“komut bulunamadı” veya benzeri bir hata görürseniz, Python muhtemelen PATH’te değildir. En kolay çözüm, kurulum sırasında “Add Python 3.x to PATH” kutusunu işaretlemektir.

Daha sonra AWS CDK bağımlılıklarını kurmak için Python paket yükleyicisi pip’e de ihtiyacınız olacak. Çoğu modern Python dağıtımı pip ile birlikte gelir.

pip --version

Yüklü değilse, resmi pip kurulum rehberini izleyin.

AWS CDK ile Başlarken

Herhangi bir kod yazmadan önce, AWS CDK’nin ne olduğunu, neden var olduğunu ve altyapı olarak kod (IaC) dünyasına nasıl oturduğunu anlamak önemlidir. Bu bölüm CDK’nin temel kavramlarını tanıtacak ve diğer popüler IaC araçlarıyla karşılaştırmasını gösterecek.

AWS CDK nedir ve neden kullanılır?

AWS Cloud Development Kit (CDK), Python, TypeScript, Java ve C# dahil aşina olduğunuz programlama dilleriyle bulut altyapısı oluşturmanıza olanak tanıyan açık kaynaklı bir çerçevedir. 

CDK, manuel JSON veya YAML şablonu yazmak yerine gerçek kodla programatik olarak CloudFormation şablonları üretmenizi sağlar.

Bu şu anlama gelir:

  • Döngüler ve fonksiyonlar kullanarak mantığı tekrar kullanabilirsiniz.
  • Altyapınızı modüller ve sınıflarla organize edebilirsiniz.
  • IDE’niz kod tamamlama, hata kontrolü ve yeniden düzenleme yetenekleri sunar.

CDK’nin merkezinde üç ana kavram bulunur:

  • App – CDK projenizin giriş noktası. Bir veya daha fazla yığın içerebilir.
  • Stack – Bir CloudFormation yığınına karşılık gelen dağıtım birimi. Her yığın, oluşturulacak bir dizi kaynağı tanımlar.
  • Construct – CDK’nin yapı taşı. Construct’lar S3 kovaları, Lambda fonksiyonları, VPC’ler ve birden çok kaynağı birleştiren karmaşık desenler gibi bulut bileşenlerini temsil eder.

AWS CDK yapısını gösteren diyagram: Bir App, üç construct—S3 Bucket, Lambda Function ve VPC—içeren bir Stack (ör. MyStack) barındırır; yukarıdan aşağıya hiyerarşiyle bağlanmış.

Bir AWS CDK uygulamasının görsel hiyerarşisi

CDK vs Terraform vs CloudFormation

Aşağıdaki tablo, AWS’de altyapıyı yönetmek için mevcut araçlar arasındaki farkları açıklar.

Özellik

AWS CDK

Terraform

AWS CloudFormation

Dil Desteği

Python, TypeScript, Java, C#

HCL (bildirimsel)

YAML / JSON

Soyutlama Düzeyi

Yüksek (OOP + kütüphaneler)

Orta

Düşük

Modülerlik

Güçlü (construct’lar, sınıflar)

Güçlü (modüller)

Zayıf (iç içe yığınlar)

Durum Yönetimi

CloudFormation tarafından yönetilir

Terraform tarafından yönetilir (tfstate)

CloudFormation tarafından yönetilir

Çoklu bulut

Yalnızca AWS

Evet

Yalnızca AWS

Desteklenen diller ve önkoşullar

AWS CDK, geliştiricilerin en rahat oldukları dili seçmelerine olanak tanıyan birden fazla programlama dilini destekler:

  • TypeScript
  • Python
  • Java
  • C#/.NET
  • Go

Bu eğitimde odak Python olacak, ancak temel kavramlar tüm desteklenen dillere uygulanır.

Kurulum ve yapılandırma

Artık ortamınız hazır olduğuna göre, Python kullanarak ilk AWS CDK uygulamanızın iskeletini oluşturma zamanı. CDK init komutu, hızlıca başlamanıza yardımcı olmak için dosyalar, dizinler ve bir sanal ortam dahil olmak üzere tüm proje yapısını hazırlar.

Bir proje dizini oluşturun

Yeni bir dizin oluşturmak ve içine geçmek için terminalinizi açıp şu komutu çalıştırın:

mkdir cdk_datacamp && cd cdk_datacamp

CDK uygulamasını başlatın

cdk init sample-app --language python

Bu, aşağıdakileri içeren temel bir örnekle önceden yapılandırılmış bir başlangıç projesi oluşturur:

  • Örnek bir yığın (cdk_datacamp_stack)
  • Bir SQS kuyruğu, bir SNS konusuna abone edilmiş
  • CDK uygulamanızın nasıl çalıştığını yapılandıran bir cdk.json dosyası
  • Python bağımlılıkları için bir sanal ortam (.venv içinde)

Komut tamamlandığında buna benzer bir çıktı göreceksiniz:

Python projesini başlatmak için AWS CDK terminal çıktısı; sanal ortamı manuel oluşturma ve etkinleştirme, gereksinimleri yükleme ve cdk synth çalıştırma adımlarını içerir.

CDK Python proje iskeleti 

Sanal Ortam Kurulumu

cdk init işlemi otomatik olarak bir sanal ortam oluşturmazsa, bunu elle yapabilirsiniz:

python3 -m venv .venv
source .venv/bin/activate

Etkinleştirildikten sonra gerekli bağımlılıkları yükleyin:

pip install -r requirements.txt

CDK Kavramlarını Anlamak

Koda daha derin dalmadan önce, AWS CDK’nin çekirdek bileşenleri—uygulamalar, yığınlar ve construct’lar—pratikte nasıl birlikte çalışır inceleyelim. Artık her birinin neyi temsil ettiğine aşina olduğunuza göre, ölçeklenebilir ve modüler bir altyapı oluşturmak için nasıl etkileştiklerini görmek önemlidir. 

Ayrıca construct seviyelerini (L1, L2, L3) ayrıntılandıracak ve bunu mümkün kılan CDK kütüphanelerini inceleyeceğiz.

Uygulamalar, yığınlar ve construct’lar

Önceki bölümlerde App, Stack ve Construct’un ne olduğunu öğrendiğinize göre, bir CDK uygulamasında nasıl birlikte çalıştıklarını anlayalım.

Bunu bir ev inşa etmek gibi düşünün:

  • App genel inşaat projesidir.
  • Her Stack, projedeki ayrı bir bina veya yapıdır.
  • Her Construct, bir yığına dahil edilen duvarlar, kapılar veya tesisat gibi bir bileşendir.

Kodda ilişki şöyle görünür:

# app.py

from aws_cdk import App
from my_project.my_stack import MyStack

# Initialize the CDK application
app = App()

# Instantiate the stack and add it to the app
MyStack(app, "MyFirstStack")

# Synthesize the CloudFormation template
app.synth()
# my_stack.py

from aws_cdk import Stack
from aws_cdk import aws_s3 as s3
from constructs import Construct

class MyStack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # Define an Amazon S3 bucket with default settings
        s3.Bucket(self, "MyBucket")

Burada App, bir S3 kovası gibi Construct’ları içeren bir Stack örnekler.

Construct seviyelerini anlamak: L1, L2 ve L3

AWS CDK’de construct’lar, ihtiyaç duyduğunuz kontrol veya sadelik düzeyine göre esneklik sağlayan üç soyutlama seviyesinde gelir.

Seviye 1 (L1) – CloudFormation Construct’ları

Bunlar, doğrudan AWS CloudFormation spesifikasyonundan üretilen ham yapı taşlarıdır. CloudFormation’daki her AWS kaynağının CDK’de eşdeğer bir L1 construct’ı vardır; adları her zaman “Cfn” ile başlar.

L1 construct’lar olası tüm yapılandırma seçeneklerini sunar ancak hiçbir soyutlama veya varsayılan sağlamaz. Tam kontrol gerektiğinde veya henüz üst düzey construct’lar tarafından sarılmamış yeni AWS özelliklerini kullandığınızda idealdirler.

  • Örnek: s3.CfnBucket

Seviye 2 (L2) – AWS CDK-yerel Construct’lar

L2 construct’lar, L1’in üzerinde daha üst düzey, geliştirici dostu bir soyutlama sağlar. Günlük işleri kolaylaştıran makul varsayılanlara ve yerleşik yöntemlere sahip, görüş bildirici bileşenlerdir. Günlük kullanım için tasarlanmışlardır; yinelemeli kodu azaltırken iyi bir özelleştirme düzeyi sunarlar.

  • Örnek: s3.Bucket – Sadece bir satır kodla sürümlü bir kova oluşturabilirsiniz.

Seviye 3 (L3) – Desen Construct’ları

L3 construct’lar, birden fazla AWS kaynağını yaygın mimari desenlere paketleyen soyutlamalardır. AWS tarafından sağlanabilir veya topluluk ya da siz tarafından yeniden kullanılabilir bileşenler olarak oluşturulabilirler. L3 construct’ları, karmaşıklığı kapsüllemek ve projeler ya da ekipler arasında altyapı desenlerini tekrar kullanmak için tercih edin.

  • Örnek: aws_s3_deployment.BucketDeployment – Varlık yüklemelerini otomatikleştirmek için bir S3 kovasını ve dağıtım stratejisini birleştirir.

Geliştiricilerin çoğu L2 construct’larla başlar ve gerektiğinde L1 ekler. Projeniz büyüdükçe ve tekrar eden desenleri yeniden kullanılabilir bileşenlere soyutlamak istediğinizde L3 kullanışlı hale gelir.

CDK kütüphaneleri ve modülleri

AWS CDK ile oluştururken doğrudan ham CloudFormation ile etkileşime girmezsiniz. Bunun yerine; S3, Lambda, IAM ve daha fazlası gibi AWS servisleri için construct’lar sağlayan CDK’nin modüler kütüphanelerini kullanırsınız. Tüm AWS servis modülleri, aws-cdk-lib adlı çekirdek paket altında toplanmıştır ve servislere göre alt başlıklara ayrılmıştır.

Python’da yaygın kullanılan kütüphaneler

Aşağıda Python projelerinde aws-cdk-lib içinden en sık kullanılan kütüphane (veya modül) örnekleri yer alıyor:

  • aws_cdk.aws_s3 – S3 kovaları oluşturmak için
  • aws_cdk.aws_lambda – Lambda fonksiyonlarını tanımlamak için
  • aws_cdk.aws_iam – Roller ve izinleri yönetmek için
  • aws_cdk.aws_dynamodb – DynamoDB tablolarıyla çalışmak için
  • aws_cdk.aws_ec2 – VPC’ler ve güvenlik grupları gibi ağ bileşenleri için
  • aws_cdk.aws_sns / aws_cdk.aws_sns_subscriptions – SNS konuları ve aboneleri için

Bu modüller yalnızca ihtiyaç duyulduğunda içe aktarılır; projenizi hafif ve modüler tutar.

Bir CDK modülü nasıl içe aktarılır ve kullanılır

Belirli bir AWS servisini kullanmak için modülünü içe aktarır ve construct sınıflarını çağırırsınız. Örneğin, bir S3 kovası oluşturmak için:

from aws_cdk import aws_s3 as s3

# Inside your stack
bucket = s3.Bucket(self, "MyBucket")

Bu örnek, şifreleme ve sürümleme seçenekleri gibi yerleşik varsayılanlar içeren L2 construct’ı s3.Bucket’ı kullanır.

Başka bir servisi kullanmanız gerekirse, modülünü aynı şekilde içe aktarın:

from aws_cdk import aws_lambda as lambda_
from aws_cdk import aws_iam as iam

Not: requirements.txt dosyanızda genellikle yalnızca şunlara ihtiyaç duyarsınız:

aws-cdk-lib==2.179.0
constructs>=10.0.0,<11.0.0

Bu iki paket, tüm AWS CDK construct’larına ve çekirdek çerçeve işlevselliğine erişim sağlar.

İlk CDK Yığınınızı Oluşturma

AWS CDK’nin iç işleyişini öğrendikten sonra bu bilgiyi uygulayabilirsiniz. Aşağıdaki bölüm, Python kullanarak çalışan bir CDK yığını oluşturma konusunda size rehberlik eder. AWS hesabınıza dağıtmadan önce, kod aracılığıyla bir proje yapısı oluşturacak ve S3 kovaları ile Lambda fonksiyonları gibi gerçek AWS kaynaklarını uygulayacaksınız.

Yeni bir projenin iskeletini oluşturma

Komut satırında --language python bayrağıyla cdk init çalıştırdığınızda, şu yapıya benzeyen tam bir proje oluşturur:

AWS CDK proje dizin ağacının görünümü; app.py, cdk.json, requirements.txt gibi kilit dosyalar ve cdk_datacamp kaynak kodu ile tests/unit/test_cdk_datacamp_stack.py klasörleri.

Bir AWS CDK Python projesinin klasör yapısı

App’in tanımlandığı yer app.py dosyasıdır ve Stack ile Construct’lar için kodu yazdığınız yer cdk_datacamp_stack.py dosyasıdır.

İpucu: Yığın dosyasını veya sınıfını, uygulamanızın amacına uygun olacak şekilde storage_stack.py ya da monitoring_stack.py gibi yeniden adlandırabilirsiniz.

AWS kaynakları ekleme

Şimdi CDK yığınıza bazı AWS kaynakları ekleyelim. Bunları, cdk_datacamp_stack.py dosyanızdaki Stack sınıfınızın __init__() yöntemi içinde yazacaksınız.

S3 kovası

from aws_cdk import aws_s3 as s3

# Create an S3 bucket with versioning and managed encryption
bucket = s3.Bucket(
    self,
    "MyBucket",
    versioned=True,
    encryption=s3.BucketEncryption.S3_MANAGED
)

Lambda fonksiyonu

from aws_cdk import aws_lambda as lambda_

# Define a Lambda function using Python 3.9 runtime
lambda_function = lambda_.Function(
    self,
    "MyFunction",
    runtime=lambda_.Runtime.PYTHON_3_9,
    handler="index.handler",
    code=lambda_.Code.from_asset("lambda")  # Load code from local folder named 'lambda'
)

Yığını dağıtma

Kaynaklarınızı ekledikten sonra, bunları AWS’ye dağıtma zamanı.

Terminalinizde sanal ortamınızı etkinleştirin ve şunu çalıştırın:

cdk deploy

Bu, şunları yapacaktır:

  1. Yığını CloudFormation şablonuna sentezlemek
  2. Bu şablonu AWS’ye yüklemek
  3. Kaynakları hesabınızda sağlamak

Yığını ilk kez dağıtıyorsanız, değişiklikleri onaylamanız istenecektir.

Dağıtımdan sonra şunları yapabilirsiniz:

  1. AWS Konsolu’nu açın
  2. İlgili servise gidin (ör. S3, Lambda)
  3. CDK’nin az önce oluşturduğu kaynakları görüntüleyin

CDK Construct’larıyla Çalışmak

AWS CDK uygulamaları, temel yapısal öğeler olarak construct’lara dayanır. İster yerleşik servis construct’larını kullanın ister kendi yeniden kullanılabilir desenlerinizi oluşturun, construct’ları ustalıkla kullanmak altyapı kodunuzu daha modüler, sürdürülebilir ve okunabilir hale getirir.

Bu bölüm, L2 (üst düzey) construct’ların kullanımını ve tekrarlayan desenleri azaltan özel construct’ların nasıl geliştirileceğini öğretir.

L2 construct’ları kullanma

L2 construct’lar, ham CloudFormation’a (L1) göre kullanımı daha kolay CDK-yerel soyutlamalardır. Makul varsayılanlara ve tip güvenliğine sahiptir; genellikle bir AWS kaynağını kurmak için daha az satır kod gerektirirler.

Neden L2 construct’ları kullanmalı?

  • Daha az şablon kodu — L1’e kıyasla daha az zorunlu alan
  • Daha okunabilir ve deyimsel Python kodu
  • .add_to_role_policy() veya .add_event_notification() gibi yardımcı yöntemler içerir
  • Kaynaklar arasındaki bağımlılıkları otomatik olarak yönetir

Örnek: L2 kullanarak S3 kovası oluşturma

from aws_cdk import aws_s3 as s3
# Create a versioned and encrypted S3 bucket
bucket = s3.Bucket(
    self,
    "MyBucket",
    versioned=True,
    encryption=s3.BucketEncryption.S3_MANAGED
)

Eşdeğer L1 construct’ı s3.CfnBucket, tüm özelliklerin elle ayarlanmasını ve yapılandırmanın ham dict’ler olarak tanımlanmasını gerektirir — çok daha az sezgiseldir.

Diğer yaygın L2 construct’lar şunlardır:

  • AWS Lambda için lambda_.Function()
  • DynamoDB için dynamodb.Table()
  • SQS için sqs.Queue()
  • SNS için sns.Topic()

Özel construct’lar oluşturma

Altyapınız, belirli izinlere sahip Lambda fonksiyonları ve S3 kovaları oluşturmak gibi yinelenen desenlerle genişleyecektir. Bu özel senaryo için en ideal çözüm özel construct’lardır.

Özel construct’lar, ilişkili kaynakları tek bir mantıksal birimde birleştirmenize olanak tanır; bu birim yığınlar veya projeler arasında yeniden kullanılabilir.

Ne zaman özel bir construct oluşturmalı:

  • Her zaman birlikte sağlanan 3+ kaynağınız varsa
  • Yeniden kullanılabilir mantığı kapsüllemek istediğinizde
  • Yığınlar arasında kod tekrarını azaltmak istediğinizde

Örnek: Yeniden kullanılabilir S3 + Lambda deseni

from constructs import Construct
from aws_cdk import aws_s3 as s3, aws_lambda as lambda_
class StorageWithLambda(Construct):
    def __init__(self, scope: Construct, id: str) -> None:
        super().__init__(scope, id)
        # S3 bucket
        self.bucket = s3.Bucket(self, "MyBucket")

        # Lambda function
        self.function = lambda_.Function(
            self,
            "MyFunction",
            runtime=lambda_.Runtime.PYTHON_3_9,
            handler="index.handler",
            code=lambda_.Code.from_asset("lambda")
        )
        # Grant Lambda access to the S3 bucket
        self.bucket.grant_read_write(self.function)

Artık bu construct’ı herhangi bir yığın içinde şöyle kullanabilirsiniz:

from my_project.storage_with_lambda import StorageWithLambda
storage = StorageWithLambda(self, "ReusableComponent")

Yukarıdakini çalıştırmadan önce, proje kökünde lambda adlı bir klasör ve içinde aşağıdaki içeriğe sahip index.py dosyası oluşturun:

def handler(event, context):
    return {
        "statusCode": 200,
        "body": "Hello from Lambda!"
    }

Yeniden kullanılabilirlik ipuçları

  • Dosyaları construct_ önekiyle adlandırın veya bir constructs/ klasörüne yerleştirin
  • Esneklik için self.bucket veya self.function gibi çıktı alanlarını dışa açın
  • Her construct’ı tek bir sorumluluğa odaklı tutun

CDK Uygulamalarını Test Etme ve Sentezleme

Altyapı kodunuzu yazdıktan sonra, CDK’nin neleri dağıtacağını kontrol etmek ve ideal olarak yığınlarınızın beklendiği gibi davrandığını test etmek esastır. AWS CDK, CloudFormation şablonları sentezlemek ve dağıtımdan önce yanlış yapılandırmaları yakalamak için otomatik testler yazmanıza olanak tanıyan araçlar sağlar.

Şablonları sentezleme

cdk synth komutu, CDK kodunuzdan CloudFormation şablonu üretir.

cdk synth

Bunu çalıştırdığınızda CDK:

  • Uygulamanızı (app.py aracılığıyla) yükler
  • Tüm construct ve yığınları çözümler
  • Ham YAML/JSON CloudFormation şablonları çıktılar

Sentezlenen AWS CloudFormation şablonu; SNS’nin mesaj göndermesine izin veren kuyruk ilkesi ve kuyruğa başvuran bir SNS aboneliği dahil SQS kuyruğu gibi kaynakları içeriyor.

Sentezlenen CloudFormation şablonu 

Varsayılan olarak çıktı terminalinize gider, ancak gerekirse bir dosyaya da yönlendirebilirsiniz:

cdk synth > template.yaml

Şu durumlarda kullanışlıdır:

  • Dağıtmadan önce gerçek şablonu incelemek istediğinizde
  • Bir yığının yapısını hata ayıklarken
  • CDK kullanmayan ekiplerle şablonu paylaşırken

Altyapıyı test etme

Altyapı olarak kodu test etmek alışılmadık gelebilir, ancak özellikle yığınlarınız büyüdüğünde veya koşullu mantık, döngüler ya da yeniden kullanılabilir construct’lar içerdiğinde oldukça faydalıdır.

AWS CDK, sentezlenen yığınları test etmek için assertions modülü sunar.

pytest ile basit bir test yazma

Aşağıda, yığında belirli bir kaynağın (ör. S3 kovası) yer aldığını kontrol eden örnek bir test yer alır:

# test/test_cdk_datacamp_stack.py
import aws_cdk as cdk
from aws_cdk.assertions import Template
from cdk_datacamp.cdk_datacamp_stack import CdkDatacampStack
def test_s3_bucket_created():
    app = cdk.App()
    stack = CdkDatacampStack(app, "TestStack")
    template = Template.from_stack(stack)
    # Assert that an S3 bucket exists
    template.resource_count_is("AWS::S3::Bucket", 1)

Testleri çalıştırmak için pytest kurulu olduğundan emin olun:

pip install -U pytest

Ardından şunu çalıştırın:

pytest

Her şey geçerse yeşil bir onay işareti görürsünüz. Aksi halde, test çıktısı eksik olanı size söyleyecektir.

Linux ortamında Python 3.11.11 ve pytest 8.3.5 kullanılarak alınan pytest çıktısı; üç testin de yeşil göstergelerle geçtiğini ve 2.89 saniyelik çalışma süresini gösteriyor.      

AWS CDK yığını için tüm testlerin başarıyla çalıştığını gösteren Pytest çıktısı

CDK yığınınıza doğrulama da ekleyebilirsiniz. Doğrulama testleri, dağıtım gerçekleşmeden önce girdileri doğrulayan construct veya yığın kodunuz içindeki çalışma zamanı kontrolleridir. Hatalı yapılandırmaları yakalamaya veya geliştirme yaşam döngüsünün erken safhalarında kısıtlamaları uygulamaya yardımcı olurlar.

Diyelim ki bucket_name değerini bir context değişkeni olarak geçirmek istiyoruz; ancak şunları doğrulamak istiyoruz:

  • Kova adı boş değil
  • S3 adlandırma kurallarını karşılıyor (örn. yalnızca küçük harf)

test/test_storage_with_lambda.py adlı bir dosya oluşturun ve aşağıdakileri ekleyin:

import pytest
from aws_cdk import App, Stack
from cdk_datacamp.storage_with_lambda import StorageWithLambda

def test_missing_bucket_name():
    app = App()
    stack = Stack(app, "TestStack")

    with pytest.raises(ValueError, match="bucket_name is required"):
        StorageWithLambda(stack, "FailingConstruct", bucket_name=None)

def test_bucket_name_uppercase():
    app = App()
    stack = Stack(app, "TestStack")

    with pytest.raises(ValueError, match="must be lowercase"):
        StorageWithLambda(stack, "FailingConstruct", bucket_name="InvalidName")

 Doğrulamayı test etmek için aşağıdaki komutu çalıştırın:

test/test_storage_with_lambda.py

Linux ortamında Python 3.11.11 ve pytest 8.3.5 kullanılarak alınan pytest çıktısı; üç testin de yeşil göstergelerle geçtiğini gösteriyor.        

AWS CDK yığını için tüm testlerin başarıyla çalıştığını gösteren Pytest çıktısı

Ne zaman test kullanılmalı:

  • Yeniden kullanılabilir construct’lar veya desenler oluşturuyorsanız.
  • Testlerin uygulanması, ekip üyeleri arasında standart teknik gereksinimleri belirlemeye hizmet ediyorsa.
  • CI/CD sırasında gerilemeleri veya istenmeyen değişiklikleri yakalamak istiyorsanız.

CDK bilginizi mülakat ortamında pekiştirmek ister misiniz? Bu en iyi AWS DevOps mülakat soruları hazırlık yapmanıza yardımcı olabilir.

AWS CDK ile Çalışırken En İyi Uygulamalar ve İpuçları

CDK yığını oluşturma ve dağıtma konusunda ustalaştıktan sonra, altyapı kodunuzu temiz, güvenli ve ölçeklenebilir tutmak için en iyi uygulamaları takip etmelisiniz. Bu bölüm, büyük projelerin nasıl yapılandırılacağını, güvenliğin doğru şekilde nasıl ele alınacağını ve CDK’nin CI/CD boru hatlarına nasıl entegre edileceğini tartışır.

Büyük projeleri düzenleme

CDK uygulamanız büyüdükçe, kodu yönetilebilir birimlere ayırmak hayati hale gelir.

Birden çok yığın kullanın

Altyapınızı ilgi alanına göre bölün. Örneğin:

  • NetworkingStack: VPC’ler, alt ağlar, güvenlik grupları
  • ComputeStack: EC2, Lambda
  • StorageStack: S3, DynamoDB

Bu yaklaşım, altyapınızın parçalarını bağımsız olarak dağıtmanızı, test etmenizi veya silmenizi sağlar. app.py içinde şöyle dahil edilebilir:

network_stack = NetworkingStack(app, "NetworkingStack")
compute_stack = ComputeStack(app, "ComputeStack")

Kaynakları yığınlar arasında çıktı veya referanslar kullanarak da aktarabilirsiniz.

Yeniden kullanılabilir iç içe construct’lar oluşturun

StorageWithLambda ile yaptığınız gibi, ilişkili kaynakları (ör. bir Lambda ve izinleri) özel bir construct içine kapsülleyin. Bu, okunabilirliği ve yığınlar ya da uygulamalar arasında yeniden kullanılabilirliği artırır.

Ortam bazlı yapılandırma kullanın

Birden fazla ortamı (dev, staging, prod) şu yollarla destekleyin:

  • Context değerleri içeren cdk.json
  • CLI geçersiz kılmaları: cdk deploy -c env=prod
  • Yığınlarınızdaki koşullu mantık
env = app.node.try_get_context("env")
if env == "prod":
    bucket_name = "mycompany-prod-logs"

Güvenlik ve izinler

Her altyapı projesi, AWS CDK ile otomatik dağıtım süreçlerinde güvenliği önceliklendirmelidir. Aşağıdaki bölüm, asgari ayrıcalık ilkeleriyle güvenli IAM kaynak yönetimini gösterir.

Varsayılanlar yerine IAM rolleri tanımlayın

Lambda veya ECS görevleri gibi CDK construct’ları otomatik olarak IAM rolleri oluşturur. Rahat olsa da, izinler ve adlandırma üzerinde kontrolünüzü sınırlayabilir.

Bunun yerine rolleri açıkça tanımlayın:

from aws_cdk import aws_iam as iam

execution_role = iam.Role(
    self,
    "LambdaExecutionRole",
    assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
    description="Custom role for Lambda with least privilege",
    managed_policies=[
        iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaBasicExecutionRole")
    ]
)

Bu rol, varsayılan olarak yalnızca günlüklemeye izin verir ve başka hiçbir şeye izin vermez.

En az ayrıcalık ilkesini uygulayın

actions veya resources içinde mutlak gerekmedikçe "*" kullanmaktan kaçının.

Örnek:

lambda_fn.add_to_role_policy(
    iam.PolicyStatement(
        actions=["*"],
        resources=["*"]
    )
)

Ayrıca mevcut olduğunda kaynağa özgü yetkilendirmeleri kullanabilirsiniz:

bucket.grant_read(lambda_fn)

Bu, S3 kovasına kapsamlı erişimle gerekli politikayı otomatik olarak oluşturur.

Mümkün olduğunda yönetilen ilkeleri kullanın

AWS yönetilen ilkeleri bakımı basitleştirir ve hata olasılığını azaltır.

iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSQSReadOnlyAccess")

Bunları ECS, Batch veya Step Functions gibi servisler için özel rollere ekleyebilirsiniz.

CI/CD entegrasyonu

AWS CDK, çağdaş CI/CD boru hatlarıyla entegre olabilme yeteneğiyle büyük güç sunar. CDK; GitHub, GitLab ve CodePipeline gibi AWS-yerel hizmetler dahil sürüm kontrollü kod dağıtımıyla otomatik altyapı teslimini destekler. Sistem, insan hatalarını azaltırken geri bildirim döngülerini kısaltır ve birden çok ortama dağıtımı mümkün kılar.

GitHub Actions: CDK dağıtımlarını otomatikleştirme

GitHub Actions’ı her push veya pull request’te CDK yığınlarını sentezlemek, farkını almak, test etmek ve dağıtmak için kullanabilirsiniz.

Şu .github/workflows/deploy.yml dosyasına göz atın:

name: Deploy CDK App

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - uses: actions/setup-python@v4
        with:
          python-version: 3.11

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          npm install -g aws-cdk

      - name: Run unit tests
        run: pytest

      - name: CDK Synth
        run: cdk synth -c environment=prod

      - name: Deploy to AWS
        run: cdk deploy --require-approval never
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

Birleştirmeden önce altyapı değişikliklerini önizlemek için PR’larda cdk diff kullanın.

CDK pipelines: CodePipeline ile yerel CDK CI/CD

AWS içinde tam yönetilen dağıtımlar için CDK, tıpkı altyapı gibi tüm CI/CD boru hattınızı kod olarak tanımlamanıza olanak tanıyan aws_cdk.pipelines adlı bir modül sağlar.

İşte basitleştirilmiş bir örnek:

from aws_cdk import pipelines, SecretValue, Stack
from constructs import Construct
from my_app_stage import MyAppStage  # replace with your actual stage import

class PipelineStack(Stack):
    def __init__(
        self,
        scope: Construct,
        construct_id: str,
        **kwargs
    ) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Define the source of the pipeline from a GitHub repository
        source = pipelines.CodePipelineSource.git_hub(
            repo_string="your-org/your-repo",  # GitHub org/repo
            branch="main",
            authentication=SecretValue.secrets_manager("GITHUB_TOKEN")
        )

        # Define the CodePipeline and its synthesis step
        pipeline = pipelines.CodePipeline(
            self,
            "MyAppPipeline",
            synth=pipelines.ShellStep(
                "Synth",
                input=source,
                commands=[
                    "pip install -r requirements.txt",
                    "npm install -g aws-cdk",
                    "cdk synth"
                ]
            )
        )

        # Add an application stage (e.g., production deployment)
        pipeline.add_stage(
            MyAppStage(self, "ProdStage")
        )

Yukarıdaki kodda:

  • SecretValue.secrets_manager("GITHUB_TOKEN"), GitHub token’ınızı Secrets Manager’dan güvenle çeker.
  • MyAppStage, Stage sınıfını genişleten ve gerçek CDK yığınlarınızı saran bir sınıf olmalıdır.

Makine öğrenimi sistemleri dağıtıyorsanız, CDK’nin sürekli dağıtım uygulamalarıyla entegrasyonu Makine Öğrenimi için CI/CD kursumuzda ele alınmaktadır.

Sonuç

Bu eğitim, AWS Cloud Development Kit (CDK) işlemleri aracılığıyla Python’da bulut altyapısını nasıl kurup dağıtacağınızı gösterdi. Şunları öğrendiniz:

  • İlk CDK yığınızı oluşturmak.
  • Kaynak olarak S3 kovaları ve Lambda fonksiyonlarını tanımlamak ve doğrulamak.
  • Özel construct’lar ve çoklu yığın desenleriyle bir projeyi düzenlemek.
  • En az ayrıcalık ilkesiyle güvenlik en iyi uygulamalarını uygulamak.
  • GitHub Actions ile CDK Pipelines’ı birleştirerek dağıtımları otomatikleştirmek.
  • Altyapı mantığınızı doğrulamak için testler yazmak.

İlk CDK uygulamanızı dağıttığınıza göre, seviyenizi yükseltmenin birkaç yolu:

  • Geliştirme/ön üretim/üretim için parametreli ortamlar kullanın
  • CloudWatch alarmları, API Gateway veya Step Functions ekleyin
  • aws_s3_deployment, aws_ecs_patterns ve cdk.pipelines gibi CDK construct’larını keşfedin
  • Construct’larınızı yeniden kullanılabilirlik için dahili bir Python kütüphanesine dönüştürün

Öğrenmeye ve inşa etmeye devam etmek için, Python ile AWS Boto’ya Giriş kursuna göz atın!

FAQs

AWS CDK nedir ve CloudFormation veya Terraform’dan nasıl farklıdır?

AWS CDK, Python gibi programlama dilleri kullanarak bulut altyapısını tanımlamanıza olanak tanır; CloudFormation ve Terraform ise JSON/YAML veya HCL’e dayanır. CDK, construct’lar aracılığıyla daha yüksek soyutlama ve yeniden kullanılabilirlik sunar.

AWS CDK’yi kullanmak için CloudFormation bilmem gerekir mi?

Hayır, CDK CloudFormation’ın çoğu karmaşıklığını soyutlar. Ancak, alt düzey construct’ları kullanırken veya dağıtımları sorun giderirken CloudFormation’ı anlamak yardımcı olur.

AWS CDK ile birden fazla ortamı (ör. dev, prod) dağıtabilir miyim?

Evet! CDK, context değerleri ve cdk deploy -c env=prod gibi CLI bayrakları kullanarak ortama özgü yapılandırmayı destekler.

CDK altyapı kodumu nasıl test ederim?

Dağıtımdan önce yığınınızdaki kaynakları ve yapılandırmaları doğrulayan birim testleri yazmak için pytest’i CDK’nin assertions ve template modülüyle birlikte kullanabilirsiniz.

cdk deploy komutunu çalıştırdığımda arka planda neler olur?

cdk deploy, Python kodunuzu bir CloudFormation şablonuna sentezler, AWS’ye yükler ve hesabınızda tanımlanan kaynakları sağlar.

Rahul Sharma

Yazar

Rahul Sharma

Rahul Sharma, bulut bilişim, DevOps uygulamaları ve açık kaynak teknolojiler konusunda uzmanlaşan bir AWS Elçisi, DevOps Mimarlı ve teknik blog yazarlıdır. AWS, Kubernetes ve Terraform konularındaki uzmanlığıyla, etkileyici makaleler ve eğiticiler aracılığıyla karmaşık kavramları öğrenenler ve profesyoneller için sadeleştirir. Rahul, DevOps zorluklarını çözmeye ve teknoloji topluluğuna güç katacak içgörüler paylaşmaya tutkuyla bağlıdır.

Konular

İlgili