Lewati ke konten utama

Bangun Stack AWS CDK Pertama Anda: Tutorial Ramah Pemula

Pelajari cara membangun dan menerapkan stack AWS CDK pertama Anda menggunakan Python. Panduan ramah pemula ini mencakup setup, construct, deployment, pengujian, dan CI/CD.
· 15 mnt Baca

Jelajahi bersama AI

Mengelola infrastruktur cloud dengan template JSON atau YAML mentah bisa melelahkan dan rentan kesalahan. AWS Cloud Development Kit (CDK) mengubah itu dengan memungkinkan Anda mendefinisikan sumber daya cloud menggunakan bahasa pemrograman modern seperti Python, TypeScript, Java, dan C#.

Dengan CDK, infrastruktur menjadi kode yang dapat digunakan ulang, diuji, dan dikendalikan versinya. Ini memungkinkan Anda berpikir seperti pengembang bahkan saat menyediakan sistem cloud yang kompleks.

Dalam tutorial ini, Anda akan belajar cara menyiapkan proyek AWS CDK menggunakan Python. Kita akan menelusuri proses menulis stack pertama Anda, menambahkan sumber daya AWS penting, dan menerapkannya ke akun AWS Anda. Pada akhirnya, Anda akan memahami dengan jelas cara kerja CDK dan cara menggunakannya untuk mengelola infrastruktur dengan cara yang ramah pengembang, melalui kode.

Untuk memahami lebih baik praktik di balik alat seperti AWS CDK, jelajahi prinsip-prinsip dasar dalam kursus DevOps Concepts kami.

Prasyarat

Sebelum kita mulai menulis kode dengan AWS CDK, pastikan lingkungan Anda telah disiapkan dengan benar. Berikut yang Anda perlukan:

Akun AWS untuk eksperimen

Anda memerlukan akses ke akun AWS untuk menerapkan aplikasi yang akan kita bangun. Jika sistem Anda sudah dikonfigurasi dengan kredensial untuk pengguna tingkat administrator, silakan lewati ke bagian berikutnya.

Jika Anda belum memiliki akun AWS, buat di sini.

Untuk jalur belajar terstruktur yang mencakup dasar-dasar AWS, AWS Cloud Practitioner track adalah tempat yang sangat baik untuk memulai.

Pengguna administrator

Anda memerlukan pengguna dengan akses terprogram dan izin penuh untuk mengikuti langkah-langkahnya.

  1. Masuk ke akun AWS Anda.
  2. Buka Konsol IAM.
  3. Buat pengguna baru — Anda dapat menamainya seperti “datacamp-cdk”
  4. Pilih Programmatic access.
  5. Klik Next: Permissions.
  6. Pilih Attach existing policies directly dan centang AdministratorAccess.
  7. Klik Next: Tags, Next: Review, lalu Create User.

Di layar terakhir, catat Access key ID dan Secret access key Anda. Anda akan memerlukannya di langkah berikutnya.

Konfigurasikan kredensial AWS Anda

Buka terminal dan jalankan:

aws configure

Anda akan diminta memasukkan kredensial dari konsol IAM:

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]: 

Pilih IDE untuk pengembangan

AWS CDK memungkinkan pengembang bekerja dalam lingkungan pemrograman lengkap alih-alih template YAML atau JSON. Lingkungan penuh fitur ini memungkinkan Anda menggunakan IDE pilihan sambil mendapatkan manfaat dari fitur pelengkapan kode, linting real-time, dan alat refactoring untuk manajemen kode infrastruktur yang efisien.

Untuk mendapatkan pengalaman pengembangan terbaik dengan Python CDK, saya sarankan menggunakan IDE yang mendukung hal-hal berikut:

  • Highlight sintaks
  • Pelengkapan kode
  • Navigasi dan saran cerdas
  • Dukungan virtual environment

Instal Python dan pip

Untuk menggunakan AWS CDK dengan Python, Anda perlu memasang Python versi 3.8 atau lebih tinggi pada sistem Anda. Jika belum, Anda dapat mengunduh versi terbaru dari situs resmi Python.

