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
| Tingkat | Contoh | Rasanya |
|---|---|---|
| L1 | sqs.CfnQueue | Semua properti CloudFormation, tanpa default, tanpa bantuan |
| L2 | sqs.Queue | Default aman, tipe yang benar, grant_* |
| L3 | aws_apigatewayv2_integrations.HttpLambdaIntegration | Beberapa 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.