← Semua pembelajaran / AWS untuk AI Engineer
Fase 2 · IaC & CI/CD

CDK — construct L1, L2, L3

Construct adalah unit penyusun CDK. Memahami tiga tingkatnya menjelaskan kenapa sebagian kode CDK ringkas sekali dan sebagian lain terasa seperti YAML yang menyamar.

Intisari

  • L1 (Cfn*) memetakan CloudFormation satu-satu — lengkap tapi mentah.
  • L2 menambahkan default masuk akal dan metode grant_*. Ini yang kamu pakai sehari-hari.
  • L3 (pattern) merangkai beberapa resource jadi satu pola siap pakai.
  • Layanan baru sering hanya punya L1 di awal — normal, dan tetap layak dipakai.
  • Escape hatch: dari construct L2 kamu bisa turun ke node L1-nya untuk menyetel properti yang belum terekspos.

Tiga tingkat

TingkatContohRasanya
L1sqs.CfnQueueSemua properti CloudFormation, tanpa default, tanpa bantuan
L2sqs.QueueDefault aman, tipe yang benar, grant_*
L3aws_apigatewayv2_integrations.HttpLambdaIntegrationBeberapa resource sekaligus, satu baris

Perbedaannya dalam kode

# L1 — persis CloudFormation. Semua nama properti mengikuti CFN.
sqs.CfnQueue(self, "Antrean",
             queue_name="ingest",
             visibility_timeout=180,
             redrive_policy={"deadLetterTargetArn": dlq_arn, "maxReceiveCount": 3})

# L2 — tipe Python yang benar, DLQ jadi objek, izin punya metode
antrean = sqs.Queue(
    self, "Antrean",
    visibility_timeout=Duration.seconds(180),
    dead_letter_queue=sqs.DeadLetterQueue(max_receive_count=3, queue=dlq),
)
antrean.grant_consume_messages(fungsi)

Perhatikan Duration.seconds(180) versus angka 180. Di L2, satuan menjadi bagian dari tipe — tidak ada lagi pertanyaan "ini detik atau milidetik?" yang harus dijawab dengan membuka dokumentasi.

Kalau L2 belum ada

Ini situasi yang akan kamu temui, karena layanan GenAI di AWS bergerak cepat sementara construct L2 menyusul belakangan. Jawabannya bukan menunggu — pakai L1:

from aws_cdk import aws_bedrock as bedrock

kb = bedrock.CfnKnowledgeBase(
    self, "KnowledgeBase",
    name="dokumen-internal",
    role_arn=peran_kb.role_arn,
    knowledge_base_configuration={...},
    storage_configuration={...},
)

Lebih bertele-tele, tapi tetap IaC: tetap masuk kontrol versi, tetap ikut cdk diff, tetap di-rollback kalau gagal. Itu yang penting.

Escape hatch

Kadang kamu memakai L2 tapi butuh satu properti yang belum diekspos. Turun ke node L1-nya:

antrean = sqs.Queue(self, "Antrean")

cfn_antrean = antrean.node.default_child          # objek CfnQueue di bawahnya
cfn_antrean.add_property_override("SqsManagedSseEnabled", True)

Kapan pakai escape hatch: saat AWS merilis properti baru dan CDK belum menyusul. Ini normal dan bukan tanda kamu salah jalan. Yang salah adalah membuang CDK dan kembali menulis YAML tangan hanya karena satu properti.

Membuat construct sendiri

Ini yang dimaksud exam guide dengan "standardized technical components": bungkus pola yang berulang jadi satu construct, lalu pakai berkali-kali dengan jaminan konfigurasi yang seragam.

class FungsiBedrock(Construct):
    """Lambda yang boleh memanggil Bedrock, dengan default yang sudah kami sepakati."""

    def __init__(self, scope, id, *, handler, model_id, **kwargs):
        super().__init__(scope, id)

        self.fungsi = lambda_.Function(
            self, "Fn",
            runtime=lambda_.Runtime.PYTHON_3_13,
            handler=handler,
            timeout=Duration.seconds(60),
            memory_size=1024,
            tracing=lambda_.Tracing.ACTIVE,          # X-Ray selalu aktif
            environment={"MODEL_ID": model_id},
            **kwargs,
        )
        self.fungsi.add_to_role_policy(iam.PolicyStatement(
            actions=["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"],
            resources=[f"arn:aws:bedrock:{Stack.of(self).region}::foundation-model/{model_id}"],
        ))

Latihan: bungkus fungsi Lambda-mu jadi construct FungsiBedrock seperti di atas, lalu pakai dua kali dalam satu stack dengan model yang berbeda. Jalankan cdk synth dan hitung ada berapa resource CloudFormation yang dihasilkan dari dua baris Python itu.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.