Jika Anda menggunakan Windows, pastikan Python ditambahkan ke variabel lingkungan PATH sistem Anda. Untuk memeriksa, buka terminal atau command prompt dan jalankan:

python --version

Jika Anda melihat kesalahan “command not found” atau serupa, kemungkinan Python belum ada di PATH Anda. Perbaikan termudah adalah mencentang kotak “Add Python 3.x to PATH” saat instalasi.

Anda juga memerlukan pip, penginstal paket Python, untuk memasang dependensi AWS CDK nanti. Sebagian besar distribusi Python modern sudah menyertakan pip.

pip --version

Jika belum terpasang, ikuti panduan instalasi pip resmi.

Mulai Menggunakan AWS CDK

Sebelum kita menulis kode, penting untuk memahami apa itu AWS CDK, mengapa ada, dan bagaimana posisinya dalam dunia infrastructure as code (IaC) yang lebih luas. Bagian ini akan memperkenalkan konsep inti di balik CDK dan menunjukkan perbandingannya dengan alat IaC populer lainnya.

Apa itu AWS CDK, dan mengapa digunakan?

AWS Cloud Development Kit (CDK) adalah kerangka kerja open-source yang memungkinkan pengguna membuat infrastruktur cloud melalui bahasa pemrograman yang familier, termasuk Python, TypeScript, Java, dan C#. 

CDK memungkinkan pengguna menghasilkan template CloudFormation secara terprogram melalui kode nyata alih-alih mengharuskan penulisan template JSON atau YAML secara manual.

Artinya Anda dapat:

  • Menggunakan ulang logika dengan loop dan fungsi.
  • Mengatur infrastruktur menggunakan modul dan kelas.
  • IDE Anda menyediakan alat untuk pelengkapan kode, pemeriksaan kesalahan, dan kemampuan refactoring.

Pada intinya, CDK berputar di sekitar tiga konsep utama:

  • App – Titik masuk proyek CDK Anda. Dapat berisi satu atau beberapa stack.
  • Stack – Unit deployment yang dipetakan ke CloudFormation stack. Setiap stack mendefinisikan sekumpulan sumber daya yang akan dibuat.
  • Construct – Blok pembangun CDK. Construct merepresentasikan komponen cloud seperti bucket S3, fungsi Lambda, VPC, dan pola kompleks yang menggabungkan beberapa sumber daya.

Diagram yang mengilustrasikan struktur AWS CDK: sebuah App berisi sebuah Stack (mis., MyStack), yang mencakup tiga construct—S3 Bucket, Lambda Function, dan VPC—terhubung dalam hierarki dari atas ke bawah.

Hierarki visual dari sebuah app AWS CDK

CDK vs Terraform vs CloudFormation

Tabel berikut menjelaskan perbedaan antara alat yang tersedia di AWS untuk mengelola infrastruktur.

Fitur

AWS CDK

Terraform

AWS CloudFormation

Dukungan Bahasa

Python, TypeScript, Java, C#

HCL (deklaratif)

YAML / JSON

Tingkat Abstraksi

Tinggi (OOP + pustaka)

Sedang

Rendah

Modularitas

Kuat (construct, kelas)

Kuat (modul)

Lemah (nested stack)

Manajemen State

Ditangani oleh CloudFormation

Ditangani oleh Terraform (tfstate)

Ditangani oleh CloudFormation

Multi-cloud

Hanya AWS

Ya

Hanya AWS

Bahasa yang didukung dan prasyarat

AWS CDK mendukung beberapa bahasa pemrograman, memungkinkan pengembang memilih yang paling nyaman digunakan:

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

Dalam tutorial ini, kita akan fokus pada Python, tetapi konsep intinya berlaku di semua bahasa yang didukung.

Instalasi dan penyiapan

Sekarang lingkungan Anda siap, saatnya menggunakan Python untuk membuat kerangka app AWS CDK pertama Anda. Perintah CDK init menyiapkan seluruh struktur proyek, termasuk file, direktori, dan virtual environment, untuk membantu Anda memulai dengan cepat.

Buat direktori proyek

Buka terminal dan jalankan perintah berikut untuk membuat direktori baru dan masuk ke dalamnya:

mkdir cdk_datacamp && cd cdk_datacamp

Inisialisasi app CDK

cdk init sample-app --language python

Ini membuat proyek awal yang telah dikonfigurasi dengan contoh dasar yang mencakup:

  • Sebuah stack contoh (cdk_datacamp_stack)
  • Antrian SQS yang berlangganan ke topik SNS
  • File cdk.json yang mengonfigurasi cara app CDK Anda berjalan
  • Sebuah virtual environment (di .venv) untuk dependensi Python

Saat perintah selesai, Anda akan melihat output serupa ini:

Output terminal AWS CDK untuk menginisialisasi proyek Python, termasuk langkah membuat dan mengaktifkan virtual environment secara manual, memasang requirements, dan menjalankan cdk synth.

Kerangka proyek CDK Python 

Penyiapan Virtual Environment

Jika proses cdk init tidak otomatis membuat virtual environment, Anda dapat melakukannya secara manual:

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

Setelah diaktifkan, pasang dependensi yang diperlukan:

pip install -r requirements.txt

Memahami Konsep CDK

Sebelum menyelami lebih dalam kode, mari kita jelajahi bagaimana komponen inti AWS CDK—app, stack, dan construct—bekerja bersama dalam praktik. Sekarang Anda sudah familier dengan apa yang diwakili masing-masing, penting untuk melihat bagaimana mereka berinteraksi membentuk infrastruktur yang skalabel dan modular. 

Kita juga akan mengurai berbagai level construct (L1, L2, L3) dan meninjau pustaka CDK yang memungkinkannya.

App, stack, dan construct

Sekarang Anda tahu apa itu App, Stack, dan Construct dari bagian sebelumnya, mari pahami bagaimana mereka bekerja bersama dalam aplikasi CDK.

Anggap seperti membangun rumah:

  • App adalah keseluruhan proyek konstruksi.
  • Setiap Stack seperti bangunan atau struktur terpisah dalam proyek itu.
  • Setiap Construct adalah komponen, seperti dinding, pintu, atau pipa, yang masuk ke dalam sebuah stack.

Dalam kode, relasinya terlihat seperti ini:

# 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")

Di sini, App menginstansiasi sebuah Stack, yang mencakup Construct seperti bucket S3.

Memahami level construct: L1, L2, dan L3

Dalam AWS CDK, construct hadir dalam tiga tingkat abstraksi, memberi Anda fleksibilitas berdasarkan seberapa banyak kontrol atau kesederhanaan yang Anda perlukan.

Level 1 (L1) – Construct CloudFormation

Ini adalah blok bangunan mentah yang dihasilkan langsung dari spesifikasi AWS CloudFormation. Setiap sumber daya AWS di CloudFormation memiliki construct L1 yang setara di CDK; namanya selalu diawali dengan “Cfn”.

Construct L1 mengekspos semua opsi konfigurasi yang mungkin tetapi tidak menawarkan abstraksi atau default. Ideal saat Anda memerlukan kontrol penuh atau menggunakan fitur AWS yang lebih baru yang belum dibungkus oleh construct tingkat lebih tinggi.

  • Contoh: s3.CfnBucket

Level 2 (L2) – Construct native AWS CDK

Construct L2 menyediakan abstraksi yang lebih tinggi dan ramah pengembang di atas construct L1. Ini adalah komponen opinionated dengan default yang masuk akal dan metode bawaan yang menyederhanakan tugas sehari-hari. Dirancang untuk penggunaan harian dan membantu mengurangi boilerplate sambil tetap menawarkan tingkat kustomisasi yang baik.

  • Contoh: s3.Bucket – Anda dapat membuat bucket berversi hanya dengan satu baris kode.

Level 3 (L3) – Construct Pola

Construct L3 adalah abstraksi yang menggabungkan beberapa sumber daya AWS ke dalam pola arsitektur umum. Dapat disediakan oleh AWS atau dibangun sebagai komponen yang dapat digunakan ulang oleh komunitas atau Anda. Gunakan construct L3 untuk mengenkapsulasi kompleksitas dan menggunakan ulang pola infrastruktur di berbagai proyek atau tim.

  • Contoh: aws_s3_deployment.BucketDeployment – Menggabungkan bucket S3 dan strategi deployment untuk mengotomatiskan unggahan aset.

Kebanyakan pengembang mulai dengan construct L2 dan memperkenalkan L1 hanya saat diperlukan. L3 menjadi berguna saat proyek Anda berkembang dan Anda ingin mengabstraksi pola berulang ke dalam komponen yang dapat digunakan ulang.

Pustaka dan modul CDK

Anda tidak berinteraksi langsung dengan CloudFormation mentah saat membangun dengan AWS CDK. Sebagai gantinya, Anda menggunakan pustaka modular CDK, yang menyediakan construct untuk layanan AWS seperti S3, Lambda, IAM, dan lainnya. Semua modul layanan AWS dibundel di bawah paket inti bernama aws-cdk-lib, dan ini diorganisasi lebih lanjut berdasarkan layanan.

Pustaka yang umum digunakan di Python

Berikut beberapa pustaka (atau modul) yang paling sering digunakan dari aws-cdk-lib dalam proyek Python:

  • aws_cdk.aws_s3 – Untuk membuat bucket S3
  • aws_cdk.aws_lambda – Untuk mendefinisikan fungsi Lambda
  • aws_cdk.aws_iam – Untuk mengelola role dan izin
  • aws_cdk.aws_dynamodb – Untuk bekerja dengan tabel DynamoDB
  • aws_cdk.aws_ec2 – Untuk komponen jaringan seperti VPC dan security group
  • aws_cdk.aws_sns / aws_cdk.aws_sns_subscriptions – Untuk topik SNS dan subscriber-nya

Modul-modul ini diimpor hanya saat diperlukan, menjaga proyek Anda tetap ringan dan modular.

Cara mengimpor dan menggunakan modul CDK

Untuk menggunakan layanan AWS tertentu, Anda mengimpor modulnya dan memanggil kelas construct-nya. Misalnya, untuk membuat bucket S3:

from aws_cdk import aws_s3 as s3

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

Contoh ini menggunakan construct L2 s3.Bucket, yang menyertakan default bawaan seperti opsi enkripsi dan versioning.

Jika Anda perlu menggunakan layanan lain, cukup impor modulnya dengan cara yang sama:

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

Catatan: Dalam requirements.txt, biasanya Anda hanya memerlukan:

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

Kedua paket ini memberi Anda akses ke semua construct AWS CDK dan fungsionalitas kerangka intinya.

Membuat CDK Stack Pertama Anda

Setelah mempelajari cara kerja internal AWS CDK, Anda dapat menerapkan pengetahuan ini. Bagian berikut memandu Anda membangun stack CDK operasional menggunakan Python. Sebelum menerapkannya ke akun AWS Anda, Anda akan membuat struktur proyek melalui kode dan mengimplementasikan sumber daya AWS nyata, seperti bucket S3 dan fungsi Lambda.

Membuat kerangka proyek baru

Saat Anda menjalankan perintah cdk init dengan flag --language python, ini menyiapkan struktur proyek lengkap yang terlihat seperti ini:

Tampilan pohon direktori proyek AWS CDK dengan file kunci seperti app.py, cdk.json, requirements.txt, dan folder untuk kode sumber cdk_datacamp serta tests/unit/test_cdk_datacamp_stack.py.

Struktur folder proyek AWS CDK Python

File app.py adalah tempat App didefinisikan, dan file cdk_datacamp_stack.py adalah tempat Anda menulis kode untuk Stack dan Construct Anda.

Kiat: Anda dapat mengubah nama file atau kelas stack agar sesuai dengan tujuan app Anda, seperti storage_stack.py atau monitoring_stack.py.

Menambahkan sumber daya AWS

Sekarang mari tambahkan beberapa sumber daya AWS ke stack CDK Anda. Anda akan menulis ini di dalam metode __init__() dari kelas Stack Anda di file cdk_datacamp_stack.py.

Bucket S3

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
)

Fungsi Lambda

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'
)

Menerapkan stack

Setelah Anda menambahkan sumber daya, saatnya menerapkannya ke AWS.

Di terminal Anda, aktifkan virtual environment dan jalankan:

cdk deploy

Ini akan:

  1. Mensintesis stack Anda menjadi template CloudFormation
  2. Mengunggah template tersebut ke AWS
  3. Menyediakan sumber daya di akun Anda

Anda akan diminta untuk menyetujui perubahan jika ini pertama kalinya Anda menerapkan stack.

Setelah deployment, Anda dapat:

  1. Buka AWS Console
  2. Arahkan ke layanan terkait (mis., S3, Lambda)
  3. Lihat sumber daya yang baru dibuat CDK

Bekerja dengan Construct CDK

App AWS CDK bergantung pada construct sebagai elemen struktural esensialnya. Kode infrastruktur Anda akan menjadi lebih modular, mudah dirawat, dan mudah dibaca saat Anda menguasai construct, baik menggunakan construct layanan bawaan maupun membuat pola dapat digunakan ulang milik Anda.

Bagian ini mengajarkan Anda tentang penggunaan construct L2 (tingkat tinggi) dan cara mengembangkan construct kustom yang mengurangi pola berulang.

Menggunakan construct L2

Construct L2 adalah abstraksi native CDK yang lebih mudah digunakan daripada CloudFormation mentah (L1). Mereka memiliki default yang masuk akal dan type safety, seringkali membutuhkan lebih sedikit baris kode untuk menyiapkan sumber daya AWS.

Mengapa menggunakan construct L2?

  • Lebih sedikit boilerplate — lebih sedikit field wajib dibandingkan L1
  • Kode Python lebih mudah dibaca dan idiomatis
  • Mencakup metode utilitas seperti .add_to_role_policy() atau .add_event_notification()
  • Secara otomatis mengelola dependensi antar sumber daya

Contoh: Membuat bucket S3 menggunakan L2

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
)

Construct L1 yang setara, s3.CfnBucket, akan memerlukan semua properti disetel secara manual dan konfigurasi didefinisikan sebagai dict mentah—jauh kurang intuitif.

Construct L2 umum lainnya meliputi:

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

Membuat construct kustom

Infrastruktur Anda akan berkembang dengan pola berulang, seperti membuat fungsi Lambda dengan izin tertentu dan bucket S3. Construct kustom adalah solusi ideal untuk skenario ini.

Construct kustom memungkinkan Anda menggabungkan sumber daya terkait menjadi satu unit logis, yang dapat digunakan ulang di berbagai stack atau proyek.

Kapan membuat construct kustom:

  • Saat Anda memiliki 3+ sumber daya yang selalu disediakan bersama
  • Saat Anda ingin mengenkapsulasi logika yang dapat digunakan ulang
  • Saat Anda ingin mengurangi duplikasi kode di berbagai stack

Contoh: Pola S3 + Lambda yang dapat digunakan ulang

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)

Sekarang Anda dapat menggunakan construct ini di dalam stack mana pun seperti ini:

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

Sebelum menjalankan hal di atas, buat folder bernama lambda di root proyek dan buat file index.py dengan konten berikut:

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

Kiat keterpakaiulangan

  • Awali file dengan construct_ atau tempatkan di dalam folder constructs/
  • Ekspos output seperti self.bucket atau self.function untuk fleksibilitas
  • Jaga setiap construct fokus pada satu tanggung jawab

Menguji dan Mensintesis App CDK

Setelah menulis kode infrastruktur Anda, penting untuk memeriksa apa yang akan diterapkan CDK dan idealnya menguji bahwa stack Anda berperilaku seperti yang diharapkan. AWS CDK menyediakan alat untuk mensintesis template CloudFormation dan menulis pengujian otomatis guna menangkap salah konfigurasi sebelum deployment.

Mensintesis template

Perintah cdk synth menghasilkan template CloudFormation dari kode CDK Anda.

cdk synth

Saat Anda menjalankannya, CDK akan:

  • Memuat app Anda (melalui app.py)
  • Menyelesaikan semua construct dan stack
  • Menghasilkan template CloudFormation mentah dalam YAML/JSON

template AWS CloudFormation yang disintesis dengan sumber daya termasuk antrian SQS, kebijakan antrian yang mengizinkan SNS mengirim pesan, dan sumber daya langganan SNS yang mereferensikan antrian.

Template CloudFormation yang disintesis 

Secara default, output ditampilkan di terminal Anda, tetapi Anda juga dapat mengarahkannya ke file jika diperlukan:

cdk synth > template.yaml

Ini berguna ketika:

  • Anda ingin memeriksa template sebenarnya sebelum deployment
  • Anda sedang men-debug struktur sebuah stack
  • Anda berbagi template dengan tim yang tidak menggunakan CDK

Menguji infrastruktur

Meskipun menguji infrastructure as code mungkin terdengar tidak biasa, ini bermanfaat, terutama saat stack Anda menjadi besar atau mencakup logika kondisional, loop, atau construct yang dapat digunakan ulang.

AWS CDK menawarkan modul assertions untuk menguji stack yang disintesis.

Menulis pengujian sederhana dengan pytest

Berikut contoh pengujian yang memeriksa apakah sumber daya tertentu (seperti bucket S3) disertakan dalam stack:

# 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)

Untuk menjalankan pengujian, pastikan pytest terpasang:

pip install -U pytest

Lalu jalankan:

pytest

Jika semuanya lolos, Anda akan melihat tanda centang hijau. Jika tidak, output pengujian akan memberi tahu Anda apa yang kurang.

output pytest pada lingkungan Linux menggunakan Python 3.11.11 dan pytest 8.3.5, menunjukkan semua tiga kasus uji lulus dengan indikator hijau dan waktu eksekusi 2,89 detik.      

Output Pytest yang menunjukkan eksekusi sukses semua kasus uji untuk stack AWS CDK

Anda juga dapat menyertakan validasi di stack CDK Anda. Pengujian validasi adalah pemeriksaan runtime di dalam kode construct atau stack Anda yang memvalidasi input sebelum deployment terjadi. Ini membantu menangkap salah konfigurasi atau menegakkan batasan lebih awal dalam siklus pengembangan.

Misalkan kita ingin meneruskan bucket_name sebagai variabel konteks, tetapi kita ingin memvalidasi bahwa:

  • Nama bucket tidak kosong
  • Memenuhi aturan penamaan S3 (mis., huruf kecil saja)

Buat file bernama test/test_storage_with_lambda.py dan tambahkan berikut ini:

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")

 Untuk menguji validasi, jalankan perintah di bawah ini:

test/test_storage_with_lambda.py

output pytest pada lingkungan Linux menggunakan Python 3.11.11 dan pytest 8.3.5, menunjukkan semua tiga kasus uji lulus dengan indikator hijau.        

Output Pytest yang menunjukkan eksekusi sukses semua kasus uji untuk stack AWS CDK

Kapan menggunakan pengujian:

  • Anda membuat construct atau pola yang dapat digunakan ulang.
  • Penerapan pengujian berfungsi untuk menetapkan persyaratan teknis standar di antara anggota tim.
  • Anda ingin menangkap regresi atau perubahan yang tidak diinginkan selama CI/CD.

Ingin memperkuat pengetahuan CDK Anda dalam situasi wawancara? Kumpulan pertanyaan wawancara AWS DevOps teratas ini dapat membantu Anda bersiap.

Praktik Terbaik dan Kiat untuk Bekerja dengan AWS CDK

Setelah menguasai pembuatan dan deployment stack CDK, Anda harus mengikuti praktik terbaik untuk menjaga kode infrastruktur tetap bersih, aman, dan skalabel. Bagian ini akan membahas cara menyusun proyek besar, menangani keamanan dengan benar, dan mengintegrasikan CDK ke pipeline CI/CD.

Mengorganisasi proyek besar

Saat app CDK Anda berkembang, mengorganisasi kode menjadi unit yang dapat dikelola menjadi hal penting.

Gunakan beberapa stack

Pisahkan infrastruktur berdasarkan concern. Misalnya:

  • NetworkingStack: VPC, subnet, security group
  • ComputeStack: EC2, Lambda
  • StorageStack: S3, DynamoDB

Ini memungkinkan Anda menerapkan, menguji, atau menghapus bagian infrastruktur secara mandiri. Berikut cara menyertakannya dalam app.py:

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

Anda juga dapat meneruskan sumber daya antar stack menggunakan output atau referensi.

Buat construct bertingkat yang dapat digunakan ulang

Enkapsulasi sumber daya terkait (seperti Lambda dan izinnya) ke dalam construct kustom, seperti yang Anda lakukan dengan StorageWithLambda. Ini meningkatkan keterbacaan dan keterpakaiulangan lintas stack atau app.

Gunakan konfigurasi spesifik lingkungan

Dukung beberapa lingkungan (dev, staging, prod) menggunakan:

  • cdk.json dengan nilai konteks
  • Override CLI: cdk deploy -c env=prod
  • Logika kondisional di stack Anda
env = app.node.try_get_context("env")
if env == "prod":
    bucket_name = "mycompany-prod-logs"

Keamanan dan izin

Setiap proyek infrastruktur harus memprioritaskan keamanan selama proses deployment otomatis AWS CDK. Bagian berikut menunjukkan pengelolaan sumber daya IAM yang aman melalui prinsip least privilege.

Definisikan role IAM alih-alih menggunakan default

Construct CDK, termasuk tugas Lambda atau ECS, akan otomatis membuat role IAM. Meskipun nyaman, ini dapat membatasi kontrol Anda atas izin dan penamaan.

Sebagai gantinya, definisikan role secara eksplisit:

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")
    ]
)

Role ini hanya mengizinkan logging dan tidak ada yang lain secara default.

Terapkan prinsip least privilege

Hindari menggunakan "*" pada actions atau resources kecuali benar-benar diperlukan.

Contoh:

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

Anda juga dapat menggunakan grant spesifik sumber daya jika tersedia:

bucket.grant_read(lambda_fn)

Ini secara otomatis menghasilkan kebijakan yang diperlukan dengan akses yang dibatasi ke bucket S3 tersebut.

Gunakan managed policy jika memungkinkan

AWS-managed policy menyederhanakan pemeliharaan dan mengurangi kemungkinan kesalahan.

iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSQSReadOnlyAccess")

Anda dapat melampirkannya ke role kustom untuk layanan seperti ECS, Batch, atau Step Functions.

Integrasi CI/CD

AWS CDK memberikan kekuatan luar biasa melalui kemampuannya berintegrasi dengan pipeline CI/CD kontemporer. CDK mendukung delivery infrastruktur otomatis melalui deployment kode yang dikendalikan versi, yang bekerja dengan GitHub, GitLab, dan layanan native AWS termasuk CodePipeline. Sistem ini mengurangi kesalahan manusia sambil memperpendek siklus umpan balik dan memungkinkan deployment di berbagai lingkungan.

GitHub Actions: Mengotomatiskan deployment CDK

Anda dapat menggunakan GitHub Actions untuk melakukan synth, diff, test, dan deploy stack CDK pada setiap push atau pull request.

Lihat .github/workflows/deploy.yml ini:

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 }}

Gunakan cdk diff dalam PR untuk meninjau perubahan infra sebelum menggabungkan.

CDK pipelines: CI/CD native CDK dengan CodePipeline

Untuk deployment terkelola penuh di dalam AWS, CDK menyediakan modul bernama aws_cdk.pipelines, yang memungkinkan Anda mendefinisikan seluruh pipeline CI/CD sebagai kode, seperti halnya infrastruktur.

Berikut contoh yang disederhanakan:

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")
        )

Pada kode di atas:

  • SecretValue.secrets_manager("GITHUB_TOKEN") secara aman mengambil token GitHub Anda dari Secrets Manager.
  • MyAppStage harus berupa kelas yang memperluas Stage dan membungkus stack CDK Anda yang sebenarnya.

Jika Anda menerapkan sistem machine learning, integrasi CDK dengan praktik deployment berkelanjutan dibahas dalam kursus CI/CD for Machine Learning kami.

Kesimpulan

Tutorial ini menunjukkan cara membangun dan menerapkan infrastruktur cloud dalam Python melalui operasi AWS Cloud Development Kit (CDK). Anda telah mempelajari cara:

  • Membuat stack CDK pertama Anda.
  • Mendefinisikan dan memvalidasi bucket S3 dan fungsi Lambda sebagai sumber daya.
  • Mengorganisasi proyek melalui construct kustom dan pola multi-stack.
  • Menerapkan praktik keamanan terbaik melalui prinsip least privilege.
  • Mengotomatiskan deployment dengan menggabungkan GitHub Actions dan CDK Pipelines.
  • Menulis pengujian untuk memvalidasi logika infrastruktur Anda.

Sekarang Anda telah menerapkan app CDK pertama Anda, berikut beberapa cara untuk naik tingkat:

  • Gunakan lingkungan terparametrisasi untuk dev/staging/prod
  • Tambahkan CloudWatch alarms, API Gateway, atau Step Functions
  • Jelajahi construct CDK seperti aws_s3_deployment, aws_ecs_patterns, dan cdk.pipelines
  • Ubah construct Anda menjadi pustaka Python internal untuk keterpakaiulangan

Untuk terus belajar dan membangun, simak kursus Introduction to AWS Boto in Python!

FAQs

Apa itu AWS CDK, dan bagaimana bedanya dengan CloudFormation atau Terraform?

AWS CDK memungkinkan Anda mendefinisikan infrastruktur cloud menggunakan bahasa pemrograman seperti Python, sementara CloudFormation dan Terraform mengandalkan JSON/YAML atau HCL. CDK menawarkan abstraksi dan keterpakaiulangan yang lebih tinggi melalui construct.

Apakah saya perlu mengetahui CloudFormation untuk menggunakan AWS CDK?

Tidak, CDK mengabstraksi sebagian besar kompleksitas CloudFormation. Namun, memahami CloudFormation membantu saat menggunakan construct tingkat lebih rendah atau menelusuri masalah deployment.

Bisakah saya menerapkan beberapa lingkungan (mis., dev, prod) dengan AWS CDK?

Ya! CDK mendukung konfigurasi spesifik lingkungan menggunakan nilai konteks dan flag CLI seperti cdk deploy -c env=prod.

Bagaimana cara menguji kode infrastruktur CDK saya?

Anda dapat menggunakan pytest bersama modul assertions dan template CDK untuk menulis unit test yang memverifikasi sumber daya dan konfigurasi stack Anda sebelum deployment.

Apa yang terjadi di balik layar saat saya menjalankan cdk deploy?

cdk deploy mensintesis kode Python Anda menjadi template CloudFormation, mengunggahnya ke AWS, dan menyediakan sumber daya yang didefinisikan di akun Anda.

Rahul Sharma

Penulis

Rahul Sharma

Rahul Sharma adalah AWS Ambassador, Arsitek DevOps, dan blogger teknis yang mengkhususkan diri pada komputasi awan, praktik DevOps, serta teknologi open-source. Dengan keahlian di AWS, Kubernetes, dan Terraform, ia menyederhanakan konsep yang kompleks bagi pelajar dan profesional melalui artikel dan tutorial yang menarik. Rahul bersemangat memecahkan tantangan DevOps dan berbagi wawasan untuk memberdayakan komunitas teknologi.

Topik

Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Spaghetti Plot dan Jalur Badai

blogs

Tutorial Korelasi di R